o
    Ö­jIo  ã                   @   sZ  d dl Z 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 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"e j#j$e %¡ dkdd�dd„ ƒZ&e j#j$e %¡ dkdd�e j#j'dd�dd„ ƒƒZ(e j#j$e %¡ dkdd�dd „ ƒZ)dS )!é    N)ÚTestCaseÚassert_array_almost_equalÚassert_array_equalÚassert_Úassert_allcloseÚassert_equal)Úassert_deallocated)Ú
csr_matrix)ÚLinearOperator)ÚScalarFunctionÚVectorFunctionÚLinearVectorFunctionÚIdentityVectorFunction)ÚrosenÚ	rosen_derÚ
rosen_hess)ÚBFGSc                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚExScalarFunctionc                 C   ó   d| _ d| _d| _d S ©Nr   )ÚnfevÚngevÚnhev©Úself© r   úo/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_differentiable_functions.pyÚ__init__   ó   
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                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zejj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_analitÚg_analitÚf_approxÚg_approxr   r   r   Útest_finite_difference_grad(   s®   ÿÿ



















z.TestScalarFunction.test_finite_difference_gradc              	   C   s2  t ƒ }dd„ }ddg}t|j|d|j|jd tj tjfƒ}| |¡| |¡f}|| |¡|ƒ |jdks6J ‚d|d< | |¡| |¡f}|| |¡|ƒ ddg}t|j|dd|jd tj tjfƒ}|jdkshJ ‚| |¡| |¡f}|| |¡|ƒ |jdks�J ‚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_allcloser5   r4   r   r    r/   ú3-point)	r   r   r$   r(   r*   r&   r7   Úfun_and_gradr   )r   r:   rD   r;   r<   ÚfgÚsfr   r   r   Útest_fun_and_grad…   s.   ÿÿ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 |¡ƒ qs|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|
 |¡| |¡ƒ �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|
 |¡| |¡ƒ �qG|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/   r0   r   r    r1   r5   ç      @ç      @ç      @r%   çÍÌÌÌÌÌ @ç333333ó?r6   r4   çÍÌÌÌÌÌ@çffffff@)r   r   r$   r(   r*   r&   r7   r   r   r   r   r   Ú
isinstanceÚHr
   r8   r   r9   Údot)r   r:   r   r   r   r;   r<   r=   Ú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  g d¢¡}t||dddd„ d t j t jfƒ}||jus#J ‚t| |¡dƒ ||jus2J ‚d	|d
< | |¡}t|dƒ d|d
< | |¡}t|dƒ ||jusUJ ‚tƒ }t  g d¢¡}t||dd|d t j t jfƒ}||jusuJ ‚t| |¡dƒ ||jus„J ‚d	|d
< | |¡}t|dƒ d|d
< | |¡}t|dƒ ||jus§J ‚dd„ }t  g d¢¡}t||dddd„ d t j t jfƒ}||jusÊJ ‚t| |¡dƒ t|jt  g d¢¡ƒ ||jusäJ ‚d S )Nc                 S   s   t  t  | ¡d ¡S )Nr!   )r&   ÚsumÚasarray©r#   r   r   r   r8   (  s   z4TestScalarFunction.test_x_storage_overlap.<locals>.f)r/   r5   rJ   r   rE   c                 S   ó   | S ©Nr   r[   r   r   r   Ú<lambda>,  ó    z;TestScalarFunction.test_x_storage_overlap.<locals>.<lambda>g      ,@r0   r   g      *@r    c                 S   s   | | 9 } t  | ¡S r]   )r&   rY   r[   r   r   r   ÚffN  s   
z5TestScalarFunction.test_x_storage_overlap.<locals>.ffc                 S   r\   r]   r   r[   r   r   r   r^   T  r_   )r&   r'   r   r7   r#   r   r$   r   )r   r8   r#   rH   Úf1Úf2r*   r`   r   r   r   Útest_x_storage_overlap"  sF   "







ÿz)TestScalarFunction.test_x_storage_overlapc              	   C   sä   t  g d¢¡}tt|dttd d ƒ}| g d¢¡ | |¡ | g d¢¡ | g d¢¡ t|j	dƒ t|j
g d¢ƒ tt|ddtd t j t jfƒ}| g d¢¡ | |¡ | g d¢¡ | g d¢¡ t|j	dƒ t|j
g d¢ƒ d S )N©r!   r2   r%   r   )r    r    r    )g)\�Âõ(ð?r    r/   r0   )r/   r/   r/   r1   )r&   r'   r   r   r   r   r$   r(   r   Ú	_lowest_fÚ	_lowest_xr7   )r   r;   rH   r   r   r   Útest_lowest_x[  s&   ÿ
ÿ
z TestScalarFunction.test_lowest_xc              	   C   sZ   t  g d¢¡ t j¡}dd„ }t||ddtd t j t jfƒ}| |¡}|jt jks+J ‚d S )Nrd   c                 S   s   | j tjksJ ‚t| ƒS r]   )Údtyper&   Úfloat32r   r[   r   r   r   Úrosen_u  s   z2TestScalarFunction.test_float_size.<locals>.rosen_r   r1   )	r&   r'   Úastyperi   r   r   r7   r$   rh   )r   r;   rj   rH   Úresr   r   r   Útest_float_sizep  s   ÿ
z"TestScalarFunction.test_float_sizeN)r+   r,   r-   rB   rI   rX   ÚpytestÚmarkÚthread_unsaferc   rg   rm   r   r   r   r   r.   &   s    ]!|
8r.   c                   @   r   )
ÚExVectorialFunctionc                 C   r   r   )r   Únjevr   r   r   r   r   r   �  r   zExVectorialFunction.__init__c                 C   sn   |  j d7  _ tjd|d d |d d  d  |d  d|d d |d d  d  d|d   g|jd�S )Nr    r!   r   r%   r2   ©rh   )r   r&   r'   rh   r"   r   r   r   r$   †  s   **ÿÿzExVectorialFunction.func                 C   sV   |  j d7  _ tjd|d  d d|d  gd|d d  d d|d  gg|jd�S )	Nr    r%   r   é   r!   r2   é   rs   )rr   r&   r'   rh   r"   r   r   r   Újac‹  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!   é   ru   )r   r&   r)   r'   )r   r#   rT   r   r   r   r*   �  s   ,
ÿzExVectorialFunction.hessN)r+   r,   r-   r   r$   rv   r*   r   r   r   r   rq     s
    rq   c                   @   s4   e Zd Zdd„ Zdd„ Zejj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/   r0   r    r1   r2   r3   r4   r%   ©Údecimalr5   r6   r!   )rq   r   r$   rv   r*   r&   r7   r   r   rr   r8   r   ÚJ)r   r:   r   rr   r;   r<   r=   r#   r>   ÚJ_analitr@   Ú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 |	¡ƒ qy|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| |¡| |¡ƒ �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| |¡| |¡d
d� �qY|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/   r0   r5   r    r1   rJ   rK   rL   r%   é   ry   rM   rN   r6   r4   rO   rP   )rq   r   r$   rv   r*   r&   r7   r   r   rr   r   r   rQ   rR   r
   r8   r   r{   rS   )r   r:   r   rr   r   r;   Úv0r<   r=   Úpr#   rU   rV   rT   rW   r   r   r   rX   ø  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us#J ‚t| |¡| |¡ƒ ||jus5J ‚d|d< t| |¡| |¡ƒ ||jusKJ ‚d|d< t| |¡| |¡ƒ ||jusaJ ‚t	ƒ }t ddg¡}t|j|d|d d tj tjfd ƒ}t
 t¡�N ||jus‰J ‚t| |¡| |¡ƒ ||jus›J ‚d|d< t| |¡| |¡ƒ ||jus±J ‚d|d< t| |¡| |¡ƒ ||jusÇJ ‚W d   ƒ d S 1 sÒw   Y  d S )Nr/   r0   rE   r5   r   )rq   r&   r'   r   r$   r*   r7   r#   r   r   rn   ÚwarnsÚUserWarning)r   r:   r;   Úvfr*   r   r   r   rc   x  s<   ÿÿ"óz,TestVectorialFunction.test_x_storage_overlapc              	   C   sz   t ƒ }t ddg¡ tj¡}t|j||j|jd d tj	 tj	fd ƒ}| |¡}|j
tjks.J ‚| |¡}|j
tjks;J ‚d S )Nr/   r0   )rq   r&   r'   rk   ri   r   r$   rv   r*   r7   rh   )r   r:   r;   r„   rl   r   r   r   rm   ¤  s   ÿ

z%TestVectorialFunction.test_float_sizeN)
r+   r,   r-   r~   rX   rn   ro   rp   rc   rm   r   r   r   r   rx   –  s    ` 
+rx   c                  C   sD  t  g d¢g d¢g¡} t  d¡}t| ƒ}t  g d¢¡}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!   r2   )r    r†   r   r†   r    éýÿÿÿéüÿÿÿTF©r2   r2   )r&   r'   Úzerosr	   r   r   Úsparse_jacobianr   r$   rv   Útoarrayr*   )ÚA_denser;   ÚA_sparser#   rT   ÚAxra   rb   Úf3Úf4Úf5Úf6r   r   r   Útest_LinearVectorFunction²  s4   þ



 r•   c                  C   s¶   t  g d¢g d¢g¡} t  g d¢¡}t| |dƒ}t||jƒ t|  |¡|jƒ t  g d¢¡}t| | |¡ƒ t||jƒ t|  |¡|jƒ t|  |¡| |¡ƒ t|  |¡|jƒ d S )Nr…   r‡   )r    r!   r†   F)r†   r2   r3   )	r&   r'   r   r   r#   rS   r8   rv   r$   )ÚAr;   r$   Úx1r   r   r   Ú%test_LinearVectorFunction_memoizationÖ  s   r˜   c                  C   sÔ   t  d¡} t| d ƒ}t| dƒ}t| dƒ}t|jƒ t|j ƒ t|jƒ t  g d¢¡}t  g d¢¡}t| |¡|ƒ t| |¡|ƒ t| |¡ 	¡ t  
d¡ƒ t| |¡t  
d¡ƒ t| ||¡ 	¡ t  d¡ƒ d S )Nr2   FT)r†   r!   r    )éþÿÿÿr2   r   rŠ   )r&   r‹   r   r   rŒ   r'   r   r$   rv   r�   r)   r*   )r;   ra   rb   r‘   r#   rT   r   r   r   Útest_IdentityVectorFunctionæ  s   





 rš   ÚPyPyz'assert_deallocate not available on PyPy)Úreasonc                      sH   t ƒ ‰ t d¡‰t‡ ‡fdd„ƒ�	 W d  ƒ dS 1 sw   Y  dS )úRegression test for gh-20768.r2   c                	      s$   t ˆ jˆdˆ jˆ jd tj tjfƒS )Nr   )r   r$   r(   r*   r&   r7   r   ©r:   r;   r   r   r^     s    ÿz5test_ScalarFunctionNoReferenceCycle.<locals>.<lambda>N)r   r&   r‹   r   r   r   rž   r   Ú#test_ScalarFunctionNoReferenceCycleý  s
   
"þrŸ   z/TODO remove reference cycle from VectorFunctionc                      sF   t ƒ ‰ ddg‰t‡ ‡fdd„ƒ�	 W d  ƒ dS 1 sw   Y  dS )r�   r/   r0   c                	      s&   t ˆ jˆˆ jˆ jd d tj tjfd ƒS r]   )r   r$   rv   r*   r&   r7   r   rž   r   r   r^     s    ÿz5test_VectorFunctionNoReferenceCycle.<locals>.<lambda>N)rq   r   r   r   rž   r   Ú#test_VectorFunctionNoReferenceCycle
  s
   "þr    c                     s`   t  g d¢g d¢g¡} t  d¡‰t| ƒ‰ t‡ ‡fdd„ƒ�	 W d  ƒ dS 1 s)w   Y  dS )r�   r…   r‡   r2   c                      s   t ˆ ˆd ƒS r]   )r   r   ©r�   r;   r   r   r^   $  s    z;test_LinearVectorFunctionNoReferenceCycle.<locals>.<lambda>N)r&   r'   r‹   r	   r   )rŽ   r   r¡   r   Ú)test_LinearVectorFunctionNoReferenceCycle  s   þ
"ÿr¢   )*rn   ÚplatformÚnumpyr&   Únumpy.testingr   r   r   r   r   r   Úscipy._lib._gcutilsr   Úscipy.sparser	   Úscipy.sparse.linalgr
   Ú(scipy.optimize._differentiable_functionsr   r   r   r   Úscipy.optimizer   r   r   Ú'scipy.optimize._hessian_update_strategyr   r   r.   rq   rx   r•   r˜   rš   ro   ÚskipifÚpython_implementationrŸ   Úxfailr    r¢   r   r   r   r   Ú<module>   sJ       [  $
þ
	
þ	
þ