
    xf1B                        d Z ddlmZ ddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlZddlmZ ej                   ej"                  ej$                  ej&                  ej(                  ej*                  ej,                  d	Zej                   ej(                  ej*                  ej,                  d
Zd Zg de_        i e_        i e_        i e_        d Zg de_        ej$                  ej&                  de_        i e_        i e_        d Zg de_        i e_        i e_        i e_        d Z g de _        i e _        i e _        i e _        d Z!ddge!_        ej$                  ej&                  ej"                  de!_        dhe!_        h de!_        d Z"g de"_        ej&                  ej$                  ej"                  de"_        ddhe"_        dhe"_        d Z#dd ge#_        ej&                  ej$                  ej"                  de#_        i e#_        i e#_         G d! d"      Z$ G d# d$      Z% G d% d&      Z& G d' d(      Z' G d) d*      Z(y)+zA Unit tests for nonlinear solvers
Author: Ondrej Certik
May 2007
    )assert_N)_nonlinroot)diagdot)inv   )pressure_network)andersondiagbroydenlinearmixingexcitingmixingbroyden1broyden2krylov)r   r   r   r   c                     t        j                  |       j                  } t        g d      }d}| | z  |t	        | j                  | z        z  | z  z
  }|S )N)      g      ?r	         ?{Gz?)npasarrayTr   float)xdcfs       B/usr/lib/python3/dist-packages/scipy/optimize/tests/test_nonlin.pyFr       sM    


1A_AA	
QU1337^#a''AH    )r	   r	   r	   r	   r	   c                     | S N r   s    r   F2r&   )       Hr!   )r	   r   r            )r   r   c                     | S r#   r$   r%   s    r   F2_luckyr,   4   r'   r!   )r   r   r   r   r   r   c                 |    t        j                  g dg dg dg      }t        j                  g d      }|| z  |z
  S )N)r	   g        )r	   r.   r	   )r   r	   r.   )r	   r   g      @)r   arrayr   Abs      r   F3r3   >   s3    
+z:67A
Aq519r!   )r	   r   r   c                     d}|| d   z  | d   z  dz
  t        j                  | d          t        j                  | d          z   dd|z  z   z
  gS )Ng     @r   r	   )r   exp)r   r1   s     r   	F4_powellr6   J   sT    AadF1Q4K!ORVVQqTE]RVVQqTE]:a!A#gFGGr!   r.   )r   r   r   minres>   cgsgmrestfqmrr8   bicgstabc                 F    t        | dt        j                  g d            S )Nr(   )r   r   r   r   )r
   r   r/   r%   s    r   F5r>   Z   s    Aq"((+;"<==r!   )g       @r   r   r   )r   r   r   r9   c           	      (   | \  }}t        j                  ddgddgg      }t        j                  |dz   |dz  dz
  z  dz   t        j                  |t        j                  |      z  d	z
        g      }t         j                  j                  ||       S )
Ng/$gffffff-@g+,?grD0?r   r)         r	   )r   r/   sinr5   linalgsolve)r   x1x2J0vs        r   F6rI   i   s    FB	FD>J') 
*B
26b!eai(3.&&bffRj1,-/ 	0AIIOOB"""r!   g      gffffff?c                       e Zd ZdZddZddZej                  j                  d        Z	d Z
ej                  j                  dg d      d        Zd	 Zy
)
TestNonlinz
    Check the Broyden methods for a few test problems.

    broyden1, broyden2, and newton_krylov must succeed for
    all functions. Some of the others don't -- tests in KNOWN_BAD are skipped.

    c           
      |   |t         d   k(  rddD ]_  }||j                  v r |||j                  |d |dd      }t        t	        j
                   ||            j                         |k         a  |||j                  |dd      }t        t	        j
                   ||            j                         |k         y )Nr   r:   r<   r9   r8   r;      r   )methodline_searchf_tolmaxiterverbose)rQ   rR   rS   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrQ   rO   r   s         r   _check_nonlin_funczTestNonlin._check_nonlin_func   s    78$$I 9Q]]*AEE&d$c1>AaD)--/%789 AEEQ?AaD!%%'%/0r!   c                    |dk(  rodD ]j  }||j                   v rt        ||j                  ||ddd|id      }t        t	        j
                  |j                        j                         |k         l t        ||j                  ||ddd      }t        t	        j
                  |j                        j                         |k         y )	Nr   rM   rN   r   rO   )ftolrR   dispjac_optionsrO   options)r]   rR   r^   )ROOT_JAC_KSP_BADr   rV   r   r   rW   funrX   )rY   r   rO   rQ   
jac_methodress         r   _check_rootzTestNonlin._check_root   s    XM <
!3!331aeeF,1c,-4<j3I$KL CGG,002U:;< 1aeeF$)c1EGCGG$((*U23r!   c                      y r#   r$   )rY   akws      r   _check_func_failzTestNonlin._check_func_fail   s    r!   c                 8   t         t        t        t        t        t
        t        fD ]r  }t        j                         D ]Y  }||j                  j                         v r)|t        j                         v r| j                  ||       H| j                  ||       [ t y r#   )r    r&   r,   r3   r6   r>   rI   rT   values	KNOWN_BAD	MUST_WORKrj   r[   )rY   r   rZ   s      r   test_problem_nonlinzTestNonlin.test_problem_nonlin   s    R2y"b9 	1A( 11;;--//y//11--a6''401	1r!   rO   )lgmresr:   r<   r9   r8   r;   c           	           d _          fd}t        j                  t        t        j                  |ddd|       t         j                          y )NFc                 X    d_         t        j                  |       j                         S )NT)_tol_norm_usedr   rW   rX   )r   rY   s    r   local_norm_funcz8TestNonlin.test_tol_norm_called.<locals>.local_norm_func   s"    "&D;;q>%%''r!   r   rN   r   )rO   rQ   rR   rS   tol_norm)rs   nonlinnewton_krylovr    rV   r   )rY   rO   rt   s   `  r   test_tol_norm_calledzTestNonlin.test_tol_norm_called   sF     $	( 	QfD%(!&5	7 	##$r!   c                     t         t        t        t        t        t
        t        fD ]H  }t        D ]=  }||j                  v r|t        v r| j                  ||       ,| j                  ||       ? J y r#   )r    r&   r,   r3   r6   r>   rI   rT   rm   rn   rj   rf   )rY   r   meths      r   test_problem_rootzTestNonlin.test_problem_root   sf    R2y"b9 	*A *1;;&y(--a6  D)*	*r!   N)r   )__name__
__module____qualname____doc__r[   rf   pytestmarkxfailrj   ro   parametrizerx   r{   r$   r!   r   rK   rK      sc    14" [[ 1 [[X (; <%<%*r!   rK   c                      e Zd ZdZ ej
                  g de       ej
                  g de       ej
                  g de       ej
                  g de       ej
                  g de       ej
                  g de       ej
                  g de       ej
                  g d	e      gZeD  cg c]
  }|d
z  dz
   c}} ZddZ	d Z
d Zd Zd Zd Zyc c}} w )
TestSecantzDCheck that some Jacobian approximations satisfy the secant condition)r	   r   r   r(   r)   )r   r   r(   r)   r	   )r   r(   r)   r	   r   )r(   r)   r	   r   r   )	   r	   r   r	   r   )r   r	   r   r	   r   )r)   r)   r@   r	   r	   )r	   r   r@   r)   r	   r   r	   c           
      J    |di |}|j                  | j                  d   | j                  d   d       t        t	        | j                  dd | j                  dd             D ];  \  }\  }}|j                  ||       t        t        ||dz               D ]  }| j                  ||z
  dz      | j                  ||z
     z
  }	| j                  ||z
  dz      | j                  ||z
     z
  }
t        t        j                  |	|j                  |
                    ||k\  s| j                  ||z
  dz      | j                  ||z
     z
  }	| j                  ||z
  dz      | j                  ||z
     z
  }
t        t        j                  |	|j                  |
                    > y)z|
        Check that the given Jacobian approximation satisfies secant
        conditions for last `npoints` points.
        r   Nr	   r$   )setupxsfs	enumeratezipupdaterangeminr   r   allcloserD   )rY   jac_clsnpointsri   jacjr   r   kdxdfs              r   _check_secantzTestSecant._check_secant   sq   
 mm		$''!*dggaj$/"3twwqr{DGGABK#@A 	<IAv1JJq!3w!,- 8WWQqSU^dggacl2WWQqSU^dggacl2B		"678 G|WWQwYq[)DGGAgI,>>WWQwYq[)DGGAgI,>>BKKCIIbM::;	<r!   c                 B    | j                  t        j                         y r#   )r   rv   BroydenFirstrY   s    r   test_broyden1zTestSecant.test_broyden1   s    6../r!   c                 B    | j                  t        j                         y r#   )r   rv   BroydenSecondr   s    r   test_broyden2zTestSecant.test_broyden2   s    6//0r!   c           	      Z   t        j                  d      }|j                  | j                  d   | j                  d   d        t        j                  d      dz  }t        t        | j                  dd  | j                  dd              D ]  \  }\  }}|| j                  |   z
  }|| j                  |   z
  }||t        ||      z
  d d d f   |d d d f   z  t        ||      z  z  }|j                  ||       t        t        j                  |j                         |dd	              y )
N皙?alphar   r)   g      $r	   绽|=vIh%<=rtolatol)rv   r   r   r   r   r   identityr   r   r   r   r   r   todense)rY   r   Blast_jr   r   r   r   s           r   test_broyden1_updatezTestSecant.test_broyden1_update   s   !!,		$''!*dggaj$/KKNf%'DGGABK(EF 	KNFFQTWWV_$BTWWV_$B"s1bz/1T6*RQZ7#b"+EEAJJq!BKKqu5IJ	Kr!   c           	      l   t        j                  d      }|j                  | j                  d   | j                  d   d        t        j                  d      dz  }t        t        | j                  dd  | j                  dd              D ]  \  }\  }}|| j                  |   z
  }|| j                  |   z
  }||t        ||      z
  d d d f   |d d d f   z  t        ||      z  z  }|j                  ||       t        t        j                  |j                         t        |      dd	              y )
Nr   r   r   r)   gr	   r   r   r   )rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rY   r   Hr   r   r   r   r   s           r   test_broyden2_updatezTestSecant.test_broyden2_update  s   ""-		$''!*dggaj$/KKNd#'DGGABK(EF 	PNFFQTWWV_$BTWWV_$B"s1bz/1T6*RQZ7#b"+EEAJJq!BKKs1vENO	Pr!   c                 J    | j                  t        j                  ddd       y )Nr   r   )Mw0r   )r   rv   Andersonr   s    r   test_andersonzTestSecant.test_anderson  s    
 	6??aAqAr!   N)r	   )r|   r}   r~   r   r   r/   r   r   r   r   r   r   r   r   r   ).0r   s   00r   r   r      s    N
"((;
&
"((;
&
"((;
&
"((;
&
"((;
&
"((;
&
"((;
&
"((;
&
)B 	q!Q$(	B<*01KPBs 
 s   .Cr   c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	
TestLinearz]Solve a linear equation;
    some methods find the exact solution in a finite number of stepsc           	      "  	 t         j                  j                  d       t         j                  j                  ||      |r&dt         j                  j                  ||      z  z   t         j                  j                  |      	|r%	dt         j                  j                  |      z  z   		fd}t	        j
                  |t        j                  |      ||dd d      }t        t        j                  t        |      	d             y )N{                 ?c                 "    t        |       z
  S r#   )r   r0   s    r   rZ   zTestLinear._check.<locals>.func'  s    q!9q= r!   ư>r   )rR   rQ   rP   rS   )r   )
r   randomseedrandnrv   nonlin_solvezerosr   r   r   )
rY   r   NrR   complexri   rZ   solr1   r2   s
           @@r   _checkzTestLinear._check  s    
		sIIOOAq!Bryyq!,,,AIIOOABryyq)))A	! !!$S'(,$KC3K67r!   c                     | j                  t        j                  d      ddd       | j                  t        j                  d      ddd       y N      ?r      )   FT)r   rv   r   r   s    r   r   zTestLinear.test_broyden1.  s<    F''c2BEBF''c2BDAr!   c                     | j                  t        j                  d      ddd       | j                  t        j                  d      ddd       y r   )r   rv   r   r   s    r   r   zTestLinear.test_broyden23  s<    F((s3RUCF((s3RTBr!   c                     | j                  t        j                  dd      ddd       | j                  t        j                  dd      ddd       y )N2   r   )r   r   r      FT)r   rv   r   r   s    r   r   zTestLinear.test_anderson8  s<    FOOb4b"eDFOOb4b"dCr!   c                     | j                  t        j                  dddd       | j                  t        j                  dddd       y )Nr   r   F
   )inner_mT)r   rv   KrylovJacobianr   s    r   test_krylovzTestLinear.test_krylov=  s:    F))2q%DF))2q$Cr!   N)F)	r|   r}   r~   r   r   r   r   r   r   r$   r!   r   r   r     s%    H8"B
C
D
Dr!   r   c                   H    e Zd ZdZd ZddZd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestJacobianDotSolvezFCheck that solve/dot methods in Jacobian approximations are consistentc                 T    |dz  dz
  t        j                  | j                  |      z   S )Nr   r	   )r   r   r1   rY   r   s     r   _funczTestJacobianDotSolve._funcF  s$    !tax"&&+++r!   c                    t         j                  j                  d       d}fd}fd} |||      | _        t         j                  j	                  |      } |di |}	|	j                  || j                  |      | j                         t        d|z        D ]4  }
 ||      }t        |	d      rMt        j                  |	      }t        |	d      r;|	j                  |      }t         j                  j                  ||      } |||d       t        |	d	      rS|	j                  |      }t         j                  j                  |j                  j                         |      } |||d
       t        |	d      r1|	j                  |      }t        j                   ||      } |||d       t        |	d      rI|	j#                  |      }t        j                   |j                  j                         |      } |||d       t        |	d      rGt        |	d      r;|	j                  |      }|	j                  |	j                  |            } |||d       t        |	d      rGt        |	d	      r;|	j#                  |      }|	j#                  |	j                  |            } |||d        ||      }|	j%                  || j                  |             7 y )Nr   r@   c                      t        j                  j                  |  }r"|dt        j                  j                  |  z  z   }|S )Nr   )r   r   rand)rh   qr   s     r   r   z-TestJacobianDotSolve._check_dot.<locals>.randN  s9    		"A299>>1---Hr!   c                     t        | |z
        j                         }t        |      j                         z  z   }||kD  rt        | d|d      y )Nz: err g)absrX   AssertionError)rh   r2   msgr   r   tols        r   assert_closez5TestJacobianDotSolve._check_dot.<locals>.assert_closeT  sT    AE
 Ac!fjjl3&&A1u$uF1Q%%899 r!   r   	__array__rD   zsolve vs arrayrsolvezrsolve vs arraymatveczdot vs arrayrmatveczrmatvec vs arrayzdot vs solvezrmatvec vs rsolver$   )r   r   r   r1   r   r   r   r   hasattrr/   rD   rC   r   r   conjr   r   r   r   )rY   r   r   r   ri   r   r   r   x0r   r   rH   JdGvGv2JvJv2r   s     ``              r   
_check_dotzTestJacobianDotSolve._check_dotI  s4   
		s		: a YY^^Amm		"djjndjj1 qs !	)AQAsK(XXc]3(1B))//"a0C S*:;3)AB))//"$$))+q9C S*;<3)AB&&Q-C S.93	*QB&&a0C S*<=sH%'#w*?ZZ]ii

2/Rn5sI&73+A[[^kk#**R.1R&9:QAJJq$**Q-(C!	)r!   c                     | j                  t        j                  d       | j                  t        j                  d       y NF)r   T)r   rv   r   r   s    r   r   z"TestJacobianDotSolve.test_broyden1  .    ++U;++T:r!   c                     | j                  t        j                  d       | j                  t        j                  d       y r   )r   rv   r   r   s    r   r   z"TestJacobianDotSolve.test_broyden2  s.    ,,e<,,d;r!   c                     | j                  t        j                  d       | j                  t        j                  d       y r   )r   rv   r   r   s    r   r   z"TestJacobianDotSolve.test_anderson  s*    76r!   c                     | j                  t        j                  d       | j                  t        j                  d       y r   )r   rv   DiagBroydenr   s    r   test_diagbroydenz%TestJacobianDotSolve.test_diagbroyden  s.    **E:**D9r!   c                     | j                  t        j                  d       | j                  t        j                  d       y r   )r   rv   LinearMixingr   s    r   test_linearmixingz&TestJacobianDotSolve.test_linearmixing  r   r!   c                     | j                  t        j                  d       | j                  t        j                  d       y r   )r   rv   ExcitingMixingr   s    r   test_excitingmixingz(TestJacobianDotSolve.test_excitingmixing  s.    --u=--t<r!   c                     | j                  t        j                  dd       | j                  t        j                  dd       y )NFgMbP?)r   r   T)r   rv   r   r   s    r   r   z TestJacobianDotSolve.test_krylov  s2    --u$G--tFr!   N)Fr   )r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r$   r!   r   r   r   C  s4    P,:)x;<7:;=Gr!   r   c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)TestNonlinOldTestsz Test case for a simple constrained entropy maximization problem
    (the machine translation example of Berger et al in
    Computational Linguistics, vol 22, num 1, pp 39--72, 1996.)
    c                     t        j                  t        t        j                  dd      }t	        t        j
                  |      dk         t	        t        j
                  t        |            dk         y N   r	   iterr   &.>)rv   r   r    rV   r   normr   s     r   r   z TestNonlinOldTests.test_broyden1  I    OOAaee!4A%&AaD!D()r!   c                     t        j                  t        t        j                  dd      }t	        t        j
                  |      dk         t	        t        j
                  t        |            dk         y r  )rv   r   r    rV   r   r	  r   s     r   r   z TestNonlinOldTests.test_broyden2  r
  r!   c                     t        j                  t        t        j                  ddd      }t	        t        j
                  |      dk         y )Nr  Q?r)   )r  r   r   Q?)rv   r   r    rV   r   r	  r   s     r   r   z TestNonlinOldTests.test_anderson  s1    OOAaee$;A%&r!   c                     t        j                  t        t        j                  dd      }t	        t        j
                  |      dk         t	        t        j
                  t        |            dk         y )N<   r   r  Hz>)rv   r   r    rV   r   r	  r   s     r   r   z$TestNonlinOldTests.test_linearmixing  sK    !%%Rc:A%&AaD!D()r!   c                     t        j                  t        t        j                  dd      }t	        t        j
                  |      dk         t	        t        j
                  t        |            dk         y )Nr   r   r  h㈵>)rv   r   r    rV   r   r	  r   s     r   test_excitingz TestNonlinOldTests.test_exciting  sK    !!!AEEr<A%&AaD!D()r!   c                     t        j                  t        t        j                  dd      }t	        t        j
                  |      dk         t	        t        j
                  t        |            dk         y )N   r	   r  :0yE>)rv   r   r    rV   r   r	  r   s     r   r   z#TestNonlinOldTests.test_diagbroyden  sK    qBQ7A%&AaD!D()r!   c                     t        t        t        j                  ddddid      }t        t	        j
                  |j                        dk         t        t	        j
                  |j                        dk         y )Nr   r  r   r	   nitr_   r`   r  r   r    rV   r   rv   r	  r   rc   rY   re   s     r   test_root_broyden1z%TestNonlinOldTests.test_root_broyden1  W    1aeeJ#%wlCECEE"T)*CGG$t+,r!   c                     t        t        t        j                  ddddid      }t        t	        j
                  |j                        dk         t        t	        j
                  |j                        dk         y )Nr   r  r   r	   r  r`   r  r  r  s     r   test_root_broyden2z%TestNonlinOldTests.test_root_broyden2  r  r!   c           	          t        t        t        j                  dddddd      }t        t	        j
                  |j                        dk         y )	Nr   r  r  r)   )r   r   r  r`   r  )r   r    rV   r   rv   r	  r   r  s     r   test_root_andersonz%TestNonlinOldTests.test_root_anderson  sD    1aeeJ#%59+BDE 	CEE"T)*r!   c                     t        t        t        j                  ddddid      }t        t	        j
                  |j                        dk         t        t	        j
                  |j                        dk         y )Nr   r  r   r   r  r`   r  r  r  s     r   test_root_linearmixingz)TestNonlinOldTests.test_root_linearmixing  s[    1aeeN#%,3S>;< 	CEE"T)*CGG$t+,r!   c                     t        t        t        j                  ddddid      }t        t	        j
                  |j                        dk         t        t	        j
                  |j                        dk         y )Nr   r   r   r   r  r`   r  r  r  s     r   test_root_excitingmixingz+TestNonlinOldTests.test_root_excitingmixing  s\    1aee$4#%,3S>;< 	CEE"T)*CGG$t+,r!   c                     t        t        t        j                  ddddid      }t        t	        j
                  |j                        dk         t        t	        j
                  |j                        dk         y )Nr   r  r   r	   r  r`   r  r  r  s     r   test_root_diagbroydenz(TestNonlinOldTests.test_root_diagbroyden  s[    1aeeM#%,3Q<9: 	CEE"T)*CGG$t+,r!   N)r|   r}   r~   r   r   r   r   r   r  r   r  r   r"  r$  r&  r(  r$   r!   r   r  r    sC    
*
*
'*
*
*
--+---r!   r  ))r   numpy.testingr   r   scipy.optimizer   rv   r   numpyr   r   numpy.linalgr   r   test_minpackr
   r   r   r   r   r   r   rw   rT   rn   r    rV   rm   rU   rb   r&   r,   r3   r6   r>   rI   rK   r   r   r   r  r$   r!   r   <module>r.     sK   "  2    *v7I7I!..&BWBWFOO))+  fooF4H4HJ	 	  
 & 3 3"("7"79      
 H
 R	'-':':)/)>)>&,&8&8:	  "
	 L	 > 
"("7"7 & 3 3%113 "j # "("7"7 & 3 3%113  K* K*\IB IBX'D 'DT\G \G~H- H-r!   