a
    h=H                     @   s*  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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 d/d0 d0Z*G d1d2 d2Z+dS )3zA 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                 C   s@   t | j} tg d}d}| |  |t| j|   |   }|S )N)      g      ?r	         ?{Gz?)npZasarrayTr   float)xdcf r   \/var/www/html/assistant/venv/lib/python3.9/site-packages/scipy/optimize/tests/test_nonlin.pyF    s
     r   )r	   r	   r	   r	   r	   c                 C   s   | S Nr   r   r   r   r   F2.   s    r"   )r	   r   r            )r   r   c                 C   s   | S r    r   r!   r   r   r   F2_lucky9   s    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   F3C   s    r-   )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_powellO   s    r/   r'   )r   r   r   minres>   r1   bicgstabtfqmrcgsgmresc                 C   s   t | dtg dS )Nr#   )r   r   r   r   )r
   r   r*   r!   r   r   r   F5_   s    r6   )       @r   r   r   )r   r   r   r4   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*   sinr.   linalgsolve)r   x1Zx2ZJ0vr   r   r   F6n   s    
r?   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rTdD ]B}||jv r q|||j|d |ddd}tt|| |k  q|||j|ddd}tt|| |k  d S )Nr   r5   r2   r4   r1   r3      r   )methodline_searchf_tolmaxiterverbose)rE   rF   rG   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrE   rC   r   r   r   r   _check_nonlin_func   s    
zTestNonlin._check_nonlin_funcc              
   C   s   |dkrVdD ]H}||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   rA   rB   r   rC   )ftolrF   dispjac_optionsrC   options)rP   rF   rQ   )ROOT_JAC_KSP_BADr   rJ   r   r   rK   funrL   )rM   r   rC   rE   Z
jac_methodresr   r   r   _check_root   s    



zTestNonlin._check_rootc                 O   s   d S r    r   )rM   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 ]F}t D ]8}||j	 v rJ|t
 v r| || q| || qqd S r    )r   r"   r&   r-   r/   r6   r?   rH   values	KNOWN_BAD	MUST_WORKr[   rO   )rM   r   rN   r   r   r   test_problem_nonlin   s    zTestNonlin.test_problem_nonlinrC   )Zlgmresr5   r2   r4   r1   r3   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   rK   rL   r!   rM   r   r   local_norm_func   s    z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   rB   r   )rC   rE   rF   rG   Ztol_norm)r`   nonlinnewton_krylovr   rJ   r   )rM   rC   rb   r   ra   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 ]0}||jv r>|t	v r| 
|| q| || qqd S r    )r   r"   r&   r-   r/   r6   r?   rH   r]   r^   r[   rX   )rM   r   methr   r   r   test_problem_root   s    
zTestNonlin.test_problem_rootc                 C   sL   dd }t tjj" tj|dgdd W d    n1 s>0    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	   )rJ   rF   )pytestZraisesscipyoptimizeZNoConvergencerc   rd   )rM   rh   r   r   r   test_no_convergence   s    zTestNonlin.test_no_convergenceN)r   )r   )__name__
__module____qualname____doc__rO   rX   ri   markZxfailr[   filterwarningsr_   Zparametrizere   rg   rl   r   r   r   r   r@      s   




	


	r@   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)      ?r7   r)         @      @)r7   r)   ru   rv   rt   )r)   ru   rv   rt   r7   )ru   rv   rt   r7   r)   )      "@rt   rw   rt   r)   )r(   rt   rw   rt   r)   )rv   rv         @rt   rt   )rt   r7   rx   rv   rt   c                 C   s   g | ]}|d  d qS )r   r	   r   ).0r   r   r   r   
<listcomp>       zTestSecant.<listcomp>r	   c              	   K   s6  |f i |}| | jd | jd d tt| jdd | jdd D ]\}\}}||| tt||d D ]Z}| j|| d  | j||   }	| j|| d  | j||   }
tt	
|	||
 qt||krJ| j|| d  | j||   }	| j|| d  | j||   }
tt	
|	||
  qJdS )z|
        Check that the given Jacobian approximation satisfies secant
        conditions for last `npoints` points.
        r   Nr	   )setupxsfs	enumeratezipupdaterangeminr   r   allcloser<   )rM   jac_clsnpointsrZ   jacjr   r   kdxdfr   r   r   _check_secant   s    .    zTestSecant._check_secantc                 C   s   |  tj d S r    )r   rc   BroydenFirstra   r   r   r   test_broyden1   s    zTestSecant.test_broyden1c                 C   s   |  tj d S r    )r   rc   BroydenSecondra   r   r   r   test_broyden2  s    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 ]\}\}}|| j|  }|| j|  }||t	|| d d d f |d d d f  t	|| 7 }|
|| ttj| |ddd	 qVd S )
N皙?alphar   r$   g      $r	   绽|=vIh%<=Zrtolatol)rc   r   r|   r}   r~   r   identityr   r   r   r   r   r   todense)rM   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 ]\}\}}|| j|  }|| j|  }||t	|| d d d f |d d d f  t	|| 7 }|
|| ttj| t|ddd	 qVd S )
Nr   r   r   r$   gr	   r   r   r   )rc   r   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   )rM   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   rc   Andersonra   r   r   r   test_anderson   s    zTestSecant.test_andersonN)r	   )rm   rn   ro   rp   r   r*   r}   r~   r   r   r   r   r   r   r   r   r   r   rs      s"   
rs   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|| |r4 dt j||   t j||rX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   rN   6  s    zTestLinear._check.<locals>.funcư>r   rF   rE   rD   rG   r   )
r   randomseedZrandnrc   nonlin_solvezerosr   r   r   )rM   r   NrF   complexrZ   rN   solr   r   r   _check,  s    zTestLinear._checkc                 C   s4   |  tjddddd |  tjddddd d S Nrt   r      )   FT)r   rc   r   ra   r   r   r   r   =  s    zTestLinear.test_broyden1c                 C   s4   |  tjddddd |  tjddddd d S r   )r   rc   r   ra   r   r   r   r   B  s    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   rt   )r   r   r      FT)r   rc   r   ra   r   r   r   r   G  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   rc   KrylovJacobianra   r   r   r   test_krylovL  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   rN   R  s    z'TestLinear._check_autojac.<locals>.funcc                    s    S r    r   )r>   )r+   r   r   r   U  s    z&TestLinear._check_autojac.<locals>.jacr   r   r   r   r   )rc   r   r   r   shapeZtestingZassert_allclose)rM   r+   r,   rN   r   r   r   r   r   _check_autojacQ  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   r0   y      ?       @y       @       @)r   r   r*   r   rM   r+   r,   r   r   r   test_jac_sparse`  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_ndarrayf  s    zTestLinear.test_jac_ndarrayN)F)rm   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   (  s   
r   c                   @   sZ   e Zd ZdZ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dd ZdS )TestJacobianDotSolvezP
    Check that solve/dot methods in Jacobian approximations are consistent
    c                 C   s   |d d t | j| S )Nr   r	   )r   r   r+   rM   r   r   r   r   _funcr  s    zTestJacobianDotSolve._funcFr   c                    s  t jd d} fdd}fdd}|||| _t j|}|f i |}	|	|| || j td| D ]|}
||}t|	drXt 	|	}t|	d	r|	
|}t j
||}|||d
 t|	dr|	|}t j
|j |}|||d t|	dr$|	|}t ||}|||d t|	drX|	|}t |j |}|||d t|	drt|	d	r|	|}|	
|	|}|||d t|	drt|	dr|	|}|	|	|}|||d ||}|	|| | qpd S )Nr   r8   c                     s(   t jj|  } r$|dt jj|    }|S )Nr   )r   r   rand)rY   qr   r   r   r   z  s    z-TestJacobianDotSolve._check_dot.<locals>.randc                    sD   t | |  } t |    }||kr@t| d|dd S )Nz: err g)absrL   AssertionError)rY   r,   msgr   r   )tolr   r   assert_close  s    z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   Z	__array__r<   zsolve vs arrayrsolvezrsolve vs arraymatveczdot vs arrayrmatveczrmatvec vs arrayzdot vs solvezrmatvec vs rsolve)r   r   r   r+   r   r|   r   r   hasattrr*   r<   r;   r   r   Zconjr   r   r   r   )rM   r   r   r   rZ   r   r   r   Zx0r   r   r>   ZJdZGvZGv2ZJvZJv2r   r   r   r   r   
_check_dotu  sL    








zTestJacobianDotSolve._check_dotc                 C   s$   | j tjdd | j tjdd d S NFr   T)r   rc   r   ra   r   r   r   r     s    z"TestJacobianDotSolve.test_broyden1c                 C   s$   | j tjdd | j tjdd d S r   )r   rc   r   ra   r   r   r   r     s    z"TestJacobianDotSolve.test_broyden2c                 C   s$   | j tjdd | j tjdd d S r   )r   rc   r   ra   r   r   r   r     s    z"TestJacobianDotSolve.test_andersonc                 C   s$   | j tjdd | j tjdd d S r   )r   rc   ZDiagBroydenra   r   r   r   test_diagbroyden  s    z%TestJacobianDotSolve.test_diagbroydenc                 C   s$   | j tjdd | j tjdd d S r   )r   rc   ZLinearMixingra   r   r   r   test_linearmixing  s    z&TestJacobianDotSolve.test_linearmixingc                 C   s$   | j tjdd | j tjdd d S r   )r   rc   ZExcitingMixingra   r   r   r   test_excitingmixing  s    z(TestJacobianDotSolve.test_excitingmixingc                 C   s(   | j tjddd | j tjddd d S )NFgMbP?r   T)r   rc   r   ra   r   r   r   r     s    z TestJacobianDotSolve.test_krylovN)Fr   )rm   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   m  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   s@   t jttjddd}tt |dk  tt t|dk  d S N   r	   iterr   &.>)rc   r   r   rJ   r   normr   r   r   r   r     s    z TestNonlinOldTests.test_broyden1c                 C   s@   t jttjddd}tt |dk  tt t|dk  d S r   )rc   r   r   rJ   r   r   r   r   r   r   r     s    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?)rc   r   r   rJ   r   r   r   r   r   r   r     s    z TestNonlinOldTests.test_andersonc                 C   s@   t jttjddd}tt |dk  tt t|dk  d S )N<   r   r   Hz>)rc   r   r   rJ   r   r   r   r   r   r   r     s    z$TestNonlinOldTests.test_linearmixingc                 C   s@   t jttjddd}tt |dk  tt t|dk  d S )Nr   r   r   h㈵>)rc   r   r   rJ   r   r   r   r   r   r   test_exciting  s    z TestNonlinOldTests.test_excitingc                 C   s@   t jttjddd}tt |dk  tt t|dk  d S )N   r	   r   :0yE>)rc   r   r   rJ   r   r   r   r   r   r   r     s    z#TestNonlinOldTests.test_diagbroydenc                 C   sH   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	   nitrR   rS   r   r   r   rJ   r   rc   r   r   rV   rM   rW   r   r   r   test_root_broyden1  s
    
z%TestNonlinOldTests.test_root_broyden1c                 C   sH   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	   r   rS   r   r   r   r   r   r   test_root_broyden2  s
    
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   rS   r   )r   r   rJ   r   rc   r   r   r   r   r   r   test_root_anderson  s    
z%TestNonlinOldTests.test_root_andersonc                 C   sH   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   r   rS   r   r   r   r   r   r   test_root_linearmixing  s    
z)TestNonlinOldTests.test_root_linearmixingc                 C   sH   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   r   rS   r   r   r   r   r   r   test_root_excitingmixing
  s    
z+TestNonlinOldTests.test_root_excitingmixingc                 C   sH   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	   r   rS   r   r   r   r   r   r   test_root_diagbroyden  s    
z(TestNonlinOldTests.test_root_diagbroydenN)rm   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   ),rp   Znumpy.testingr   ri   Zscipy.optimizer   rc   r   Zscipy.sparser   numpyr   r   Znumpy.linalgr   r   rj   Ztest_minpackr
   r   r   r   r   r   r   rd   rH   r^   r   rJ   r]   rI   rU   r"   r&   r-   r/   r6   r?   r@   rs   r   r   r   r   r   r   r   <module>   s   







	
XLEa