
    rhF                     j    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y)    )OptionalUnionN)Tensor   )
_to_scalar	OptimizerParamsT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                d/var/www/html/ai-insurance-compliance-backend/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'3..    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_wolferL   )   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FHa8@T

 5+B+BC1a(u))A,1O F
T &a&J	J	
 N"+A,)B-"?VGXw'wqzGAJ&'&03CC AJaLNAJaLN
  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 C 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).
    paramslrmax_itermax_evaltolerance_gradr4   history_sizeline_search_fnc	           	      b   t        |t              r|j                         dk7  rt        d      d|k  st        d|       ||dz  dz  }t	        |||||||      }	t
        
|   ||	       t        | j                        dk7  rt        d      | j                  d	   d
   | _	        d | _
        y )Nr   zTensor lr must be 1-elementg        zInvalid learning rate:       )rO   rP   rQ   rR   r4   rS   rT   z>LBFGS doesn't support per-parameter options (parameter groups)r   rN   )
isinstancer   numel
ValueErrordictsuper__init__lenparam_groups_params_numel_cache)selfrN   rO   rP   rQ   rR   r4   rS   rT   defaults	__class__s             r   r]   zLBFGS.__init__   s     b&!bhhjAo:;;by6rd;<<!|q(H)-%)
 	*t  !Q&P  ((+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_complexrY   ).0ps     r   	<genexpr>zLBFGS._numel.<locals>.<genexpr>   s:      $ "'!1!1!!4AGGI!'')C$s   AA)ra   sumr`   )rb   s    r   _numelzLBFGS._numel   s:    $ # $$ !D
    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   )r`   gradnewrY   zero_	is_sparseto_denseviewr(   rg   view_as_realappendcat)rb   viewsri   rs   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)r`   r(   rg   rt   rY   add_view_asrl   )rb   	step_sizeupdateoffsetri   rY   s         r   	_add_gradzLBFGS._add_grad  s     	A"&&q)GGIEFF6&6E>2::1=YFOeOF	 &&&r    c                 |    | j                   D cg c]"  }|j                  t        j                        $ c}S c c}w )Nr"   )r`   r'   r(   r)   )rb   ri   s     r   _clone_paramzLBFGS._clone_param  s+    HLU1e&=&=>UUUs   '9c                 b    t        | j                  |      D ]  \  }}|j                  |        y N)zipr`   copy_)rb   params_datari   pdatas       r   
_set_paramzLBFGS._set_param"  s+    DLL+6 	HAuGGEN	r    c                     | j                  ||       t         |             }| j                         }| j                  |       ||fS r   )r   floatrx   r   )rb   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   }t	        |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/t1        dd|j                         j3                         z        |z  }n|}|j!                  |      }"|"| kD  rnVd}#|p|dk7  rt5        d       j7                         }$ fd}%t9        |%|$|||||"      \  }}}}# j;                  ||       |j                         j                         |k  }nw j;                  ||       ||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   rO   rP   rQ   rR   r4   rT   rS   
func_evalsn_iterr.   r-   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr%   rz   r"   strong_wolfez only 'strong_wolfe' is supportedc                 ,    j                  | ||      S r   )r   )r,   r-   r.   r   rb   s      r   r+   zLBFGS.step.<locals>.obj_func  s    #99'1aKKr    )r^   r_   r(   enable_gradr   stater`   
setdefaultr   rx   r&   r   getnegsubmulr*   popru   ranger|   r'   r)   r   r   rk   RuntimeErrorr   rL   r   )&rb   r   grouprO   rP   rQ   rR   r4   rT   rS   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.!!!$d$$$/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&IIcBh'  !%%(]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!#S9==?#6#6#889B> --"C &&& M)!^3&'IJJ!..0FL 9F &!Qi9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E xH c
c
$j$jd h"0&kO0 0s   U..U7)r      NgHz>&.>d   N)__name__
__module____qualname____doc__r	   r   r   r   intr   strr]   rl   rx   r   r   r   r   r(   no_gradr   __classcell__)rd   s   @r   r
   r
      s    H $%"& $"&(,"!"! %- "! 	"!
 3-"! "!  "! "! !"!H!#	'V U]]_A Ar    r   )g-C6?g?r      )typingr   r   r(   r   	optimizerr   r   r	   __all__r   rL   r
    r    r   <module>r      s>    "   5 5 )/: RTK*\xI xr    