
     hX                         d dl Zd dlmZ ddlmZmZ ddlm	Z	 d dl
mZ dZ G d d          Z G d	 d
          Z G d d          Z G d de          ZdS )    N   )approx_derivativegroup_columns)HessianUpdateStrategy)LinearOperator)z2-pointz3-pointcsc                   F    e Zd ZdZ	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 ZdS )ScalarFunctiona  Scalar function and its derivatives.

    This class defines a scalar function F: R^n->R and methods for
    computing or approximating its first and second derivatives.

    Parameters
    ----------
    fun : callable
        evaluates the scalar function. Must be of the form ``fun(x, *args)``,
        where ``x`` is the argument in the form of a 1-D array and ``args`` is
        a tuple of any additional fixed parameters needed to completely specify
        the function. Should return a scalar.
    x0 : array-like
        Provides an initial set of variables for evaluating fun. Array of real
        elements of size (n,), where 'n' is the number of independent
        variables.
    args : tuple, optional
        Any additional fixed parameters needed to completely specify the scalar
        function.
    grad : {callable, '2-point', '3-point', 'cs'}
        Method for computing the gradient vector.
        If it is a callable, it should be a function that returns the gradient
        vector:

            ``grad(x, *args) -> array_like, shape (n,)``

        where ``x`` is an array with shape (n,) and ``args`` is a tuple with
        the fixed parameters.
        Alternatively, the keywords  {'2-point', '3-point', 'cs'} can be used
        to select a finite difference scheme for numerical estimation of the
        gradient with a relative step size. These finite difference schemes
        obey any specified `bounds`.
    hess : {callable, '2-point', '3-point', 'cs', HessianUpdateStrategy}
        Method for computing the Hessian matrix. If it is callable, it should
        return the  Hessian matrix:

            ``hess(x, *args) -> {LinearOperator, spmatrix, array}, (n, n)``

        where x is a (n,) ndarray and `args` is a tuple with the fixed
        parameters. Alternatively, the keywords {'2-point', '3-point', 'cs'}
        select a finite difference scheme for numerical estimation. Or, objects
        implementing `HessianUpdateStrategy` interface can be used to
        approximate the Hessian.
        Whenever the gradient is estimated via finite-differences, the Hessian
        cannot be estimated with options {'2-point', '3-point', 'cs'} and needs
        to be estimated using one of the quasi-Newton strategies.
    finite_diff_rel_step : None or array_like
        Relative step size to use. The absolute step size is computed as
        ``h = finite_diff_rel_step * sign(x0) * max(1, abs(x0))``, possibly
        adjusted to fit into the bounds. For ``method='3-point'`` the sign
        of `h` is ignored. If None then finite_diff_rel_step is selected
        automatically,
    finite_diff_bounds : tuple of array_like
        Lower and upper bounds on independent variables. Defaults to no bounds,
        (-np.inf, np.inf). Each bound must match the size of `x0` or be a
        scalar, in the latter case the bound will be the same for all
        variables. Use it to limit the range of function evaluation.
    epsilon : None or array_like, optional
        Absolute step size to use, possibly adjusted to fit into the bounds.
        For ``method='3-point'`` the sign of `epsilon` is ignored. By default
        relative steps are used, only if ``epsilon is not None`` are absolute
        steps used.

    Notes
    -----
    This class implements a memoization logic. There are methods `fun`,
    `grad`, hess` and corresponding attributes `f`, `g` and `H`. The following
    things should be considered:

        1. Use only public methods `fun`, `grad` and `hess`.
        2. After one of the methods is called, the corresponding attribute
           will be set. However, a subsequent call with a different argument
           of *any* of the methods may overwrite the attribute.
    Nc	                     t                    s!t          vrt          dt           d          t                    s6t          v s-t          t                    st          dt           d          t          v rt          v rt          d          t          j        |                              t                     _	         j	        j
         _        d _        d _        d _        d _        d _        d _        d  _        t
          j         _        i t          v rd<   |d<   |d	<   |d
<   t          v rd<   |d<   |d	<   dd<    fd fd}	|	 _                                          t                    r fd fd}
nt          v r fd}
|
 _                                          t                    r t          j        |          gR   _        d _         xj        dz  c_        t7          j         j                  r& fdt7          j         j                   _        nYt           j        t<                    r fdn7 fdt          j        t          j          j                             _         fd}nxt          v r fd} |             d _        nVt          t                    rA _         j        !                     j        d           d _        d  _"        d  _#         fd}| _$        t          t                    r fd}n fd}| _%        d S )Nz)`grad` must be either callable or one of .z@`hess` must be either callable, HessianUpdateStrategy or one of zWhenever the gradient is estimated via finite-differences, we require the Hessian to be estimated using one of the quasi-Newton strategies.r   Fmethodrel_stepabs_stepboundsTas_linear_operatorc                 Z   xj         dz  c_          t          j        |           gR  }t          j        |          sQ	 t          j        |                                          }n)# t          t          f$ r}t          d          |d }~ww xY w|j        k     r| _	        |_        |S )Nr   z@The user-provided objective function must return a scalar value.)
nfevnpcopyisscalarasarrayitem	TypeError
ValueError	_lowest_f	_lowest_x)xfxeargsfunselfs      d/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/optimize/_differentiable_functions.pyfun_wrappedz,ScalarFunction.__init__.<locals>.fun_wrapped   s    IINII RWQZZ'$'''B;r?? B,,..BB!:.   $6   DN""!"!#Is   &A) )B:B

Bc                  2      j                   _        d S Nr   fr$   r"   s   r#   
update_funz+ScalarFunction.__init__.<locals>.update_fun        [((DFFF    c                 ~    xj         dz  c_         t          j         t          j        |           gR            S Nr   )ngevr   
atleast_1dr   )r   r    gradr"   s    r#   grad_wrappedz-ScalarFunction.__init__.<locals>.grad_wrapped   s<    		Q		}TT"'!**%<t%<%<%<===r,   c                  2      j                   _        d S r&   )r   g)r2   r"   s   r#   update_gradz,ScalarFunction.__init__.<locals>.update_grad       %df--r,   c                                                        xj        dz  c_        t          j        fdj        i _        d S )Nr   f0)_update_funr/   r   r   r(   r4   finite_diff_optionsr$   r"   s   r#   r5   z,ScalarFunction.__init__.<locals>.update_grad   sZ      """		Q		*; B B46 B-@B Br,   r   c                 ~    xj         dz  c_         t          j         t          j        |           gR            S r.   )nhevsps
csr_matrixr   r   r   r    hessr"   s    r#   hess_wrappedz-ScalarFunction.__init__.<locals>.hess_wrapped   s<    IINII>$$rwqzz*AD*A*A*ABBBr,   c                 Z    xj         dz  c_          t          j        |           gR  S r.   )r=   r   r   r@   s    r#   rB   z-ScalarFunction.__init__.<locals>.hess_wrapped   s2    IINII4

2T2222r,   c           	          xj         dz  c_         t          j        t          j         t          j        |           gR                      S r.   )r=   r   
atleast_2dr   r   r@   s    r#   rB   z-ScalarFunction.__init__.<locals>.hess_wrapped   sF    IINII=DD4Kd4K4K4K)L)LMMMr,   c                  2      j                   _        d S r&   )r   HrB   r"   s   r#   update_hessz,ScalarFunction.__init__.<locals>.update_hess   r6   r,   c                  x                                      t          j        fdj        i _        j        S Nr8   )_update_gradr   r   r4   rG   )r;   r2   r"   s   r#   rI   z,ScalarFunction.__init__.<locals>.update_hess   sN    !!###*< B BDF B-@B Bvr,   rA   c                                                          j                             j         j        z
   j         j        z
             d S r&   )rL   rG   updater   x_prevr4   g_prevr"   s   r#   rI   z,ScalarFunction.__init__.<locals>.update_hess   sC    !!###dft{2DFT[4HIIIIIr,   c                                                      j        _        j        _        t          j        |                               t                    _        d_	        d_
        d_                                         d S NF)rL   r   rO   r4   rP   r   r0   astypefloat	f_updated	g_updated	H_updated_update_hessr   r"   s    r#   update_xz)ScalarFunction.__init__.<locals>.update_x   su    !!###"f"f q))0077!&!&!&!!#####r,   c                     t          j        |                               t                    _        d_        d_        d_        d S rS   )r   r0   rT   rU   r   rV   rW   rX   rZ   s    r#   r[   z)ScalarFunction.__init__.<locals>.update_x   s=     q))0077!&!&!&r,   )&callable
FD_METHODSr   
isinstancer   r   r0   rT   rU   r   sizenr   r/   r=   rV   rW   rX   r   infr   _update_fun_implr9   _update_grad_implrL   r   rG   r>   issparser?   r   rE   r   
initializerO   rP   _update_hess_impl_update_x_impl)r"   r!   x0r    r1   rA   finite_diff_rel_stepfinite_diff_boundsepsilonr*   r5   rI   r[   r;   r$   r2   rB   s   `` ```       @@@@r#   __init__zScalarFunction.__init__V   s    ~~ 	$j"8"8IJIII    	$*"4"4d$9:: #5,(, , ,  
 :$*"4"4 8 9 9 9 r""))%00			 :,0).B
+.5
+,>):,0).B
+.5
+8< 45	 	 	 	 	 	 	,	) 	) 	) 	) 	) 	) !+ D>> 	B> > > > > > >. . . . . . . ZB B B B B B B "- D>> +	JT"'"++----DF!DNIINII|DF## ;C C C C C C C //DFN33 	;3 3 3 3 3 3 3 3
N N N N N N N rz$&'9'9::. . . . . . . Z       KMMM!DNN344 		JDFFdff---!DNDKDKJ J J J J "-d122 	'
$ 
$ 
$ 
$ 
$ 
$' ' ' ' ' 'r,   c                 N    | j         s|                                  d| _         d S d S NTrV   rc   rQ   s    r#   r9   zScalarFunction._update_fun   3    ~ 	"!!###!DNNN	" 	"r,   c                 N    | j         s|                                  d| _         d S d S ro   )rW   rd   rQ   s    r#   rL   zScalarFunction._update_grad   3    ~ 	"""$$$!DNNN	" 	"r,   c                 N    | j         s|                                  d| _         d S d S ro   rX   rg   rQ   s    r#   rY   zScalarFunction._update_hess  rs   r,   c                     t          j        || j                  s|                     |           |                                  | j        S r&   )r   array_equalr   rh   r9   r(   r"   r   s     r#   r!   zScalarFunction.fun  sE    ~a(( 	#"""vr,   c                     t          j        || j                  s|                     |           |                                  | j        S r&   )r   rw   r   rh   rL   r4   rx   s     r#   r1   zScalarFunction.grad  E    ~a(( 	#"""vr,   c                     t          j        || j                  s|                     |           |                                  | j        S r&   )r   rw   r   rh   rY   rG   rx   s     r#   rA   zScalarFunction.hess  rz   r,   c                     t          j        || j                  s|                     |           |                                  |                                  | j        | j        fS r&   )r   rw   r   rh   r9   rL   r(   r4   rx   s     r#   fun_and_gradzScalarFunction.fun_and_grad  s^    ~a(( 	#"""vtv~r,   r&   )__name__
__module____qualname____doc__rm   r9   rL   rY   r!   r1   rA   r}    r,   r#   r
   r
      s        I IV .2a' a' a' a'F" " "
" " "
" " "
          r,   r
   c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )VectorFunctiona  Vector function and its derivatives.

    This class defines a vector function F: R^n->R^m and methods for
    computing or approximating its first and second derivatives.

    Notes
    -----
    This class implements a memoization logic. There are methods `fun`,
    `jac`, hess` and corresponding attributes `f`, `J` and `H`. The following
    things should be considered:

        1. Use only public methods `fun`, `jac` and `hess`.
        2. After one of the methods is called, the corresponding attribute
           will be set. However, a subsequent call with a different argument
           of *any* of the methods may overwrite the attribute.
    c	                 (    t                    s0t          vr't          d                    t                              t                    sEt          v s<t	          t
                    s't          d                    t                              t          v rt          v rt          d          t          j        |                              t                     _
         j
        j         _        d _        d _        d _        d _        d _        d _        i t          v rEd<   |d<   |t'          |          }	||	fd<   |d	<   t          j         j
                   _        t          v r-d<   |d<   d
d<   t          j         j
                   _        t          v rt          v rt          d           fd fd}
|
 _         |
             t          j         j                   _         j        j         _        t                    r  j
                   _        d
 _         xj        dz  c_        |s|Et9          j         j                  r, fdt9          j         j                   _        d
 _        npt9          j         j                  r, fd j                                          _        d _        n+ fdt          j!         j                   _        d _         fd}nt          v rtE           j
        fd j        i _        d
 _        |s|Ft9          j         j                  r- fd}t9          j         j                   _        d
 _        nrt9          j         j                  r- fd} j                                          _        d _        n, fd}t          j!         j                   _        d _        | _#        t                    r  j
         j                   _$        d
 _         xj        dz  c_        t9          j         j$                  r% fdt9          j         j$                   _$        nWt	           j$        tJ                    r fdn6 fdt          j!        t          j&         j$                             _$         fd}n}t          v rfd fd} |             d
 _        nVt	          t
                    rA _$         j$        '                     j        d           d
 _        d  _(        d  _)         fd}| _*        t	          t
                    r fd}n fd }| _+        d S )!Nz+`jac` must be either callable or one of {}.zB`hess` must be either callable,HessianUpdateStrategy or one of {}.zWhenever the Jacobian is estimated via finite-differences, we require the Hessian to be estimated using one of the quasi-Newton strategies.r   Fr   r   sparsityr   Tr   c                 ^    xj         dz  c_         t          j         |                     S r.   )r   r   r0   )r   r!   r"   s    r#   r$   z,VectorFunction.__init__.<locals>.fun_wrappede  s*    IINII=Q(((r,   c                  2      j                   _        d S r&   r'   r)   s   r#   r*   z+VectorFunction.__init__.<locals>.update_funi  r+   r,   r   c                 ^    xj         dz  c_         t          j         |                     S r.   )njevr>   r?   r   jacr"   s    r#   jac_wrappedz,VectorFunction.__init__.<locals>.jac_wrappedz  s*    IINII>##a&&111r,   c                 ^    xj         dz  c_          |                                           S r.   )r   toarrayr   s    r#   r   z,VectorFunction.__init__.<locals>.jac_wrapped  s*    IINII3q66>>+++r,   c                 ^    xj         dz  c_         t          j         |                     S r.   )r   r   rE   r   s    r#   r   z,VectorFunction.__init__.<locals>.jac_wrapped  s*    IINII=Q000r,   c                  2      j                   _        d S r&   )r   J)r   r"   s   r#   
update_jacz+VectorFunction.__init__.<locals>.update_jac  s    $TV,,r,   r8   c                                                        t          j        t          j        fdj        i           _        d S rK   )r9   r>   r?   r   r   r(   r   r:   s   r#   r   z+VectorFunction.__init__.<locals>.update_jac  s\    $$&&& ^)+tv A A$& A,?A AB BDFFFr,   c                                                        t          j        fdj        i                                 _        d S rK   )r9   r   r   r(   r   r   r:   s   r#   r   z+VectorFunction.__init__.<locals>.update_jac  sW    $$&&&.{DF F Ftv F1DF FFMgii FFFr,   c                                                        t          j        t          j        fdj        i           _        d S rK   )r9   r   rE   r   r   r(   r   r:   s   r#   r   z+VectorFunction.__init__.<locals>.update_jac  s\    $$&&&])+tv A A$& A,?A AB BDFFFr,   c                 `    xj         dz  c_         t          j         | |                    S r.   )r=   r>   r?   r   vrA   r"   s     r#   rB   z-VectorFunction.__init__.<locals>.hess_wrapped  s,    IINII>$$q!**555r,   c                 <    xj         dz  c_          | |          S r.   )r=   r   s     r#   rB   z-VectorFunction.__init__.<locals>.hess_wrapped  s"    IINII41::%r,   c                     xj         dz  c_         t          j        t          j         | |                              S r.   )r=   r   rE   r   r   s     r#   rB   z-VectorFunction.__init__.<locals>.hess_wrapped  s6    IINII=DDAJJ)?)?@@@r,   c                  >      j         j                  _        d S r&   )r   r   rG   rH   s   r#   rI   z,VectorFunction.__init__.<locals>.update_hess  s    %dfdf55r,   c                 J     |           j                             |          S r&   )Tdot)r   r   r   s     r#   	jac_dot_vz*VectorFunction.__init__.<locals>.jac_dot_v  s"    "{1~~'++A...r,   c                                                        t          j        fj        j                            j                  j        fd _        d S )N)r8   r    )_update_jacr   r   r   r   r   r   rG   )r;   r   r"   s   r#   rI   z,VectorFunction.__init__.<locals>.update_hess  sf      """*9df B.2fhll46.B.B15	B B .AB Br,   rA   c                  :                                     j        |j        wj        j        z
  } j        j                            j                  j        j                            j                  z
  }j        	                    | |           d S d S d S r&   )
r   rO   J_prevr   r   r   r   r   rG   rN   )delta_xdelta_gr"   s     r#   rI   z,VectorFunction.__init__.<locals>.update_hess  s      """ ;*t{/F"ft{2G"fhll4622T[]5F5Ftv5N5NNGFMM'733333 +*/F/Fr,   c                                                      j        _        j        _        t          j        |                               t                    _        d_	        d_
        d_                                         d S rS   )r   r   rO   r   r   r   r0   rT   rU   rV   	J_updatedrX   rY   rZ   s    r#   r[   z)VectorFunction.__init__.<locals>.update_x  ss      """"f"fq))0077!&!&!&!!#####r,   c                     t          j        |                               t                    _        d_        d_        d_        d S rS   )r   r0   rT   rU   r   rV   r   rX   rZ   s    r#   r[   z)VectorFunction.__init__.<locals>.update_x  s;    q))0077!&!&!&r,   ),r]   r^   r   formatr_   r   r   r0   rT   rU   r   r`   ra   r   r   r=   rV   r   rX   r   r   x_diffrc   
zeros_liker(   r   mr   r>   re   r?   sparse_jacobianr   rE   r   _update_jac_implrG   r   r   rf   rO   r   rg   rh   )r"   r!   ri   r   rA   rj   finite_diff_jac_sparsityrk   r   sparsity_groupsr*   r   rI   r[   r;   r$   rB   r   r   s   `` ``         @@@@@r#   rm   zVectorFunction.__init__3  sI    }} 	2J!6!6J$fZ002 2 2  	2$*"4"4d$9:: #5 C$fZ002 2 2 *!3!3 + , , ,
 r""))%00			 *,/).B
+'3"/0H"I"I3K3B3D#J/,>)'$&//DK:,0).B
+8< 45'$&//DK*!3!3 + , , ,	) 	) 	) 	) 	) 	)	) 	) 	) 	) 	) 	) !+
tv&& C== <	-S[[DF!DNIINII -#+TV0D0D+2 2 2 2 2 2 //'+$$df%% -, , , , , , ))',$$1 1 1 1 1 1 tv..',$- - - - - - - J&{DF > >tv >)<> >DF!DN -#+TV0D0D+B B B B B B B
 //'+$$df%% -P P P P P P P ))',$$B B B B B B B
 tv..',$ * D>> 2	4T$&$&))DF!DNIINII|DF## ;6 6 6 6 6 6 //DFN33 	;& & & & & & &
A A A A A A rz$&'9'9::6 6 6 6 6 6 6Z/ / / / /B B B B B B B KMMM!DNN344 	4DFFdff---!DNDKDK4 4 4 4 4 "-d122 	'$ $ $ $ $ $' ' ' ' ' 'r,   c                 Z    t          j        || j                  s|| _        d| _        d S d S rS   )r   rw   r   rX   )r"   r   s     r#   	_update_vzVectorFunction._update_v  s4    ~a(( 	#DF"DNNN	# 	#r,   c                 h    t          j        || j                  s|                     |           d S d S r&   )r   rw   r   rh   rx   s     r#   	_update_xzVectorFunction._update_x  s<    ~a(( 	#"""""	# 	#r,   c                 N    | j         s|                                  d| _         d S d S ro   rp   rQ   s    r#   r9   zVectorFunction._update_fun  rq   r,   c                 N    | j         s|                                  d| _         d S d S ro   )r   r   rQ   s    r#   r   zVectorFunction._update_jac  rq   r,   c                 N    | j         s|                                  d| _         d S d S ro   ru   rQ   s    r#   rY   zVectorFunction._update_hess  rs   r,   c                 b    |                      |           |                                  | j        S r&   )r   r9   r(   rx   s     r#   r!   zVectorFunction.fun  -    qvr,   c                 b    |                      |           |                                  | j        S r&   )r   r   r   rx   s     r#   r   zVectorFunction.jac  r   r,   c                     |                      |           |                     |           |                                  | j        S r&   )r   r   rY   rG   r"   r   r   s      r#   rA   zVectorFunction.hess  s?    qqvr,   N)r~   r   r   r   rm   r   r   r9   r   rY   r!   r   rA   r   r,   r#   r   r   "  s          H' H' H'T# # #
# # #" " "
" " "
" " "
  
  
    r,   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )LinearVectorFunctionzLinear vector function and its derivatives.

    Defines a linear function F = A x, where x is N-D vector and
    A is m-by-n matrix. The Jacobian is constant and equals to A. The Hessian
    is identically zero and it is returned as a csr matrix.
    c                    |s|5t          j        |          r!t          j        |          | _        d| _        ngt          j        |          r!|                                | _        d| _        n2t          j        t          j        |                    | _        d| _        | j        j	        \  | _
        | _        t          j        |                              t                    | _        | j                            | j                  | _        d| _        t          j        | j
        t                    | _        t          j        | j        | j        f          | _        d S )NTF)dtype)r>   re   r?   r   r   r   r   rE   r   shaper   ra   r0   rT   rU   r   r   r(   rV   zerosr   rG   )r"   Ari   r   s       r#   rm   zLinearVectorFunction.__init__.  s	    		)o5#,q//5^A&&DF#'D  \!__ 	)YY[[DF#(D   ]2:a==11DF#(D r""))%00DF##$&... 011r,   c                     t          j        || j                  s:t          j        |                              t
                    | _        d| _        d S d S rS   )r   rw   r   r0   rT   rU   rV   rx   s     r#   r   zLinearVectorFunction._update_xC  sL    ~a(( 	#]1%%,,U33DF"DNNN	# 	#r,   c                     |                      |           | j        s&| j                            |          | _        d| _        | j        S ro   )r   rV   r   r   r(   rx   s     r#   r!   zLinearVectorFunction.funH  s?    q~ 	"VZZ]]DF!DNvr,   c                 :    |                      |           | j        S r&   )r   r   rx   s     r#   r   zLinearVectorFunction.jacO  s    qvr,   c                 H    |                      |           || _        | j        S r&   )r   r   rG   r   s      r#   rA   zLinearVectorFunction.hessS  s"    qvr,   N)	r~   r   r   r   rm   r   r!   r   rA   r   r,   r#   r   r   '  si         2 2 2*# # #
        r,   r   c                   "     e Zd ZdZ fdZ xZS )IdentityVectorFunctionzIdentity vector function and its derivatives.

    The Jacobian is the identity matrix, returned as a dense array when
    `sparse_jacobian=False` and as a csr matrix otherwise. The Hessian is
    identically zero and it is returned as a csr matrix.
    c                     t          |          }|s|t          j        |d          }d}nt          j        |          }d}t	                                          |||           d S )Ncsr)r   TF)lenr>   eyer   superrm   )r"   ri   r   ra   r   	__class__s        r#   rm   zIdentityVectorFunction.__init__`  sj    GG 	$o5%(((A"OOq		A#OB00000r,   )r~   r   r   r   rm   __classcell__)r   s   @r#   r   r   Y  sB         1 1 1 1 1 1 1 1 1r,   r   )numpyr   scipy.sparsesparser>   _numdiffr   r   _hessian_update_strategyr   scipy.sparse.linalgr   r^   r
   r   r   r   r   r,   r#   <module>r      s&             6 6 6 6 6 6 6 6 ; ; ; ; ; ; . . . . . . *
T T T T T T T TnB B B B B B B BJ/ / / / / / / /d1 1 1 1 11 1 1 1 1 1r,   