U
    »mœd*f  ã                   @   sØ   d dl Z d dlZd dlmZmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ d dlmZ G dd	„ d	ƒZG d
d„ deƒZG dd„ dƒZG dd„ deƒZdd„ Zdd„ Zdd„ ZdS )é    N)ÚTestCaseÚassert_array_almost_equalÚassert_array_equalÚassert_Úassert_allcloseÚassert_equal)Ú
csr_matrix)ÚLinearOperator)ÚScalarFunctionÚVectorFunctionÚLinearVectorFunctionÚIdentityVectorFunction)ÚrosenÚ	rosen_derÚ
rosen_hess)ÚBFGSc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚExScalarFunctionc                 C   s   d| _ d| _d| _d S ©Nr   )ÚnfevÚngevÚnhev©Úself© r   úk/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_differentiable_functions.pyÚ__init__   s    zExScalarFunction.__init__c                 C   s6   |  j d7  _ d|d d |d d  d  |d  S )Né   é   r   )r   ©r   Úxr   r   r   Úfun   s    zExScalarFunction.func                 C   s0   |  j d7  _ t d|d  d d|d  g¡S )Nr   é   r   )r   ÚnpÚarrayr   r   r   r   Úgrad   s    zExScalarFunction.gradc                 C   s   |  j d7  _ dt d¡ S )Nr   r!   r   )r   r"   Úeyer   r   r   r   Úhess   s    zExScalarFunction.hessN)Ú__name__Ú
__module__Ú__qualname__r   r    r$   r&   r   r   r   r   r      s   r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestScalarFunctionc              	   C   sæ  t ƒ }d}d}ddg}t|j|d|j|jd tj tjfƒ}|d7 }|d7 }t|j|ƒ t|j|ƒ t|j	|ƒ t|j	|ƒ t|j|dd|jd tj tjfƒ}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ t|j
|j
ƒ t|j|jƒ dd	g}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ t||
ƒ t|	|ƒ d
dg}| |¡}	|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ | |¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ t|	|ƒ dd	g}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ t||
ƒ t|	|ƒ dd	g}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|j	 |ƒ t||
ƒ t|	|ƒ d S )Nr   ç      ð?ç        r   r   ú2-pointé   é
   ç333333Ó?ç       @ç      @r   )r   r
   r    r$   r&   r"   Úinfr   r   r   Úfr   Úg)r   Úexr   r   Úx0ÚanalitÚapproxr   Úf_analitZg_analitÚf_approxZg_approxr   r   r   Útest_finite_difference_grad&   s¶      ÿ  ÿ



















z.TestScalarFunction.test_finite_difference_gradc              	   C   s4  t ƒ }dd„ }ddg}t|j|d|j|jd tj tjfƒ}| |¡| |¡f}|| |¡|ƒ |jdkslt	‚d|d< | |¡| |¡f}|| |¡|ƒ ddg}t|j|dd|jd tj tjfƒ}|jdksÐt	‚| |¡| |¡f}|| |¡|ƒ |jdk�st	‚d|d< | |¡| |¡f}|| |¡|ƒ d S )	Nc                 S   s(   t | d |d ƒ t | d |d ƒ d S )Nr   r   )r   )r   Úyr   r   r   Úfg_allclose†   s    z9TestScalarFunction.test_fun_and_grad.<locals>.fg_allcloser1   r0   r   r   r+   ú3-point)
r   r
   r    r$   r&   r"   r3   Zfun_and_gradr   ÚAssertionError)r   r6   r>   r7   r8   ZfgÚsfr   r   r   Útest_fun_and_gradƒ   s6      ÿ  ÿz$TestScalarFunction.test_fun_and_gradc              	   C   sP  t ƒ }d}d}d}ddg}t|j|d|j|jd tj tjfƒ}|d7 }|d7 }|d7 }t|j|ƒ t|j|ƒ t|j	|ƒ t|j	|ƒ t|j
|ƒ t|j
|ƒ t|j|d|jdd tj tjfƒ}tt|jtƒƒ ddgdd	gd
dgfD ]:}t|j|jƒ t|j|jƒ t|j |¡|j |¡ƒ qæ|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}	| |	¡}
|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |	¡}tt|tƒƒ ddgdd	gd
dgfD ]}t|
 |¡| |¡ƒ �q.|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}	| |	¡}
|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |	¡}tt|tƒƒ ddgdd	gd
dgfD ]}t|
 |¡| |¡ƒ �qP|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}	| |	¡}| |	¡}
|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |	¡}| |	¡}tt|tƒƒ ddgdd	gd
dgfD ]}t|
 |¡| |¡ƒ �qŽ|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}	| |	¡}| |	¡}
|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |	¡}| |	¡}tt|tƒƒ ddgdd	gd
dgfD ]}t|
 |¡| |¡ƒ �qÌ|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ d S )Nr   r+   r,   r   r   r-   r1   ç      @ç      @ç      @r!   çÍÌÌÌÌÌ @ç333333ó?r2   r0   çÍÌÌÌÌÌ@çffffff@)r   r
   r    r$   r&   r"   r3   r   r   r   r   r   Ú
isinstanceÚHr	   r4   r   r5   Údot)r   r6   r   r   r   r7   r8   r9   Úvr   ÚH_analitÚH_approxÚ_r   r   r   Ú+test_finite_difference_hess_linear_operator¤   sö      ÿ  ÿ











z>TestScalarFunction.test_finite_difference_hess_linear_operatorc              	   C   sÜ  dd„ }t  dddg¡}t||dddd	„ d t j t jfƒ}||jk	sHt‚t| |¡d
ƒ ||jk	sft‚d|d< | |¡}t|dƒ d|d< | |¡}t|d
ƒ ||jk	s¬t‚tƒ }t  dddg¡}t||dd|d t j t jfƒ}||jk	sît‚t| |¡d
ƒ ||jk	�st‚d|d< | |¡}t|dƒ d|d< | |¡}t|d
ƒ ||jk	�sVt‚dd„ }t  dddg¡}t||dddd	„ d t j t jfƒ}||jk	�s t‚t| |¡d
ƒ t|jt  dddg¡ƒ ||jk	�sØt‚d S )Nc                 S   s   t  t  | ¡d ¡S )Nr   )r"   ÚsumZasarray©r   r   r   r   r4   %  s    z4TestScalarFunction.test_x_storage_overlap.<locals>.fr+   r1   rC   r   r?   c                 S   s   | S ©Nr   rS   r   r   r   Ú<lambda>)  ó    z;TestScalarFunction.test_x_storage_overlap.<locals>.<lambda>g      ,@r,   r   g      *@r   c                 S   s   | | 9 } t  | ¡S rT   )r"   rR   rS   r   r   r   ÚffK  s    z5TestScalarFunction.test_x_storage_overlap.<locals>.ffc                 S   s   | S rT   r   rS   r   r   r   rU   Q  rV   )	r"   r#   r
   r3   r   r@   r   r    r   )r   r4   r   rA   Úf1Úf2r&   rW   r   r   r   Útest_x_storage_overlap   sR    "







      ÿz)TestScalarFunction.test_x_storage_overlapc              	   C   sö   t  dddg¡}tt|dttd d ƒ}| dddg¡ | |¡ | dddg¡ | dddg¡ t|j	dƒ t|j
dddgƒ tt|dd	td t j t jfƒ}| dddg¡ | |¡ | dddg¡ | dddg¡ t|j	dƒ t|j
dddgƒ d S )
Nr   r.   r!   r   r   g)\�Âõ(ð?r+   r,   r-   )r"   r#   r
   r   r   r   r    r$   r   Z	_lowest_fZ	_lowest_xr3   )r   r7   rA   r   r   r   Útest_lowest_xX  s*     ÿ
 ÿ
z TestScalarFunction.test_lowest_xN)r'   r(   r)   r<   rB   rQ   rZ   r[   r   r   r   r   r*   $   s
   ]!|8r*   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚExVectorialFunctionc                 C   s   d| _ d| _d| _d S r   )r   Únjevr   r   r   r   r   r   p  s    zExVectorialFunction.__init__c                 C   sh   |  j d7  _ t d|d d |d d  d  |d  d|d d |d d  d  d|d   g¡S )Nr   r   r   r!   r.   )r   r"   r#   r   r   r   r   r    u  s    **ÿzExVectorialFunction.func                 C   sP   |  j d7  _ t d|d  d d|d  gd|d d  d d|d  gg¡S )Nr   r!   r   é   r   r.   é   )r]   r"   r#   r   r   r   r   Újacz  s    ÿzExVectorialFunction.jacc                 C   sJ   |  j d7  _ |d d t d¡ |d t d|d  dgddgg¡  S )Nr   r   r!   r   é   r_   )r   r"   r%   r#   )r   r   rM   r   r   r   r&     s    ,ÿzExVectorialFunction.hessN)r'   r(   r)   r   r    r`   r&   r   r   r   r   r\   n  s   r\   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestVectorialFunctionc              	   C   s2  t ƒ }d}d}ddg}t|j||j|jd d tj tjfd ƒ}|d7 }|d7 }t|j|ƒ t|j|ƒ t|j	|ƒ t|j	|ƒ t|j|d|jd d tj tjfd ƒ}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|j
ƒ t|j|jƒ ddg}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t||
ƒ t|	|d	d
� ddg}| |¡}	|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ | |¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|	|ƒ ddg}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t||
ƒ t|	|ƒ ddg}| |¡}| |¡}	|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ | |¡}
| |¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t||
ƒ t|	|ƒ d S )Nr   r+   r,   r   r-   r.   r/   r0   r!   ©Údecimalr1   r2   r   )r\   r   r    r`   r&   r"   r3   r   r   r]   r4   r   ÚJ)r   r6   r   r]   r7   r8   r9   r   r:   ZJ_analitr;   ZJ_approxr   r   r   Útest_finite_difference_jac‡  sº     ÿ ÿ


















z0TestVectorialFunction.test_finite_difference_jacc              	   C   sˆ  t ƒ }d}d}d}ddg}ddg}t|j||j|jd d tj tjfd ƒ}|d7 }|d7 }|d7 }t|j|ƒ t|j|ƒ t|j	|ƒ t|j	|ƒ t|j
|ƒ t|j
|ƒ t|j||jdd d tj tjfd ƒ}tt|jtƒƒ ddgddgd	dgfD ]:}	t|j|jƒ t|j|jƒ t|j |	¡|j |	¡ƒ qò|d7 }|d
7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}
| |
|¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |
|¡}tt|tƒƒ ddgddgd	dgfD ] }	t| |	¡| |	¡dd� �q>|d
7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}
ddg}| |
|¡}|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |
|¡}tt|tƒƒ ddgddgd	dgfD ]}t| |¡| |¡ƒ �qp|d
7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}
| |
¡}| |
|¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |
¡}| |
|¡}tt|tƒƒ ddgddgd	dgfD ] }t| |¡| |¡d
d� �q²|d
7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ ddg}
ddg}| |
¡}| |
|¡}|d7 }|d7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ | |
¡}| |
|¡}tt|tƒƒ ddgddgd	dgfD ] }t| |¡| |¡d
d� �q |d
7 }t|j|ƒ t|j|j |ƒ t|j	|ƒ t|j	|j	 |ƒ t|j
|ƒ t|j
|j
 |ƒ d S )Nr   r+   r,   r1   r   r-   rC   rD   rE   r!   é   rc   rF   rG   r2   r0   rH   rI   )r\   r   r    r`   r&   r"   r3   r   r   r]   r   r   rJ   rK   r	   r4   r   re   rL   )r   r6   r   r]   r   r7   Zv0r8   r9   Úpr   rN   rO   rM   rP   r   r   r   rQ   ç  sü     ÿ ÿÿ




zATestVectorialFunction.test_finite_difference_hess_linear_operatorc              	   C   s¤  t ƒ }t ddg¡}t|j|d|jd d tj tjfd ƒ}||jk	sFt‚t	| |¡| |¡ƒ ||jk	sjt‚d|d< t	| |¡| |¡ƒ ||jk	s–t‚d|d< t	| |¡| |¡ƒ ||jk	sÂt‚t
ƒ }t ddg¡}t|j|d|d d tj tjfd ƒ}t t¡�˜ ||jk	�st‚t	| |¡| |¡ƒ ||jk	�s:t‚d|d< t	| |¡| |¡ƒ ||jk	�sht‚d|d< t	| |¡| |¡ƒ ||jk	�s–t‚W 5 Q R X d S )Nr+   r,   r?   r1   r   )r\   r"   r#   r   r    r&   r3   r   r@   r   r   ÚpytestZwarnsÚUserWarning)r   r6   r7   Zvfr&   r   r   r   rZ   g  s>     ÿ ÿz,TestVectorialFunction.test_x_storage_overlapN)r'   r(   r)   rf   rQ   rZ   r   r   r   r   rb   …  s   ` rb   c                  C   sJ  t  dddgdddgg¡} t  d¡}t| ƒ}t  dddg¡}t  ddg¡}t  ddg¡}t| |d ƒ}t|j ƒ t| |d	ƒ}t|jƒ t| |d
ƒ}t|j ƒ t||d ƒ}	t|	jƒ t||d	ƒ}
t|
jƒ t||d
ƒ}t|j ƒ t| |¡|ƒ t| |¡|ƒ t| 	|¡| ƒ t| 	|¡ 
¡ | 
¡ ƒ t| ||¡ 
¡ t  d¡ƒ d S )Néÿÿÿÿr   r   r!   r.   r   éýÿÿÿéüÿÿÿTF©r.   r.   )r"   r#   Úzerosr   r   r   Úsparse_jacobianr   r    r`   Útoarrayr&   )ZA_denser7   ZA_sparser   rM   ZAxrX   rY   Úf3Zf4Zf5Zf6r   r   r   Útest_LinearVectorFunction“  s4    þ



rs   c                  C   s¾   t  dddgdddgg¡} t  dddg¡}t| |dƒ}t||jƒ t|  |¡|jƒ t  dddg¡}t| | |¡ƒ t||jƒ t|  |¡|jƒ t|  |¡| |¡ƒ t|  |¡|jƒ d S )	Nrk   r   r   r!   r   Fr.   r/   )	r"   r#   r   r   r   rL   r4   r`   r    )ÚAr7   r    Úx1r   r   r   Ú%test_LinearVectorFunction_memoization·  s    rv   c                  C   sØ   t  d¡} t| d ƒ}t| dƒ}t| dƒ}t|jƒ t|j ƒ t|jƒ t  dddg¡}t  dddg¡}t| |¡|ƒ t| |¡|ƒ t| |¡ 	¡ t  
d¡ƒ t| |¡t  
d¡ƒ t| ||¡ 	¡ t  d	¡ƒ d S )
Nr.   FTrk   r   r   éþÿÿÿr   rn   )r"   ro   r   r   rp   r#   r   r    r`   rq   r%   r&   )r7   rX   rY   rr   r   rM   r   r   r   Útest_IdentityVectorFunctionÇ  s    





rx   ) ri   Únumpyr"   Znumpy.testingr   r   r   r   r   r   Zscipy.sparser   Zscipy.sparse.linalgr	   Z(scipy.optimize._differentiable_functionsr
   r   r   r   Zscipy.optimizer   r   r   Z'scipy.optimize._hessian_update_strategyr   r   r*   r\   rb   rs   rv   rx   r   r   r   r   Ú<module>   s$      L  $