o
    Xi2                     @  s  U d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZ ddlm  mZ ddlm  mZ ddlmZ eeZdZdZd?ddZd@ddZG dd deZejG dd dZejZ e	eej! ej!df Z"eej#e ge"f Z$dAddZ%G dd dZ&e& Z'de(d< e'j)Z)dBd$d%Z*dCdDd)d*Z+dCdEd,d-Z,e)d.d/d0d1dFd2d3Z-e)d4d/d0d1dFd5d6Z.e)d7d8d0d1dFd9d:Z/G d;d< d<Z0dGd=d>Z1dS )H6Convert the model to the specified ONNX opset version.    )annotationsN)CallableSequenceUnion)ir      modelir.Modelreturn
int | Nonec                 C  sN   | j d}| j d}|dur#|dur#||kr#td| d| d|p&|S )z1Get the ONNX opset version imported by the model. ai.onnxNz$Model imports multiple onnx opsets: z and .)opset_importsget
ValueError)r
   model_version1model_version2 r   c/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/version_converter/_version_converter.py_get_onnx_opset_version   s   r   model_or_functionir.Model | ir.FunctionversionintNonec                 C  s    d| j v r	| j d= || j d< dS )z=Set the ONNX opset version imported by the model or function.r   r   N)r   )r   r   r   r   r   _set_onnx_opset_version%   s   
r   c                   @  s   e Zd ZdZdS )VersionConverterErrorzIRaised when an node's version cannot be upgraded/downgraded successfully.N)__name__
__module____qualname____doc__r   r   r   r   r   ,   s    r   c                   @  s"   e Zd ZU dZded< ded< dS )Replacementz&A replacement for a node in the graph.zSequence[ir.Value]new_outputszSequence[ir.Node]	new_nodesN)r    r!   r"   r#   __annotations__r   r   r   r   r$   0   s   
 r$   target_versionboolc                 C  s@   d| j jv r| j jd }ndS t|  ko|  kotkS   S )z@Check if the target version is supported by the current version.r   T)graphr   SUPPORTED_MIN_ONNX_OPSETSUPPORTED_MAX_ONNX_OPSET)r
   r(   current_versionr   r   r   version_supported@   s   r.   c                   @  s4   e Zd ZdZdd Z	ddddZ	ddddZdS )AdapterRegistryz6A class that maintains a registry of adapters for ops.c                 C  s
   i | _ d S N)op_adapters)selfr   r   r   __init__Q   s   
zAdapterRegistry.__init__Tdomainstropnameoriginal_versionr   up_conversionr)   r   AdapterFunction | Nonec                 C  s$   | j ||||f}|d ur|S d S r0   )r1   r   )r2   r4   r6   r7   r8   adapter_funcr   r   r   lookup_adaptersT   s   zAdapterRegistry.lookup_adaptersr   N,Callable[[AdapterFunction], AdapterFunction]c                   s   d fdd}|S )zrRegister an adapter based on the domain, operator type, node version and whether to upgrade/downgrade node versionfunctionAdapterFunctionr   c                   s,   t   fdd} jf< |S )Nc                    s    | i |S r0   r   )argskwargsr=   r   r   wrapped_functionf   s   zEAdapterRegistry.register.<locals>.decorator.<locals>.wrapped_function)	functoolswrapsr1   )r=   rB   r4   node_versionr6   r2   r8   rA   r   	decoratore   s   z+AdapterRegistry.register.<locals>.decoratorN)r=   r>   r   r>   r   )r2   r6   r4   rF   r8   rG   r   rE   r   register`   s   zAdapterRegistry.registerT)
r4   r5   r6   r5   r7   r   r8   r)   r   r9   )r   NT)r6   r5   r4   r5   r   r<   )r    r!   r"   r#   r3   r;   rH   r   r   r   r   r/   N   s    r/   registrynodeir.Nodeindexir.Value | Nonec                 C  s   |t | jk r| j| S d S r0   )leninputs)rK   rM   r   r   r   
_get_inputu   s   
rQ   namer5   defaultc                 C  @   || j v r| j | }t|tjsd S |j}t|tr|S d S |S r0   )
attributes
isinstancer   Attrvaluer   rK   rR   rS   attrattr_valr   r   r   _get_int_attribute{      


r\   
str | Nonec                 C  rT   r0   )rU   rV   r   rW   rX   r5   rY   r   r   r   _get_str_attribute   r]   r_   DFT   T)rF   r8   c                 C  sv   | j d }t| j dkr| j d nd }t| dd}t| dd}t| dd }|d ur9|j|d}|j|||||dS d S )Nr      inverseonesidedaxis)	value_int)rc   rd   )rP   rO   r\   Constantr`   )rK   opinput
dft_lengthrc   rd   re   
axis_valuer   r   r   	dft_19_20   s   
rl   
GridSamplec                 C  st   | j d }| j d }t| dd}t| dd}t| dd}|dkr*|j|||d|d	S |d
kr8|j|||d|d	S d S )Nr   rb   align_cornersmodelinearpadding_modezerosbilinear)rn   ro   rq   bicubiccubic)rP   r\   r_   rm   )rK   rh   xgridrn   ro   rq   r   r   r   gridsample_19_20   s   



rx   GroupNormalization   c                 C  s  t | d}t | d}t | d}|d u s|d u s|d u r"td|  |j}|d u r0td| |d }t|ts;d S |j}|j}|d u sI|d u rKd S t|d trYt|d ts[d S t| dd }	|	d u ritd|	|kr|	|d kr|	|d kr|jddgd	}
|jdgd	}t||	 }|jd|gd	}|||
}|||}|||}|||
}|||}|||}|j	||||	d
S d S )Nr   rb      zMissing input for zMissing required shape for 
num_groupsz&Missing required attribute: num_groups)
value_ints)r|   )
rQ   r   shaperV   r   r\   rg   ReshapeExpandry   )rK   rh   rv   scalebiasx_shapenum_channelsscale_shape
bias_shaper|   reshape_1_sizesreshape_2_sizesc_divexpand_sizesscale_reshape_1scale_expandscale_reshape_2bias_reshape_1bias_expandbias_reshape_2r   r   r   groupnormalization_20_21   sF   



r   c                   @  sZ   e Zd Zd"ddZ	d#d$ddZd%ddZd&ddZ	d#d'ddZd(ddZd)dd Z	d!S )*_VersionConverterr(   r   c                 C  s   || _ tt | _d S r0   )_target_versionmetadata_mergerMetadataMergerdict_default_metadata_merger)r2   r(   r   r   r   r3      s
   z_VersionConverter.__init__TrK   rL   from_versionr8   r)   r   Replacement | Nonec                 C  sh   |j dksJ t|j |j||}|d u rd S t }|||}|d ur2t|tjr,|g}t||j	S d S )Nr   )
r4   rJ   r;   op_typeRewriterContextrV   r   Valuer$   nodes)r2   rK   r   r8   adaptercontextoutputr   r   r   process_node   s   
z_VersionConverter.process_noderootir.Graph | ir.Functionr   c                 C  s6   t d|j|j|j t|||g|j|j|j	 d S )NzReplacing node: %s::%s %s)
loggerdebugr4   r   rR   ir_conveniencereplace_nodes_and_valuesr&   outputsr%   )r2   rK   replacementr   r   r   r   replace_node
  s   z_VersionConverter.replace_noderZ   ir.Attrc                 C  sZ   |  rd S |jtjjkr| |  d S |jtjjkr)| D ]	}| | q!d S d S r0   )	is_reftyper   AttributeTypeGRAPHvisit_graph_or_functionas_graphGRAPHS	as_graphs)r2   rZ   r*   r   r   r   visit_attribute  s   z!_VersionConverter.visit_attributec           	      C  s   |r|d }n|d }|  |||}|d u r(|j D ]}| | q||_d S |jD ]}||_q+| j|g|j | ||| d S )Nrb   )	r   rU   valuesr   r   r&   r   copy_merged_metadatar   )	r2   rK   r   r   r8   
to_versionr   rZ   new_noder   r   r   
visit_node  s   


z_VersionConverter.visit_nodegraph_or_functionc                 C  s   |D ]Z}|j dkr
q|jp| j}|d u rtd| d| j|k r.td| j d|j dt|| jD ]'}z| j|||dd W q4 ty[ } ztd	|j	| W Y d }~q4d }~ww qd S )
Nr   zNode z has no version.zTarget opset: z less than node version: z6, downstream version conversion not currently handled.T)r8   z<Skipping version conversion for node %s due to exception: %s)
r4   r   _default_onnx_opsetr   r   ranger   r   warningr   )r2   r   rK   rF   r   er   r   r   r   2  s.   

z)_VersionConverter.visit_graph_or_functionr
   r   c                 C  sL   t || _| |j |j D ]}| | t|| j qt|| j d S r0   )r   r   r   r*   	functionsr   r   r   )r2   r
   r=   r   r   r   visit_modelL  s   

z_VersionConverter.visit_modelN)r(   r   rI   )rK   rL   r   r   r8   r)   r   r   )rK   rL   r   r   r   r   )rZ   r   r   r   )
rK   rL   r   r   r   r   r8   r)   r   r   )r   r   r   r   )r
   r   r   r   )
r    r!   r"   r3   r   r   r   r   r   r   r   r   r   r   r      s    




r   c                 C  sD   |t ks|tk rtd| dt dt  dt|d}||  dS )r   zTarget opset version z$ is not supported. Supported range: z to r   )r(   N)r,   r+   r   r   r   )r
   r(   version_converterr   r   r   convert_versionU  s   
r   )r
   r   r   r   )r   r   r   r   r   r   )r
   r   r(   r   r   r)   )rK   rL   rM   r   r   rN   r0   )rK   rL   rR   r5   rS   r   r   r   )rK   rL   rR   r5   rS   r^   r   r^   )rK   rL   )r
   r   r(   r   r   r   )2r#   
__future__r   dataclassesrC   loggingtypingr   r   r   onnx_ir.convenienceconveniencer   onnxscript.ir._taper   _tape onnxscript.utils.metadata_mergerutilsr   
onnxscript	getLoggerr    r   r,   r+   r   r   RuntimeErrorr   	dataclassr$   Builderr   r   ReturnValueNoder>   r.   r/   rJ   r'   rH   rQ   r\   r_   rl   rx   r   r   r   r   r   r   r   <module>   sH   




"
0f