
    YhF                     r    d dl mZmZ 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 )    )OptionalUnionN)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                c/var/www/tools.fuzzalab.pt/emblema-extractor/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_wolferP   )   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, 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_gradr8   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:       )rV   rW   rX   rY   r8   rZ   r[   z>LBFGS doesn't support per-parameter options (parameter groups)r   rU   )
isinstancer   numel
ValueErrordictsuper__init__lenparam_groups_params_numel_cache)selfrU   rV   rW   rX   rY   r8   rZ   r[   defaults	__class__s             r   rd   zLBFGS.__init__   s     b&!! 	<bhhjjAoo:;;;byy;r;;<<<!|q(H)-%)
 
 
 	***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    )rh   sumrg   ri   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   )rg   gradnewr`   zero_	is_sparseto_denseviewr,   rn   view_as_realappendcat)ri   viewsrq   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)rg   r,   rn   r}   r`   add_view_asru   )ri   	step_sizeupdateoffsetrq   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-   ro   s     r   
<listcomp>z&LBFGS._clone_param.<locals>.<listcomp>   s)    UUU1e&=>>UUUr    )rg   rt   s    r   _clone_paramzLBFGS._clone_param  s    UUUUUUr    c                 f    t          | j        |          D ]\  }}|                    |           d S N)ziprg   copy_)ri   params_datarq   pdatas       r   
_set_paramzLBFGS._set_param"  s<    DL+66 	 	HAuGGENNNN	 	r    c                     |                      ||           t           |                      }|                                 }|                     |           ||fS r   )r   floatr   r   )ri   closurer0   r1   r2   loss	flat_grads          r   _directional_evaluatezLBFGS._directional_evaluate&  sV    q!WWYY**,,	Yr    c           	      F    t           j                  dk    s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;t1          dd|
                                                                z            |z  }n|}|                    |          }"|"| k    rnd}#||dk    rt5          d                                           }$ fd}%t9          |%|$|||||"          \  }}}}#                     ||           |
                                                                |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   rV   rW   rX   rY   r8   r[   rZ   
func_evalsn_iterr2   r1   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   )r0   r1   r2   r   ri   s      r   r/   zLBFGS.step.<locals>.obj_func  s    #99'1aKKKr    )re   rf   r,   enable_gradr   staterg   
setdefaultr   r   r*   r   getnegsubmulr.   popr~   ranger   r+   r-   r   r   rs   RuntimeErrorr   rP   r   )&ri   r   grouprV   rW   rX   rY   r8   r[   rZ   r   	orig_lossr   current_evalsr   opt_condr2   r1   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir5   r=   x_initr/   s&   ``                                    r   stepz
LBFGS.step-  sH    4$%%**** &%#%%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 &!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,,V03V0)r   rR   NrS   r#   rT   N)__name__
__module____qualname____doc__r	   r   r   r   intr   strrd   ru   r   r   r   r   r   r,   no_gradr   __classcell__)rk   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   r	   __all__r   rP   r
    r    r   <module>r      s    " " " " " " " "        5 5 5 5 5 5 5 5 5 5 )/ / / /: RTK* K* K* K*\x x x x xI x x x x xr    