U
    9%ev                     @   s   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dl
mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ G dd deZG dd deZG dd deZdS )    )DictListN   )GuardBuilder)
AttrSourceGetItemSourceGlobalWeakRefSource)global_key_name   )MutableLocalVariableTracker)ConstantVariable)ConstDictVariable)ListVariable)GetAttrVariable)UserDefinedObjectVariablec                   @   s   e Zd ZdS )ArgMappingExceptionN__name__
__module____qualname__ r   r   `/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_dynamo/variables/optimizer.pyr      s   r   c                   @   s   e Zd ZdS )GuardInstallExceptionNr   r   r   r   r   r      s   r   c                       s`   e Zd Zd fdd	Zdddd fdd	Z fd
dZdd Zdd Zdd Zdd Z	  Z
S )OptimizerVariableNc                    sN   t  j|f| | jjD ]}d|krd|d< q|d kr<i | _|d krJi | _d S )NZ
capturableT)super__init__valueparam_groupsgrad_to_sourcetensor_to_source)selfr   r   r    kwargsgroup	__class__r   r   r      s    
zOptimizerVariable.__init__zList[VariableTracker]zDict[str, VariableTracker]r   )argsr"   returnc              
      s   |dkrtzD| j ||\}}| jj|| | | | ||||| tdW S  ttfk
rr } zW 5 d}~X Y nX t 	||||S )zUThis is an optimization to avoid tracing the very slow intialization of the optimizer_init_groupN)
get_python_argsr   r(   map_sources_and_install_guardsupdate_list_argsr   r   r   r   call_method)r!   txnamer&   r"   py_args	py_kwargs_r$   r   r   r,   '   s    

zOptimizerVariable.call_methodc                    s    |dkrt | |S t ||S )Nr(   )r   r   var_getattr)r!   r-   r.   r$   r   r   r2   <   s    
zOptimizerVariable.var_getattrc                    s<   fdd  fdd|D } fdd|  D }||fS )z9Get python values equivalent to the variable tracker argsc                    sr   t | tr|  S t | tr&| js&g S t | trht | jtrht | jjt	rh| jjj
dkrh jj| jj S t d S )Nr   )
isinstancer   Zas_python_constantr   itemsr   sourcer   baser   memberr   r   indexr   )arg)r!   r   r   map_argE   s    

z2OptimizerVariable.get_python_args.<locals>.map_argc                    s   g | ]} |qS r   r   ).0r9   r:   r   r   
<listcomp>T   s     z5OptimizerVariable.get_python_args.<locals>.<listcomp>c                    s   i | ]\}}| |qS r   r   )r;   kvr<   r   r   
<dictcomp>U   s      z5OptimizerVariable.get_python_args.<locals>.<dictcomp>)r4   )r!   r&   r"   new_argsZ
new_kwargsr   )r:   r!   r   r)   B   s    z!OptimizerVariable.get_python_argsc                 C   s  ddl m} i | _i | _t| jjD ]f\}}tt| j	d|}t|d D ]>\}}tt|d|}|| j|< |j
d k	rJt|d| j|j
< qJq$t }	t| j	d}
|	|
tj | jj D ]\}}|t|| t|
| j| }|	|tj | D ]~\}}t|tjr>|| jkr>|| jkr>t||| j|< q|d ks\t|ttttfrv|	t||tj qt qq|jj|	 ||t| j	d| jj}|jj|j d S )Nr
   VariableBuilderr   paramsgradstate) builderrC   r   r    	enumerater   r   r   r   r5   rE   setaddZ
make_guardr   Z	DICT_KEYSrF   r4   store_dict_keyr	   r3   torchTensorboolintfloatstrZCONSTANT_MATCHr   outputguardsupdate)r!   r-   rC   Zg_indr#   Zgroup_sourceZp_indpZparam_sourcerS   Zstate_sourcer   Zp_state_sourcer>   r?   Zgroup_guardsr   r   r   r*   Y   sV     




z0OptimizerVariable.map_sources_and_install_guardsc                 C   sr   ddl m} || jkr*||| j| |S || jkrH||| j| |S |t|| ||tt||S dS )z%Wrap state tensor in a TensorVariabler
   rB   N)rG   rC   r    r   rK   r	   r   )r!   r-   Ztensor_valuerC   r   r   r   wrap_tensor   s    

 
zOptimizerVariable.wrap_tensorc           	         s`   t ||D ]P\}}t|tr
tdd |D r
t fdd|D t i d}|| q
dS )z7Update the args and kwargs to the traced optimizer callc                 s   s   | ]}t |tjV  qd S )N)r3   rL   rM   r;   tr   r   r   	<genexpr>   s    z5OptimizerVariable.update_list_args.<locals>.<genexpr>c                    s   g | ]}  |qS r   )rV   rW   r!   r-   r   r   r=      s     z6OptimizerVariable.update_list_args.<locals>.<listcomp>)Zmutable_localZrecursively_containsN)zipr3   r   allr   Zreplace_all)	r!   r-   r&   r"   r/   r0   r9   Zpy_argZtensor_varsr   rZ   r   r+      s    z"OptimizerVariable.update_list_args)NN)r   r   r   r   r,   r2   r)   r*   rV   r+   __classcell__r   r   r$   r   r      s   3r   )typingr   r   rL   rS   r   r5   r   r   r   utilsr	   r6   r   r   Zconstantr   Zdictsr   listsr   miscr   Zuser_definedr   	Exceptionr   r   r   r   r   r   r   <module>   s   