§
    µ³Ùg1*  ã                   ó”   — d Z ddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZ g Zd„ Z G d„ d	¦  «        Z	 	 	 	 	 dd„ZdS )zTrust-region optimization.é    Né   )Ú_check_unknown_optionsÚ_status_messageÚOptimizeResultÚ_prepare_scalar_functionÚ_call_callback_maybe_halt)ÚHessianUpdateStrategy)Ú
FD_METHODSc                 ó0   ‡ ‡‡— dgŠ‰ €‰d fS ˆˆ ˆfd„}‰|fS )Nr   c                 ó`   •— ‰dxx         dz  cc<    ‰t          j        | ¦  «        g|‰z   ¢R Ž S )Nr   r   )ÚnpÚcopy)ÚxÚwrapper_argsÚargsÚfunctionÚncallss     €€€úQ/granary/edev/quantum/lib/python3.11/site-packages/scipy/optimize/_trustregion.pyÚfunction_wrapperz(_wrap_function.<locals>.function_wrapper   s=   ø€ Øˆqˆ	ˆ	Œ	�Q‰ˆ	ˆ	‰	àˆx�œ ™
œ
Ð; l°TÑ&9Ð;Ð;Ð;Ð;ó    © )r   r   r   r   s   `` @r   Ú_wrap_functionr      sO   øøø€ ð ˆS€FØÐØ�tˆ|Ðð<ð <ð <ð <ð <ð <ð <ð
 Ð#Ð#Ð#r   c                   óŠ   — e Zd ZdZdd„Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	d„ Z
ed	„ ¦   «         Zd
„ Zd„ ZdS )ÚBaseQuadraticSubproblemaQ  
    Base/abstract class defining the quadratic model for trust-region
    minimization. Child classes must implement the ``solve`` method.

    Values of the objective function, Jacobian and Hessian (if provided) at
    the current iterate ``x`` are evaluated on demand and then stored as
    attributes ``fun``, ``jac``, ``hess``.
    Nc                 ó    — || _         d | _        d | _        d | _        d | _        d | _        d | _        || _        || _        || _	        || _
        d S ©N)Ú_xÚ_fÚ_gÚ_hÚ_g_magÚ_cauchy_pointÚ_newton_pointÚ_funÚ_jacÚ_hessÚ_hessp)Úselfr   ÚfunÚjacÚhessÚhessps         r   Ú__init__z BaseQuadraticSubproblem.__init__(   sU   € ØˆŒØˆŒØˆŒØˆŒØˆŒØ!ˆÔØ!ˆÔØˆŒ	ØˆŒ	ØˆŒ
ØˆŒˆˆr   c                 óž   — | j         t          j        | j        |¦  «        z   dt          j        ||                      |¦  «        ¦  «        z  z   S )Ng      à?)r)   r   Údotr*   r,   ©r(   Úps     r   Ú__call__z BaseQuadraticSubproblem.__call__5   s=   € ØŒx�"œ& ¤¨1Ñ-Ô-Ñ-°µb´f¸QÀÇ
Â
È1ÁÄÑ6NÔ6NÑ0NÑNÐNr   c                 ó\   — | j         €|                      | j        ¦  «        | _         | j         S )z1Value of objective function at current iteration.)r   r$   r   ©r(   s    r   r)   zBaseQuadraticSubproblem.fun8   ó'   € ð Œ7ˆ?Ø—i’i ¤Ñ(Ô(ˆDŒGØŒwˆr   c                 ó\   — | j         €|                      | j        ¦  «        | _         | j         S )z=Value of Jacobian of objective function at current iteration.)r   r%   r   r4   s    r   r*   zBaseQuadraticSubproblem.jac?   r5   r   c                 ó\   — | j         €|                      | j        ¦  «        | _         | j         S )z<Value of Hessian of objective function at current iteration.)r    r&   r   r4   s    r   r+   zBaseQuadraticSubproblem.hessF   s'   € ð Œ7ˆ?Ø—j’j ¤Ñ)Ô)ˆDŒGØŒwˆr   c                 óz   — | j         �|                       | j        |¦  «        S t          j        | j        |¦  «        S r   )r'   r   r   r/   r+   r0   s     r   r,   zBaseQuadraticSubproblem.hesspM   s4   € ØŒ;Ð"Ø—;’;˜tœw¨Ñ*Ô*Ð*å”6˜$œ) QÑ'Ô'Ð'r   c                 óp   — | j         €)t          j                             | j        ¦  «        | _         | j         S )zAMagnitude of jacobian of objective function at current iteration.)r!   ÚscipyÚlinalgÚnormr*   r4   s    r   Újac_magzBaseQuadraticSubproblem.jac_magS   s-   € ð Œ;ÐÝœ,×+Ò+¨D¬HÑ5Ô5ˆDŒKØŒ{Ðr   c                 óF  — t          j        ||¦  «        }dt          j        ||¦  «        z  }t          j        ||¦  «        |dz  z
  }t          j        ||z  d|z  |z  z
  ¦  «        }|t          j        ||¦  «        z   }| d|z  z  }	d|z  |z  }
t          |	|
g¦  «        S )zÄ
        Solve the scalar quadratic equation ``||z + t d|| == trust_radius``.
        This is like a line-sphere intersection.
        Return the two values of t, sorted from low to high.
        é   é   éþÿÿÿ)r   r/   ÚmathÚsqrtÚcopysignÚsorted)r(   ÚzÚdÚtrust_radiusÚaÚbÚcÚsqrt_discriminantÚauxÚtaÚtbs              r   Úget_boundaries_intersectionsz4BaseQuadraticSubproblem.get_boundaries_intersectionsZ   s¦   € õ ŒF�1�a‰LŒLˆØ•”�q˜!‘”ÑˆÝŒF�1�a‰LŒL˜<¨™?Ñ*ˆÝ œI a¨¡c¨A¨a©C°©E¡kÑ2Ô2Ðð •$”-Ð 1°1Ñ5Ô5Ñ5ˆØˆT�Q�q‘S‰\ˆØ�‰T�C‰ZˆÝ�r˜2�hÑÔÐr   c                 ó    — t          d¦  «        ‚)Nz9The solve method should be implemented by the child class)ÚNotImplementedError)r(   rH   s     r   ÚsolvezBaseQuadraticSubproblem.solveq   s   € Ý!ð #4ñ 5ô 5ð 	5r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r2   Úpropertyr)   r*   r+   r,   r=   rP   rS   r   r   r   r   r      sÝ   € € € € € ðð ðð ð ð ðOð Oð Oð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð(ð (ð (ð ðð ñ „Xðð ð  ð  ð.5ð 5ð 5ð 5ð 5r   r   r   ç      ð?ç     @�@ç333333Ã?ç-Cëâ6?FTc                 óÒ  ‡#— t          |¦  «         |€t          d¦  «        ‚|€|€t          d¦  «        ‚|€t          d¦  «        ‚d|	cxk    rdk     sn t          d¦  «        ‚|dk    rt          d¦  «        ‚|dk    rt          d	¦  «        ‚||k    rt          d
¦  «        ‚t          j        |¦  «                             ¦   «         }t          | ||||¬¦  «        Š#‰#j        } ‰#j        }t          |¦  «        r‰#j
        }nEt          |¦  «        rn5|t          v st          |t          ¦  «        rd}ˆ#fd„}nt          d¦  «        ‚t          ||¦  «        \  }}|€t          |¦  «        dz  }d}|}|}|r|g} ||| |||¦  «        }d}|j        |
k    �r%	 |                     |¦  «        \  }}n# t          j        j        $ r d}Y nów xY w ||¦  «        }||z   } ||| |||¦  «        }|j        |j        z
  }|j        |z
  }|dk    rd}n®||z  }|dk     r|dz  }n|dk    r|rt)          d|z  |¦  «        }||	k    r|}|}|r'|                     t          j        |¦  «        ¦  «         |dz  }t/          ||j        ¬¦  «        } t1          || ¦  «        rn#|j        |
k     rd}n||k    rd}n|j        |
k    �°%t2          d         t2          d         ddf}!|r¶|dk    rt5          |!|         ¦  «         n"t7          j        |!|         t:          d¬¦  «         t5          d|j        d›�¦  «         t5          d|z  ¦  «         t5          d‰#j        z  ¦  «         t5          d‰#j        z  ¦  «         t5          d‰#j         |d         z   z  ¦  «         t/          ||dk    ||j        |j!        ‰#j        ‰#j        ‰#j         |d         z   ||!|         ¬¦
  «
        }"|�
|j
        |"d<   |r||"d <   |"S )!aÐ  
    Minimization of scalar function of one or more variables using a
    trust-region algorithm.

    Options for the trust-region algorithm are:
        initial_trust_radius : float
            Initial trust radius.
        max_trust_radius : float
            Never propose steps that are longer than this value.
        eta : float
            Trust region related acceptance stringency for proposed steps.
        gtol : float
            Gradient norm must be less than `gtol`
            before successful termination.
        maxiter : int
            Maximum number of iterations to perform.
        disp : bool
            If True, print convergence message.
        inexact : bool
            Accuracy to solve subproblems. If True requires less nonlinear
            iterations, but more vector products. Only effective for method
            trust-krylov.

    This function is called by the `minimize` function.
    It is not supposed to be called directly.
    Nz7Jacobian is currently required for trust-region methodsz_Either the Hessian or the Hessian-vector product is currently required for trust-region methodszBA subproblem solving strategy is required for trust-region methodsr   g      Ð?zinvalid acceptance stringencyz%the max trust radius must be positivez)the initial trust radius must be positivez?the initial trust radius must be less than the max trust radius)r*   r+   r   c                 óT   •— ‰                      | ¦  «                             |¦  «        S r   )r+   r/   )r   r1   r   Úsfs      €r   r,   z%_minimize_trust_region.<locals>.hesspÀ   s   ø€ Ø—7’7˜1‘:”:—>’> !Ñ$Ô$Ð$r   éÈ   é   r?   g      è?r   )r   r)   ÚsuccessÚmaxiterz:A bad approximation caused failure to predict improvement.z3A linalg error occurred, such as a non-psd Hessian.)Ú
stacklevelz!         Current function value: Úfz         Iterations: %dz!         Function evaluations: %dz!         Gradient evaluations: %dz          Hessian evaluations: %d)
r   rb   Ústatusr)   r*   ÚnfevÚnjevÚnhevÚnitÚmessager+   Úallvecs)"r   Ú
ValueErrorÚ	Exceptionr   ÚasarrayÚflattenr   r)   ÚgradÚcallabler+   r
   Ú
isinstancer	   r   Úlenr=   rS   r;   ÚLinAlgErrorÚminÚappendr   r   r   r   ÚprintÚwarningsÚwarnÚRuntimeWarningrg   Úngevri   r*   )$r)   Úx0r   r*   r+   r,   Ú
subproblemÚinitial_trust_radiusÚmax_trust_radiusÚetaÚgtolrc   ÚdispÚ
return_allÚcallbackÚinexactÚunknown_optionsÚnhesspÚwarnflagrH   r   rl   ÚmÚkr1   Úhits_boundaryÚpredicted_valueÚ
x_proposedÚ
m_proposedÚactual_reductionÚpredicted_reductionÚrhoÚintermediate_resultÚstatus_messagesÚresultr_   s$                                      @r   Ú_minimize_trust_regionr–   v   s  ø€ õ> ˜?Ñ+Ô+Ð+à
€{Ýð #ñ $ô $ð 	$à€|˜˜Ýð Jñ Kô Kð 	KàÐÝð 0ñ 1ô 1ð 	1à�ˆOˆOŠOˆO�tŠOˆOˆOˆOÝÐ7Ñ8Ô8Ð8Ø˜1ÒÐÝÐ?Ñ@Ô@Ð@Ø˜qÒ Ð ÝÐDÑEÔEÐEØÐ/Ò/Ð/Ýð ,ñ -ô -ð 	-õ 
Œ�B‰Œ×	Ò	Ñ	!Ô	!€Bõ 
" # r¨s¸ÀDÐ	IÑ	IÔ	I€BØ
Œ&€CØ
Œ'€CÝ��~„~ð KØŒwˆˆÝ	�%‰Œð Kð 	Ø
•*Ð
Ð
¥
¨4Õ1FÑ GÔ GÐ
ð ˆð	%ð 	%ð 	%ð 	%ð 	%ð 	%õ ð Jñ Kô Kð 	Kõ # 5¨$Ñ/Ô/�M€FˆEð €Ý�b‘'”'˜#‘+ˆð €Hð (€LØ
€AØð Ø�#ˆØˆ
�1�c˜3  eÑ,Ô,€AØ	€Að Œ)�tÒ
Ñ
ð	Ø Ÿwšw |Ñ4Ô4ÑˆAˆ}ˆ}øÝŒyÔ$ð 	ð 	ð 	ØˆHØˆEð	øøøð
 ˜!˜A™$œ$ˆð ˜‘Uˆ
Ø�Z 
¨C°°d¸EÑBÔBˆ
ð œ5 :¤>Ñ1ÐØœe oÑ5ÐØ !Ò#Ð#ØˆHØØÐ!4Ñ4ˆð �Š:ˆ:Ø˜DÑ ˆLˆLØ�4ŠZˆZ˜MˆZÝ˜q ™~Ð/?Ñ@Ô@ˆLð �Š9ˆ9ØˆAØˆAð ð 	'Ø�NŠN�2œ7 1™:œ:Ñ&Ô&Ð&Ø	ˆQ‰ˆå,¨q°a´eÐ<Ñ<Ô<ÐÝ$ XÐ/BÑCÔCð 	Øð Œ9�tÒÐØˆHØð �Š<ˆ<ØˆHØðo Œ)�tÒ
Ñ
õv ˜IÔ&Ý˜IÔ&ØHØAð	€Oð ð 	JØ�qŠ=ˆ=Ý�/ (Ô+Ñ,Ô,Ð,Ð,åŒM˜/¨(Ô3µ^ÐPQÐRÑRÔRÐRÝÐ;°!´%Ð;Ð;Ð;Ñ<Ô<Ð<ÝÐ'¨!Ñ+Ñ,Ô,Ð,ÝÐ1°B´GÑ;Ñ<Ô<Ð<ÝÐ1°B´GÑ;Ñ<Ô<Ð<ÝÐ0°B´G¸fÀQ¼iÑ4GÑHÑIÔIÐIå˜a¨(°aª-ÀØ !¤¨1¬5°r´wÀRÄWØ!#¤¨6°!¬9Ñ!4¸!Ø$3°HÔ$=ð?ñ ?ô ?€Fð
 ÐØœˆˆv‰àð $Ø#ˆˆyÑà€Ms   ÆF0 Æ0G	ÇG	)r   NNNNrY   rZ   r[   r\   NFFNT)rW   rB   ry   Únumpyr   Úscipy.linalgr:   Ú	_optimizer   r   r   r   r   Ú'scipy.optimize._hessian_update_strategyr	   Ú(scipy.optimize._differentiable_functionsr
   Ú__all__r   r   r–   r   r   r   ú<module>r�      s  ðØ  Ð  Ø €€€Ø €€€à Ð Ð Ð Ø Ð Ð Ð ð3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð JÐ IÐ IÐ IÐ IÐ IØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø
€ð$ð $ð $ðU5ð U5ð U5ð U5ð U5ñ U5ô U5ð U5ðp IMØADØCGØ@EØ26ð	zð zð zð zð zð zr   