o
    4Bi=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?)npasarrayTr   float)xdcf r   `/var/www/html/Trade-python/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_lucky9   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   F3C   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_powellO   s   Dr2   r*   )r   r   r   minres>   cgsgmrestfqmrr4   bicgstabc                 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   r5   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   x1x2J0vr   r   r   F6n   s   
rD   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   r6   r8   r5   r4   r7      r   )methodline_searchf_tolmaxiterverbose)rJ   rK   rL   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrJ   rH   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   rF   rG   r   rH   )ftolrK   dispjac_optionsrH   options)rU   rK   rV   )ROOT_JAC_KSP_BADr   rO   r   r   rP   funrQ   )rR   r   rH   rJ   
jac_methodresr   r   r   _check_root   s   



zTestNonlin._check_rootc                 O   s   d S r"   r   )rR   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   rD   rM   values	KNOWN_BAD	MUST_WORKra   rT   )rR   r   rS   r   r   r   test_problem_nonlin   s   zTestNonlin.test_problem_nonlinrH   )lgmresr6   r8   r5   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   rP   rQ   r#   rR   r   r   local_norm_func   s   z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   rG   r   )rH   rJ   rK   rL   tol_norm)rg   nonlinnewton_krylovr    rO   r   )rR   rH   ri   r   rh   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   rD   rM   rc   rd   ra   r^   )rR   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	   )rO   rK   )pytestraisesscipyoptimizeNoConvergencerk   rl   )rR   rp   r   r   r   test_no_convergence   s   "zTestNonlin.test_no_convergenceN)r   )__name__
__module____qualname____doc__rT   r^   rq   markxfailra   filterwarningsre   parametrizerm   ro   rv   r   r   r   r   rE      s    





	

	rE   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,   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                 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?   )rR   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   rk   BroydenFirstrh   r   r   r   test_broyden1      zTestSecant.test_broyden1c                 C   r   r"   )r   rk   BroydenSecondrh   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%<=rtolatol)rk   r   r   r   r   r   identityr   r   r   r   r   r   todense)rR   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   )rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rR   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   )Mw0r   )r   rk   Andersonrh   r   r   r   test_anderson   s   zTestSecant.test_andersonN)r	   )rw   rx   ry   rz   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r      s$    
r   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   rS   6     zTestLinear._check.<locals>.funcư>r   rK   rJ   rI   rL   r   )
r   randomseedrandnrk   nonlin_solvezerosr   r   r   )rR   r   NrK   complexr`   rS   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 Nr   r      )   FT)r   rk   r   rh   r   r   r   r   =     zTestLinear.test_broyden1c                 C   r   r   )r   rk   r   rh   r   r   r   r   B  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   rk   r   rh   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
   )inner_mT)r   rk   KrylovJacobianrh   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   rS   R  r   z'TestLinear._check_autojac.<locals>.funcc                    s    S r"   r   )rC   )r.   r   r   r   U  r%   z&TestLinear._check_autojac.<locals>.jacr   r   r   r   r   )rk   r   r   r   shapetestingassert_allclose)rR   r.   r/   rS   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   r3   y      ?       @y       @       @)r   r   r-   r   rR   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)rw   rx   ry   rz   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.   rR   r   r   r   r   _funcr  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   r;   c                     s(   t jj|  } r|dt jj|    }|S )Nr   )r   r   rand)r_   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)absrQ   AssertionError)r_   r/   msgr   r   )tolr   r   assert_close  s
   z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   	__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   r   r   r   hasattrr-   r?   r>   r   r   conjr   r   r   r   )rR   r   r   r   r`   r   r   r   x0r   r   rC   JdGvGv2JvJv2r   r   r   r   r   
_check_dotu  sN   











zTestJacobianDotSolve._check_dotc                 C   $   | j tjdd | j tjdd d S NFr   T)r   rk   r   rh   r   r   r   r        z"TestJacobianDotSolve.test_broyden1c                 C   r   r   )r   rk   r   rh   r   r   r   r     r   z"TestJacobianDotSolve.test_broyden2c                 C   r   r   )r   rk   r   rh   r   r   r   r     r   z"TestJacobianDotSolve.test_andersonc                 C   r   r   )r   rk   DiagBroydenrh   r   r   r   test_diagbroyden  r   z%TestJacobianDotSolve.test_diagbroydenc                 C   r   r   )r   rk   LinearMixingrh   r   r   r   test_linearmixing  r   z&TestJacobianDotSolve.test_linearmixingc                 C   r   r   )r   rk   ExcitingMixingrh   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   rk   r   rh   r   r   r   r     s   z TestJacobianDotSolve.test_krylovN)Fr   )rw   rx   ry   rz   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   @   t jttjddd}tt |dk  tt t|dk  d S N   r	   iterr   &.>)rk   r   r    rO   r   normr   r   r   r   r        z TestNonlinOldTests.test_broyden1c                 C   r   r   )rk   r   r    rO   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?)rk   r   r    rO   r   r   r   r   r   r   r     s   z TestNonlinOldTests.test_andersonc                 C   r   )N<   r   r   Hz>)rk   r   r    rO   r   r   r   r   r   r   r     r  z$TestNonlinOldTests.test_linearmixingc                 C   r   )Nr   r   r   h㈵>)rk   r   r    rO   r   r   r   r   r   r   test_exciting  r  z TestNonlinOldTests.test_excitingc                 C   r   )N   r	   r   :0yE>)rk   r   r    rO   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	   nitrW   rX   r   r   r    rO   r   rk   r   r   r[   rR   r]   r   r   r   test_root_broyden1  
   
z%TestNonlinOldTests.test_root_broyden1c                 C   r
  )Nr   r   r   r	   r  rX   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  rX   r  )r   r    rO   r   rk   r   r   r  r   r   r   test_root_anderson  s   
z%TestNonlinOldTests.test_root_andersonc                 C   r
  )Nr   r  r   r   r  rX   r  r  r  r   r   r   test_root_linearmixing     
z)TestNonlinOldTests.test_root_linearmixingc                 C   r
  )Nr   r   r   r   r  rX   r  r  r  r   r   r   test_root_excitingmixing
  r  z+TestNonlinOldTests.test_root_excitingmixingc                 C   r
  )Nr   r  r   r	   r  rX   r	  r  r  r   r   r   test_root_diagbroyden  r  z(TestNonlinOldTests.test_root_diagbroydenN)rw   rx   ry   rz   r   r   r   r   r  r   r  r  r  r  r  r  r   r   r   r   r     s    r   ),rz   numpy.testingr   rq   scipy.optimizer   rk   r   scipy.sparser   numpyr   r   numpy.linalgr   r   rs   test_minpackr
   r   r   r   r   r   r   rl   rM   rd   r    rO   rc   rN   rZ   r$   r)   r0   r2   r9   rD   rE   r   r   r   r   r   r   r   r   <module>   s    








	XLEa