
    JThF                     j    S SK JrJr  S SKrS SKJr  SSKJrJr  S/rS
S jr	 SS jr
 " S	 S\5      rg)    )OptionalUnionN)Tensor   )	OptimizerParamsTLBFGSc                 :   Ub  Uu  pxOX::  a  X4OX04u  pxX%-   SX-
  -  X-
  -  -
  n	U	S-  X%-  -
  n
U
S:  a_  U
R                  5       nX::  a  X3U -
  X[-   U	-
  XR-
  SU-  -   -  -  -
  nOX U-
  X+-   U	-
  X%-
  SU-  -   -  -  -
  n[        [        X5      U5      $ Xx-   S-  $ )N      r   g       @)sqrtminmax)x1f1g1x2f2g2bounds
xmin_bound
xmax_boundd1	d2_squared2min_poss                I/var/www/auris/envauris/lib/python3.13/site-packages/torch/optim/lbfgs.py_cubic_interpolater      s     !'
J-/X"B8
 
1=BG,	,BAIA~^^8G2"'AF:J(KLLGG2"'AF:J(KLLG3w+Z88'3..    c           
         UR                  5       R                  5       nUR                  [        R                  S9nU " XU5      u  pSnUR                  U5      nSXEU4u  nnnnSnSnUU
:  Ga
  XXr-  U-  -   :  d  US:  a2  UU:  a,  UU/nUU/nUUR                  [        R                  S9/nUU/nO[        U5      U* U-  ::  a  U/nU/nU/nSnOUS:  a,  UU/nUU/nUUR                  [        R                  S9/nUU/nOtUSUU-
  -  -   nUS-  nUn[        UUUX,UUU4S9nUnUnUR                  [        R                  S9nUnU " XU5      u  pUS-  nUR                  U5      nUS-  nUU
:  a  GM
  UU
:X  a
  SU/nXL/nX]/nSnWS   US	   ::  a  S
OSu  nnU(       Gd  UU
:  Ga  [        WS   US   -
  5      U-  U	:  a  GO[        US   US   WS   US   US   US   5      nS[        U5      [        U5      -
  -  n [        [        U5      U-
  U[        U5      -
  5      U :  ax  U(       d  U[        U5      :  d  U[        U5      ::  aP  [        U[        U5      -
  5      [        U[        U5      -
  5      :  a  [        U5      U -
  nO[        U5      U -   nSnOSnOSnU " XU5      u  pUS-  nUR                  U5      nUS-  nXXr-  U-  -   :  d	  UUU   :  aC  UUU'   UUU'   UR                  [        R                  S9WU'   UUU'   US   US   ::  a  S
OSu  nnOw[        U5      U* U-  ::  a  SnO2UUU   UU   -
  -  S:  a   UU   UU'   UU   UU'   WU   UU'   UU   UU'   UUU'   UUU'   UR                  [        R                  S9WU'   UUU'   U(       d	  UU
:  a  GM  WU   nUU   nWU   nXX.4$ )Nmemory_formatr   r   FTg{Gz?
   )r   )r   r   )r   r   g?)absr   clonetorchcontiguous_formatdotr   r   )!obj_funcxtdfggtdc1c2tolerance_changemax_lsd_normf_newg_newls_func_evalsgtd_newt_prevf_prevg_prevgtd_prevdonels_iterbracket	bracket_f	bracket_gbracket_gtdmin_stepmax_steptmpinsuf_progresslow_poshigh_posepss!                                    r   _strong_wolferK   )   s    UUW[[]F	e556AA!$LEMiilG ()!|$FFFHDG
F
$%'A+%6/qkGI5;R;R!STI#W-Kw<B39$cGIIDa<qkGI5;R;R!STI#W-K tq6z**r6FHa8@T

 5+B+BCa())A,1O F
T &a&J	J	
 N"+A,)B-"?VGXw'wqzGAJ&'&03CC AJaLNAJaLN
  S\CL01s7|aS\!12S8c'l!2a3w<6Gq3w<'(3q3w</?+@@Gs*AGs*A!&!%"N  a())A,1$%)G2D)D !GH"'Ih"'++E<S<S+"TIh$+K!*3A,)A,*FFGX7|sSy(GH-0@@AQF$+G$4!&/&8	(#&/&8	(#(3G(<H%  !GG!&Ig!&5;R;R!SIg#*K C w'H 	AgEgE))r   c                      ^  \ rS rSrSr       SS\S\\\4   S\	S\
\	   S\S\S	\	S
\
\   4U 4S jjjrS rS rS rS rS rS r\R(                  " 5       S 5       rSrU =r$ )r	      a:  Implements L-BFGS algorithm.

Heavily inspired by `minFunc
<https://www.cs.ubc.ca/~schmidtm/Software/minFunc.html>`_.

.. warning::
    This optimizer doesn't support per-parameter options and parameter
    groups (there can be only one).

.. warning::
    Right now all parameters have to be on a single device. This will be
    improved in the future.

.. note::
    This is a very memory intensive optimizer (it requires additional
    ``param_bytes * (history_size + 1)`` bytes). If it doesn't fit in memory
    try reducing the history size, or use a different algorithm.

Args:
    params (iterable): iterable of parameters to optimize. Parameters must be real.
    lr (float, optional): learning rate (default: 1)
    max_iter (int, optional): maximal number of iterations per optimization step
        (default: 20)
    max_eval (int, optional): maximal number of function evaluations per optimization
        step (default: max_iter * 1.25).
    tolerance_grad (float, optional): termination tolerance on first order optimality
        (default: 1e-7).
    tolerance_change (float, optional): termination tolerance on function
        value/parameter changes (default: 1e-9).
    history_size (int, optional): update history size (default: 100).
    line_search_fn (str, optional): either 'strong_wolfe' or None (default: None).
paramslrmax_itermax_evaltolerance_gradr3   history_sizeline_search_fnc	           
      l  > [        U[        5      (       a  UR                  5       S:w  a  [        S5      eSU::  d  [        SU 35      eUc  US-  S-  n[	        UUUUUUUS9n	[
        T
U ]  X5        [        U R                  5      S:w  a  [        S5      eU R                  S	   S
   U l	        S U l
        g )Nr   zTensor lr must be 1-elementg        zInvalid learning rate:       )rO   rP   rQ   rR   r3   rS   rT   z>LBFGS doesn't support per-parameter options (parameter groups)r   rN   )
isinstancer   numel
ValueErrordictsuper__init__lenparam_groups_params_numel_cache)selfrN   rO   rP   rQ   rR   r3   rS   rT   defaults	__class__s             r   r]   LBFGS.__init__   s     b&!!bhhjAo:;;by6rd;<<!|q(H)-%)
 	*t  !Q&P  ((+H5 r   c                 v    U R                   c!  [        S U R                   5       5      U l         U R                   $ )Nc              3      #    U  HC  n[         R                  " U5      (       a  S UR                  5       -  OUR                  5       v   ME     g7f)r   N)r'   
is_complexrY   ).0ps     r   	<genexpr>LBFGS._numel.<locals>.<genexpr>   s<      $%A "'!1!1!!4!4AGGI!'')C%s   AA)ra   sumr`   )rb   s    r   _numelLBFGS._numel   s:    $ # $$ !D
    r   c                 2   / nU R                    H  nUR                  c.  UR                  UR                  5       5      R	                  5       nO`UR                  R
                  (       a*  UR                  R                  5       R                  S5      nOUR                  R                  S5      n[        R                  " U5      (       a%  [        R                  " U5      R                  S5      nUR                  U5        M     [        R                  " US5      $ )Nr$   r   )r`   gradnewrY   zero_	is_sparseto_denseviewr'   rh   view_as_realappendcat)rb   viewsrj   rv   s       r   _gather_flat_gradLBFGS._gather_flat_grad  s    Avv~uuQWWY'--/!!vv(--b1vv{{2%%))$/44R8LL  yy""r   c                 (   SnU R                    Hk  n[        R                  " U5      (       a  [        R                  " U5      nUR	                  5       nUR                  X#X5-    R                  U5      US9  X5-  nMm     X0R                  5       :X  d   eg )Nr   alpha)r`   r'   rh   rw   rY   add_view_asrn   )rb   	step_sizeupdateoffsetrj   rY   s         r   	_add_gradLBFGS._add_grad  s~    A""&&q)GGIEFF66>2::1=YFOOF  &&&r   c                 z    U R                    Vs/ s H  oR                  [        R                  S9PM!     sn$ s  snf )Nr!   )r`   r&   r'   r(   )rb   rj   s     r   _clone_paramLBFGS._clone_param  s-    HLU1e&=&=>UUUs   &8c                 d    [        U R                  U5       H  u  p#UR                  U5        M     g N)zipr`   copy_)rb   params_datarj   pdatas       r   
_set_paramLBFGS._set_param"  s$    DLL+6HAGGEN 7r   c                     U R                  X45        [        U" 5       5      nU R                  5       nU R                  U5        XV4$ r   )r   floatr{   r   )rb   closurer+   r,   r-   loss	flat_grads          r   _directional_evaluateLBFGS._directional_evaluate&  s<    qWY**,	r   c           	        ^ ^ [        T R                  5      S:X  d   e[        R                  " 5       " T5      mT R                  S   nUS   nUS   nUS   nUS   nUS   nUS   nUS	   n	T R                  T R
                  S      n
U
R                  S
S5        U
R                  SS5        T" 5       n[        U5      nSnU
S
==   S-  ss'   T R                  5       nUR                  5       R                  5       U:*  nU(       a  U$ U
R                  S5      nU
R                  S5      nU
R                  S5      nU
R                  S5      nU
R                  S5      nU
R                  S5      nU
R                  S5      nU
R                  S5      nSnUU:  Ga  US-  nU
S==   S-  ss'   U
S   S:X  a  UR                  5       n/ n/ n/ nSnGOUR                  U5      nUR                  U5      nUR                  U5      nUS:  a  [        U5      U	:X  a3  UR!                  S5        UR!                  S5        UR!                  S5        UR#                  U5        UR#                  U5        UR#                  SU-  5        UUR                  U5      -  n[        U5      nSU
;  a	  S/U	-  U
S'   U
S   nUR                  5       n[%        US-
  SS5       H7  nUU   R                  U5      UU   -  UU'   UR'                  UU   UU   * S9  M9     [        R                  " UU5      =nn [%        U5       H6  nUU   R                  U 5      UU   -  n!U R'                  UU   UU   U!-
  S9  M8     Uc  UR)                  [        R*                  S9nOUR-                  U5        UnU
S   S:X  a/  [/        SSUR                  5       R1                  5       -  5      U-  nOUnUR                  U5      n"U"U* :  a  GOcSn#Ubp  US:w  a  [3        S5      eT R5                  5       n$UU 4S jn%[7        U%U$UUXU"5      u  pnn#T R9                  UU5        UR                  5       R                  5       U:*  nOyT R9                  UU5        UU:w  aa  [        R                  " 5          [        T" 5       5      nSSS5        T R                  5       nUR                  5       R                  5       U:*  nSn#UU#-  nU
S
==   U#-  ss'   UU:X  a  O\X:  a  OVU(       a  ONUR                  U5      R                  5       R                  5       U::  a  O[        UU-
  5      U:  a  O	UU:  a  GM  UU
S'   UU
S'   UU
S'   UU
S'   UU
S'   UU
S'   UU
S'   UU
S'   U$ ! , (       d  f       N= f)zPerform a single optimization step.

Args:
    closure (Callable): A closure that reevaluates the model
        and returns the loss.
r   r   rO   rP   rQ   rR   r3   rT   rS   
func_evalsn_iterr-   r,   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr$   r~   r!   strong_wolfez only 'strong_wolfe' is supportedc                 *   > TR                  TXU5      $ r   )r   )r+   r,   r-   r   rb   s      r   r*   LBFGS.step.<locals>.obj_func  s    #99'1KKr   )r^   r_   r'   enable_gradstater`   
setdefaultr   r{   r%   r   getnegsubmulr)   poprx   ranger   r&   r(   r   r   rm   RuntimeErrorr   rK   r   )&rb   r   grouprO   rP   rQ   rR   r3   rT   rS   r   	orig_lossr   current_evalsr   opt_condr-   r,   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir0   r8   x_initr*   s&   ``                                    r   step
LBFGS.step-  s    4$$%*** ##%g.!!!$4[$$/0 !34/0^, 

4<<?+q)1% I	Ylq **,	==?&&(N:  IIcNIIcN99Z(99Z(YYt_8$#34IIk*	xaKF(Oq O
 X!#MMO MM.1EE!HUU1X:8}4 Q Qq	 OOA&OOA&IIcBh'  !%%(]F h-u$#'&<"7E$K4[ MMOw{B3A$QKOOA.A6BqEFF8A;r!ufF5 4 		!V,,AwA#A;??1-15DFF8A;bedlF; ( %!*u?V?V!W$$Y/I X!#S9==?#6#6#889B> --"C &&& M)!^3&'IJJ!..0FL 9F &!Q95DQ q!$$==?..0NB q!$X% **,$WY/ - $ 6 6 8I(}}224FH$%M ]*M,=0
 !(  uuQx||~!!#'774)#$'77E xH c
c
$j$jd h"0&kO -,s   U>>
V)ra   r`   )r      NgHz>&.>d   N)__name__
__module____qualname____firstlineno____doc__r   r   r   r   intr   strr]   rn   r{   r   r   r   r   r'   no_gradr   __static_attributes____classcell__)rd   s   @r   r	   r	      s    H $%"& $"&(,"!"! %- "! 	"!
 3-"! "!  "! "! !"! "!H!#	'V ]]_A Ar   r   )g-C6?g?r      )typingr   r   r'   r   	optimizerr   r   __all__r   rK   r	    r   r   <module>r      s;    "   ) )/: RTK*\xI xr   