o
    iaC                     @   sV   d dl Z d dlmZ ddlmZ dgZdddZ				
	dddZG dd deZdS )    N)reduce   )	OptimizerLBFGSc                 C   s   |d ur	|\}}n| |kr| |fn|| f\}}|| d||  | |   }	|	d ||  }
|
dkrj|
  }| |krN|||  || |	 || d|     }n| | | || |	 || d|     }tt|||S || d S )N      r   g       @)sqrtminmax)x1f1g1Zx2f2g2boundsZ
xmin_boundZ
xmax_boundZd1Z	d2_squareZd2Zmin_pos r   `/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/torch/optim/lbfgs.py_cubic_interpolate   s   
	*(r   -C6??&.>   c           !   	   C   s   |   }|jtjd}| |||\}}d}||}d|||f\}}}}d}d}||
k r|||| |  ks@|dkrV||krV||g}||g}||jtjdg}||g}npt || | krk|g}|g}|g}d}n[|dkr||g}||g}||jtjdg}||g}nA|d||   }|d }|}t||||||||fd}|}|}|jtjd}|}| |||\}}|d7 }||}|d7 }||
k s.||
krd|g}||g}||g}d}|d |d	 krd
nd\}}|s||
k rt |d |d  | |	k rn t|d |d |d |d |d |d }dt|t|  } tt|| |t| | k rb|s>|t|ks>|t|kr_t |t| t |t| k rVt||  }nt||  }d}nd}nd}| |||\}}|d7 }||}|d7 }|||| |  ks||| kr|||< |||< |jtjd||< |||< |d |d krd
nd\}}nGt || | krd}n%||| ||   dkr|| ||< || ||< || ||< || ||< |||< |||< |jtjd||< |||< |s||
k s|| }|| }|| }||||fS )NZ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_changeZmax_lsZd_normZf_newZg_newls_func_evalsZgtd_newZt_prevZf_prevZg_prevZgtd_prevdoneZls_iterZbracketZ	bracket_fZ	bracket_gZbracket_gtdZmin_stepZmax_steptmpZinsuf_progressZlow_posZhigh_posZepsr   r   r   _strong_wolfe#   s   
$

/
 ""
$ >r-   c                       sp   e Zd ZdZ							d fdd		Zd
d Zdd Zdd Zdd Zdd Z	dd Z
e dd Z  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	           
   	      sh   |d u r
|d d }t |||||||d}	t ||	 t| jdkr'td| jd d | _d | _d S )N      )lrmax_itermax_evaltolerance_gradr)   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)
selfr9   r3   r4   r5   r6   r)   r7   r8   defaults	__class__r   r   r<      s    	
zLBFGS.__init__c                 C   s$   | j d u rtdd | jd| _ | j S )Nc                 S   s   | |   S N)numel)totalpr   r   r   <lambda>   s    zLBFGS._numel.<locals>.<lambda>r   )rA   r   r@   rB   r   r   r   _numel   s   
zLBFGS._numelc                 C   sj   g }| j D ])}|jd u r||  }n|jjr#|j d}n|jd}|| qt	
|dS )Nr   r   )r@   ZgradnewrG   Zzero_Z	is_sparseZto_denseviewappendr   cat)rB   ZviewsrI   rN   r   r   r   _gather_flat_grad   s   

zLBFGS._gather_flat_gradc                 C   sT   d}| j D ]}| }|j||||  ||d ||7 }q||  ks(J d S )Nr   alpha)r@   rG   add_Zview_asrL   )rB   Z	step_sizeupdateoffsetrI   rG   r   r   r   	_add_grad  s   
 
zLBFGS._add_gradc                 C   s   dd | j D S )Nc                 S   s   g | ]	}|j tjd qS )r   )r   r   r   ).0rI   r   r   r   
<listcomp>  s    z&LBFGS._clone_param.<locals>.<listcomp>)r@   rK   r   r   r   _clone_param     zLBFGS._clone_paramc                 C   s$   t | j|D ]	\}}|| qd S rF   )zipr@   copy_)rB   Zparams_datarI   Zpdatar   r   r   
_set_param  s   zLBFGS._set_paramc                 C   s0   |  || t| }|  }| | ||fS rF   )rW   floatrQ   r^   )rB   closurer!   r"   r#   loss	flat_gradr   r   r   _directional_evaluate  s
   

zLBFGS._directional_evaluatec           &         s  t jdks	J t   jd }|d }|d }|d }|d }|d }|d }|d	 }	jjd  }
|
d
d |
dd   }t|}d}|
d
  d7  <  }|	 
 |k}|re|S |
d}|
d}|
d}|
d}|
d}|
d}|
d}|
d}d}||k r1|d7 }|
d  d7  < |
d dkr| }g }g }g }d}n||}||}||}|dkrt ||	kr|d |d |d || || |d|  ||| }t |}d|
vrdg|	 |
d< |
d }| }t|d ddD ]}|| |||  ||< |j|| ||  d qt|| }} t|D ]}|| | ||  }!| j|| || |! d q<|du re|jtjd}n|| |}|
d dkrtdd|	   | }n|}||}"|"| krnd}#|dur|dkrtd }$ fdd}%t|%|$|||||"\}}}}#|| |	 
 |k}n3|| ||krt  t  }W d   n	1 sw   Y   }|	 
 |k}d}#||#7 }|
d
  |#7  < ||krn%||krn|rn||	 
 |kr#nt	|| |k r-n||k s||
d< ||
d< ||
d< ||
d< ||
d< ||
d< ||
d< ||
d< |S )zPerforms a single optimization step.

        Args:
            closure (Callable): A closure that reevaluates the model
                and returns the loss.
        r   r   r3   r4   r5   r6   r)   r8   r7   Z
func_evalsn_iterr#   r"   old_dirsold_stpsroH_diagprev_flat_grad	prev_lossg|=g      ?alNr   rR   r   Zstrong_wolfez only 'strong_wolfe' is supportedc                    s     | ||S rF   )rc   )r!   r"   r#   r`   rB   r   r   r      r[   zLBFGS.step.<locals>.obj_func)r=   r>   r   Zenable_gradstater@   
setdefaultr_   rQ   r   r
   getnegsubmulr   poprO   rangerT   r   r   r]   r	   sumRuntimeErrorrZ   r-   rW   )&rB   r`   groupr3   r4   r5   r6   r)   r8   r7   rm   Z	orig_lossra   Zcurrent_evalsrb   Zopt_condr#   r"   re   rf   rg   rh   ri   rj   rd   ysZysZnum_oldrk   qirZbe_ir&   r*   Zx_initr    r   rl   r   step  s   



























  z
LBFGS.step)r   r.   Nr/   r   r0   N)__name__
__module____qualname____doc__r<   rL   rQ   rW   rZ   r^   rc   r   Zno_gradr}   __classcell__r   r   rD   r   r      s$     	rF   )r   r   r   r   )	r   	functoolsr   Z	optimizerr   __all__r   r-   r   r   r   r   r   <module>   s    
#
 