
    Ui0                     :    d dl Zd dlmZ  G d d          Zd ZdS )    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d
S )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_array 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                 Z    || _         || _        || _        || _        || _        || _        d S N)n_eqn_ineqfunjachesskeep_feasible)selfr   r   r	   r
   r   r   s          /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/scipy/optimize/_trustregion_constr/canonical_constraint.py__init__zCanonicalConstraint.__init__*   s3    		*    c                     |j         \  }}|j        }|j        }t          j        |t          j         k              r<t          j        |t          j        k              r|                     |j                  S t          j        |t          j         k              r<t          j        |t          j        k              r|                     |j                  S t          j        ||k              r|                     ||          S t          j        |t          j         k              r| 	                    |||          S t          j        |t          j        k              r| 
                    |||          S |                     ||||          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   sV    "B~"06"-   	%RVB"&L%9%9 	%99TV$$$6"-   		KRVB"&L%9%9 		K99TV$$$VB"H 	K**4444VB26'M"" 	K))$MBBBVB"&L!! 	K,,T2}EEE--dBMJ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_arraybool_)r   r   r	   r
   r   r&   r-   r)   s        @@@r   r   zCanonicalConstraint.emptyG   s     HQKK	HaV$$	]Aq6**
	( 	( 	( 	( 	(	( 	( 	( 	( 	(	 	 	 	 	 s1ac4!28)D)D)DEEEr   c                   	 fd}|rt           j        	nt          j        		fd}fd}t          d D                       }t          d D                       }t          j        d D                       } | ||||||          S )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           fdD              \  }}ng g }}t          j        |          t          j        |          fS )Nc                 :    g | ]}|                               S r$   r	   .0cr%   s     r   
<listcomp>z@CanonicalConstraint.concatenate.<locals>.fun.<locals>.<listcomp>h   #    BBBq!%%((BBBr   )zipr   hstack)r%   eq_allineq_allcanonical_constraintss   `  r   r	   z,CanonicalConstraint.concatenate.<locals>.fune   s`    $ *#&BBBB,ABBB$D  $&r9V$$bi&9&999r   c                 p     rt           fdD              \  }}ng g }} |           |          fS )Nc                 :    g | ]}|                               S r$   r
   r7   s     r   r:   z@CanonicalConstraint.concatenate.<locals>.jac.<locals>.<listcomp>v   r;   r   )r<   )r%   r>   r?   r@   vstacks   `  r   r
   z,CanonicalConstraint.concatenate.<locals>.jacs   s^    $ *#&BBBB,ABBB$D  $&r6&>>66(#3#333r   c                 V  
 g 
d}d}D ]d}||||j         z            }||||j        z            }
                    |                    | ||                     ||j         z  }||j        z  }e
fd}| j        d         }	t
          j                            |	|	f|t                    S )Nr   c                 x    t          j        | t                    }D ]}||                    |           z  }|S )Nr.   )r   
zeros_likefloatdot)presulthhess_alls      r   matvecz=CanonicalConstraint.concatenate.<locals>.hess.<locals>.matvec   sA    q666! ' 'AaeeAhh&FFr   r.   )	r   r   appendr   shaper0   linalgLinearOperatorrH   )r%   r+   r,   index_eq
index_ineqr9   vc_eqvc_ineqrN   r   rM   r@   s             @r   r   z-CanonicalConstraint.concatenate.<locals>.hess|   s    HHJ* ' 'Xh&778 J,A!ABq% 9 9:::AF"ah&

     
A:,,aVV5,IIIr   c              3   $   K   | ]}|j         V  d S r   )r   r8   r9   s     r   	<genexpr>z2CanonicalConstraint.concatenate.<locals>.<genexpr>   s$      99a16999999r   c              3   $   K   | ]}|j         V  d S r   )r   rX   s     r   rY   z2CanonicalConstraint.concatenate.<locals>.<genexpr>   s$      ==!QX======r   c                     g | ]	}|j         
S r$   )r   rX   s     r   r:   z3CanonicalConstraint.concatenate.<locals>.<listcomp>   s&     #: #: #:q1? #: #: #:r   )r0   rD   r   sumr=   )
r   r@   sparse_jacobianr	   r
   r   r   r   r   rD   s
    `       @r   concatenatezCanonicalConstraint.concatenate]   s    	: 	: 	: 	: 	:  	ZFFYF	4 	4 	4 	4 	4 	4	J 	J 	J 	J 	J( 99#899999=='<=====	 #: #:#8#: #: #: ; ; s4c4???r   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                 8                         |           z
  fS r   r6   )r%   r    r&   values    r   r	   z4CanonicalConstraint._equal_to_canonical.<locals>.fun   s    88A;;&	11r   c                 2                         |           fS r   rC   r%   r    r)   s    r   r
   z4CanonicalConstraint._equal_to_canonical.<locals>.jac   s    88A;;	))r   c                 0                         | |          S r   r   r%   r+   r,   r    s      r   r   z5CanonicalConstraint._equal_to_canonical.<locals>.hess   s    99Q%%%r   )r   r   r   rP   boolr]   r0   r1   )r   r    ra   r   r   r   r   r	   r
   r   r&   r)   s    ``       @@r   r   z'CanonicalConstraint._equal_to_canonical   s.   HQKK	F{1~$/// 	)q!f--II!Q((I	2 	2 	2 	2 	2 	2 	2	* 	* 	* 	* 	* 	*	& 	& 	& 	& 	& HQKK	F 	)q!f--II!Q((Is4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}	n?t          j	                  d         |         }         
fd}fd}fd}	 | |||||	|          S )Nr   c                 8                         |           z
  fS r   r6   )r%   r    r&   r   s    r   r	   z3CanonicalConstraint._less_to_canonical.<locals>.fun   s     $((1++"222r   c                 2                         |           fS r   rC   rc   s    r   r
   z3CanonicalConstraint._less_to_canonical.<locals>.jac   s     $((1++--r   c                 0                         | |          S r   re   rf   s      r   r   z4CanonicalConstraint._less_to_canonical.<locals>.hess   s    yyF+++r   c                 D                         |                    z
  fS r   r6   )r%   r    r&   	finite_ubr   s    r   r	   z3CanonicalConstraint._less_to_canonical.<locals>.fun   s"     $((1++i"82"===r   c                 >                         |                    fS r   rC   )r%   r    r)   rm   s    r   r
   z3CanonicalConstraint._less_to_canonical.<locals>.jac   s     $((1++i"888r   c                 l    t          j        j                  }||<                       | |          S r   r   zerosmr   )r%   r+   r,   vr    rm   s       r   r   z4CanonicalConstraint._less_to_canonical.<locals>.hess   s/    HTV$$%)yyA&r   
r   r   r   r]   r0   r1   r   r\   r   nonzero)r   r    r   r   r   r   r   r	   r
   r   r&   r)   rm   s    ``       @@@r   r   z&CanonicalConstraint._less_to_canonical   s   HQKK	F 	)q!f--II!Q((IK		""6) 	'3 3 3 3 3 3 3. . . . . ., , , , , , 
9--a0I))4MIB> > > > > > > >9 9 9 9 9 9 9' ' ' ' ' '
 s4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}	n?t          j	                  d         |         }         
fd}fd}fd}	 | |||||	|          S )Nr   c                 8                         |           z
  fS r   r6   )r%   r    r&   r   s    r   r	   z6CanonicalConstraint._greater_to_canonical.<locals>.fun   s     "txx{{"222r   c                 4                         |            fS r   rC   rc   s    r   r
   z6CanonicalConstraint._greater_to_canonical.<locals>.jac   s     488A;;,..r   c                 2                         | |           S r   re   rf   s      r   r   z7CanonicalConstraint._greater_to_canonical.<locals>.hess   s    yyVG,,,r   c                 D                         |                    z
  fS r   r6   )r%   r    r&   	finite_lbr   s    r   r	   z6CanonicalConstraint._greater_to_canonical.<locals>.fun   s"     "txx{{9'="===r   c                 @                         |                     fS r   rC   )r%   r    r)   r{   s    r   r
   z6CanonicalConstraint._greater_to_canonical.<locals>.jac   s      488A;;y#9"999r   c                 n    t          j        j                  }| |<                       | |          S r   rp   )r%   r+   r,   rs   r    r{   s       r   r   z7CanonicalConstraint._greater_to_canonical.<locals>.hess   s1    HTV$$ &w)yyA&r   rt   )r   r    r   r   r   r   r   r	   r
   r   r&   r)   r{   s    ``       @@@r   r   z)CanonicalConstraint._greater_to_canonical   s   HQKK	F 	)q!f--II!Q((I"&L		""6) 	'3 3 3 3 3 3 3/ / / / / /- - - - - - 
9--a0I))4MIB> > > > > > > >: : : : : : :' ' ' ' ' '
 s4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                                         |           }|                  z
  }|                  z
  }	         |	         z
  }|
         
         z
  }
         |
         z
  }|t          j        ||||f          fS r   )r	   r   r=   )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ry"b"b!12222r   c                                         |           }|	         }|         }|
          }|         }| }t          j        |          rt          j        ||||f          }nt	          j        ||||f          }||fS r   )r
   r0   issparserD   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 3z2r2r"233y"b"b!122t8Or   c                   	 d}|||z            }|z  }|||z            }|z  }|||z            }|z  }|||z            }t          j                  }||
<   ||<   | |<   ||z
  |<   	                    | |          S )Nr   )r   rG   r   )r%   r+   r,   n_startv_lv_gv_ilv_igrs   r    r   r   r   r   r   	n_greater
n_intervaln_lesss            r   r   z8CanonicalConstraint._interval_to_canonical.<locals>.hess5  s    G6!112CvG9!445Cy G''J"667Dz!G''J"667Db!!AAeHAdGAgJ+AhK99Q??"r   )r   r   ru   rP   r=   )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  s   wrvbF7"6VG#vg-
5!!!$z$"*W%%a(:h''*AM!$	^A&
)#a*n4{1~	=#6#0#9#0#:#0#:#< = =
	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3	 	 	 	 	 	 	 	 		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#$ s4c4???r   N)__name__
__module____qualname____doc__r   classmethodr!   r   r^   r   r   r   r   r$   r   r   r   r      s       # #H+ + + K K [K( F F [F* 7@ 7@ [7@r @ @ [@> %@ %@ [%@N %@ %@ [%@N ?@ ?@ [?@ ?@ ?@r   r   c                 4   g }g }g }g }|D ]}|j         j        }|j         j        }	|j        \  }
}t	          j        |
|k              r.|                    ||
z
             |                    |	           kt	          j        |
t          j         k              rP|t          j        k     }|                    ||         ||         z
             |                    |	|                    t	          j        |t          j        k              rS|
t          j         k    }|                    |
|         ||         z
             |                    |	|                     S|
t          j         k    }|t          j        k    }|
|k    }|| z  }|| z  }| | z  | z  }|                    ||         |
|         z
             |                    ||         ||         z
             |                    |
|         ||         z
             |                    ||         ||         z
             |                    |
|         ||         z
             |                    |	|                    |                    |	|                    |                    |	|                     |                    |	|                    |                    |	|                     |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`, modifies and
    concatenates them to the canonical constraint format.
    r   )r	   r   r   r   r   r   rO   r   r=   r   r0   rD   r1   )r   prepared_constraintsr]   c_eqc_ineqJ_eqJ_ineqr9   r   r   r   r   rm   r{   r   r   r   r   r   r   rD   r   s                         r    initial_constraints_as_canonicalr   J  sS    DFDF! !( !(EGEGB6"( 	(KKBKKNNNNVB26'M"" 	(RVIMM!I,I6777MM!I,''''VB"&L!! 	(bfWIMM"Y-!I,6777MM1Y<-((((BF7]F26\F"HEVG#Dw&Gv'6'1HKK%2e9,---MM!D'BtH,---MM"W+'
2333MM!H+84555MM"X,84555KK%!!!MM!D'"""MM1W:+&&&MM!H+&&&MM1X;,''''"329T???D"(9RYvbhqkkF !q!f%%!Q  *66$<<<UD%0VVF^^^5Fv%%r   )numpyr   scipy.sparsesparser0   r   r   r$   r   r   <module>r      su             B@ B@ B@ B@ B@ B@ B@ B@J
<& <& <& <& <&r   