
    ǄguF                     f    d dl mZmZ d dlZd dlmZ ddlmZmZ dgZd
dZ		 ddZ
 G d	 de      Zy)    )OptionalUnionN)Tensor   )	OptimizerParamsTLBFGSc                 V   ||\  }}n| |k  r| |fn|| f\  }}||z   d||z
  z  | |z
  z  z
  }	|	dz  ||z  z
  }
|
dk\  rf|
j                         }| |k  r||| z
  ||z   |	z
  ||z
  d|z  z   z  z  z
  }n| | |z
  ||z   |	z
  ||z
  d|z  z   z  z  z
  }t        t        ||      |      S ||z   dz  S )N      r   g       @)sqrtminmax)x1f1g1x2f2g2bounds
xmin_bound
xmax_boundd1	d2_squared2min_poss                Y/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/optim/lbfgs.py_cubic_interpolater      s     !'
J-/2X"bB8
J 
b1R=BG,	,BARIA~^^8BGb2"r'AF:J(KLLGBGb2"r'AF:J(KLLG3w
+Z88Z'3..    c           
         |j                         j                         }|j                  t        j                        } | |||      \  }}d}|j                  |      }d|||f\  }}}}d}d}||
k  r||||z  |z  z   kD  s
|dkD  r4||k\  r/||g}||g}||j                  t        j                        g}||g}nt        |      | |z  k  r|g}|g}|g}d}n|dk\  r/||g}||g}||j                  t        j                        g}||g}n{|d||z
  z  z   }|dz  }|}t        ||||||||f      }|}|}|j                  t        j                        }|} | |||      \  }}|dz  }|j                  |      }|dz  }||
k  r||
k(  rd|g}||g}||g}d}d   |d	   k  rd
nd\  }}|s||
k  rt        d   |d   z
        |z  |	k  rnt        |d   |d   d   |d   |d   |d         }dt        |      t        |      z
  z  } t        t        |      |z
  |t        |      z
        | k  rp|s|t        |      k\  s|t        |      k  rOt        |t        |      z
        t        |t        |      z
        k  rt        |      | z
  }nt        |      | z   }d}nd}nd} | |||      \  }}|dz  }|j                  |      }|dz  }||||z  |z  z   kD  s|||   k\  rE|||<   |||<   |j                  t        j                        |<   |||<   |d   |d   k  rd
nd\  }}nxt        |      | |z  k  rd}n1|||   ||   z
  z  dk\  r ||   ||<   ||   ||<   |   ||<   ||   ||<   |||<   |||<   |j                  t        j                        |<   |||<   |s||
k  r|   }||   }|   }||||fS )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Aq!$LE5MiilG ()!Q|$FFFHDG
F
AQ$%'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1a(u))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  1a(u))A,1AQ$%)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%M))r   c                        e Zd ZdZ	 	 	 	 	 	 	 ddedeeef   dede	e   dededed	e	e
   f fd
Zd Zd Zd Zd Zd Zd Z ej&                         d        Z xZS )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): learning rate (default: 1)
        max_iter (int): maximal number of iterations per optimization step
            (default: 20)
        max_eval (int): maximal number of function evaluations per optimization
            step (default: max_iter * 1.25).
        tolerance_grad (float): termination tolerance on first order optimality
            (default: 1e-7).
        tolerance_change (float): termination tolerance on function
            value/parameter changes (default: 1e-9).
        history_size (int): update history size (default: 100).
        line_search_fn (str): either 'strong_wolfe' or None (default: None).
    paramslrmax_itermax_evaltolerance_gradr3   history_sizeline_search_fnc	           	      b   t        |t              r|j                         dk7  rt        d      d|k  st        d|       ||dz  dz  }t	        |||||||      }	t
        
|   ||	       t        | j                        dk7  rt        d      | j                  d	   d
   | _	        d | _
        y )Nr   zTensor lr must be 1-elementg        zInvalid learning rate:       )rN   rO   rP   rQ   r3   rR   rS   z>LBFGS doesn't support per-parameter options (parameter groups)r   rM   )
isinstancer   numel
ValueErrordictsuper__init__lenparam_groups_params_numel_cache)selfrM   rN   rO   rP   rQ   r3   rR   rS   defaults	__class__s             r   r\   zLBFGS.__init__   s     b&!bhhjAo:;;by6rd;<<!|q(H)-%)
 	*t  !Q&S  ((+H5 r   c                 t    | j                   !t        d | j                  D              | _         | j                   S )Nc              3      K   | ]<  }t        j                  |      rd |j                         z  n|j                          > yw)r   N)r'   
is_complexrX   ).0ps     r   	<genexpr>zLBFGS._numel.<locals>.<genexpr>   s:      $ "'!1!1!!4AGGI!'')C$s   AA)r`   sumr_   )ra   s    r   _numelzLBFGS._numel   s:    $ # $$ !D
    r   c                    g }| j                   D ]  }|j                  .|j                  |j                               j	                         }n[|j                  j
                  r*|j                  j                         j                  d      }n|j                  j                  d      }t        j                  |      r$t        j                  |      j                  d      }|j                  |        t        j                  |d      S )Nr$   r   )r_   gradnewrX   zero_	is_sparseto_denseviewr'   rf   view_as_realappendcat)ra   viewsrh   rr   s       r   _gather_flat_gradzLBFGS._gather_flat_grad  s     		Avv~uuQWWY'--/!!vv(--b1vv{{2%))$/44R8LL		 yy""r   c                 "   d}| j                   D ]i  }t        j                  |      rt        j                  |      }|j	                         }|j                  ||||z    j                  |      |       ||z  }k || j                         k(  sJ y )Nr   alpha)r_   r'   rf   rs   rX   add_view_asrk   )ra   	step_sizeupdateoffsetrh   rX   s         r   	_add_gradzLBFGS._add_grad  s     	A"&&q)GGIEFF6&6E>2::1=YFOeOF	 &&&r   c                 |    | j                   D cg c]"  }|j                  t        j                        $ c}S c c}w )Nr!   )r_   r&   r'   r(   )ra   rh   s     r   _clone_paramzLBFGS._clone_param  s+    HLU1e&=&=>UUUs   '9c                 b    t        | j                  |      D ]  \  }}|j                  |        y N)zipr_   copy_)ra   params_datarh   pdatas       r   
_set_paramzLBFGS._set_param"  s+    DLL+6 	HAuGGEN	r   c                     | j                  ||       t         |             }| j                         }| j                  |       ||fS r   )r   floatrw   r   )ra   closurer+   r,   r-   loss	flat_grads          r   _directional_evaluatezLBFGS._directional_evaluate&  s@    q!WY**,	Yr   c           	      
    t         j                        dk(  sJ  t        j                                j                  d   }|d   }|d   }|d   }|d   }|d   }|d   }|d	   }	 j                   j
                  d      }
|
j                  d
d       |
j                  dd               }t        |      }d}|
d
xx   dz  cc<    j                         }|j                         j                         |k  }|r|S |
j                  d      }|
j                  d      }|
j                  d      }|
j                  d      }|
j                  d      }|
j                  d      }|
j                  d      }|
j                  d      }d}||k  r|dz  }|
dxx   dz  cc<   |
d   dk(  r|j                         }g }g }g }d}n|j                  |      }|j                  |      }|j                  |      }|dkD  rt        |      |	k(  r3|j!                  d       |j!                  d       |j!                  d       |j#                  |       |j#                  |       |j#                  d|z         ||j                  |      z  }t        |      }d|
vr	dg|	z  |
d<   |
d   }|j                         }t%        |dz
  dd      D ]9  }||   j                  |      ||   z  ||<   |j'                  ||   ||           ; t        j                  ||      x}} t%        |      D ]8  }||   j                  |       ||   z  }!| j'                  ||   ||   |!z
         : |!|j)                  t        j*                        }n|j-                  |       |}|
d   dk(  r/t/        dd|j                         j1                         z        |z  }n|}|j                  |      }"|"| kD  rnVd}#|p|dk7  rt3        d       j5                         }$ fd}%t7        |%|$|||||"      \  }}}}# j9                  ||       |j                         j                         |k  }nw j9                  ||       ||k7  r`t        j                         5  t                      }ddd        j                         }|j                         j                         |k  }d}#||#z  }|
d
xx   |#z  cc<   ||k(  rnS||k\  rnM|rnJ|j                  |      j                         j                         |k  rnt        ||z
        |k  rn||k  r||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   |S # 1 sw Y   xY w)zPerform a single optimization step.

        Args:
            closure (Callable): A closure that reevaluates the model
                and returns the loss.
        r   r   rN   rO   rP   rQ   r3   rS   rR   
func_evalsn_iterr-   r,   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr$   ry   r!   strong_wolfez only 'strong_wolfe' is supportedc                 ,    j                  | ||      S r   )r   )r+   r,   r-   r   ra   s      r   r*   zLBFGS.step.<locals>.obj_func  s    #99'1aKKr   )r]   r^   r'   enable_gradstater_   
setdefaultr   rw   r%   r   getnegsubmulr)   poprt   ranger{   r&   r(   r   r   rj   RuntimeErrorr   rK   r   )&ra   r   grouprN   rO   rP   rQ   r3   rS   rR   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   stepz
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3 6A$QKOOA.A6BqEFF8A;r!ufF56 		!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i95D)Q q!$$==?..0NB q!$X% **, 0$WY/0 $ 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0 0s   U%%U.)r      NgHz>&.>d   N)__name__
__module____qualname____doc__r   r   r   r   intr   strr\   rk   rw   r   r   r   r   r'   no_gradr   __classcell__)rc   s   @r   r	   r	      s    H $%"& $"&(,"!"! %- "! 	"!
 3-"! "!  "! "! !"!H!#	'V U]]_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   