o
    i1B                     @   s  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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.d/ d/Z'G d0d1 d1Z(dS )2zA 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                 C   s@   t | j} tg d}d}| |  |t| j|   |   }|S )N)      g      ?r         ?{Gz?)npZasarrayTr   float)xdcf r   o/var/www/html/eduruby.in/lip-sync/lip-sync-env/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_lucky4   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   g        )r   r(   r   )r   r   r(   )r   r   g      @)r   array)r   Abr   r   r   F3>   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_powellJ   s   Dr.   r(   )r   r   r   minres>   gmrescgsbicgstabr0   tfqmrc                 C   s   t | dtg dS )Nr$   )r   r   r   r   )r	   r   r)   r!   r   r   r   F5Z   s   r5   )g       @r   r   r   )r   r   r   r2   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   F6i   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	d	d
 Z
ejdg 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   r1   r3   r2   r0   r4      r   )methodline_searchf_tolmaxiterverbose)rC   rD   rE   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrC   rA   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   r?   r@   r   rA   )ftolrD   dispjac_optionsrA   options)rN   rD   rO   )ROOT_JAC_KSP_BADr   rH   r   r   rI   funrJ   )rK   r   rA   rC   Z
jac_methodresr   r   r   _check_root   s   



zTestNonlin._check_rootc                 O   s   d S r    r   )rK   akwr   r   r   _check_func_fail   s   zTestNonlin._check_func_failc                 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'   r,   r.   r5   r=   rF   values	KNOWN_BAD	MUST_WORKrY   rM   )rK   r   rL   r   r   r   test_problem_nonlin   s   zTestNonlin.test_problem_nonlinrA   )Zlgmresr1   r3   r2   r0   r4   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   rI   rJ   r!   rK   r   r   local_norm_func   s   z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   r@   r   )rA   rC   rD   rE   Ztol_norm)r^   nonlinnewton_krylovr   rH   r   )rK   rA   r`   r   r_   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'   r,   r.   r5   r=   rF   r[   r\   rY   rV   )rK   r   methr   r   r   test_problem_root   s   
zTestNonlin.test_problem_rootN)r   )__name__
__module____qualname____doc__rM   rV   pytestmarkZxfailrY   r]   Zparametrizerc   re   r   r   r   r   r>      s    


	
r>   c                   @   s   e Zd ZdZeg deeg deeg deeg deeg deeg deeg deeg d	e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$   r%   )r   r   r$   r%   r   )r   r$   r%   r   r   )r$   r%   r   r   r   )	   r   rm   r   r   )r   r   rm   r   r   )r%   r%   r6   r   r   )r   r   r6   r%   r   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:   )rK   jac_clsnpointsrX   jacjr   r   kdxdfr   r   r   _check_secant   s   .    zTestSecant._check_secantc                 C      |  tj d S r    )r   ra   BroydenFirstr_   r   r   r   test_broyden1      zTestSecant.test_broyden1c                 C   r   r    )r   ra   BroydenSecondr_   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)ra   r   rp   rq   rr   r   identityrs   rt   r   ru   r   rx   todense)rK   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   )ra   r   rp   rq   rr   r   r   rs   rt   r   ru   r   rx   r   r   )rK   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w0rz   )r   ra   Andersonr_   r   r   r   test_anderson  s   zTestSecant.test_andersonN)r   )rf   rg   rh   ri   r   r)   r   rq   rr   r   r   r   r   r   r   r   r   r   r   rl      s$    
rl   c                   @   s:   e Zd ZdZd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   rL   '  s   zTestLinear._check.<locals>.funcư>r   )rD   rC   rB   rE   )r   )
r   randomseedZrandnra   Znonlin_solveZzerosr   rx   r   )rK   r{   NrD   complexrX   rL   Z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 N      ?r      )   FT)r   ra   r   r_   r   r   r   r   .     zTestLinear.test_broyden1c                 C   r   r   )r   ra   r   r_   r   r   r   r   3  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   r   )r   r   r      FT)r   ra   r   r_   r   r   r   r   8  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   ra   KrylovJacobianr_   r   r   r   test_krylov=  s   zTestLinear.test_krylovN)F)	rf   rg   rh   ri   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 )TestJacobianDotSolvezFCheck that solve/dot methods in Jacobian approximations are consistentc                 C   s   |d d t | j| S )Nr   r   )r   r   r*   rK   r   r   r   r   _funcF  s   zTestJacobianDotSolve._funcFr   c                    s  t jd d} fdd}fdd}|||| _t j|}|di |}	|	|| || j td| D ]}
||}t|	drt 	|	}t|	d	r_|	
|}t j
||}|||d
 t|	dry|	|}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 ||}|	|| | q8d S )Nr   r6   c                     s(   t jj|  } r|dt jj|    }|S )Nr   )r   r   rand)rW   qr   r   r   r   N  s   z-TestJacobianDotSolve._check_dot.<locals>.randc                    sD   t | |  } t |    }||kr t| d|dd S )Nz: err g)absrJ   AssertionError)rW   r+   msgr   r   )tolr   r   assert_closeT  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 rsolver   )r   r   r   r*   r   rp   r   rv   hasattrr)   r:   r9   r   r   Zconjr   r   r   ru   )rK   ry   r   r   rX   r   r   r   Zx0r{   r}   r<   ZJdZGvZGv2ZJvZJv2r   r   r   r   r   
_check_dotI  sN   











zTestJacobianDotSolve._check_dotc                 C   $   | j tjdd | j tjdd d S NFr   T)r   ra   r   r_   r   r   r   r        z"TestJacobianDotSolve.test_broyden1c                 C   r   r   )r   ra   r   r_   r   r   r   r     r   z"TestJacobianDotSolve.test_broyden2c                 C   r   r   )r   ra   r   r_   r   r   r   r     r   z"TestJacobianDotSolve.test_andersonc                 C   r   r   )r   ra   ZDiagBroydenr_   r   r   r   test_diagbroyden  r   z%TestJacobianDotSolve.test_diagbroydenc                 C   r   r   )r   ra   ZLinearMixingr_   r   r   r   test_linearmixing  r   z&TestJacobianDotSolve.test_linearmixingc                 C   r   r   )r   ra   ZExcitingMixingr_   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   T)r   ra   r   r_   r   r   r   r     s   z TestJacobianDotSolve.test_krylovN)Fr   )rf   rg   rh   ri   r   r   r   r   r   r   r   r   r   r   r   r   r   r   C  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   &.>)ra   r   r   rH   r   normr   r   r   r   r        z TestNonlinOldTests.test_broyden1c                 C   r   r   )ra   r   r   rH   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?)ra   r
   r   rH   r   r   r   r   r   r   r     s   z TestNonlinOldTests.test_andersonc                 C   r   )N<   r   r   Hz>)ra   r   r   rH   r   r   r   r   r   r   r     r   z$TestNonlinOldTests.test_linearmixingc                 C   r   )Nr   r   r   h㈵>)ra   r   r   rH   r   r   r   r   r   r   test_exciting  r   z TestNonlinOldTests.test_excitingc                 C   r   )N   r   r   :0yE>)ra   r   r   rH   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   nitrP   rQ   r   r   r   rH   r   ra   r   r   rT   rK   rU   r   r   r   test_root_broyden1  
   
z%TestNonlinOldTests.test_root_broyden1c                 C   r   )Nr   r   r   r   r   rQ   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   rQ   r   )r   r   rH   r   ra   r   r   r   r   r   r   test_root_anderson  s   
z%TestNonlinOldTests.test_root_andersonc                 C   r   )Nr   r   r   r   r   rQ   r   r   r   r   r   r   test_root_linearmixing     
z)TestNonlinOldTests.test_root_linearmixingc                 C   r   )Nr   r   r   r   r   rQ   r   r   r   r   r   r   test_root_excitingmixing  r   z+TestNonlinOldTests.test_root_excitingmixingc                 C   r   )Nr   r   r   r   r   rQ   r   r   r   r   r   r   test_root_diagbroyden  r   z(TestNonlinOldTests.test_root_diagbroydenN)rf   rg   rh   ri   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    r   ))ri   Znumpy.testingr   rj   Zscipy.optimizer   ra   r   numpyr   r   Znumpy.linalgr   r   Ztest_minpackr	   r
   r   r   r   r   r   rb   rF   r\   r   rH   r[   rG   rS   r"   r'   r,   r.   r5   r=   r>   rl   r   r   r   r   r   r   r   <module>   s    








	NL*_