o
    iH                     @   s6  d Z ddlmZ ddlZddlm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jejdZejejejejdZdd Zg de_i e_ i e_!i e_"dd Z#g de#_ejejde#_ i e#_!i e#_"dd Z$g de$_i e$_ i e$_!i e$_"dd Z%g de%_i e%_ i e%_!i e%_"dd Z&ddge&_ejejejde&_ dhe&_!h d e&_"d!d" Z'g d#e'_ejejejd$e'_ d%dhe'_!dhe'_"d&d' Z(d(d)ge(_ejejejd$e(_ i e(_!i e(_"G d*d+ d+Z)G d,d- d-Z*G d.d/ d/Z+G d0d1 d1Z,G d2d3 d3Z-dS )4zA Unit tests for nonlinear solvers
Author: Ondrej Certik
May 2007
    )assert_N)partial)_nonlinroot)	csr_array)diagdot)inv   )pressure_network)andersondiagbroydenlinearmixingexcitingmixingbroyden1broyden2krylov)r   r   r   r   c                 C   s@   t | j} tg d}d}| |  |t| j|   |   }|S )N)      g      ?r
         ?{Gz?)npZasarrayTr   float)xdcf r   Z/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/optimize/tests/test_nonlin.pyF!   s
    r    )r
   r
   r
   r
   r
   c                 C      | S Nr   r   r   r   r   F2/      r$   )r
   r   r            )r   r   c                 C   r!   r"   r   r#   r   r   r   F2_lucky:   r%   r)   )r   r   r   r   r   r   c                 C   s6   t g dg dg dg}t g d}||  | S )N)r
           )r
   r*   r
   )r   r
   r*   )r
   r         @)r   array)r   Abr   r   r   F3D   s   r0   )r
   r   r   c                 C   sH   d}|| d  | d  d t | d  t | d   dd|   gS )Ng     @r   r
   )r   exp)r   r.   r   r   r   	F4_powellP   s   Dr2   r*   )r   r   r   minres>   gmresbicgstabtfqmrcgsr4   c                 C   s   t | dtg dS )Nr&   )r   r   r   r   )r   r   r-   r#   r   r   r   F5`   s   r9   )       @r   r   r   )r   r   r   r8   c              	   C   sd   | \}}t ddgddgg}t |d |d d  d t |t | d	 g}t j|| S )
Ng/$gffffff-@g+,?grD0?r   r'         r
   )r   r-   sinr1   linalgsolve)r   x1Zx2ZJ0vr   r   r   F6o   s   
rB   g      gffffff?c                   @   s   e Zd ZdZdddZdddZejjdd Z	ej
d	d
d Zej
d	ejdg ddd Zej
d	dd Zdd ZdS )
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.

    r   c              
   C   s   |t d kr*dD ]!}||jv rq|||j|d |ddd}tt|| |k  q|||j|ddd}tt|| |k  d S )Nr   r5   r6   r8   r4   r7      r   )methodline_searchf_tolmaxiterverbose)rH   rI   rJ   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrH   rF   r   r   r   r   _check_nonlin_func   s   
zTestNonlin._check_nonlin_funcc              
   C   s   |dkr+dD ]$}||j v rqt||j||ddd|idd}tt|j |k  qt||j||dddd}tt|j |k  d S )	Nr   rD   rE   r   rF   )ftolrI   dispjac_optionsrF   options)rS   rI   rT   )ROOT_JAC_KSP_BADr   rM   r   r   rN   funrO   )rP   r   rF   rH   Z
jac_methodresr   r   r   _check_root   s   



zTestNonlin._check_rootc                 O   s   d S r"   r   )rP   akwr   r   r   _check_func_fail   s   zTestNonlin._check_func_failzignore::DeprecationWarningc                 C   s^   t ttttttfD ]#}t D ]}||j	 v r%|t
 v r$| || q| || qq	d S r"   )r    r$   r)   r0   r2   r9   rB   rK   values	KNOWN_BAD	MUST_WORKr^   rR   )rP   r   rQ   r   r   r   test_problem_nonlin   s   zTestNonlin.test_problem_nonlinrF   )Zlgmresr5   r6   r8   r4   r7   c              	      s:   d _  fdd}tjttj|ddd|d t j  d S )NFc                    s   d _ t|  S )NT)_tol_norm_usedr   rN   rO   r#   rP   r   r   local_norm_func   s   z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   rE   r   )rF   rH   rI   rJ   Ztol_norm)rc   nonlinnewton_krylovr    rM   r   )rP   rF   re   r   rd   r   test_tol_norm_called   s   zTestNonlin.test_tol_norm_calledc                 C   sR   t ttttttfD ]}tD ]}||jv r|t	v r| 
|| q| || qq	d S r"   )r    r$   r)   r0   r2   r9   rB   rK   r`   ra   r^   r[   )rP   r   methr   r   r   test_problem_root   s   
zTestNonlin.test_problem_rootc                 C   sN   dd }t tjj tj|dgdd W d    d S 1 s w   Y  d S )Nc                 S   s   d|  S )Ng     @@r   r#   r   r   r   wont_converge   s   z5TestNonlin.test_no_convergence.<locals>.wont_converger   r
   )rM   rI   )pytestZraisesscipyoptimizeZNoConvergencerf   rg   )rP   rk   r   r   r   test_no_convergence   s   "zTestNonlin.test_no_convergenceN)r   )__name__
__module____qualname____doc__rR   r[   rl   markZxfailr^   filterwarningsrb   Zparametrizerh   rj   ro   r   r   r   r   rC      s    





	

	rC   c                   @   s   e Zd ZdZeg deg deg deg deg deg deg deg d	gZd
d eD ZdddZdd Z	dd Z
dd Zdd Zdd ZdS )
TestSecantzDCheck that some Jacobian approximations satisfy the secant condition)      ?r:   r,         @      @)r:   r,   rx   ry   rw   )r,   rx   ry   rw   r:   )rx   ry   rw   r:   r,   )      "@rw   rz   rw   r,   )r+   rw   rz   rw   r,   )ry   ry         @rw   rw   )rw   r:   r{   ry   rw   c                 C   s   g | ]}|d  d qS )r   r
   r   ).0r   r   r   r   
<listcomp>   s    zTestSecant.<listcomp>r
   c              	   K   s6  |di |}| | jd | jd d tt| jdd | jdd D ]s\}\}}||| tt||d D ]-}| j|| d  | j||   }	| j|| d  | j||   }
tt	
|	||
 q:||kr| j|| d  | j||   }	| j|| d  | j||   }
tt	
|	||
  q%dS )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   allcloser?   )rP   jac_clsnpointsr]   jacjr   r   kdxdfr   r   r   _check_secant   s   .    zTestSecant._check_secantc                 C      |  tj d S r"   )r   rf   BroydenFirstrd   r   r   r   test_broyden1      zTestSecant.test_broyden1c                 C   r   r"   )r   rf   BroydenSecondrd   r   r   r   test_broyden2  r   zTestSecant.test_broyden2c                 C   s   t jdd}|| jd | jd d  tdd }tt| jdd  | jdd  D ]C\}\}}|| j|  }|| j|  }||t	|| d d d f |d d d f  t	|| 7 }|
|| ttj| |ddd	 q+d S )
N皙?alphar   r'   g      $r
   绽|=vIh%<=Zrtolatol)rf   r   r~   r   r   r   identityr   r   r   r   r   r   todense)rP   r   Blast_jr   r   r   r   r   r   r   test_broyden1_update  s   .8zTestSecant.test_broyden1_updatec                 C   s   t jdd}|| jd | jd d  tdd }tt| jdd  | jdd  D ]E\}\}}|| j|  }|| j|  }||t	|| d d d f |d d d f  t	|| 7 }|
|| ttj| t|ddd	 q+d S )
Nr   r   r   r'   gr
   r   r   r   )rf   r   r~   r   r   r   r   r   r   r   r   r   r   r   r	   )rP   r   Hr   r   r   r   r   r   r   r   test_broyden2_update  s   .8 zTestSecant.test_broyden2_updatec                 C   s   | j tjdddd d S )Nr   r   )MZw0r   )r   rf   Andersonrd   r   r   r   test_anderson!  s   zTestSecant.test_andersonN)r
   )rp   rq   rr   rs   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   rv      s$    
rv   c                   @   sR   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )
TestLinearz]Solve a linear equation;
    some methods find the exact solution in a finite number of stepsFc              	      s   t jd t j|| |r dt j||   t j||r,dt j|   fdd}tj|t |||dd dd}tt jt	 |dd d S )	N{                 ?c                    s   t  |  S r"   r   r#   r.   r/   r   r   rQ   7     zTestLinear._check.<locals>.funcư>r   rI   rH   rG   rJ   r   )
r   randomseedZrandnrf   nonlin_solvezerosr   r   r   )rP   r   NrI   complexr]   rQ   solr   r   r   _check-  s   zTestLinear._checkc                 C   4   |  tjddddd |  tjddddd d S Nrw   r      )   FT)r   rf   r   rd   r   r   r   r   >     zTestLinear.test_broyden1c                 C   r   r   )r   rf   r   rd   r   r   r   r   C  r   zTestLinear.test_broyden2c                 C   s8   |  tjdddddd |  tjdddddd d S )N2   rw   )r   r   r      FT)r   rf   r   rd   r   r   r   r   H  s   zTestLinear.test_andersonc                 C   s0   | j tjddddd | j tjddddd d S )Nr   r   F
   )Zinner_mT)r   rf   KrylovJacobianrd   r   r   r   test_krylovM  s   zTestLinear.test_krylovc              	      s    fdd} fdd}t j|tjd |ddd dd}tjj | dd	 t j|tjd  ddd dd}tjj | dd	 d S )
Nc                    s     |  S r"   r   r#   r   r   r   rQ   S  r   z'TestLinear._check_autojac.<locals>.funcc                    s    S r"   r   )rA   r.   r   r   r   V  r%   z&TestLinear._check_autojac.<locals>.jacr   r   r   r   r   )rf   r   r   r   shapeZtestingZassert_allclose)rP   r.   r/   rQ   r   r   r   r   r   _check_autojacR  s   zTestLinear._check_autojacc                 C   sF   t ddgddgg}tddg}| || | d| d|  d S Nr
   r   r3   y      ?       @y       @       @)r   r   r-   r   rP   r.   r/   r   r   r   test_jac_sparsea  s   zTestLinear.test_jac_sparsec                 C   sH   t ddgddgg}t ddg}| || | d| d|  d S r   )r   r-   r   r   r   r   r   test_jac_ndarrayg  s   zTestLinear.test_jac_ndarrayN)F)rp   rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   )  s    
r   c                   @   sd   e Zd ZdZdddZdddZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zejjdd ZdS )TestJacobianDotSolvezP
    Check that solve/dot methods in Jacobian approximations are consistent
    Nc                 C   s   |d d t || S )Nr   r
   )r   r   )rP   r   r.   r   r   r   _funcs  s   zTestJacobianDotSolve._funcFr   c                    s  t jdd} fdd}fdd}|||}|}	|di |}
|
|	| |	|t| j|d td| D ]}||}t|
d	rt 	|
}t|
d
rc|

|}t j
||}|||d t|
dr}|
|}t j
|j |}|||d t|
dr|
|}t ||}|||d t|
dr|
|}t |j |}|||d t|
drt|
d
r|
|}|

|
|}|||d t|
drt|
dr|
|}|
|
|}|||d ||}|
|| || q<d S )Nr   r;   c                     s$   j |  } r|dj |    }|S )Nr   )rand)r\   q)r   rngr   r   r   {  s   
z-TestJacobianDotSolve._check_dot.<locals>.randc                    sD   t | |  } t |    }||kr t| d|dd S )Nz: err g)absrO   AssertionError)r\   r/   msgr   r   )tolr   r   assert_close  s
   z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   r   Z	__array__r?   zsolve vs arrayrsolvezrsolve vs arraymatveczdot vs arrayrmatveczrmatvec vs arrayzdot vs solvezrmatvec vs rsolver   )r   r   ZRandomStater   r~   r   r   r   hasattrr-   r?   r>   r   r   Zconjr   r   r   r   )rP   r   r   r   r]   r   r   r   r.   Zx0r   r   rA   ZJdZGvZGv2ZJvZJv2r   r   )r   r   r   r   
_check_dotv  sN   

 











zTestJacobianDotSolve._check_dotc                 C   $   | j tjdd | j tjdd d S NF)r   T)r   rf   r   rd   r   r   r   r        z"TestJacobianDotSolve.test_broyden1c                 C   r   r   )r   rf   r   rd   r   r   r   r     r   z"TestJacobianDotSolve.test_broyden2c                 C   r   r   )r   rf   r   rd   r   r   r   r     r   z"TestJacobianDotSolve.test_andersonc                 C   r   r   )r   rf   ZDiagBroydenrd   r   r   r   test_diagbroyden  r   z%TestJacobianDotSolve.test_diagbroydenc                 C   r   r   )r   rf   ZLinearMixingrd   r   r   r   test_linearmixing  r   z&TestJacobianDotSolve.test_linearmixingc                 C   r   r   )r   rf   ZExcitingMixingrd   r   r   r   test_excitingmixing  r   z(TestJacobianDotSolve.test_excitingmixingc                 C   s(   | j tjddd | j tjddd d S )NFgMbP?)r   r   T)r   rf   r   rd   r   r   r   r     s   z TestJacobianDotSolve.test_krylovr"   )Fr   )rp   rq   rr   rs   r   r   r   r   r   r   r   r   rl   rt   Zthread_unsafer   r   r   r   r   r   n  s    

<r   c                   @   sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )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                 C   @   t jttjddd}tt |dk  tt t|dk  d S N   r
   iterr   &.>)rf   r   r    rM   r   normrP   r   r   r   r   r        z TestNonlinOldTests.test_broyden1c                 C   r   r   )rf   r   r    rM   r   r   r   r   r   r   r     r   z TestNonlinOldTests.test_broyden2c                 C   s,   t jttjdddd}tt |dk  d S )Nr   Q?r'   )r   r   r   Q?)rf   r   r    rM   r   r   r   r   r   r   r     s   z TestNonlinOldTests.test_andersonc                 C   r   )N<   r   r   Hz>)rf   r   r    rM   r   r   r   r   r   r   r     r   z$TestNonlinOldTests.test_linearmixingc                 C   r   )Nr   r   r   h㈵>)rf   r   r    rM   r   r   r   r   r   r   test_exciting  r   z TestNonlinOldTests.test_excitingc                 C   r   )N   r
   r   :0yE>)rf   r   r    rM   r   r   r   r   r   r   r     r   z#TestNonlinOldTests.test_diagbroydenc                 C   H   t ttjddddidd}tt|jdk  tt|jdk  d S )Nr   r   r   r
   nitrU   rV   r   r   r    rM   r   rf   r   r   rY   rP   rZ   r   r   r   test_root_broyden1  
   
z%TestNonlinOldTests.test_root_broyden1c                 C   r   )Nr   r   r   r
   r   rV   r   r   r   r   r   r   test_root_broyden2  r   z%TestNonlinOldTests.test_root_broyden2c                 C   s6   t ttjddddddd}tt|jdk  d S )	Nr   r   r   r'   )r   r   r   rV   r   )r   r    rM   r   rf   r   r   r   r   r   r   test_root_anderson  s   
z%TestNonlinOldTests.test_root_andersonc                 C   r   )Nr   r   r   r   r   rV   r   r   r   r   r   r   test_root_linearmixing     
z)TestNonlinOldTests.test_root_linearmixingc                 C   r   )Nr   r   r   r   r   rV   r   r   r   r   r   r   test_root_excitingmixing  r   z+TestNonlinOldTests.test_root_excitingmixingc                 C   r   )Nr   r   r   r
   r   rV   r   r   r   r   r   r   test_root_diagbroyden  r   z(TestNonlinOldTests.test_root_diagbroydenN)rp   rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    r   ).rs   Znumpy.testingr   rl   	functoolsr   Zscipy.optimizer   rf   r   Zscipy.sparser   numpyr   r   Znumpy.linalgr	   r   rm   Ztest_minpackr   r   r   r   r   r   r   rg   rK   ra   r    rM   r`   rL   rX   r$   r)   r0   r2   r9   rB   rC   rv   r   r   r   r   r   r   r   <module>   s    








	XLEb