Ë
    çÿæiZ.  ã                   óŽ   — 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y)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   ¢­Ž S )Nr   r   )ÚnpÚcopy)ÚxÚwrapper_argsÚargsÚfunctionÚncallss     €€€úp/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/scipy/optimize/_trustregion.pyÚfunction_wrapperz(_wrap_function.<locals>.function_wrapper   s-   ø€ Øˆq‹	�Q‰‹	áœŸ™ ›
Ð; l°TÑ&9Ò;Ð;ó    © )r   r   r   r   s   `` @r   Ú_wrap_functionr      s/   ú€ ð ˆS€FØÐØ�tˆ|Ðö<ð
 Ð#Ð#Ð#r   c                   óp   — 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y)Ú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 | _        || _        || _        || _	        || _
        y ©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__(   sQ   € ØˆŒØˆŒØˆŒØˆŒØˆŒØ!ˆÔØ!ˆÔØˆŒ	ØˆŒ	ØˆŒ
Øˆ�r   c                 ó®   — | j                   t        j                  | j                  |«      z   dt        j                  || j	                  |«      «      z  z   S )Ng      à?)r)   r   Údotr*   r,   ©r(   Úps     r   Ú__call__z BaseQuadraticSubproblem.__call__5   s=   € Ø�x‰xœ"Ÿ&™& §¡¨1Ó-Ñ-°´b·f±f¸QÀÇ
Á
È1ÃÓ6NÑ0NÑNÐNr   c                 ór   — | j                   € | j                  | j                  «      | _         | j                   S )z1Value of objective function at current iteration.)r   r$   r   ©r(   s    r   r)   zBaseQuadraticSubproblem.fun8   ó*   € ð �7‰7ˆ?Ø—i‘i §¡Ó(ˆDŒGØ�w‰wˆr   c                 ór   — | j                   € | 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                 ór   — | j                   € | 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‰7ˆ?Ø—j‘j §¡Ó)ˆDŒGØ�w‰wˆr   c                 ó’   — | j                   �| j                  | j                  |«      S t        j                  | j                  |«      S r   )r'   r   r   r/   r+   r0   s     r   r,   zBaseQuadraticSubproblem.hesspM   s6   € Ø�;‰;Ð"Ø—;‘;˜tŸw™w¨Ó*Ð*ä—6‘6˜$Ÿ)™) QÓ'Ð'r   c                 óŽ   — | j                   €.t        j                  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   s2   € ð �;‰;ÐÜŸ,™,×+Ñ+¨D¯H©HÓ5ˆDŒKØ�{‰{Ðr   c                 óH  — 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‰F�1�a‹LˆØ”—‘�q˜!“ÑˆÜ�F‰F�1�a‹L˜<¨™?Ñ*ˆÜ ŸI™I a¨¡c¨A¨a©C°©E¡kÓ2Ðð ”$—-‘-Ð 1°1Ó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ð 	5r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r2   Úpropertyr)   r*   r+   r,   r=   rP   rS   r   r   r   r   r      sq   „ ñóòOð ñó ðð ñó ðð ñó ðò(ð ñó ðò ó.5r   r   c                 ó¸  ‡&— t        |«       |€t        d«      ‚|€|€t        d«      ‚|€t        d«      ‚d|	cxk  rdk  st        d«      ‚ t        d«      ‚|dk  rt        d«      ‚|dk  rt        d	«      ‚||k\  rt        d
«      ‚t        j                  |«      j                  «       }t        | |||||¬«      Š&‰&j                  } ‰&j                  }t        |«      r‰&j                  }n7t        |«      rn+|t        v st        |t        «      rd}ˆ&fd„}nt        d«      ‚t        ||«      \  }}|€t        |«      dz  }d}|}|}|r|g}i }t!        |d«      r||d<    ||| |||fi |¤Ž}d}|j"                  |
k\  �r	 |j%                  |«      \  }} ||«      }||z   } ||| |||fi |¤Ž}|j                  |j                  z
  } |j                  |z
  }!|!dk  rd}n©| |!z  }"|"dk  r|dz  }n|"dkD  r|rt+        d|z  |«      }|"|	kD  r|}|}|r$j-                  t        j.                  |«      «       |dz  }t1        ||j                  ¬«      }#t3        ||#«      rn+|j"                  |
k  rd}n||k\  rd}n|j"                  |
k\  r�Œt4        d   t4        d   ddf}$|r¬|dk(  rt7        |$|   «       nt9        j:                  |$|   t<        d¬«       t7        d|j                  d›�«       t7        d|d›�«       t7        d‰&j>                  d›�«       t7        d‰&j@                  d›�«       t7        d‰&jB                  |d   z   d›�«       t1        ||dk(  ||j                  |jD                  ‰&j>                  ‰&j@                  ‰&jB                  |d   z   ||$|   ¬ «
      }%|�|j                  |%d!<   |r|%d"<   |%S # t        j&                  j(                  $ r d}Y �ŒQw xY w)#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.
        workers : int, map-like callable, optional
            A map-like callable, such as `multiprocessing.Pool.map` for evaluating
            any numerical differentiation in parallel.
            This evaluation is carried out as ``workers(fun, iterable)``.
            Only for 'trust-krylov', 'trust-ncg'.

            .. versionadded:: 1.16.0
        subproblem_maxiter : int, optional
            Maximum number of iterations to perform per subproblem. Only affects
            trust-exact. Default is 25.

            .. versionadded:: 1.17.0


    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   Úworkersc                 óD   •— ‰j                  | «      j                  |«      S r   )r+   r/   )r   r1   r   Úsfs      €r   r,   z%_minimize_trust_region.<locals>.hesspÔ   s   ø€ Ø—7‘7˜1“:—>‘> !Ó$Ð$r   éÈ   ÚMAXITER_DEFAULTÚmaxiteré   r?   g      è?r   )r   r)   Úsuccessz:A bad approximation caused failure to predict improvement.z3A linalg error occurred, such as a non-psd Hessian.)Ú
stacklevelz!         Current function value: Úfz         Iterations: rG   z         Function evaluations: z         Gradient evaluations: z         Hessian evaluations: )
r   ra   Ústatusr)   r*   ÚnfevÚnjevÚnhevÚnitÚmessager+   Úallvecs)#r   Ú
ValueErrorÚ	Exceptionr   ÚasarrayÚflattenr   r)   ÚgradÚcallabler+   r
   Ú
isinstancer	   r   ÚlenÚhasattrr=   rS   r;   ÚLinAlgErrorÚminÚappendr   r   r   r   ÚprintÚwarningsÚwarnÚRuntimeWarningre   Úngevrg   r*   )'r)   Úx0r   r*   r+   r,   Ú
subproblemÚinitial_trust_radiusÚmax_trust_radiusÚetaÚgtolr_   ÚdispÚ
return_allÚcallbackÚinexactrZ   Úsubproblem_maxiterÚunknown_optionsÚnhesspÚwarnflagrH   r   rj   Úsubproblem_init_kwÚ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   sw  ø€ ôZ ˜?Ô+à
€{Üð #ó $ð 	$à€|˜˜Üð Jó Kð 	KàÐÜð 0ó 1ð 	1à�ŒO�tŠOÜÐ7Ó8Ð8ð ÜÐ7Ó8Ð8Ø˜1ÒÜÐ?Ó@Ð@Ø˜qÒ ÜÐDÓEÐEØÐ/Ò/Üð ,ó -ð 	-ô 
�‰�B‹×	Ñ	Ó	!€Bô 
"ØˆR�S˜t¨$¸ô
€Bð �&‰&€CØ
�'‰'€CÜ�„~Ø�w‰w‰Ü	�%Œð 	Ø
”*Ñ
¤
¨4Ô1FÔ Gð ˆõ	%ô ð Jó Kð 	Kô # 5¨$Ó/�M€FˆEð €Ü�b“'˜#‘+ˆð €Hð (€LØ
€AÙØ�#ˆàÐÜˆzÐ,Ô-Ø(:Ð˜9Ñ%á�1�c˜3  eÑBÐ/AÑB€AØ	€Að �)‰)�tÓ
ð	Ø Ÿw™w |Ó4ÑˆAˆ}ñ ˜A›$ˆð ˜‘Uˆ
Ù 
¨C°°d¸EÑXÐEWÑXˆ
ð Ÿ5™5 :§>¡>Ñ1ÐØŸe™e oÑ5ÐØ !Ò#ØˆHØØÐ!4Ñ4ˆð �Š:Ø˜DÑ ‰LØ�4ŠZ™MÜ˜q ™~Ð/?Ó@ˆLð �Š9ØˆAØˆAñ Ø�N‰Nœ2Ÿ7™7 1›:Ô&Ø	ˆQ‰ˆä,¨q°a·e±eÔ<ÐÜ$ XÐ/BÔCØð �9‰9�tÒØˆHØð �Š<ØˆHØðo �)‰)�tÔ
ôv ˜IÑ&Ü˜IÑ&ØHØAð	€Oñ Ø�qŠ=Ü�/ (Ñ+Õ,ä�M‰M˜/¨(Ñ3´^ÐPQÕRÜÐ1°!·%±%¸°Ð;Ô<ÜÐ% a¨ UÐ+Ô,ÜÐ/°·±¸¨{Ð;Ô<ÜÐ/°·±¸¨{Ð;Ô<ÜÐ.¨r¯w©w¸À¹Ñ/BÀ1Ð.EÐFÔGä˜a¨(°a©-ÀØ !§¡¨1¯5©5°r·w±wÀRÇWÁWØ!#§¡¨6°!©9Ñ!4¸!Ø$3°HÑ$=ô?€Fð
 ÐØŸ™ˆˆv‰áØ#ˆˆyÑà€Møô] �y‰y×$Ñ$ò 	ØˆHÚð	ús   Æ N6 Î6OÏO)r   NNNNg      ð?g     @�@g333333Ã?g-Cëâ6?NFFNTNN)rW   rB   rx   Ú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ž      sZ   ðÙ  Û Û ã Û ÷3õ 3õ JÝ ?Ø
€ò$÷U5ñ U5ðp IMØADØCGØ@EØ@DØ.2ôSr   