ó
    Eñi;X  ã                   óª   • S r SSKJrJr  SSKJr  SSKrSSKJ	r	  / SQr
S r SS	 jr SS
 jr  SS jrS rS rS r\R$                  SSSSSS4S jrg)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                 ó4  • [         R                  " U5      u  n[         R                  " U5      u  n[        XR                  /US//SS9n[         R                  " U* U* /5      n[
        R                  " U5      nUR                  U5      n	U	SU n
X”XE-    * nX«4$ )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               Úm/home/mande/repo/quber/.venv/lib/python3.13/site-packages/scipy/optimize/_trustregion_constr/qp_subproblem.pyr   r      s•   € ô0 
�Š�!‹�B€AÜ	�Š�!‹�B€Aô
 ˜q§#¡#˜h¨¨D¨	Ð2¸5ÑA€Jä�iŠi˜!˜˜a˜R˜Ó!€Gô
 
�Š�ZÓ	 €BØ�h‰h�wÓ€GØ��ˆ€AØ# a¡c˜N˜?ÐàÐ"Ð"ó    Fc                 ó„  • [        U5      S:X  a  g[        R                  " U5      (       a3  U(       a"  [        R                  * n[        R                  nOSnSnSnXEU4$ [        R                  " X5      nS[        R                  " X5      -  n[        R                  " X 5      US-  -
  n	Xˆ-  SU-  U	-  -
  n
U
S:  a  SnSSU4$ [        R
                  " U
5      nU[        X¸5      -   nU* SU-  -  nSU	-  U-  n[        XE/5      u  pEU(       a  SnO-US:  d  US:”  a  SnSnSnOSn[        SU5      n[        SU5      nXEU4$ )	aà  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   sM  € ôB ˆAƒw�!ƒ|Øä	‡x‚x�×ÑÞÜ—&‘&�ˆBÜ—‘‰BàˆBØˆBØˆ	Ø�yÐ Ð ä
�Šˆq‹€AØ	ŒB�FŠF�1‹LÑ€AÜ
�Šˆq‹�| Q‘Ñ&€AØ‘3˜˜1™˜Q™‘;€LØ�aÓØˆ	Ø�!�YˆÐÜŸš Ó-Ðð ŒhÐ(Ó,Ñ
,€CØ
ˆ��1‘‰€BØ	ˆA‰�‰€BÜ�R�HÓ�F€BæØ‰	ð �‹6�R˜!“VØˆIØˆBØ‰BàˆIô �Q˜“ˆBÜ�Q˜“ˆBà�9ÐÐr$   c                 ó¾  • [         R                  " U 5      n [         R                  " U5      n[         R                  " U5      n[         R                  " U5      n[        U5      S:X  a  gUS:H  nX   X%   :  R                  5       (       d  X   X5   :„  R                  5       (       a  SnSSU4$ [         R                  " U5      nX   n X   nX'   nX7   nX -
  U-  nX0-
  U-  n	[        [         R                  " X‰5      5      n
[        [         R                  " X‰5      5      nX«::  a  SnOSnU(       d+  US:  d  U
S:”  a  SnSn
SnO[        SU
5      n
[        SU5      nX«U4$ )a½  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	   —   sO  € ôJ 	�
Š
�1‹€AÜ
�
Š
�1‹€AÜ	�Š�B‹€BÜ	�Š�B‹€BäˆAƒw�!ƒ|Øð �1‰f€Fð 	
‰	�B‘JÑ×#Ñ#×%Ñ%¨!©)°b±jÑ*@×)EÑ)E×)GÑ)GØˆ	Ø�!�YˆÐä—’ Ó'€JØ	‰€AØ	‰€AØ	‰€BØ	‰€Bð ‰D�A‰:€DØ‰D�A‰:€Dä	ŒR�ZŠZ˜Ó#Ó	$€BÜ	ŒR�ZŠZ˜Ó#Ó	$€Bð 
ƒxØ‰	àˆ	æØ�‹6�R˜!“VØˆIØˆBØ‰Bô �Q˜“ˆBÜ�Q˜“ˆBà�9ÐÐr$   c                 ó   • [        XX#U5      u  pxn	[        XUU5      u  p«n[        R                  " Xz5      n[        R                  " X‹5      nU	(       a  U(       a  XÞ::  a  SnOSnU(       a  X«US.nXxU	S.nXÞUUU4$ XÞU4$ )aU  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°°bØ0;ó=Ñ€D�ä2°1Ø3?Ø3>ó@Ñ€D�ô 
�Š�DÓ	€BÜ	�Š�DÓ	€BÞ–{ r£xØ‰	àˆ	æØ!¸KÑHˆØ¸ÑEˆØ�y +¨xÐ7Ð7à�yÐ Ð r$   c                 óX   • X:*  R                  5       =(       a    X:*  R                  5       $ )zCheck if lb <= x <= ub.)Úall©r!   rC   rD   s      r#   r   r   1  s   € à‰G�=‰=‹?×. ¡Ÿ}™}›Ð.r$   c                 óX   • [         R                  " [         R                  " X5      U5      $ )zReturn clipped value of x)r   rA   rB   rU   s      r#   Úreinforce_box_boundariesrW   6  s   € ä�:Š:”b—j’j Ó'¨Ó,Ð,r$   c                 óŠ  • UR                  U5      * n[        XdU5      (       a  [        U5      U::  a  UnU$ U R                  R                  U5      nU R                  U5      n	[        R                   " Xˆ5      * [        R                   " X™5      -  U-  n
[        R
                  " U
5      nU
nXj-
  n[        XÍXEU5      u  pïnU(       a  XÏU-  -   nOUnU
n[        XÍXEU5      u  pïnXÏU-  -   nUnUn[        XÍXEU5      u  pïnXÏU-  -   n[        U R                  U5      U-   5      [        U R                  U5      U-   5      :  a  U$ U$ )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   ;  sL  € ð` —E‘E˜!“H�9€Lä˜\¨r×2Ñ2Ü�Ó Ó-ØˆØˆð 	
�‰�‰�‹
€Að �%‰%�‹(€CÜ—F’F˜1“L�=¤2§6¢6¨#Ó#3Ñ3°aÑ7€Lä—=’= Ó.€Lð 	€AØÑ#€AÜ2°1¸Ø3?óAÑ€AˆiæØ�q‘‰[‰ð ˆØˆÜ.¨q°RØ/;ó=‰ˆ�!à�q‘‰[ˆð 	€AØ€AÜ*¨1°Ø+7ó9�K€Aˆaà	
�1‰W‰€Bô ˆA�E‰E�"‹I˜‰MÓœT !§%¡%¨£)¨a¡-Ó0Ó0Øˆ	àˆ	r$   c           
      óJ  • Sn[         R                  " U5      u  n[         R                  " U5      u  nUR                  U* 5      nUR                  U R                  U5      U-   5      nUR                  U5      nU* nU(       a  U/nU R                  U5      n[        U5      S-  nU[        U5      -
  nUS:  a  [	        S5      eUU:  a'  SSSS.nU(       a  WR                  U5        UUS'   UU4$ Uc0  [        [        S[         R                  " U5      -  S	U-  5      U5      nUc&  [         R                  " U[         R                  * 5      nUc%  [         R                  " U[         R                  5      nU	c  XÞ-
  n	[        X�U-
  5      n	U
c  XÞ-
  n
S
nSnSn[         R                  " U5      nSn[        U	5       GH»  nUU:  a  Sn  GO±US-  nUR                  U5      nUS::  aY  [         R                  " U5      (       a  [	        S5      e[        UUXgUSS9u  nn n!U!(       a  UU U-  -   n[        XöU5      nSnSn  GO<UU-  n UU U-  -   n"[         R                   R                  U"5      U:¼  a9  [        UU U-  XgU5      u  nn#n!U!(       a  UU#U -  U-  -   n[        XöU5      nSnSn  OÓ[#        U"Xg5      (       a  SnOUS-  nUS:”  a5  [        UU U-  XgU5      u  nn#n!U!(       a  UU#U -  U-  -   n[        UXg5      nSnUU
:”  a    OwU(       a  WR                  U"5        UU U-  -   n$UR                  U$5      n%[        U%5      S-  n&U&U-  n'U%* U'U-  -   nU"nU%nU%n[        U5      S-  nU R                  U5      nGM¾     [#        XöU5      (       d  UnSnUUUS.nU(       a  WUS'   UU4$ )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Úallvecsg{®Gáz„?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ä	�Š�!‹�B€AÜ	�Š�!‹�B€Að 	
�‰ˆqˆb‹	€AØ	�‰ˆa�e‰e�A‹h˜‰lÓ€AØ	�‰ˆa‹€AØ	
ˆ€Aö Ø�#ˆà
�%‰%�‹(€CÜ�‹7�A‰:€Dð ¤ a£Ñ(€KØ�QƒÜÐIÓJÐJð 
�}Ó	$Ø¨¸TÑBˆÞØ�N‰N˜1ÔØ%ˆD�‰OØ�$ˆwˆð �{Ü”#�dœRŸWšW T›]Ñ*¨C°$©JÓ7¸ÓGˆà	�zÜ�WŠW�QœŸ™˜Ó ˆØ	�zÜ�WŠW�QœŸ™ÓˆàÑØ‘3ˆÜ�8˜q™SÓ!€HàÑ"Ø™cÐà€MØ€IØ€GÜ—m’m AÓ&€OØ	€AÜ�8�_ˆà�#‹:ØˆIÚØ	ˆQ‰ˆà—‘˜“ˆà�Q‹;Ü�xŠx˜×%Ñ%Ü ð ">ó ?ð ?ô '?Ø�q˜" ,¸Dñ'BÑ#��5˜)ö Ø˜E !™G™�Aô -¨Q°BÓ7�à�	Ø $�Úð �v‘ˆØ�U˜1‘W‘ˆô �9‰9�>‰>˜&Ó! \Ó1ä":¸1¸eÀA¹gÀrØ;Gó#IÑˆAˆu�iö Ø˜˜e™ A™Ñ%�ô )¨°Ó3ˆAàˆIØ ˆMÙô ! ¨×0Ñ0Ø‰Gà�q‰LˆGà�Q‹;Ü":¸1¸eÀA¹gÀrØ;Gó#IÑˆAˆu�iæØ"# e¨E¡k°!¡mÑ"3�ô #;¸?Ø;=ó#C�à�àÐ(Ó(ÙæØ�N‰N˜6Ô"ð �U˜3‘Y‘ˆà—‘�v“ˆä˜“L !‘Oˆ	Ø˜4ÑˆØˆH�t˜A‘vÑˆàˆØˆØˆÜ�A‹w˜‰zˆØ�e‰e�A‹h‹ñi ôl ! ¨×+Ñ+ØˆØˆØ YØ*ñ,€DæØ!ˆˆY‰Øˆdˆ7€Nr$   )F)FF)Ú__doc__Úscipy.sparser   r   Úmathr   Únumpyr   Únumpy.linalgr   Ú__all__r   r   r	   r
   r   rW   r   r,   r   © r$   r#   Ú<module>rŒ      sw   ðÙ 9ç ,Ý Û Ý ò€ò*#ð\ &+ôSðn #(ôRðl */Ø(-ôB!òJ/ò
-ò
]ð@ .0¯V©VØ˜T tØ°DØ!õbr$   