o
    hIo                     @   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   f/var/www/vscode/kcb/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sJ 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sJ d	|d
< ||}t|d d|d
< ||}t|d ||jusJ dd }t g d}t||dddd d t j t jf}||jusJ t||d t|jt g d ||jusJ 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sJ t|||| ||jusJ d|d< t|||| ||jusJ d|d< t|||| ||jusJ W d    d S 1 sw   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       [  $

	
	
