
    PhCE                     X    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y)    N)reduce   )	Optimizer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                \C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\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'2--    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_wolferH   #   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h') 5+B+BC1a(u))A,1Y F
^ &a&J	J	
 N"+A,)B-"?VGXw'wqzGAJ&'&03CC wqz9Q<Q&qz9Q<QI 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 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).
    c	           	          ||dz  dz  }t        |||||||      }	t        
| 	  ||	       t        | j                        dk7  rt        d      | j                  d   d   | _        d | _        y )N      )lrmax_itermax_evaltolerance_gradr0   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)selfrS   rM   rN   rO   rP   r0   rQ   rR   defaults	__class__s             r   rV   zLBFGS.__init__   s     !|q(H)-%)+ 	*t  !Q& 2 3 3 ((+H5 r   c                 l    | j                   t        d | j                  d      | _         | j                   S )Nc                 (    | |j                         z   S N)numel)totalps     r   <lambda>zLBFGS._numel.<locals>.<lambda>   s    	8Ir   r   )r[   r   rZ   )r\   s    r   _numelzLBFGS._numel   s1    $ &'I4<<YZ [D   r   c                    g }| j                   D ]  }|j                  .|j                  |j                               j	                         }n[|j                  j
                  r*|j                  j                         j                  d      }n|j                  j                  d      }|j                  |        t        j                  |d      S )Nr!   r   )rZ   gradnewrb   zero_	is_sparseto_denseviewappendr$   cat)r\   viewsrd   rm   s       r   _gather_flat_gradzLBFGS._gather_flat_grad   s    Avv~uuQWWY'--/!!vv(--b1vv{{2LL  yy""r   c                     d}| j                   D ]?  }|j                         }|j                  ||||z    j                  |      |       ||z  }A || j	                         k(  sJ y )Nr   alpha)rZ   rb   add_view_asrf   )r\   	step_sizeupdateoffsetrd   rb   s         r   	_add_gradzLBFGS._add_grad  se    AGGIEFF6&%088;9FMeOF	 
 &&&r   c                 |    | j                   D cg c]"  }|j                  t        j                        $ c}S c c}w )Nr   )rZ   r#   r$   r%   )r\   rd   s     r   _clone_paramzLBFGS._clone_param  s/    HLU1e&=&=>UUUs   '9c                 b    t        | j                  |      D ]  \  }}|j                  |        y ra   )ziprZ   copy_)r\   params_datard   pdatas       r   
_set_paramzLBFGS._set_param  s&    DLL+6HAuGGEN 7r   c                     | j                  ||       t         |             }| j                         }| j                  |       ||fS ra   )rz   floatrq   r   )r\   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   }|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/t/        dd|j                         j1                         z        |z  }n|}|j                  |      }"|"| kD  rnVd}#|p|dk7  rt3        d       j5                         }$ fd}%t7        |%|$|||||"      \  }}}}# j9                  ||       |j                         j                         |k  }nw j9                  ||       ||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   rM   rN   rO   rP   r0   rR   rQ   
func_evalsn_iterr*   r)   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr!   rs   r   strong_wolfez only 'strong_wolfe' is supportedc                 ,    j                  | ||      S ra   )r   )r(   r)   r*   r   r\   s      r   r'   zLBFGS.step.<locals>.obj_func  s    #99'1aKKr   )rW   rX   r$   enable_gradstaterZ   
setdefaultr   rq   r"   r   getnegsubmulr&   poprn   rangeru   r#   r%   r   r   sumRuntimeErrorr|   rH   rz   )&r\   r   grouprM   rN   rO   rP   r0   rR   rQ   r   	orig_lossr   current_evalsr   opt_condr*   r)   r   r   r   r   r   r   r   ysysnum_oldr   qirbe_ir-   r5   x_initr'   s&   ``                                    r   stepz
LBFGS.step  s    4$$%*** &%##%g.!!!$4[$$/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&IIb2g&  !%%(]F h-u$#'&<"7E$K4[ MMOw{B3A$QKOOA.A6BqEFF8A;r!ufF5 4 		!V,,AwA#A;??1-15DFF8A;bedlF; ( %!*u?V?V!W$$Y/I X!#B!4!4!667"< --"C &&& M)!^3&'IJJ!..0FL 9F &!Qi9F5D)Qq!$$==?..0NB q!$X% **,$WY/ - $ 6 6 8I(}}224FH$%M ]*M,=0
 !(  uuQx||~!!#'774)#$'77C xF c
c
$j$jd h"0&kO -,s   U%%U.)r      NgHz>&.>d   N)__name__
__module____qualname____doc__rV   rf   rq   rz   r|   r   r   r$   no_gradr   __classcell__)r^   s   @r   r   r      sb    D  $"&! $!8!

#'V U]]_@ @r   ra   )g-C6?g?r      )	r$   	functoolsr   	optimizerr   __all__r   rH   r    r   r   <module>r      s>       ).F #'R*jfI fr   