
    '}hbD                     L    d dl Z ddlmZ dgZddZ	 	 	 	 d	dZ G d de      Zy)
    N   )	Optimizer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                P/var/www/html/test/engine/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'2--    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_wolferG   "   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h') 5+B+BC1a(u))A,1Y F
^ &a&J	J	
 N"+A,)B-"?VGXw'wqzGAJ&'&03CC wqz9Q<Q&qz9Q<QI 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 w w'| 	AgEgE%M))r   c                        e Zd ZdZ	 	 	 	 	 	 	 d
 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).
    c	           	          ||dz  dz  }t        |||||||      }	t        
| 	  ||	       t        | j                        dk7  rt        d      | j                  d   d   | _        d | _        y )N      )lrmax_itermax_evaltolerance_gradr/   history_sizeline_search_fnr   z>LBFGS doesn't support per-parameter options (parameter groups)r   params)dictsuper__init__lenparam_groups
ValueError_params_numel_cache)selfrR   rL   rM   rN   rO   r/   rP   rQ   defaults	__class__s             r   rU   zLBFGS.__init__   s     !|q(H)-%)+ 	*t  !Q& 2 3 3 ((+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_complexnumel).0ps     r   	<genexpr>zLBFGS._numel.<locals>.<genexpr>   s3     #n\]U5E5Ea5HA	Maggi$W#ns   AA)rZ   sumrY   )r[   s    r   _numelzLBFGS._numel   s4    $ ##naeamam#n nD   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   )rY   gradnewra   zero_	is_sparseto_denseviewr#   r`   view_as_realappendcat)r[   viewsrc   rm   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)rY   r#   r`   rn   ra   add_view_asrf   )r[   	step_sizeupdateoffsetrc   ra   s         r   	_add_gradzLBFGS._add_grad	  s     	A"&&q)GGIEFF6&%088;9FMeOF	 &&&r   c                 |    | j                   D cg c]"  }|j                  t        j                        $ c}S c c}w )Nr   )rY   r"   r#   r$   )r[   rc   s     r   _clone_paramzLBFGS._clone_param  s+    HLU1e&=&=>UUUs   '9c                 b    t        | j                  |      D ]  \  }}|j                  |        y N)ziprY   copy_)r[   params_datarc   pdatas       r   
_set_paramzLBFGS._set_param  s+    DLL+6 	HAuGGEN	r   c                     | j                  ||       t         |             }| j                         }| j                  |       ||fS r   )r{   floatrr   r   )r[   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   rL   rM   rN   rO   r/   rQ   rP   
func_evalsn_iterr)   r(   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr    rt   r   strong_wolfez only 'strong_wolfe' is supportedc                 ,    j                  | ||      S r   )r   )r'   r(   r)   r   r[   s      r   r&   zLBFGS.step.<locals>.obj_func  s    #99'1aKKr   )rV   rW   r#   enable_gradstaterY   
setdefaultr   rr   r!   r   getnegsubmulr%   popro   rangerv   r"   r$   r   r
   re   RuntimeErrorr}   rG   r{   )&r[   r   grouprL   rM   rN   rO   r/   rQ   rP   r   	orig_lossr   current_evalsr   opt_condr)   r(   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir,   r4   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&IIb2g&  !%%(]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!#B!4!4!667"< --"C &&& M)!^3&'IJJ!..0FL 9F &!Qi9F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C xF c
c
$j$jd h"0&kO0 0s   U%%U.)r      NgHz>&.>d   N)__name__
__module____qualname____doc__rU   rf   rr   r{   r}   r   r   r#   no_gradr   __classcell__)r]   s   @r   r   r      sb    F  $"&! $!8!#	'V U]]_@ @r   r   )g-C6?g?r      )r#   	optimizerr   __all__r   rG   r    r   r   <module>r      s;      ).F #'R*jlI lr   