
    ΧguF                     n    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dS )    )OptionalUnionN)Tensor   )	OptimizerParamsTLBFGSc                 t   ||\  }}n| |k    r| |fn|| f\  }}||z   d||z
  z  | |z
  z  z
  }	|	dz  ||z  z
  }
|
dk    rs|
                                 }| |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                M/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/optim/lbfgs.py_cubic_interpolater      s    !'
JJ-/2XX"bB8
J 
b1R=BG,	,BARIA~~^^88BGb2"r'AF:J(KLLGGBGb2"r'AF:J(KLLG3w
++Z888Z'3..    -C6??&.>   c           
         |                                                                 }|                    t          j                  } | |||          \  }}d}|                    |          }d|||f\  }}}}d}d}||
k     r(||||z  |z  z   k    s|dk    r5||k    r/||g}||g}||                    t          j                  g}||g}nt          |          | |z  k    r|g}|g}|g}d}n|dk    r/||g}||g}||                    t          j                  g}||g}n|d||z
  z  z   }|dz  }|}t          ||||||||f          }|}|}|                    t          j                  }|} | |||          \  }}|dz  }|                    |          }|dz  }||
k     (||
k    rd|g}||g}||g}d}|d         |d	         k    rd
nd\  }}|s||
k     ryt          |d         |d         z
            |z  |	k     rnRt          |d         |d         |d         |d         |d         |d                   }dt          |          t          |          z
  z  } t          t          |          |z
  |t          |          z
            | k     r|s&|t          |          k    s|t          |          k    rht          |t          |          z
            t          |t          |          z
            k     rt          |          | z
  }nt          |          | z   }d}nd}nd} | |||          \  }}|dz  }|                    |          }|dz  }||||z  |z  z   k    s|||         k    rL|||<   |||<   |                    t          j                  ||<   |||<   |d         |d         k    rd
nd\  }}nt          |          | |z  k    rd}nD|||         ||         z
  z  dk    r,||         ||<   ||         ||<   ||         ||<   ||         ||<   |||<   |||<   |                    t          j                  ||<   |||<   |s||
k     y||         }||         }||         }||||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_wolferO   )   sm    UUWW[[]]F	e566A8Aq!$$LE5MiillG ()!Q|$FFFHDG
F

AQ$%%'A++%6//qkGI5;R!S!STI#W-Kw<<B39$$cGIIDa<<qkGI5;R!S!STI#W-K tq6z**r6FHa8@T
 
 

 5+BCCx1a((u))A,,1O F

T &a&J	J	
 N"+A,)B-"?"?VGX A+w''wqzGAJ&''&03CCC AJaLNAJaLN
 
  S\\CLL01s7||aS\\!122S88 &c'll!2!2a3w<<6G6Gq3w<<'((3q3w<</?+@+@@@Gs*AAGs*A!&!%"N  x1a((u))A,,1AQ$%%)G2D)D)D !GH"'Ih"'++E<S+"T"TIh$+K!*3A,)A,*F*FFGXX7||sSy((GH-0@@AQFF$+G$4!&/&8	(#&/&8	(#(3G(<H%  !GG!&Ig!&5;R!S!SIg#*K C  A+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).
    r      NHz>r"   d   paramslrmax_itermax_evaltolerance_gradr7   history_sizeline_search_fnc	           	         t          |t                    r'|                                dk    rt          d          d|k    st          d|           ||dz  dz  }t	          |||||||          }	t                                          ||	           t          | j                  dk    rt          d          | j        d	         d
         | _	        d | _
        d S )Nr   zTensor lr must be 1-elementg        zInvalid learning rate:       )rU   rV   rW   rX   r7   rY   rZ   z>LBFGS doesn't support per-parameter options (parameter groups)r   rT   )
isinstancer   numel
ValueErrordictsuper__init__lenparam_groups_params_numel_cache)selfrT   rU   rV   rW   rX   r7   rY   rZ   defaults	__class__s             r   rc   zLBFGS.__init__   s     b&!! 	<bhhjjAoo:;;;byy;r;;<<<!|q(H)-%)
 
 
 	***t !!Q&&S   (+H5 r   c                 d    | j         #t          d | j        D                       | _         | j         S )Nc              3      K   | ]C}t          j        |          rd |                                z  n|                                V  DdS )r   N)r+   
is_complexr_   .0ps     r   	<genexpr>zLBFGS._numel.<locals>.<genexpr>   s^       $ $ "'!1!!4!4CAGGII!''))$ $ $ $ $ $r   )rg   sumrf   rh   s    r   _numelzLBFGS._numel   sF    $ # $ $$ $ $ ! !D
   r   c                    g }| j         D ]}|j        :|                    |                                                                          }nS|j        j        r-|j                                                            d          }n|j                            d          }t          j	        |          r't          j
        |                              d          }|                    |           t          j        |d          S )Nr(   r   )rf   gradnewr_   zero_	is_sparseto_denseviewr+   rm   view_as_realappendcat)rh   viewsrp   r{   s       r   _gather_flat_gradzLBFGS._gather_flat_grad  s     		 		Av~uuQWWYY''--//! 'v((--b11v{{2%% 9)$//44R88LLy"""r   c                 >   d}| j         D ]x}t          j        |          rt          j        |          }|                                }|                    ||||z                                |          |           ||z  }y||                                 k    sJ d S )Nr   alpha)rf   r+   rm   r|   r_   add_view_asrt   )rh   	step_sizeupdateoffsetrp   r_   s         r   	_add_gradzLBFGS._add_grad  s     	 	A"" *&q))GGIIEFF6&6E>12::1==YFOOOeOFF&&&&&&r   c                 $    d | j         D             S )Nc                 N    g | ]"}|                     t          j                   #S )r%   )r*   r+   r,   rn   s     r   
<listcomp>z&LBFGS._clone_param.<locals>.<listcomp>   s)    UUU1e&=>>UUUr   )rf   rs   s    r   _clone_paramzLBFGS._clone_param  s    UUUUUUr   c                 f    t          | j        |          D ]\  }}|                    |           d S N)ziprf   copy_)rh   params_datarp   pdatas       r   
_set_paramzLBFGS._set_param"  s<    DL+66 	 	HAuGGENNNN	 	r   c                     |                      ||           t           |                      }|                                 }|                     |           ||fS r   )r   floatr   r   )rh   closurer/   r0   r1   loss	flat_grads          r   _directional_evaluatezLBFGS._directional_evaluate&  sV    q!WWYY**,,	Yr   c           	      ,    t           j                  dk    sJ  t          j                               j        d         }|d         }|d         }|d         }|d         }|d         }|d         }|d	         }	 j         j        d                  }
|
                    d
d           |
                    dd                        }t          |          }d}|
d
xx         dz  cc<                                    }|	                                
                                |k    }|r|S |
                    d          }|
                    d          }|
                    d          }|
                    d          }|
                    d          }|
                    d          }|
                    d          }|
                    d          }d}||k     r|dz  }|
dxx         dz  cc<   |
d         dk    r|                                }g }g }g }d}n|                    |          }|                    |          }|                    |          }|dk    rt          |          |	k    r?|                    d           |                    d           |                    d           |                    |           |                    |           |                    d|z             ||                    |          z  }t          |          }d|
vr	dg|	z  |
d<   |
d         }|                                }t%          |dz
  dd          D ]M}||                             |          ||         z  ||<   |                    ||         ||                     Nt          j        ||          x}} t%          |          D ]L}||                             |           ||         z  }!|                     ||         ||         |!z
             M|!|                    t          j                  }n|                    |           |}|
d         dk    r;t/          dd|	                                                                z            |z  }n|}|                    |          }"|"| k    rnd}#||dk    rt3          d                                           }$ fd}%t7          |%|$|||||"          \  }}}}#                     ||           |	                                
                                |k    }n                     ||           ||k    rt          j                    5  t                                 }ddd           n# 1 swxY w Y                                    }|	                                
                                |k    }d}#||#z  }|
d
xx         |#z  cc<   ||k    rnf||k    rn_|rn\|                    |          	                                
                                |k    rnt          ||z
            |k     rn||k     ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   ||
d<   |S )zPerform a single optimization step.

        Args:
            closure (Callable): A closure that reevaluates the model
                and returns the loss.
        r   r   rU   rV   rW   rX   r7   rZ   rY   
func_evalsn_iterr1   r0   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr(   r   r%   strong_wolfez only 'strong_wolfe' is supportedc                 4                         | ||          S r   )r   )r/   r0   r1   r   rh   s      r   r.   zLBFGS.step.<locals>.obj_func  s    #99'1aKKKr   )rd   re   r+   enable_gradstaterf   
setdefaultr   r   r)   r   getnegsubmulr-   popr}   ranger   r*   r,   r   r   rr   RuntimeErrorr   rO   r   )&rh   r   grouprU   rV   rW   rX   r7   rZ   rY   r   	orig_lossr   current_evalsr   opt_condr1   r0   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir4   r<   x_initr.   s&   ``                                    r   stepz
LBFGS.step-  s@    4$%%**** &%#%%g..!!$4[$$/0 !34/0^, 
4<?+q)))1%%% GII	Ylq **,,	==??&&((N:  	 IIcNNIIcNN99Z((99Z((YYt__8$$#344IIk**	xaKF(OOOq OOO
 X!##MMOO MM.11EE!HHUU1XX::8}}44 Q Qq			 OOA&&&OOA&&&IIcBh'''  !%%((]F h--u$$#'&<"7E$K4[ MMOOw{B33 6 6A$QKOOA..A6BqEFF8A;r!ufF5555 	!V,,,Aw < <A#A;??1--15DFF8A;bedlF;;;;%!*u?V!W!W$$Y///I X!##S9==??#6#6#8#8899B> --""C &&&& M)!^33&'IJJJ!..00FL L L L L L 9F &!Qi9 95D)Q q!$$$$==??..00NB q!$$$X%% *,, 0 0$WWYY//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $ 6 6 8 8I(}}2244FH$%M ]*M,=0
 !!((   uuQxx||~~!!##'7774)#$$'777E xH c
c
$j$jd h"0&ks   ;VV#&V#)r   rQ   NrR   r"   rS   N)__name__
__module____qualname____doc__r   r   r   r   intr   strrc   rt   r   r   r   r   r   r+   no_gradr   __classcell__)rj   s   @r   r	   r	      sK        H $%"& $"&(,"! "!"! %- "! 	"!
 3-"! "!  "! "! !"! "! "! "! "! "!H! ! !# # #	' 	' 	'V V V     U]__A A _A A A A Ar   r   )r    r!   r"   r#   )typingr   r   r+   r   	optimizerr   r   __all__r   rO   r	    r   r   <module>r      s    " " " " " " " "        ) ) ) ) ) ) ) ) )/ / / /: RTK* K* K* K*\x x x x xI x x x x xr   