U
    9%e5B                     @   s8  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dddddge_i e_i e_i e_dd Zddddddge_ejejde_i e_i e_dd Zddddddge_i e_i e_i e_dd Z dddg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!_dd d!dd"he!_d#d$ Z"d%dddg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/d0 d0Z&G d1d2 d2Z'G d3d4 d4Z(dS )5zA 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   sF   t | j} tdddddg}d}| |  |t| j|   |   }|S )N      g      ?r         ?{Gz?)npZasarrayTr   float)xdcf r   _/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/scipy/optimize/tests/test_nonlin.pyF   s
     r   c                 C   s   | S Nr   r   r   r   r   F2)   s    r!   r   r            )r   r   c                 C   s   | S r   r   r    r   r   r   F2_lucky4   s    r%   c                 C   s>   t dddgdddgdddgg}t dddg}||  | S )Nr   g        r   r   g      @)r   array)r   Abr   r   r   F3>   s    "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    r,   r&   )r   r   r   minresgmresbicgstabcgstfqmrc              	   C   s   t | dtddddgS )Nr"   r   )r	   r   r'   r    r   r   r   F5Z   s    r3   g       @)r   r   r   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                	   @   sf   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ddddddg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kr q|||j|d |ddd}tt|| |k  q|||j|ddd}tt|| |k  d S )Nr   r/   r0   r1   r.   r2      r   )methodline_searchf_tolmaxiterverbose)rA   rB   rC   )SOLVERSJAC_KSP_BADxinr   r   absolutemax)selfr   funcrA   r?   r   r   r   r   _check_nonlin_func   s    
  zTestNonlin._check_nonlin_funcc              
   C   s   |dkrVdD ]H}||j k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   r?   )ftolrB   dispjac_optionsr?   options)rL   rB   rM   )ROOT_JAC_KSP_BADr   rF   r   r   rG   funrH   )rI   r   r?   rA   Z
jac_methodresr   r   r   _check_root   s    



zTestNonlin._check_rootc                 O   s   d S r   r   )rI   akwr   r   r   _check_func_fail   s    zTestNonlin._check_func_failc                 C   s^   t ttttttfD ]F}t D ]8}||j	 krJ|t
 kr| || q| || qqd S r   )r   r!   r%   r*   r,   r3   r;   rD   values	KNOWN_BAD	MUST_WORKrW   rK   )rI   r   rJ   r   r   r   test_problem_nonlin   s    zTestNonlin.test_problem_nonlinr?   Zlgmresr/   r0   r1   r.   r2   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   rG   rH   r    rI   r   r   local_norm_func   s    z8TestNonlin.test_tol_norm_called.<locals>.local_norm_funcr   r>   r   )r?   rA   rB   rC   Ztol_norm)r\   nonlinnewton_krylovr   rF   r   )rI   r?   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 ]0}||jkr>|t	kr| 
|| q| || qqd S r   )r   r!   r%   r*   r,   r3   r;   rD   rY   rZ   rW   rT   )rI   r   methr   r   r   test_problem_root   s    
zTestNonlin.test_problem_rootN)r   )r   )__name__
__module____qualname____doc__rK   rT   pytestmarkZxfailrW   r[   Zparametrizera   rc   r   r   r   r   r<      s   


	 
r<   c                   @   s   e Zd ZdZedddddgeedddddgeedddddgeedddddgeedddddgeedddddgeeddd	ddgeeddd	ddg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 conditionr   r   r   r"   r#   	   r   r4   c                 C   s   g | ]}|d  d qS )r   r   r   ).0r   r   r   r   
<listcomp>   s     zTestSecant.<listcomp>c              	   K   s2  |f |}| | 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	
|	||
 qp||krF| j|| d  | j||   }	| j|| d  | j||   }
tt	
|	||
  qFd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   allcloser8   )rI   jac_clsnpointsrV   jacjr   r   kdxdfr   r   r   _check_secant   s    
.    zTestSecant._check_secantc                 C   s   |  tj d S r   )r~   r_   BroydenFirstr]   r   r   r   test_broyden1   s    zTestSecant.test_broyden1c                 C   s   |  tj d S r   )r~   r_   BroydenSecondr]   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)r_   r   rn   ro   rp   r   identityrq   rr   r   rs   r   rv   todense)rI   ry   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   )r_   r   rn   ro   rp   r   r   rq   rr   r   rs   r   rv   r   r   )rI   ry   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w0rx   )r~   r_   Andersonr]   r   r   r   test_anderson  s    zTestSecant.test_andersonN)r   )rd   re   rf   rg   r   r'   r   ro   rp   r~   r   r   r   r   r   r   r   r   r   rj      s"   
rj   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|| |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   rJ   '  s    zTestLinear._check.<locals>.funcư>r   )rB   rA   r@   rC   )r   )
r   randomseedZrandnr_   Znonlin_solveZzerosr   rv   r   )rI   ry   NrB   complexrV   rJ   Z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 N      ?r      )   FT)r   r_   r   r]   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   r_   r   r]   r   r   r   r   3  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   r   )r   r   r      FT)r   r_   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   r_   KrylovJacobianr]   r   r   r   test_krylov=  s    zTestLinear.test_krylovN)F)	rd   re   rf   rg   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(   rI   r   r   r   r   _funcF  s    zTestJacobianDotSolve._funcFr   c                    s  t jd d} fdd}fdd}|||| _t j|}|f |}	|	|| || j td| D ]|}
||}t|	drTt 	|	}t|	d	r|	
|}t j
||}|||d
 t|	dr|	|}t j
|j |}|||d t|	dr |	|}t ||}|||d t|	drT|	|}t |j |}|||d t|	drt|	d	r|	|}|	
|	|}|||d t|	drt|	dr|	|}|	|	|}|||d ||}|	|| | qld S )Nr   r4   c                     s(   t jj|  } r$|dt jj|    }|S )Nr   )r   r   rand)rU   qr   r   r   r   N  s    z-TestJacobianDotSolve._check_dot.<locals>.randc                    s@   t | |  } t |    }||kr<td||f d S )Nz
%s: err %g)absrH   AssertionError)rU   r)   msgr   r   )tolr   r   assert_closeT  s    z5TestJacobianDotSolve._check_dot.<locals>.assert_closer   Z	__array__r8   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   rn   r   rt   hasattrr'   r8   r7   r   r   Zconjr   r   r   rs   )rI   rw   r   r   rV   r   r   r   Zx0ry   r{   r:   ZJdZGvZGv2ZJvZJv2r   r   r   r   r   
_check_dotI  sL    









zTestJacobianDotSolve._check_dotc                 C   s$   | j tjdd | j tjdd d S NFr   T)r   r_   r   r]   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   r_   r   r]   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   r_   r   r]   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   r_   ZDiagBroydenr]   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   r_   ZLinearMixingr]   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   r_   ZExcitingMixingr]   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   r_   r   r]   r   r   r   r     s    z TestJacobianDotSolve.test_krylovN)Fr   )rd   re   rf   rg   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   s@   t jttjddd}tt |dk  tt t|dk  d S N   r   iterr   &.>)r_   r   r   rF   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   )r_   r   r   rF   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?)r_   r
   r   rF   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>)r_   r   r   rF   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㈵>)r_   r   r   rF   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>)r_   r   r   rF   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   nitrN   rO   r   r   r   rF   r   r_   r   r   rR   rI   rS   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   rO   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   rO   r   )r   r   rF   r   r_   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   rO   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   rO   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   rO   r   r   r   r   r   r   test_root_diagbroyden  s    
z(TestNonlinOldTests.test_root_diagbroydenN)rd   re   rf   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   ))rg   Znumpy.testingr   rh   Zscipy.optimizer   r_   r   numpyr   r   Znumpy.linalgr   r   Ztest_minpackr	   r
   r   r   r   r   r   r`   rD   rZ   r   rF   rY   rE   rQ   r!   r%   r*   r,   r3   r;   r<   rj   r   r   r   r   r   r   r   <module>   s      

	
NL*_