
    $heC                     `    d dl Z d dlmZ ddlmZ dgZddZ	 	 	 	 ddZ G d de          ZdS )    N)reduce   )	Optimizer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/auto_sub_bot/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'2--    -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_wolferL   #   sn    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h') ) ) 5+BCCx1a((u))A,,1Y F

^ &a&J	J	
 N"+A,)B-"?"?VGX ;+w''wqzGAJ&''&03CCC wqz9Q<Q&qz9Q<QI I 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  ;+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:
        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   c	           	         ||dz  dz  }t          |||||||          }	t                                          ||	           t          | j                  dk    rt          d          | j        d         d         | _        d | _        d S )N      )lrmax_itermax_evaltolerance_gradr4   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)selfrZ   rT   rU   rV   rW   r4   rX   rY   defaults	__class__s             r   r]   zLBFGS.__init__   s     !|q(H)-%)+ + + 	***t !!Q&& 2 3 3 3 (+H5 r   c                 V    | j         t          d | j        d          | _         | j         S )Nc                 0    | |                                 z   S N)numel)totalps     r   <lambda>zLBFGS._numel.<locals>.<lambda>   s    		8I r   r   )rb   r   ra   rc   s    r   _numelzLBFGS._numel   s/    $ &'I'I4<YZ [ [D  r   c                    g }| j         D ]}|j        :|                    |                                                                          }nS|j        j        r-|j                                                            d          }n|j                            d          }|                    |           t          j
        |d          S )Nr%   r   )ra   gradnewri   zero_	is_sparseto_denseviewappendr(   cat)rc   viewsrk   ru   s       r   _gather_flat_gradzLBFGS._gather_flat_grad   s     	 	Av~uuQWWYY''--//! 'v((--b11v{{2LLy"""r   c                     d}| j         D ]P}|                                }|                    ||||z                                |          |           ||z  }Q||                                 k    sJ d S )Nr   alpha)ra   ri   add_view_asrn   )rc   	step_sizeupdateoffsetrk   ri   s         r   	_add_gradzLBFGS._add_grad  s     	 	AGGIIEFF6&%/088;;9FMMMeOFF&&&&&&r   c                 $    d | j         D             S )Nc                 N    g | ]"}|                     t          j                   #S )r"   )r'   r(   r)   ).0rk   s     r   
<listcomp>z&LBFGS._clone_param.<locals>.<listcomp>  s)    UUU1e&=>>UUUr   )ra   rm   s    r   _clone_paramzLBFGS._clone_param  s    UUUUUUr   c                 f    t          | j        |          D ]\  }}|                    |           d S rh   )zipra   copy_)rc   params_datark   pdatas       r   
_set_paramzLBFGS._set_param  s<    DL+66 	 	HAuGGENNNN	 	r   c                     |                      ||           t           |                      }|                                 }|                     |           ||fS rh   )r   floatry   r   )rc   closurer,   r-   r.   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   rT   rU   rV   rW   r4   rY   rX   
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                 4                         | ||          S rh   )r   )r,   r-   r.   r   rc   s      r   r+   zLBFGS.step.<locals>.obj_func  s    #99'1aKKKr   )r^   r_   r(   enable_gradstatera   
setdefaultr   ry   r&   r   getnegsubmulr*   poprv   ranger}   r'   r)   r   r   sumRuntimeErrorr   rL   r   )&rc   r   grouprT   rU   rV   rW   r4   rY   rX   r   	orig_lossr   current_evalsr   opt_condr.   r-   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir1   r9   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&&&IIb2g&&&  !%%((]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!##B!4!4!6!6677"< --""C &&&& M)!^33&'IJJJ!..00FL L L L L L 9F &!Qi9F 9F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C xF c
c
$j$jd h"0&ks   ;VV#&V#)r   rN   NrO   r   rP   N)__name__
__module____qualname____doc__r]   rn   ry   r   r   r   r   r(   no_gradr   __classcell__)re   s   @r   r   r      s         D  $"&! $! ! ! ! ! !8! ! !

# 
# 
#' ' 'V V V     U]__@ @ _@ @ @ @ @r   rh   )r   r   r   r    )	r(   	functoolsr   	optimizerr   __all__r   rL   r    r   r   <module>r      s                      ). . . .F #'R* R* R* R*jf f f f fI f f f f fr   