o
    Xi'
                     @  sb   d Z ddlmZ ddlZddlm  mZ ddlm  m	Z	 G dd de	j
Ze	e gZdS )z"Optimization for shape operations.    )annotationsNc                      s8   e Zd Z fddZ	 dd ZdddZd	d
 Z  ZS )
ExtractDimc                   s   t  jdd d S )NF)remove_nodes)super__init__)self	__class__ f/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/ort_fusions/shape_optimization.pyr      s   zExtractDim.__init__c	                 C  sX   |j ||||dd}	|j||	dd}
|j|
g dd}|j|dgd}||||}|S )	Nr   )axis   )	allowzero)r      r      )permfinal_shape)_outputs)ConcatReshape	TransposeShapeSlice)r   opxdim0dim1dim2dim3startendshapereshaped
transposedr   	final_dimr
   r
   r   pattern   s   zExtractDim.patternreturnboolc	                 K  s   ||||fD ]}
|
j d u s|
j jdkr dS q| }d|jv r"dS d|jv r9|jd }t|tjr7|jdks9dS t	|| _
t	|| _| j
d u sO| jd u rQdS dS )N)r   Fr    r   r   T)r!   dimsproducer
attributes
isinstanceirAttrvalue	_ir_utilsget_singleton_value
_start_val_end_val)r   contextr   r   r   r   r   r   r    _dim
shape_node
start_attrr
   r
   r   check"   s    


zExtractDim.checkc           	      K  sf   ||||g}|| j | j }t|dkr|jtdg dS t|dkr+||d S |j|ddiS )Nr   
value_ints)r9   r   r   )r1   r2   lenConstantr,   
AttrInt64sIdentityr   )	r   r   r   r   r   r   r4   transposed_dimssliced_resultr
   r
   r   rewrite6   s   zExtractDim.rewrite)r&   r'   )__name__
__module____qualname__r   r%   r8   r@   __classcell__r
   r
   r   r   r      s    
r   )__doc__
__future__r   onnx_irr,   onnxscript.rewriter._ir_utilsrewriterr/   onnxscript.rewriter.patternr%   RewriteRuleClassBaser   RewriteRuleSetrulerulesr
   r
   r
   r   <module>   s   2