U
    zhbT                     @   s
  d dl Z d dlmZmZmZmZmZmZmZ d dl	Z	d dl
Z	d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ e	jjdd	d
ZeedddZeedddZe j e j!e j"e j#e j$dZ%e	j&j'dddZ(G dd dZ)G dd dZ*dS )    N)AnyDictListOptionalSetTupleUnion)ExportedProgram)ConstantArgument	InputKind	InputSpec
OutputKind
OutputSpecTensorArgument)subgraph_rewriter)_create_jit_graph)FunctionSchemagmc                 C   s"   dd }dd }t | ||}d S )Nc                 S   sJ   t jjj| |}t jj|}t jjjj||dd}t jjj	|}|S )Ntrunc)Zrounding_mode)
torchopsatensym_sizeintscalar_tensordivScalar_modeZIntZTensor)imdimscalesym_size_intr   Zdiv_scalar_modeZ
int_tensor r"   I/var/www/html/venv/lib/python3.8/site-packages/torch/_export/converter.pypattern   s    
  z.inplace_optimize_sym_size_div.<locals>.patternc                 S   s   t jjj| |}|| S N)r   r   r   r   r   )r   r   r    r!   r"   r"   r#   replacement"   s    z2inplace_optimize_sym_size_div.<locals>.replacement)r   Zreplace_pattern)r   r$   r&   Zreplaced_patternsr"   r"   r#   inplace_optimize_sym_size_div   s    	r'   )namereturnc                 C   s   |  ddS )N._)replacer(   r"   r"   r#   normalize_name)   s    r.   c                 C   s   |  d}dd| S )zprim::If -> convert_prim_If::Zconvert_r+   )splitjoin)r(   	name_listr"   r"   r#   ir_name_to_func_name-   s    
r3   )zprim::TupleIndexzaten::__is__zaten::__isnot__zaten::__not__zaten::__contains__nodec           
   
   C   s   |   }t|}t|jjd\}}|jj}z0ttj	|}t||}|rXt||}n|j
}W n> tk
r }	 z td|   d| j  |	W 5 d }	~	X Y nX |S )Nr/   zUnable to find operator z with schema )schemar   parsestrr(   r0   overload_namegetattrr   r   default	ExceptionRuntimeErrorkind)
r5   Z
schema_strr6   nsZop_nameoverrideZop_overload_modZop_overload_packetZop_overloader"   r"   r#   get_op_overload?   s"    


rB   c                   @   sL  e Zd Zeejjejjf ee	 ee	 dddZ
e	dddZejjddd	Zejjd
ddZejjdddZdd ZejjdddZejjdddZejjdddZejjdddZejjdddZejjdddZejjdddZejjddd Zejjdd!d"Zejjdd#d$Zejjdd%d&Zejjdd'd(Zejjdd)d*Z ejjdd+d,Z!ejjdd-d.Z"ejjdd/d0Z#ejjdd1d2Z$ejjdd3d4Z%ejjdd5d6Z&ejjdd7d8Z'ejjdd9d:Z(ejjdd;d<Z)ejjdd=d>Z*ejjdd?d@Z+ejjddAdBZ,dCdD Z-dES )FTS2FXGraphConverter)ts_graphparam_namesbuffer_namesc                    sv   | _ | _| _tj  _g  _g  _i  _	i  _
i  _i  _i  _t D ] }t|}t | fdd qPd S )Nc                    s
     | S r%   )_convert_standard_operatorsr4   selfr"   r#   <lambda>t       z.TS2FXGraphConverter.__init__.<locals>.<lambda>)rD   rE   rF   r   fxGraphfx_graphinput_specsoutput_specsname_to_nodeconstant_mapattribute_maptensor_constants	subgraphskind_to_standard_operatorskeysr3   setattr)rI   rD   rE   rF   khandler_func_namer"   rH   r#   __init__U   s&    
zTS2FXGraphConverter.__init__r)   c                 C   s   dt | j }|| j|< |S )NZ	subgraph_)lenrU   )rI   subgraphr(   r"   r"   r#   add_subgraphw   s    
z TS2FXGraphConverter.add_subgraphr4   c                 C   sV   g }i }t | |jD ]0\}}|jr8| |||j< q|| | qt||fS r%   )zipinputs	argumentsZ
kwarg_onlyget_fx_valuer(   appendtuple)rI   r5   r6   argskwargsinputZ
schema_argr"   r"   r#   get_args_kwargs|   s    z#TS2FXGraphConverter.get_args_kwargs)valuec                 C   s   |  }|| jkr | j| }|S || jkr^| j| }|| jkrL| j| }|S td| dn$|| jkrr| j| S td| dd S )NzValue 
 not foundzInput )	debugNamerQ   rS   
ValueErrorrR   )rI   rj   Z
value_nameZ
input_node	attr_namer"   r"   r#   rc      s    







z TS2FXGraphConverter.get_fx_valuec                 C   sR   |    | j D ]}| | q|   tj| j| j	}t
| |j  |S r%   )convert_graph_inputsrD   nodesconvert_nodeconvert_graph_outputsr   rL   GraphModulerU   rN   r'   graphZlint)rI   r5   r   r"   r"   r#   convert   s    
zTS2FXGraphConverter.convertc              	   C   s   | j  D ]}| }t|}| j|}|| j|< || jkr^| j	t
tjt|d|d q
|| jkr| j	t
tjt|d|dd q
| j	t
tjt|d|d q
d S )Nr-   argtargetT)rw   rx   
persistent)rD   ra   rl   r.   rN   placeholderrQ   rE   rO   rd   r   r   Z	PARAMETERr   rF   ZBUFFERZ
USER_INPUT)rI   Zgraph_inputr(   normalized_namefx_noder"   r"   r#   ro      s:    


	z(TS2FXGraphConverter.convert_graph_inputsc                 C   s   |   }d }|dr|d}|dkr8|d}q|dkrL|d}q|dkr`|d}q|dkrd| }| j|}|| j	|< |
d| j|< | jttjt|d|d |}q|d	kr|d}qtd
|d nd }|| j|< d S )Nrj   ifstZ	constant_r-   rv   ivalzUnsupported constant type: )outputrl   ZhasAttributeZkindOfr}   r~   r   rN   rz   rQ   r   rT   rO   rd   r   r   ZCONSTANT_TENSORr   r   rm   rR   )rI   r5   r(   rj   Zconstant_kindZplaceholder_namer|   r"   r"   r#   convert_prim_Constant   s8    



z)TS2FXGraphConverter.convert_prim_Constantc                 C   sR   |   }|tjj r>| }| 	 }|| j
|< ntd| dd S )NzUnsupported JitType (z) when get device)rh   typeZisSubtypeOfr   _CZ
TensorTypegetdevicer   rl   rR   rm   )rI   r5   Z
input_typer   output_namer"   r"   r#   convert_prim_device   s    z'TS2FXGraphConverter.convert_prim_devicec                 C   s*   |    }|  }|| j|< d S r%   )rh   r   dtyper   rl   rR   )rI   r5   r   r   r"   r"   r#   convert_prim_dtype   s    z&TS2FXGraphConverter.convert_prim_dtypec                    s\   t d fdd}|  }|d}|  }||}|rN| d| n| j|< d S )Nr-   c                    s(   |  j kr j |  S td|  dd S )Nz
Attribute rk   )rS   rm   r-   rH   r"   r#   get_attr  s    

z:TS2FXGraphConverter.convert_prim_GetAttr.<locals>.get_attrr(   r*   )r8   r   rl   r   rh   rS   )rI   r5   r   r   rn   Z
input_nameZroot_attr_namer"   rH   r#   convert_prim_GetAttr  s    
z(TS2FXGraphConverter.convert_prim_GetAttrc                 C   s`   t |}|tjjjjkr$tjjjj}| ||j\}}| j	
|||}|  }|| j|< d S r%   )rB   r   r   r   sizer   r   ri   _schemarN   call_functionr   rl   rQ   rI   r5   rx   rf   rg   r|   r   r"   r"   r#   convert_call_function_op  s    z,TS2FXGraphConverter.convert_call_function_opc                 C   s   |  | d S r%   _convert_prim_iteratorrI   r5   r"   r"   r#   convert_prim_TupleConstruct"  s    z/TS2FXGraphConverter.convert_prim_TupleConstructc                 C   s   |  | d S r%   r   r   r"   r"   r#   convert_prim_ListConstruct%  s    z.TS2FXGraphConverter.convert_prim_ListConstructc                 C   s<   g }|  D ]}|| | q|  }|| j|< d S r%   )ra   rd   rc   r   rl   rQ   )rI   r5   Zoutput_listinpr   r"   r"   r#   r   (  s
    z*TS2FXGraphConverter._convert_prim_iteratorc                 C   s   i }d\}}t | D ]R\}}|d dkr8| |}q| |}|d k	rR|d k	sZtd|||< d\}}q|d kr||d kstd|  }|| j|< d S )N)NN   r   z*DictConstruct has an empty key value pair.zGDictConstruct has an odd number of elements (violating our assumption).)	enumeratera   rc   AssertionErrorr   rl   rQ   )rI   r5   Zoutput_dictrY   vr}   r   r   r"   r"   r#   convert_prim_DictConstruct0  s,    

z.TS2FXGraphConverter.convert_prim_DictConstructc                 C   s   |  | d S r%   _convert_prim_unpack_iteratorr   r"   r"   r#   convert_prim_ListUnpackG  s    z+TS2FXGraphConverter.convert_prim_ListUnpackc                 C   s   |  | d S r%   r   r   r"   r"   r#   convert_prim_TupleUnpackJ  s    z,TS2FXGraphConverter.convert_prim_TupleUnpackc                 C   sN   t | D ]<\}}| }| | }| jtj||f}|| j	|< qd S r%   )
r   outputsrl   rc   rh   rN   r   operatorgetitemrQ   )rI   r5   r}   ZoutpZ	outp_namer   r|   r"   r"   r#   r   M  s
    z1TS2FXGraphConverter._convert_prim_unpack_iteratorc                    sn   t jjjj}t fdd| D } j||dt j	i} jt jjj
j|f}|  }| j|< d S )Nc                 3   s   | ]}  |V  qd S r%   rc   .0rh   rH   r"   r#   	<genexpr>X  s     z7TS2FXGraphConverter.convert_aten_Int.<locals>.<genexpr>r   )r   r   r   Z_to_copyr;   re   ra   rN   r   Zint32Z_local_scalar_denser   rl   rQ   )rI   r5   rx   rf   Zto_copy_noder|   r   r"   rH   r#   convert_aten_IntU  s    
 z$TS2FXGraphConverter.convert_aten_Intc                    sL   t jjj}t fdd| D } j||}| 	 }| j
|< d S )Nc                 3   s   | ]}  |V  qd S r%   r   r   rH   r"   r#   r   h  s     z?TS2FXGraphConverter.convert_prim_NumToTensor.<locals>.<genexpr>)r   r   r   r   re   ra   rN   r   r   rl   rQ   rI   r5   rx   rf   r|   r   r"   rH   r#   convert_prim_NumToTensore  s
    
z,TS2FXGraphConverter.convert_prim_NumToTensorc                 C   s   |   }d| j|< d S )N )r   rl   rS   )rI   r5   r   r"   r"   r#   convert_prim_CreateObjecto  s    z-TS2FXGraphConverter.convert_prim_CreateObjectc                 C   sH   t jjjj}| ||j\}}| j|||}|	 
 }|| j|< d S r%   )r   r   r   Zconvolutionr;   ri   r   rN   r   r   rl   rQ   r   r"   r"   r#   convert_aten__convolutions  s
    z-TS2FXGraphConverter.convert_aten__convolutionc                 C   s   t |}|j}| ||\}}|jdkr|d j}|| jkr| j| }| dkrt|}| j|  |d< | j	
tjjjjt||}	|  }
|	| j|
< d S | | d S )NZTensor_mode   )rB   r   ri   r9   r(   rT   ZnumellistitemrN   r   r   r   r   r   r   re   r   rl   rQ   r   )rI   r5   rx   r6   rf   rg   Z	arg1_nameZtensor_constantZupdated_argsr|   r   r"   r"   r#   convert_aten_div~  s&    




	
z$TS2FXGraphConverter.convert_aten_divc                    sL   t  fdd| D \}} jtj||f}|  }| j|< d S )Nc                 3   s   | ]}  |V  qd S r%   r   r   rH   r"   r#   r     s    z?TS2FXGraphConverter.convert_aten___getitem__.<locals>.<genexpr>)	re   ra   rN   r   r   r   r   rl   rQ   )rI   r5   Zinput_containerindexr|   r   r"   rH   r#   convert_aten___getitem__  s     z,TS2FXGraphConverter.convert_aten___getitem__c                    sl  t | }t|dkst |d }t }| D ]L}t }| D ].}| D ] }|  j	krV|
|  qVqJ|| q8t |}g }	| D ]h}t|t t }
 j|
_|D ]"}t|}|
j|}||
j	|< q|
 } |}|	 j| qt|	dkst fdd|D }||	d |	d t|f} jtj|i }|  }| j	|< d S )Nr   r   r   c                    s   g | ]} j | qS r"   )rQ   )r   arg_namerH   r"   r#   
<listcomp>  s     z7TS2FXGraphConverter.convert_prim_If.<locals>.<listcomp>)r   ra   r]   r   rc   setblocksrp   rl   rQ   addupdaterC   rR   r.   rN   rz   ru   r_   rd   r   re   r   r   Zcondr   )rI   r5   ra   	predicaterb   blockZ
block_argsZ
block_nodeZblock_node_inZsubgraph_nodesZsubgraph_converterZ	block_argZnormalized_block_arg_nameZplaceholder_noder^   Zsubgraph_nameZfx_block_argsrf   Z	cond_noder   r"   rH   r#   convert_prim_If  sF    
z#TS2FXGraphConverter.convert_prim_Ifc                 C   s   |  | d S r%   )_convert_as_noopr   r"   r"   r#   convert_aten_Bool  s    z%TS2FXGraphConverter.convert_aten_Boolc                 C   s<   t |}|j}| ||\}}|  }|d | j|< d S )Nr   )rB   r   ri   r   rl   rQ   )rI   r5   rx   r6   rf   rg   r   r"   r"   r#   r     s
    z$TS2FXGraphConverter._convert_as_noopc                    sL   t jjj}t fdd| D } j||}| 	 }| j
|< d S )Nc                 3   s   | ]}  |V  qd S r%   r   r   rH   r"   r#   r     s     zRTS2FXGraphConverter.convert_profiler__record_function_enter_new.<locals>.<genexpr>)r   r   profilerZ_record_function_enter_newre   ra   rN   r   r   rl   rQ   r   r"   rH   r#   +convert_profiler__record_function_enter_new  s
    
z?TS2FXGraphConverter.convert_profiler__record_function_enter_newc                    s6   t jjj}t fdd| D } j|| d S )Nc                 3   s   | ]}  |V  qd S r%   r   r   rH   r"   r#   r     s     zMTS2FXGraphConverter.convert_profiler__record_function_exit.<locals>.<genexpr>)r   r   r   Z_record_function_exitre   ra   rN   r   )rI   r5   rx   rf   r"   rH   r#   &convert_profiler__record_function_exit  s    
z:TS2FXGraphConverter.convert_profiler__record_function_exitc                    sN   t |  }t fdd| D } j||}|  }| j|< d S )Nc                 3   s   | ]}  |V  qd S r%   r   r   rH   r"   r#   r     s     zBTS2FXGraphConverter._convert_standard_operators.<locals>.<genexpr>)	rV   r>   re   ra   rN   r   r   rl   rQ   r   r"   rH   r#   rG     s
    z/TS2FXGraphConverter._convert_standard_operatorsc                 C   s*   |  }t|}t| || j}|| d S r%   )r>   r3   r:   r   )rI   r5   Z	node_kindrZ   Zhandler_funcr"   r"   r#   rq      s    z TS2FXGraphConverter.convert_nodec              	   C   s   g }| j  D ]}| }|| jkrT|| j|  | jttjt	|d|d q|| j
kr|| j
|  | jttjt|| j
| d|d qtd| dq| j|d  d S )Nr-   rv   )r(   rj   zOutput rk   r   )rD   r   rl   rQ   rd   rP   r   r   ZUSER_OUTPUTr   rR   r
   rm   rN   r   )rI   rf   Zgraph_outputr   r"   r"   r#   rr   
  s8    

 
z)TS2FXGraphConverter.convert_graph_outputsN).__name__
__module____qualname__r   r   r   rM   ZBlockr   r8   r[   r_   Noderi   Valuerc   rL   rs   ru   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   rq   rr   r"   r"   r"   r#   rC   T   sF   "&%	

5
rC   c                   @   sR   e Zd Zdeedf eeeef  dddZe	dddZ
ejjd	d
dZdS )TS2EPConverterN.)sample_argssample_kwargsc                 C   sT   || _ t||\| _| _}}|| _|| _dd | D | _dd | D | _	d S )Nc                 S   s   h | ]\}}|qS r"   r"   r   r(   r+   r"   r"   r#   	<setcomp>8  s     z*TS2EPConverter.__init__.<locals>.<setcomp>c                 S   s   h | ]\}}|qS r"   r"   r   r"   r"   r#   r   9  s     )
ts_modelr   rD   paramsr   r   Znamed_parametersrE   Znamed_buffersrF   )rI   r   r   r   r+   r"   r"   r#   r[   ,  s    zTS2EPConverter.__init__r\   c                 C   s,   t | j| j| j}| }| ||j}|S r%   )rC   rD   rE   rF   ru   retrace_as_exported_programrT   )rI   Zgraph_converterr   epr"   r"   r#   ru   ;  s      zTS2EPConverter.convertr   c                 C   s0   | j | j| }tjjj|t|ddd}|S )NFT)strictZpre_dispatch)r   r   valuesr   ZexportZ_traceZ_exportre   )rI   r   rT   ra   r   r"   r"   r#   r   C  s    z*TS2EPConverter.retrace_as_exported_program)N)r   r   r   r   r   r   r   r8   r[   r	   ru   r   rL   rs   r   r"   r"   r"   r#   r   *  s    
r   )+r   typingr   r   r   r   r   r   r   r   Ztorch.export._traceZtorch.export.exported_programr	   Ztorch.export.graph_signaturer
   r   r   r   r   r   Ztorch.fxr   Ztorch.onnx.utilsr   Ztorchgen.modelr   rL   rs   r'   r8   r.   r3   r   is_is_notnot_containsrV   r   r   rB   rC   r   r"   r"   r"   r#   <module>   s.   $ 
	   Y