
    tKg=H                        d Z ddlmZ ddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ddl
ZddlZdd	lmZ ej&                  ej(                  ej*                  ej,                  ej.                  ej0                  ej2                  d
Zej&                  ej.                  ej0                  ej2                  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)	csr_array)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       d/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/optimize/tests/test_nonlin.pyFr!       sN    


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-   9   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
           )r
   r/   r
   )r   r
   r/   )r
   r         @)r   arrayr   Abs      r    F3r6   C   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   r4   s     r    	F4_powellr9   O   sT    AadF1Q4K!ORVVQqTE]RVVQqTE]:a!A#gFGGr"   r/   )r   r   r   minres>   cgsgmrestfqmrr;   bicgstabc                 F    t        | dt        j                  g d            S )Nr)   )r   r   r   r   )r   r   r2   r&   s    r    F5rA   _   s    Aq"((+;"<==r"   )       @r   r   r   )r   r   r   r<   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   r2   sinr8   linalgsolve)r   x1x2J0vs        r    F6rM   n   s    FB	FD>z*, 
-B
26b!eai(3.&&bffRj1,-/ 	0AIIOOB"""r"   g      gffffff?c                   f   e Zd ZdZddZddZej                  j                  d        Z	ej                  j                  d      d        Zej                  j                  d      ej                  j                  dg d      d	               Zej                  j                  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?   r<   r;   r>      r   )methodline_searchf_tolmaxiterverbose)rU   rV   rW   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrU   rS   r   s         r    _check_nonlin_funczTestNonlin._check_nonlin_func   s    78$$IQ]]*AEE&d$c1>AaD)--/%78 J 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   rQ   rR   r   rS   )ftolrV   dispjac_optionsrS   options)ra   rV   rb   )ROOT_JAC_KSP_BADr   rZ   r   r   r[   funr\   )r]   r   rS   rU   
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:; N 1aeeF$)c1EGCGG$((*U23r"   c                      y r$   r%   )r]   akws      r    _check_func_failzTestNonlin._check_func_fail   s    r"   zignore::DeprecationWarningc                 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-   r6   r9   rA   rM   rX   values	KNOWN_BAD	MUST_WORKrn   r_   )r]   r   r^   s      r    test_problem_nonlinzTestNonlin.test_problem_nonlin   su    R2y"b9A(1;;--//y//11--a6''40 ) :r"   rS   )lgmresr=   r?   r<   r;   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   r[   r\   )r   r]   s    r    local_norm_funcz8TestNonlin.test_tol_norm_called.<locals>.local_norm_func   s"    "&D;;q>%%''r"   r   rR   r   )rS   rU   rV   rW   tol_norm)rw   nonlinnewton_krylovr!   rZ   r   )r]   rS   rx   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-   r6   r9   rA   rM   rX   rq   rr   rn   rj   )r]   r   meths      r    test_problem_rootzTestNonlin.test_problem_root   s\    R2y"b9A1;;&y(--a6  D)   :r"   c                     d }t        j                  t        j                  j                        5  t        j                  |dgd       d d d        y # 1 sw Y   y xY w)Nc                     d| z   S )Ng     @@r%   r&   s    r    wont_convergez5TestNonlin.test_no_convergence.<locals>.wont_converge   s    7Nr"   r   r
   )rZ   rV   )pytestraisesscipyoptimizeNoConvergencerz   r{   )r]   r   s     r    test_no_convergencezTestNonlin.test_no_convergence   s?    	 ]]5>>778  QCC 988s   AAN)r   )__name__
__module____qualname____doc__r_   rj   r   markxfailrn   filterwarningsrs   parametrizer|   r   r   r%   r"   r    rO   rO      s    14" [[  [[ <=1 >1 [[ <=[[X (; <%< >% [[ <=* >*Dr"   rO   c                      e Zd ZdZ ej
                  g d       ej
                  g d       ej
                  g d       ej
                  g d       ej
                  g d       ej
                  g d       ej
                  g d       ej
                  g d	      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)      ?rB   r1         @      @)rB   r1   r   r   r   )r1   r   r   r   rB   )r   r   r   rB   r1   )      "@r   r   r   r1   )r0   r   r   r   r1   )r   r         @r   r   )r   rB   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   allcloserH   )r]   jac_clsnpointsrm   jacjr   r   kdxdfs              r    _check_secantzTestSecant._check_secant   sh   
 mm		$''!*dggaj$/"3twwqr{DGGABK#@AIAv1JJq!3w!,-WWQqSU^dggacl2WWQqSU^dggacl2B		"67 . G|WWQwYq[)DGGAgI,>>WWQwYq[)DGGAgI,>>BKKCIIbM::; Br"   c                 B    | j                  t        j                         y r$   )r   rz   BroydenFirstr]   s    r    test_broyden1zTestSecant.test_broyden1   s    6../r"   c                 B    | j                  t        j                         y r$   )r   rz   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)rz   r   r   r   r   r   identityr   r   r   r   r   r   todense)r]   r   Blast_jr   r   r   r   s           r    test_broyden1_updatezTestSecant.test_broyden1_update  s    !!,		$''!*dggaj$/KKNf%'DGGABK(EFNFFQTWWV_$BTWWV_$B"s1bz/1d7+bqk9CBKGGAJJq!BKKqu5IJ G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   )rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   )r]   r   Hr   r   r   r   r   s           r    test_broyden2_updatezTestSecant.test_broyden2_update  s    ""-		$''!*dggaj$/KKNd#'DGGABK(EFNFFQTWWV_$BTWWV_$B"s1bz/1d7+bqk9CBKGGAJJq!BKKs1vENO Gr"   c                 J    | j                  t        j                  ddd       y )Nr   r   )Mw0r   )r   rz   Andersonr   s    r    test_andersonzTestSecant.test_anderson   s    
 	6??aAqAr"   N)r
   )r   r   r   r   r   r2   r   r   r   r   r   r   r   r   ).0r   s   00r    r   r      s    N
"(('
(
"(('
(
"(('
(
"(('
(
"(('
(
"(('
(
"(('
(
"(('
(
+B 	Bq!Q$(B	B<*01KPBs 
 s   &Cr   c                   B    e Zd ZdZddZd Zd Z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   r3   s    r    r^   zTestLinear._check.<locals>.func6  s    q!9q= r"   ư>r   rV   rU   rT   rW   r   )
r   randomseedrandnrz   nonlin_solvezerosr   r   r   )
r]   r   NrV   complexrm   r^   solr4   r5   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 Nr   r      )   FT)r   rz   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   rz   r   r   s    r    r   zTestLinear.test_broyden2B  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   rz   r   r   s    r    r   zTestLinear.test_andersonG  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   rz   KrylovJacobianr   s    r    test_krylovzTestLinear.test_krylovL  s:    F))2q%DF))2q$Cr"   c           	         fd}fd}t        j                  |t        j                  j                  d         |ddd d      }t        j
                  j                  |z  d       t        j                  |t        j                  j                  d         ddd d      }t        j
                  j                  |z  d       y )Nc                 ,    j                  |       z
  S r$   r   r3   s    r    r^   z'TestLinear._check_autojac.<locals>.funcR  s    558a<r"   c                     S r$   r%   )rL   r4   s    r    r   z&TestLinear._check_autojac.<locals>.jacU  s    Hr"   r   r   r   r   r   )rz   r   r   r   shapetestingassert_allclose)r]   r4   r5   r^   r   r   s    ``   r    _check_autojaczTestLinear._check_autojacQ  s    	 	 !!$(<c1(,$K


""1s7AD"9!!$(<a(,$K


""1s7AD"9r"   c                     t        ddgddgg      }t        j                  ddg      }| j                  ||       | j                  d|z  d|z         y Nr
   r   r:   y      ?       @y       @       @)r   r   r2   r   r]   r4   r5   s      r    test_jac_sparsezTestLinear.test_jac_sparse`  sS    1v1v&'HHaWAq!VqL6Q,7r"   c                     t        j                  ddgddgg      }t        j                  ddg      }| j                  ||       | j                  d|z  d|z         y r   )r   r2   r   r   s      r    test_jac_ndarrayzTestLinear.test_jac_ndarrayf  sW    HHq!fq!f%&HHaWAq!VqL6Q,7r"   N)F)r   r   r   r   r   r   r   r   r   r   r   r   r%   r"   r    r   r   (  s4    H8"B
C
D
D
:88r"   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)TestJacobianDotSolvezP
    Check that solve/dot methods in Jacobian approximations are consistent
    c                 T    |dz  dz
  t        j                  | j                  |      z   S )Nr   r
   )r   r   r4   r]   r   s     r    _funczTestJacobianDotSolve._funcr  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   rD   c                      t        j                  j                  |  }r"|dt        j                  j                  |  z  z   }|S )Nr   )r   r   rand)rl   qr   s     r    r   z-TestJacobianDotSolve._check_dot.<locals>.randz  s9    		"A299>>1---Hr"   c                     t        | |z
        j                         }t        |      j                         z  z   }||kD  rt        | d|d      y )Nz: err g)absr\   AssertionError)rl   r5   msgr   r   tols        r    assert_closez5TestJacobianDotSolve._check_dot.<locals>.assert_close  sT    AE
 Ac!fjjl3&&A1u$uF1Q%%899 r"   r   	__array__rH   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   r4   r   r   r   r   hasattrr2   rH   rG   r  r   conjr  r   r  r   )r]   r   r   r  rm   r   r   r  x0r   r   rL   JdGvGv2JvJv2r   s     ``              r    
_check_dotzTestJacobianDotSolve._check_dotu  s/   
		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  rz   r   r   s    r    r   z"TestJacobianDotSolve.test_broyden1  .    ++U;++T:r"   c                     | j                  t        j                  d       | j                  t        j                  d       y r  )r  rz   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  rz   r   r   s    r    r   z"TestJacobianDotSolve.test_anderson  s*    76r"   c                     | j                  t        j                  d       | j                  t        j                  d       y r  )r  rz   DiagBroydenr   s    r    test_diagbroydenz%TestJacobianDotSolve.test_diagbroyden  s.    **E:**D9r"   c                     | j                  t        j                  d       | j                  t        j                  d       y r  )r  rz   LinearMixingr   s    r    test_linearmixingz&TestJacobianDotSolve.test_linearmixing  r  r"   c                     | j                  t        j                  d       | j                  t        j                  d       y r  )r  rz   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  rz   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   m  s6    ,:)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   &.>)rz   r   r!   rZ   r   normr   s     r    r   z TestNonlinOldTests.test_broyden1  I    OOAquu2Q7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$  )rz   r   r!   rZ   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?)rz   r   r!   rZ   r   r)  r   s     r    r   z TestNonlinOldTests.test_anderson  s1    OOAquu2TQ?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>)rz   r   r!   rZ   r   r)  r   s     r    r  z$TestNonlinOldTests.test_linearmixing  sK    155r=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㈵>)rz   r   r!   rZ   r   r)  r   s     r    test_excitingz TestNonlinOldTests.test_exciting  sK    !!!QUU3?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>)rz   r   r!   rZ   r   r)  r   s     r    r  z#TestNonlinOldTests.test_diagbroyden  sK    q!%%b: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
   nitrc   rd   r(  r   r!   rZ   r   rz   r)  r   rg   r]   ri   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
   r9  rd   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   r9  rd   r.  )r   r!   rZ   r   rz   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   r0  r   r   r9  rd   r1  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   r9  rd   r3  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   r6  r   r
   r9  rd   r7  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  r4  r  r=  r@  rB  rD  rF  rH  r%   r"   r    r"  r"    sC    
*
*
'*
*
*
--+---r"   r"  ),r   numpy.testingr   r   scipy.optimizer   rz   r   scipy.sparser   numpyr   r   numpy.linalgr	   r   r   test_minpackr   r   r   r   r   r   r   r{   rX   rr   r!   rZ   rq   rY   rf   r'   r-   r6   r9   rA   rM   rO   r   r   r   r"  r%   r"   r    <module>rO     sV   "  2 "     * ,,!..#22))+  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  UD UDpIB IBXB8 B8J^G ^GBH- H-r"   