
    Ui;X                         d Z ddlmZmZ ddlmZ ddlZddlm	Z	 g dZ
d Z	 dd	Z	 dd
Z	 	 ddZd Zd Zd Zej        ddddddfdZdS )z3Equality-constrained quadratic programming solvers.    )linalgblock_array)copysignN)norm)eqp_kktfactsphere_intersectionsbox_intersectionsbox_sphere_intersectionsinside_box_boundariesmodified_doglegprojected_cgc                 L   t          j        |          \  }t          j        |          \  }t          | |j        g|dggd          }t          j        | | g          }t          j        |          }|                    |          }	|	d|         }
|	|||z             }|
|fS )a  Solve equality-constrained quadratic programming (EQP) problem.

    Solve ``min 1/2 x.T H x + x.t c`` subject to ``A x + b = 0``
    using direct factorization of the KKT system.

    Parameters
    ----------
    H : sparse array, shape (n, n)
        Hessian matrix of the EQP problem.
    c : array_like, shape (n,)
        Gradient of the quadratic objective function.
    A : sparse array
        Jacobian matrix of the EQP problem.
    b : array_like, shape (m,)
        Right-hand side of the constraint equation.

    Returns
    -------
    x : array_like, shape (n,)
        Solution of the KKT problem.
    lagrange_multipliers : ndarray, shape (m,)
        Lagrange multipliers of the KKT problem.
    Ncsc)format)npshaper   Thstackr   splusolve)HcAbnm
kkt_matrixkkt_veclukkt_solxlagrange_multiplierss               /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/scipy/optimize/_trustregion_constr/qp_subproblem.pyr   r      s    0 
!BA	!BA
 q!#hD	25AAAJi!aR!!G
 
Z	 	 BhhwGA#AacEN?"""    Fc                 ~   t          |          dk    rdS t          j        |          r'|rt          j         }t          j        }nd}d}d}|||fS t          j        ||          }dt          j        | |          z  }t          j        | |           |dz  z
  }	||z  d|z  |	z  z
  }
|
dk     rd}dd|fS t          j        |
          }|t          ||          z   }| d|z  z  }d|	z  |z  }t          ||g          \  }}|rd}n5|dk     s|dk    rd}d}d}n"d}t          d|          }t          d|          }|||fS )	aH  Find the intersection between segment (or line) and spherical constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d`` and the ball
    ``||x|| <= trust_radius``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    trust_radius : float
        Ball radius.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the ball
        ``||x|| <= trust_radius``. When ``False``, the function returns the intersection
        between the segment ``x(t) = z + t*d``, ``0 <= t <= 1``, and the ball.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the ball for
        for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line/segment
        and the sphere. On the other hand, when ``False``, there is no
        intersection.
    r   r   r   F   T      F)
r   r   isinfinfdotsqrtr   sortedmaxmin)zdtrust_radiusentire_linetatb	intersectar   r   discriminantsqrt_discriminantauxs                r#   r   r   A   s   B Aww!||{	x ! 	&BBBBB	2y  
q!A	BF1aLLA
q!|Q&AQ31Q;La	!Y-- h(!,,
,C
1B	ABRHFB 		 66R!VVIBBBI QBQBr9r$   c                    t          j        |           } t          j        |          }t          j        |          }t          j        |          }t          |          dk    rdS |dk    }| |         ||         k                                     s$| |         ||         k                                    rd}dd|fS t          j        |          }| |         } ||         }||         }||         }|| z
  |z  }|| z
  |z  }	t          t          j        ||	                    }
t          t          j        ||	                    }|
|k    rd}nd}|s3|dk     s|
dk    rd}d}
d}n t          d|
          }
t          d|          }|
||fS )a5  Find the intersection between segment (or line) and box constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d`` and the rectangular box
    ``lb <= x <= ub``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the rectangular
        box. When ``False``, the function returns the intersection between the segment
        ``x(t) = z + t*d``, ``0 <= t <= 1``, and the rectangular box.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the box for
        for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line (or segment)
        and the rectangular box. On the other hand, when ``False``, there is no
        intersection.
    r   r&   FTr'   )	r   asarrayr   anylogical_notr0   minimumr1   maximum)r2   r3   lbubr5   zero_dr8   
not_zero_dt_lbt_ubr6   r7   s               r#   r	   r	      s   J 	
1A

1A	BB	BBAww!||{ 1fF 	
&	BvJ##%% !F)bj*@)E)E)G)G 	!Y''J	*A	*A	JB	JB qDA:DqDA:D	RZd##	$	$B	RZd##	$	$B 
Rxx			 66R!VVIBBB QBQBr9r$   c                    t          | ||||          \  }}}	t          | |||          \  }
}}t          j        ||
          }t          j        ||          }|	r|r	||k    rd}nd}|r|
||d}|||	d}|||||fS |||fS )a  Find the intersection between segment (or line) and box/sphere constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d``, the rectangular box
    ``lb <= x <= ub`` and the ball ``||x|| <= trust_radius``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    trust_radius : float
        Ball radius.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the constraints.
        When ``False``, the function returns the intersection between the segment
        ``x(t) = z + t*d``, ``0 <= t <= 1`` and the constraints.
    extra_info : bool, optional
        When ``True``, the function returns ``intersect_sphere`` and ``intersect_box``.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the rectangular box and
        inside the ball for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line (or segment)
        and both constraints. On the other hand, when ``False``, there is no
        intersection.
    sphere_info : dict, optional
        Dictionary ``{ta, tb, intersect}`` containing the interval ``[ta, tb]``
        for which the line intercepts the ball. And a boolean value indicating
        whether the sphere is intersected by the line.
    box_info : dict, optional
        Dictionary ``{ta, tb, intersect}`` containing the interval ``[ta, tb]``
        for which the line intercepts the box. And a boolean value indicating
        whether the box is intersected by the line.
    TF)r6   r7   r8   )r	   r   r   rB   rA   )r2   r3   rC   rD   r4   r5   
extra_infota_btb_bintersect_bta_stb_sintersect_sr6   r7   r8   sphere_infobox_infos                     r#   r
   r
      s    b 01b"0;= =D$21a3?3>@ @D$ 
D$		B	D$		B { rRxx			 !!KHHdEE2y+x772y  r$   c                 b    || k                                     o| |k                                     S )zCheck if lb <= x <= ub.)allr!   rC   rD   s      r#   r   r   1  s%    !G==??.R}}.r$   c                 R    t          j        t          j        | |          |          S )zReturn clipped value of x)r   rA   rB   rU   s      r#   reinforce_box_boundariesrW   6  s     :bjB'',,,r$   c                    |                     |           }t          |||          rt          |          |k    r|}|S | j                             |          }|                      |          }	t	          j         ||           t	          j         |	|	          z  |z  }
t	          j        |
          }|
}||
z
  }t          |||||          \  }}}|r	|||z  z   }n#|}|
}t          |||||          \  }}}|||z  z   }|}|}t          |||||          \  }}}|||z  z   }t          |                      |          |z             t          |                      |          |z             k     r|S |S )a?  Approximately  minimize ``1/2*|| A x + b ||^2`` inside trust-region.

    Approximately solve the problem of minimizing ``1/2*|| A x + b ||^2``
    subject to ``||x|| < Delta`` and ``lb <= x <= ub`` using a modification
    of the classical dogleg approach.

    Parameters
    ----------
    A : LinearOperator (or sparse array or ndarray), shape (m, n)
        Matrix ``A`` in the minimization problem. It should have
        dimension ``(m, n)`` such that ``m < n``.
    Y : LinearOperator (or sparse array or ndarray), shape (n, m)
        LinearOperator that apply the projection matrix
        ``Q = A.T inv(A A.T)`` to the vector. The obtained vector
        ``y = Q x`` being the minimum norm solution of ``A y = x``.
    b : array_like, shape (m,)
        Vector ``b``in the minimization problem.
    trust_radius: float
        Trust radius to be considered. Delimits a sphere boundary
        to the problem.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``.
        It is expected that ``lb <= 0``, otherwise the algorithm
        may fail. If ``lb[i] = -Inf``, the lower
        bound for the ith component is just ignored.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``.
        It is expected that ``ub >= 0``, otherwise the algorithm
        may fail. If ``ub[i] = Inf``, the upper bound for the ith
        component is just ignored.

    Returns
    -------
    x : array_like, shape (n,)
        Solution to the problem.

    Notes
    -----
    Based on implementations described in pp. 885-886 from [1]_.

    References
    ----------
    .. [1] Byrd, Richard H., Mary E. Hribar, and Jorge Nocedal.
           "An interior point algorithm for large-scale nonlinear
           programming." SIAM Journal on Optimization 9.4 (1999): 877-900.
    )r-   r   r   r   r   
zeros_liker
   )r   Yr   r4   rC   rD   newton_pointr!   gA_gcauchy_pointorigin_pointr2   p_alphar8   x1x2s                      r#   r   r   ;  s   ` EE!HH9L\2r22 -- 	


A %%((CF1aLL=26#s#3#33a7L=..L 	A|#A21aR3?A AAui 	q[ .q!R/;= =5!q[ 	AA*1aR+79 9KAua	
U1WB AEE"IIMT!%%))a-0000		r$   c           	         d}t          j        |          \  }t          j        |          \  }|                    |           }|                    |                     |          |z             }|                    |          }| }|r|g}|                     |          }t          |          dz  }|t          |          z
  }|dk     rt	          d          ||k     r&dddd}|r|                    |           ||d<   ||fS |6t          t          d	t          j        |          z  d
|z            |          }| t          j	        |t           j
                   }|t          j	        |t           j
                  }|	||z
  }	t          |	||z
            }	|
||z
  }
d}d}d}t          j        |          }d}t          |	          D ]}||k     rd} n|dz  }|                    |          }|dk    r^t          j        |          rt	          d          t          |||||d          \  }} }!|!r|| |z  z   }t          |||          }d}d} nR||z  } || |z  z   }"t           j                            |"          |k    r>t          || |z  |||          \  }}#}!|!r||#| z  |z  z   }t          |||          }d}d} nt#          |"||          rd}n|dz  }|dk    r:t          || |z  |||          \  }}#}!|!r||#| z  |z  z   }t          |||          }d}||
k    r n|r|                    |"           || |z  z   }$|                    |$          }%t          |%          dz  }&|&|z  }'|% |'|z  z   }|"}|%}|%}t          |          dz  }|                     |          }t#          |||          s|}d}|||d}|r||d<   ||fS )a  Solve EQP problem with projected CG method.

    Solve equality-constrained quadratic programming problem
    ``min 1/2 x.T H x + x.t c``  subject to ``A x + b = 0`` and,
    possibly, to trust region constraints ``||x|| < trust_radius``
    and box constraints ``lb <= x <= ub``.

    Parameters
    ----------
    H : LinearOperator (or sparse array or ndarray), shape (n, n)
        Operator for computing ``H v``.
    c : array_like, shape (n,)
        Gradient of the quadratic objective function.
    Z : LinearOperator (or sparse array or ndarray), shape (n, n)
        Operator for projecting ``x`` into the null space of A.
    Y : LinearOperator,  sparse array, ndarray, shape (n, m)
        Operator that, for a given a vector ``b``, compute smallest
        norm solution of ``A x + b = 0``.
    b : array_like, shape (m,)
        Right-hand side of the constraint equation.
    trust_radius : float, optional
        Trust radius to be considered. By default, uses ``trust_radius=inf``,
        which means no trust radius at all.
    lb : array_like, shape (n,), optional
        Lower bounds to each one of the components of ``x``.
        If ``lb[i] = -Inf`` the lower bound for the i-th
        component is just ignored (default).
    ub : array_like, shape (n, ), optional
        Upper bounds to each one of the components of ``x``.
        If ``ub[i] = Inf`` the upper bound for the i-th
        component is just ignored (default).
    tol : float, optional
        Tolerance used to interrupt the algorithm.
    max_iter : int, optional
        Maximum algorithm iterations. Where ``max_inter <= n-m``.
        By default, uses ``max_iter = n-m``.
    max_infeasible_iter : int, optional
        Maximum infeasible (regarding box constraints) iterations the
        algorithm is allowed to take.
        By default, uses ``max_infeasible_iter = n-m``.
    return_all : bool, optional
        When ``true``, return the list of all vectors through the iterations.

    Returns
    -------
    x : array_like, shape (n,)
        Solution of the EQP problem.
    info : Dict
        Dictionary containing the following:

            - niter : Number of iterations.
            - stop_cond : Reason for algorithm termination:
                1. Iteration limit was reached;
                2. Reached the trust-region boundary;
                3. Negative curvature detected;
                4. Tolerance was satisfied.
            - allvecs : List containing all intermediary vectors (optional).
            - hits_boundary : True if the proposed step is on the boundary
              of the trust region.

    Notes
    -----
    Implementation of Algorithm 6.2 on [1]_.

    In the absence of spherical and box constraints, for sufficient
    iterations, the method returns a truly optimal result.
    In the presence of those constraints, the value returned is only
    a inexpensive approximation of the optimal value.

    References
    ----------
    .. [1] Gould, Nicholas IM, Mary E. Hribar, and Jorge Nocedal.
           "On the solution of equality constrained quadratic
            programming problems arising in optimization."
            SIAM Journal on Scientific Computing 23.4 (2001): 1376-1395.
    g}:r(   r   z.Trust region problem does not have a solution.T)niter	stop_condhits_boundaryallvecsNg{Gz?g?Fr'   r)   z9Negative curvature not allowed for unrestricted problems.)r5      )r   r   r-   r   
ValueErrorappendr0   r1   r.   fullr,   rY   ranger+   r
   rW   r   r   )(r   r   ZrZ   r   r4   rC   rD   tolmax_itermax_infeasible_iter
return_allCLOSE_TO_ZEROr   r   r!   rr\   r`   ri   H_prt_gtr_distanceinforh   rg   counterlast_feasible_xkipt_H_pra   rb   r8   x_nextthetar_nextg_next	rt_g_nextbetas(                                           r#   r   r     s   ` M	!BA	!BA 	
qb		A	aeeAhhlA	aA	
A  #
%%((C77A:D a(KQIJJJ 
}	$	$TBB 	&NN1%DO$w {#dRWT]]*C$J77GG	zWQ  	zWQQ38QqS!!H"cMIGmA&&O	A8__ T T#::IE	QQ;;x%%   "> ? ? ? '?q"b,D'B 'B 'B#5)  $E!GA -QB77	 $ vU1W 9>>&!!\11":1eAgr2;G#I #IAui  &eA% )B33AI ME !R00 	GGqLGQ;;":1eAgr2;G#I #IAui "#eEk!m"3 #;?;=r#C #C(((E 	#NN6""" U3YvLL!O	4HtAvAwwzeeAhh B++ Y*, ,D "!Yd7Nr$   )F)FF)__doc__scipy.sparser   r   mathr   numpyr   numpy.linalgr   __all__r   r   r	   r
   r   rW   r   r,   r    r$   r#   <module>r      s<   9 9 , , , , , , , ,                  *# *# *#\ &+S S S Sn #(R R R Rl */(-B! B! B! B!J/ / /
- - -
] ] ]@ .0VTtD!b b b b b br$   