o
    Xiq                     @  sP  U d dl mZ d dlmZmZmZ g dZd dlZd dlm	  m
Z d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZ d d	lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ed
ej(ej)Z*g e%j+ej+ej+e j+e$j+e#j+e, e&j+e"j+e!j+e'j+R Z-de.d< G dd dej	j/Z0	ddddZ1dS )    )annotations)SequenceTypeVarUnion)merge_metadatapatternrewriteRewritePassMatchResultMatchContextRewriteRuleRewriteRuleClassBaseRewriteRuleSetRewriterContextMatchingTracerMatchStatusRULE_NAME_TAGN)ir)r   )r   r   r
   r   )r   r   r   r   r   r   )_basic_rules_broadcast_to_matmul_cast_constant_of_shape_collapse_slices_fuse_batchnorm_fuse_pad_into_conv_fuse_relus_clips_min_max_to_clip_no_op_redundant_scatter_nd_remove_optional_bias_ModelProtoOrIrztuple[pattern.RewriteRule, ...]_DEFAULT_REWRITE_RULESc                      s(   e Zd Zd fddZdd
dZ  ZS )r	   rules6Sequence[pattern.RewriteRule] | pattern.RewriteRuleSetreturnNonec                  sD   t    t|tr|stdt|}t|tjsJ || _d S )Nzrules must not be empty)super__init__
isinstancer   
ValueErrorr   r   r!   )selfr!   	__class__ P/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/__init__.pyr&   D   s   



zRewritePass.__init__modelir.Modelir.passes.PassResultc                 C  s2   | j |}|rtd| d tj|t|S )NzApplied z" of general pattern rewrite rules.)r!   apply_to_modelprintr   passes
PassResultbool)r)   r.   countr,   r,   r-   callR   s   zRewritePass.call)r!   r"   r#   r$   )r.   r/   r#   r0   )__name__
__module____qualname__r&   r7   __classcell__r,   r,   r*   r-   r	   C   s    r	   r.   pattern_rewrite_rulesCUnion[Sequence[pattern.RewriteRule], pattern.RewriteRuleSet] | Noner#   c                 C  s~   |du rt }n|s| S t| tjrtj| }d}n| }d}tjt	|t
 t
 t
 f}||j}|r=tj|S |S )a&  Rewrite the model using the provided pattern rewrite rules.

    Unused nodes, functions, and opsets will be removed after the rewrite.

    Args:
        model: The model to be rewritten. Can be an ONNX ModelProto or an ir.Model.
        pattern_rewrite_rules: A sequence of pattern rewrite rules or a RewriteRuleSet.
            If not provided, default rules will be applied. If empty, no rules will be applied
            and the original model will be returned.

    Returns:
        The rewritten model as the same type as the input model.
    NTF)r    r'   onnx
ModelProtor   serdedeserialize_modelr3   PassManagerr	   common_passesRemoveUnusedNodesPassRemoveUnusedFunctionsPassRemoveUnusedOpsetsPassr.   serialize_model)r.   r<   model_irprotorewrite_passr,   r,   r-   r   Y   s(   
r   )N)r.   r   r<   r=   r#   r   )2
__future__r   typingr   r   r   __all__r>   onnx_ir.passes.commonr3   commonrC   
onnxscriptr   onnxscript.rewriterr   onnxscript.rewriter._basicsr   r   r
   r   !onnxscript.rewriter._rewrite_ruler   r   r   r   r   r    onnxscript.rewriter.rules.commonr   r   r   r   r   r   r   r   r   r   r   r?   Modelr   r!   basic_optimization_rulesr    __annotations__InPlacePassr	   r   r,   r,   r,   r-   <module>   sJ    4	
