
    n
qiON                     b    d dl Z d dl mZ ddlmZmZmZ dgZddZ	 ddZ G d de          Z	dS )    N)Tensor   )
_to_scalar	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                q/var/www/html/bestrading.cuttalo.com/services/ml-inference/venv/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_wolferN   (   s    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 ^+w''wqzGAJ&''&03CCC  AJaLN AJaLN
 
0 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 }  ^+w''B 	AgEgE%M))r   c                        e Zd ZdZ	 	 	 	 	 	 	 dded	eez  d
ededz  dededededz  ddf fdZ	d Z
d ZddZd Zd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, 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).
    r      NHz>r!   d   paramslrmax_itermax_evaltolerance_gradr6   history_sizeline_search_fnreturnc	                    t          |t                    r'|                                dk    rt          d          d|k    st          d|           ||dz  dz  }|||||||d}	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:       )rT   rU   rV   rW   r6   rX   rY   z>LBFGS doesn't support per-parameter options (parameter groups)r   rS   )

isinstancer   numel
ValueErrorsuper__init__lenparam_groups_params_numel_cache)selfrS   rT   rU   rV   rW   r6   rX   rY   defaults	__class__s             r   rb   zLBFGS.__init__   s     b&!! 	<bhhjjAoo:;;;byy;r;;<<<!|q(H  , 0(,
 
 	***t !!Q&&P   (+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   )rf   sumre   rg   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   )re   gradnewr_   zero_	is_sparseto_denseviewr*   rl   view_as_realappendcat)rg   viewsro   rz   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    r't          d| d|                                            d S )Nr   alphazExpected offset z
 to equal )	re   r*   rl   r{   r_   add_view_asrs   AssertionError)rg   	step_sizeupdateoffsetro   r_   s         r   	_add_gradzLBFGS._add_grad2  s     	 	A"" *&q))GGIIEFF6&6E>12::1==YFOOOeOFFT[[]]"" !UF!U!Udkkmm!U!UVVV #"r   c                 $    d | j         D             S )Nc                 N    g | ]"}|                     t          j                   #S )r$   )r)   r*   r+   rm   s     r   
<listcomp>z&LBFGS._clone_param.<locals>.<listcomp>?  s)    UUU1e&=>>UUUr   )re   rr   s    r   _clone_paramzLBFGS._clone_param>  s    UUUUUUr   c                 j    t          | j        |d          D ]\  }}|                    |           d S )NT)strict)zipre   copy_)rg   params_dataro   pdatas       r   
_set_paramzLBFGS._set_paramA  sA    DL+dCCC 	 	HAuGGENNNN	 	r   c                     |                      ||           t           |                      }|                                 }|                     |           ||fS N)r   floatr   r   )rg   closurer.   r/   r0   loss	flat_grads          r   _directional_evaluatezLBFGS._directional_evaluateE  sV    q!WWYY**,,	Yr   c                     t           j                  dk    r$t          dt           j                              t          j                               j        d         }t          |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;t3          dd|                                                                z            |z  }n|}|                    |          }"|"| k    rnd}#||dk    rt7          d                                           }$ fd}%t;          |%|$|||||"||z
            \  }}}}#                     ||           |                                                                |k    }n                     ||           ||k    rt          j                    5               }ddd           n# 1 swxY w Y   t          |          } 
                                }|                                                                |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   z*Expected exactly one param_group, but got r   rT   rU   rV   rW   r6   rY   rX   
func_evalsn_iterr0   r/   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.   r/   r0   r   rg   s      r   r-   zLBFGS.step.<locals>.obj_func  s    #99'1aKKKr   )r7   )rc   rd   r   r*   enable_gradr   statere   
setdefaultr   r   r(   r   getnegsubmulr,   popr|   ranger   r)   r+   r   r   rq   RuntimeErrorr   rN   r   )&rg   r   grouprT   rU   rV   rW   r6   rY   rX   r   	orig_lossr   current_evalsr   opt_condr0   r/   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir3   r;   x_initr-   s&   ``                                    r   stepz
LBFGS.stepL  s    t !!Q&& USAR=S=SUU  
 &%#%%g..!!$d$$$$/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 !'-7	9 	9 	95D)Q q!$$$$==??..00NB q!$$$X%% *,, ) )&wyy) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ;;D $ 6 6 8 8I(}}2244FH$%M ]*M,=0
 !!((   uuQxx||~~!!##'7774)#$$'777U xX c
c
$j$jd h"0&ks   /WW
W
)r   rP   NrQ   r!   rR   N)rZ   N)__name__
__module____qualname____doc__r   r   r   intstrrb   rs   r   r   r   r   r   r*   no_gradr   __classcell__)ri   s   @r   r   r      s^        H # $"&%)"! "!"! FN"! 	"!
 *"! "!  "! "! d
"! 
"! "! "! "! "! "!H! ! !# # #
W 
W 
W 
WV V V      U]__L L _L L L L Lr   r   )r   r    r!   r"   )
r*   r   	optimizerr   r   r   __all__r   rN   r    r   r   <module>r      s           5 5 5 5 5 5 5 5 5 5 )/ / / /: RTi* i* i* i*XE E E E EI E E E E Er   