
    sg0                     2    d dl Zd dlmZ  G d d      Zd Zy)    Nc                       e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zy
)CanonicalConstrainta  Canonical constraint to use with trust-constr algorithm.

    It represents the set of constraints of the form::

        f_eq(x) = 0
        f_ineq(x) <= 0

    where ``f_eq`` and ``f_ineq`` are evaluated by a single function, see
    below.

    The class is supposed to be instantiated by factory methods, which
    should prepare the parameters listed below.

    Parameters
    ----------
    n_eq, n_ineq : int
        Number of equality and inequality constraints respectively.
    fun : callable
        Function defining the constraints. The signature is
        ``fun(x) -> c_eq, c_ineq``, where ``c_eq`` is ndarray with `n_eq`
        components and ``c_ineq`` is ndarray with `n_ineq` components.
    jac : callable
        Function to evaluate the Jacobian of the constraint. The signature
        is ``jac(x) -> J_eq, J_ineq``, where ``J_eq`` and ``J_ineq`` are
        either ndarray of csr_matrix of shapes (n_eq, n) and (n_ineq, n),
        respectively.
    hess : callable
        Function to evaluate the Hessian of the constraints multiplied
        by Lagrange multipliers, that is
        ``dot(f_eq, v_eq) + dot(f_ineq, v_ineq)``. The signature is
        ``hess(x, v_eq, v_ineq) -> H``, where ``H`` has an implied
        shape (n, n) and provide a matrix-vector product operation
        ``H.dot(p)``.
    keep_feasible : ndarray, shape (n_ineq,)
        Mask indicating which inequality constraints should be kept feasible.
    c                 X    || _         || _        || _        || _        || _        || _        y N)n_eqn_ineqfunjachesskeep_feasible)selfr   r   r	   r
   r   r   s          j/var/www/html/venv/lib/python3.12/site-packages/scipy/optimize/_trustregion_constr/canonical_constraint.py__init__zCanonicalConstraint.__init__*   s-    		*    c                 R   |j                   \  }}|j                  }|j                  }t        j                  |t        j
                   k(        rAt        j                  |t        j
                  k(        r| j                  |j                        S t        j                  |t        j
                   k(        rAt        j                  |t        j
                  k(        r| j                  |j                        S t        j                  ||k(        r| j                  ||      S t        j                  |t        j
                   k(        r| j                  |||      S t        j                  |t        j
                  k(        r| j                  |||      S | j                  ||||      S )z5Create an instance from `PreparedConstrained` object.)boundsr	   r   npallinfemptyn_equal_to_canonical_less_to_canonical_greater_to_canonical_interval_to_canonical)cls
constraintlbubcfunr   s         r   from_PreparedConstraintz+CanonicalConstraint.from_PreparedConstraint2   s-    ""B~~"0066"- RVVB"&&L%999TVV$$66"- RVVB"&&L%999TVV$$VVB"H**444VVB266'M"))$MBBVVB"&&L!,,T2}EE--dBMJJr   c                    t        j                  d      t        j                  d|f      t        j                  ||f      fd}fd}fd} | dd|||t        j                  dt         j                              S )zCreate an "empty" instance.

        This "empty" instance is required to allow working with unconstrained
        problems as if they have some constraints.
        r   c                     fS r    )x	empty_funs    r   r	   z&CanonicalConstraint.empty.<locals>.funR       i''r   c                     fS r   r$   )r%   	empty_jacs    r   r
   z&CanonicalConstraint.empty.<locals>.jacU   r'   r   c                     S r   r$   )r%   v_eqv_ineq
empty_hesss      r   r   z'CanonicalConstraint.empty.<locals>.hessX   s	    r   dtype)r   r   sps
csr_matrixbool_)r   r   r	   r
   r   r&   r-   r)   s        @@@r   r   zCanonicalConstraint.emptyG   sk     HHQK	HHaV$	^^QF+
	(	(	 1ac4!288)DEEr   c                 2  
 fd}|rt         j                  
nt        j                  

fd}fd}t        d D              }t        d D              }t        j                  D cg c]  }|j
                   c}      }	 | ||||||	      S c c}w )a  Concatenate multiple `CanonicalConstraint` into one.

        `sparse_jacobian` (bool) determines the Jacobian format of the
        concatenated constraint. Note that items in `canonical_constraints`
        must have their Jacobians in the same format.
        c                     r)t        D cg c]  }|j                  |        c} \  }}ng g }}t        j                  |      t        j                  |      fS c c}w r   )zipr	   r   hstack)r%   ceq_allineq_allcanonical_constraintss       r   r	   z,CanonicalConstraint.concatenate.<locals>.fune   sZ    $#&,ABq!%%(B$D  $&r99V$bii&999	 Cs   Ac                     r)t        D cg c]  }|j                  |        c} \  }}ng g }} |       |      fS c c}w r   )r5   r
   )r%   r7   r8   r9   r:   vstacks       r   r
   z,CanonicalConstraint.concatenate.<locals>.jacs   sQ    $#&,ABq!%%(B$D  $&r&>6(#333	 Cs   Ac                 `  
 g 
d}d}D ]f  }||||j                   z    }||||j                  z    }
j                  |j                  | ||             ||j                   z  }||j                  z  }h 
fd}| j                  d   }	t
        j                  j                  |	|	f|t              S )Nr   c                 h    t        j                  |       }D ]  }||j                  |       z  } |S r   )r   
zeros_likedot)presulthhess_alls      r   matvecz=CanonicalConstraint.concatenate.<locals>.hess.<locals>.matvec   s7    q)! 'AaeeAh&F'r   r.   )	r   r   appendr   shaper0   linalgLinearOperatorfloat)r%   r+   r,   index_eq
index_ineqr7   vc_eqvc_ineqrE   r   rD   r:   s             @r   r   z-CanonicalConstraint.concatenate.<locals>.hess|   s    HHJ* 'Xh&78 J,ABq% 9:AFF"ahh&
' 
A::,,aVV5,IIr   c              3   4   K   | ]  }|j                     y wr   )r   .0r7   s     r   	<genexpr>z2CanonicalConstraint.concatenate.<locals>.<genexpr>   s     9a1669   c              3   4   K   | ]  }|j                     y wr   )r   rP   s     r   rR   z2CanonicalConstraint.concatenate.<locals>.<genexpr>   s     =!QXX=rS   )r0   r<   r   sumr6   r   )r   r:   sparse_jacobianr	   r
   r   r   r   r7   r   r<   s    `        @r   concatenatezCanonicalConstraint.concatenate]   s    	: ZZFYYF	4	J( 9#899='<==		#8#:q1?? #: ; 4c4??#:s   -Bc                   
 t        j                  d      
j                  }j                  d   }d}t        j                  dt              }j
                  rt        j                  d|f      nt        j                  d|f      
fd}fd}fd}	t        j                  d      
j                  }j
                  rt        j                  d|f      nt        j                  d|f       | |||||	|      S )Nr   r.   c                 0    j                  |       z
  fS r   r	   )r%   r    r&   values    r   r	   z4CanonicalConstraint._equal_to_canonical.<locals>.fun   s    88A;&	11r   c                 *    j                  |       fS r   r
   r%   r    r)   s    r   r
   z4CanonicalConstraint._equal_to_canonical.<locals>.jac   s    88A;	))r   c                 (    j                  | |      S r   r   r%   r+   r,   r    s      r   r   z5CanonicalConstraint._equal_to_canonical.<locals>.hess   s    99Q%%r   )r   r   r   rG   boolrV   r0   r1   )r   r    r[   r   r   r   r   r	   r
   r   r&   r)   s    ``       @@r   r   z'CanonicalConstraint._equal_to_canonical   s    HHQK	FF{{1~$/1v.I!Q(I	2	*	& HHQK	FF1v.I!Q(I4c4??r   c                   
 t        j                  d      
j                  }j                  rt	        j
                  d|f      nt        j                  d|f      t         j                  k  d}t        j                        }t        j                        r
fd}fd}fd}	n7t        j                        d   |   }   
fd}fd}fd}	 | |||||	|      S )Nr   c                 0    j                  |       z
  fS r   rZ   )r%   r    r&   r   s    r   r	   z3CanonicalConstraint._less_to_canonical.<locals>.fun   s     $((1+"222r   c                 *    j                  |       fS r   r]   r^   s    r   r
   z3CanonicalConstraint._less_to_canonical.<locals>.jac   s     $((1+--r   c                 (    j                  | |      S r   r`   ra   s      r   r   z4CanonicalConstraint._less_to_canonical.<locals>.hess   s    yyF++r   c                 6    j                  |          z
  fS r   rZ   )r%   r    r&   	finite_ubr   s    r   r	   z3CanonicalConstraint._less_to_canonical.<locals>.fun   s      $((1+i"82"===r   c                 0    j                  |          fS r   r]   )r%   r    r)   rh   s    r   r
   z3CanonicalConstraint._less_to_canonical.<locals>.jac   s     $((1+i"888r   c                 p    t        j                  j                        }||<   j                  | |      S r   r   zerosmr   )r%   r+   r,   vr    rh   s       r   r   z4CanonicalConstraint._less_to_canonical.<locals>.hess   s.    HHTVV$%)yyA&r   
r   r   r   rV   r0   r1   r   rU   r   nonzero)r   r    r   r   r   r   r   r	   r
   r   r&   r)   rh   s    ``       @@@r   r   z&CanonicalConstraint._less_to_canonical   s    HHQK	FF1v.I!Q(IK		"66)3., 

9-a0I))4MIB>9'
 4c4??r   c                   
 t        j                  d      
j                  }j                  rt	        j
                  d|f      nt        j                  d|f      t         j                   kD  d}t        j                        }t        j                        r
fd}fd}fd}	n7t        j                        d   |   }   
fd}fd}fd}	 | |||||	|      S )Nr   c                 0    j                  |       z
  fS r   rZ   )r%   r    r&   r   s    r   r	   z6CanonicalConstraint._greater_to_canonical.<locals>.fun   s     "txx{"222r   c                 ,    j                  |        fS r   r]   r^   s    r   r
   z6CanonicalConstraint._greater_to_canonical.<locals>.jac   s     488A;,..r   c                 *    j                  | |       S r   r`   ra   s      r   r   z7CanonicalConstraint._greater_to_canonical.<locals>.hess   s    yyVG,,r   c                 6    j                  |          z
  fS r   rZ   )r%   r    r&   	finite_lbr   s    r   r	   z6CanonicalConstraint._greater_to_canonical.<locals>.fun   s      "txx{9'="===r   c                 2    j                  |           fS r   r]   )r%   r    r)   rv   s    r   r
   z6CanonicalConstraint._greater_to_canonical.<locals>.jac   s     488A;y#9"999r   c                 r    t        j                  j                        }| |<   j                  | |      S r   rk   )r%   r+   r,   rn   r    rv   s       r   r   z7CanonicalConstraint._greater_to_canonical.<locals>.hess   s0    HHTVV$ &w)yyA&r   ro   )r   r    r   r   r   r   r   r	   r
   r   r&   r)   rv   s    ``       @@@r   r   z)CanonicalConstraint._greater_to_canonical   s    HHQK	FF1v.I!Q(I"&&L		"66)3/- 

9-a0I))4MIB>:'
 4c4??r   c           	         t         j                   k(  }t         j                  k(  }k(  || z  || z   | z  | z  t        j                        d   t        j                        d   t        j                        d   t        j                        d   j                  d   j                  d   j                  d   z   dz  z   }j                  d   }t        j                  |   |   |   |   f      }fd}	fd}
f	d} | |||	|
||      S )Nr      c                     j                  |       }|      z
  }|      z
  }	   |	   z
  }|
   
   z
  }
   |
   z
  }|t        j                  ||||f      fS r   )r	   r   r6   )r%   feqlegeiligr    equalgreaterintervalr   lessr   s          r   r	   z7CanonicalConstraint._interval_to_canonical.<locals>.fun  s    A5BuI%B42d8#BGqz)B8r(|+BH(+Bryy"b"b!1222r   c                     j                  |       }|	   }|   }|
    }|   }| }t        j                  |      rt        j                  ||||f      }||fS t	        j                  ||||f      }||fS r   )r
   r0   issparser<   r   )r%   Jr}   r~   r   r   r   ineqr    r   r   r   r   s           r   r
   z7CanonicalConstraint._interval_to_canonical.<locals>.jac(  s    A5B4BG*B8BB||Azz2r2r"23 t8O yy"b"b!12t8Or   c                    	 d}|||z    }|z  }|||z    }|z  }|||z    }|z  }|||z    }t        j                        }||
<   ||<   | |<   ||z
  |<   	j                  | |      S )Nr   )r   r?   r   )r%   r+   r,   n_startv_lv_gv_ilv_igrn   r    r   r   r   r   r   	n_greater
n_intervaln_lesss            r   r   z8CanonicalConstraint._interval_to_canonical.<locals>.hess5  s    G6!12CvG9!45Cy G''J"67Dz!G''J"67Db!AAeHAdGAgJ+AhK99Q?"r   )r   r   rp   rG   r6   )r   r    r   r   r   lb_infub_infr   r   r	   r
   r   r   r   r   r   r   r   r   s    ```        @@@@@@@r   r   z*CanonicalConstraint._interval_to_canonical  sR   wrvvbF7"6VG#vg-

5!!$zz$"**W%a(::h'*AMM!$	^^A&
)#a*n4{{1~		=#6#0#9#0#:#0#:#< =
	3 	3	 		# 	#$ 4c4??r   N)__name__
__module____qualname____doc__r   classmethodr!   r   rW   r   r   r   r   r$   r   r   r   r      s    #H+ K K( F F* 7@ 7@r @ @> %@ %@N %@ %@N ?@ ?@r   r   c                    g }g }g }g }|D ]{  }|j                   j                  }|j                   j                  }	|j                  \  }
}t	        j
                  |
|k(        r&|j                  ||
z
         |j                  |	       }t	        j
                  |
t        j                   k(        rB|t        j                  k  }|j                  ||   ||   z
         |j                  |	|          t	        j
                  |t        j                  k(        rE|
t        j                   kD  }|j                  |
|   ||   z
         |j                  |	|           Q|
t        j                   k(  }|t        j                  k(  }|
|k(  }|| z  }|| z  }| | z  | z  }|j                  ||   |
|   z
         |j                  ||   ||   z
         |j                  |
|   ||   z
         |j                  ||   ||   z
         |j                  |
|   ||   z
         |j                  |	|          |j                  |	|          |j                  |	|           |j                  |	|          |j                  |	|           ~ |rt	        j                  |      nt	        j                  d      }|rt	        j                  |      nt	        j                  d      }|r(t        j                  }t        j                  d| f      }n't        j                  }t	        j                  d| f      }|r ||      n|}|r ||      n|}||||fS )a  Convert initial values of the constraints to the canonical format.

    The purpose to avoid one additional call to the constraints at the initial
    point. It takes saved values in `PreparedConstraint`, modififies and
    concatenates them to the canonical constraint format.
    r   )r	   r|   r   r   r   r   rF   r   r6   r   r0   r<   r1   )r   prepared_constraintsrV   c_eqc_ineqJ_eqJ_ineqr7   r|   r   r   r   rh   rv   r   r   r   r   r   r   r<   r   s                         r    initial_constraints_as_canonicalr   J  s    DFDF! !(EEGGEEGGB66"(KKBKKNVVB266'M"RVVIMM!I,I67MM!I,'VVB"&&L!bffWIMM"Y-!I,67MM1Y<-(BFF7]F266\F"HEVG#Dw&Gv'6'1HKK%2e9,-MM!D'BtH,-MM"W+'
23MM!H+845MM"X,845KK%!MM!D'"MM1W:+&MM!H+&MM1X;,'C!(F #299T?D"(RYYvbhhqkF1v&!Q 6$<UD%VF^5Fv%%r   )numpyr   scipy.sparsesparser0   r   r   r$   r   r   <module>r      s     B@ B@J
<&r   