U
    U?h{                     @  s  d dl mZ d dlZd dlZd dlZd dlmZ d dlm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ZmZmZmZ d dlmZ d d	lmZmZmZ zd d
lmZ W n ek
r   dZY nX zd dlmZmZ W n ek
r   dZdZY nX dZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(i Z)dd e*eD Z+G dd deZ,G dd deZ-G dd deZ.G dd deZ/ejj0e	1dejj2e	1d ejj3e	1d!ejj4e	1d"ejj5eejj6eejj7eiZ8ejj2e	j9d e	j:d#e	j9d$e	j:d#fejj0e	j9d%e	j;d#e	j9d&e	j;d#fejj4e	j9d e	j<d#e	j9d'e	j<d#fejj3e	j9d(e	j=d#e	j9d)e	j=d#fejj7e	j9d ed#e	j9d*ed#fejj6e	j9d+ed#e	j9d,ed#fiZ>ejj0e	j9d-e	j;d#e	j9d&e	j;d#fejj3e	j9d.e	j=d#e	j9d)e	j=d#fiZ?ejj2e	j9d e	j:d#e	j9d&e	j:d#fejj0e	j9d/e	j;d#e	j9d0e	j;d#fejj4e	j9d e	j<d#e	j9d)e	j<d#fejj3e	j9d1e	j=d#e	j9d2e	j=d#fejj7e	j9d ed#e	j9d,ed#fejj6e	j9d3ed#e	j9d4ed#fiZ@d5d6d7d8ZAdd9d:ZBdd<d=ZCd>d? ZDdd@dAZEddBdCZFddDdEZGdFdFdGdHdIdJZHdKdLdMdNdOZIG dPdQ dQZJG dRdS dSZKG dTdU dUZLdVdW ZMdXdY ZNdZd[ ZOd\d] ZPd^d_d^d`dadbZQdcdd ZRddfdgZSddidjZTd^dkdldmZUd^d^dndodpZVdqdrdsdtZWdqdudvdwdxZXdqdrdydzZYdqdudvd{d|ZZd^dqd}d~dZ[dqdqdvddZ\dddddZ]d_d_dddZ^d_d_dddZ_d_dddZ`d_dddZad_dddZbd_dddZcdS )    )annotationsN)Enum)Path)
ModelProtoTensorProtoexternal_data_helper)onnx_pb)
make_graph
make_model	make_nodemake_tensor_value_info)ReferenceEvaluator)GraphOptimizationLevelInferenceSessionSessionOptionsfloat8e4m3fn)int4uint4zonnx.quantizez0.1.0zai.onnxzcom.microsoftQuantizeLinearZ_QuantizeLinear_InputZDequantizeLinearZ_DequantizeLinear_OutputZ
_quantizedc                 C  s(   i | ] }t tt|trtt||qS  )
isinstancegetattrr   int).0kr   r   V/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/quantization/quant_utils.py
<dictcomp>1   s       r   c                   @  s(   e Zd ZdZdZdd Zedd ZdS )QuantizationModer      c                 C  s   | j S Nnameselfr   r   r   __str__<   s    zQuantizationMode.__str__c                 C  s*   z
t |  W S  tk
r$   t Y nX d S r    )r   KeyError
ValueError)moder   r   r   from_string?   s    
zQuantizationMode.from_stringN)__name__
__module____qualname__Z
IntegerOpsZ
QLinearOpsr%   staticmethodr)   r   r   r   r   r   8   s
   r   c                   @  s(   e Zd ZdZdZdd Zedd ZdS )QuantizedValueTyper   r   c                 C  s   | j S r    r!   r#   r   r   r   r%   K   s    zQuantizedValueType.__str__c                 C  s*   z
t |  W S  tk
r$   t Y nX d S r    )r.   r&   r'   )vr   r   r   r)   N   s    
zQuantizedValueType.from_stringN)r*   r+   r,   ZInputZInitializerr%   r-   r)   r   r   r   r   r.   G   s
   r.   c                   @  sH   e Zd ZdZdZdZdZdZdZdZ	dd	 Z
ed
d Zedd ZdS )	QuantTyper   r                  c                 C  s   | j S r    r!   r#   r   r   r   r%   _   s    zQuantType.__str__c                 C  s*   z
t |  W S  tk
r$   t Y nX d S r    )r0   r&   r'   )tr   r   r   r)   b   s    
zQuantType.from_stringc                 C  s   | t jkrtjS | t jkr tjS | t jkr0tjS | t jkr@tj	S | t j
krPtjS | t jkr`tjS | t jkrptjS td| dd S )NzUnexpected value qtype=.)r0   QInt8r   INT8QUInt8UINT8QUInt16UINT16QInt16INT16QFLOAT8E4M3FNFLOAT8E4M3FNQUInt4UINT4QInt4INT4r'   r#   r   r   r   tensor_typei   s    






zQuantType.tensor_typeN)r*   r+   r,   r8   r:   r@   r>   r<   rD   rB   r%   r-   r)   propertyrF   r   r   r   r   r0   V   s   
r0   c                   @  s(   e Zd ZdZdZdd Zedd ZdS )QuantFormatr   r   c                 C  s   | j S r    r!   r#   r   r   r   r%      s    zQuantFormat.__str__c                 C  s*   z
t |  W S  tk
r$   t Y nX d S r    )rH   r&   r'   )formatr   r   r   r)      s    
zQuantFormat.from_stringN)r*   r+   r,   Z	QOperatorZQDQr%   r-   r)   r   r   r   r   rH   |   s
   rH   int8uint8int16uint16dtype   i   i  i i     i   iii@   i i @  r2   zero_point_indexc                 G  s   g }t |D ]\}}tt|tjr8|t| n,t|tjrP|| nt	d| d| || kr|d }|j
tjks|j
tjkrt	d|j
 qt|dkrt|S |d S )Nzarg z is not an array: rV   zzero_point cannot be r   r   )	enumeratenumpyZ
issubdtypetypenumberappendarrayr   ndarray	TypeErrorrO   float32float16lentuple)rX   argsnew_argsiar/   r   r   r   _check_type   s    ri   c                 C  s  | t kstd|  d| tjjtjjtjjtjjfkr|dkrRtd|d|j	t
jkrftj}n&|j	t
jkrztj}ntd|j	 dtttdg dgtjd| g dgd	td
dddgdggdtd|d td|d gtd| d g}t|}t|d ||dd S t |  }	t| ddd\}
}|d k	r>t|
|n|
}|d k	rVt||n|}t
|t
j|  | }t
j ||||d t||	S d S )NUnexpected data type > requested. Only INT8, UINT8, INT16, and UINT16 are supported.r   z2zero_point is expected to be null for float 8 not r7   zUnexpected dtype Constant
zero_point)valuer   XscaleYZqu)ro   rp   FT)reduce_range	symmetric)out)!ONNX_TYPE_TO_NP_TYPEAssertionError
onnx_protor   rA   ZFLOAT8E4M3FNUZZ
FLOAT8E5M2ZFLOAT8E5M2FNUZNotImplementedErrorrO   rZ   ra   FLOATrb   FLOAT16r'   r
   r	   r   onnxhelperZmake_tensorr   r   ri   runget_qmin_qmax_for_qTypemaxminasarrayastyperoundZclip)qTypeZarrrp   rm   lowhighZ	onnx_typeZ
onnx_modelrefrO   qminqmaxZcliplowZcliphighZarr_fp32r   r   r   quantize_nparray   sV    
   

r   Fc                 C  s  |dks|dk r$t d| d| t| tjd| jd} t|tjd|jd}|dk	rjt|| | }|rtt| t|}| } |
 }||kstd|  d| tj||  tj	d}tj|tj	dtj|tj	d }t|| }	|	dkstd|	t
|jjk r8tjd	|jd}	tjd|jd}
n\|rjtjt|| tjd
tj	d |jd}
ntjt|| |	  |jd}
|	|j}	|
|	gS )a  Calculate the scale s and zero point z for the quantization relation
    r = s(q-z), where r are the original values and q are the corresponding
    quantized values.

    r and z are calculated such that every value within [rmin,rmax] has an
    approximate representation within [qmin,qmax]. In addition, qmin <= z <=
    qmax is enforced. If the symmetric flag is set to True, the interval
    [rmin,rmax] is symmetrized to [-absmax, +absmax], where
    absmax = max(abs(rmin), abs(rmax)).

    :parameter rmin: minimum value of r
    :parameter rmax: maximum value of r
    :parameter qmin: minimum value representable by the target quantization data type
    :parameter qmax: maximum value representable by the target quantization data type
    :parameter symmetric: True if the floating-point range should be made symmetric. Defaults to False.
    :parameter min_real_range: Minimum floating-point range (i.e., rmax - rmin) to enforce. Defaults to None.
    :return: zero and scale [z, s]

    r   Bqmin and qmax must meet requirement: qmin <= 0 <= qmax while qmin:, qmmax:rN   Nzqmin=z > qmax=z
scale isse      ?g       @)r'   rZ   minimumr^   rO   maximumr   absrv   Zfloat64ZfinfoZtinyr   r   )rminrmaxr   r   rs   min_real_rangeZabsmaxZdrZdqrp   rm   r   r   r   compute_scale_zp   s4      r   c           	        s   d}| t kr~| tjkrdddlm  ddlm} |} fddtdD }tj	dd |D tj
d	}ntd
|  d|t | < n| tjkrddlm} |}|dkrtd|  dtt |  }tj	d|d	}tj	|| |jd	}||gS )ar  Calculate the scale s for a float8 type (E4M3FN).
    The function assumes the coefficient distribution and the float 8
    distribution are similar to two gaussian laws.

    :return: zero and scale [z, s]

    More details in notebook `quantization_fp8.ipynb
    <https://github.com/microsoft/onnxruntime/blob/main/docs/python/notebooks/quantization_fp8.ipynb>`_.
    Nr   float8e4m3_to_float32r   c                   s   g | ]} |qS r   r   )r   rg   r   r   r   
<listcomp>A  s     z+compute_scale_zp_float8.<locals>.<listcomp>   c                 S  s$   g | ]}t |st |s|qS r   )rZ   isnanisinf)r   fr   r   r   r   C  s     
 
 rN   zQuantization to element_type=z not implemented.zUnexpected element_type r7   )FLOAT8_DISTRIBUTIONSr   rA   Zonnx.numpy_helperr   #onnx.reference.custom_element_typesr   rangerZ   r^   ra   r'   r`   stdrO   )	Zelement_typer   Zzp_dtyper   Z
all_valuesvaluesZstd_f8zerorp   r   r   r   compute_scale_zp_float80  s,    

 

r   c              
   C  s  t | tjs tdt|  d|dk	r.|}nt| r>|  nd}|dk	rP|}nt| r`|  nd}tj|| j	d}tj|| j	d}d}	tjd| j	d}
|t
jkrD|rtdt| }t||\}	}
t|| |
|	}t|tj d	@ d	kr0t| }td
|  d|  d|  d|  d	t|||	|
|ddS |t
jt
jt
jt
jt
jt
jfkrt| rt|||d\}}t||||||\}	}
t|| |
|	}t|||	|
|ddS td| ddS )a  
    :param data: data to quantize
    :param qType: data type to quantize to. Supported types UINT8 and INT8
    :param symmetric: whether symmetric quantization is used or not. This is applied to INT8.
    :parameter reduce_range: True if the quantization range should be reduced. Defaults to False.
    :parameter min_real_range: Minimum floating-point range (i.e., rmax - rmin) to enforce. Defaults to None.
    :parameter rmin_override: The value of rmin to use if not None. Otherwise, uses min(data).
    :parameter rmax_override: The value of rmax to use if not None. Otherwise, uses max(data).
    :return: minimum, maximum, zero point, scale, and quantized weights

    To pack weights, we compute a linear transformation

    - when data `type == uint8` mode, from `[rmin, rmax]` -> :math:`[0, 2^{b-1}]` and
    - when data `type == int8`, from `[-m , m]` -> :math:`[-(2^{b-1}-1), 2^{b-1}-1]` where
        `m = max(abs(rmin), abs(rmax))`

    and add necessary intermediate nodes to transform quantized weight to full weight using the equation

    :math:`r = S(q-z)`, where

    - *r*: real original value
    - *q*: quantized value
    - *S*: scale
    - *z*: zero point
    z%Weight must be given as an array not r7   Ng        rN   r   r   z1Unsupported option reduce_range=True for float 8.rQ   z+One of the quantized value is NaN data in [z, z], quantized_data in [z].r1   rW   rs   zUnexpected value for qType=)r   rZ   r_   r`   r[   rc   r   r   r^   rO   r   rA   RuntimeErrorr   r   r   anyr   rK   Zravelr   ri   r9   r;   r?   r=   rE   rC   r~   r   r'   )datar   rs   rr   r   Zrmin_overrideZrmax_overrider   r   rm   rp   r   quantized_dataZnp_datar   r   r   r   r   quantize_dataU  sL    

,
r   c                 C  s   | t jjkrtdd}|r(t| }n |r>| tkr>t|  }n
t| }|s\td|  d|\}}|dkst|dk rtd| d| d|j	 d	| d
| d|  |S )z
    Return qmin and qmax, the minimum and maximum value representable by the given qType
    :parameter qType: onnx.onnx_pb.TensorProto.UINT8 or onnx.onnx_pb.TensorProto.UINT8
    :return: qmin, qmax
    z;This function is not implemented for float 8 as not needed.Nrj   rk   r   r   r   z, dtype=z, reduce_range=z, symmetric=z, qType=)
rw   r   rA   rx   ONNX_INT_TYPE_REDUCED_RANGEgetONNX_INT_TYPE_SYMMETRIC_RANGEONNX_INT_TYPE_RANGEr'   rO   )r   rr   rs   Zqranger   r   r   r   r   r~     s     

(r~   c                 C  s   t | ||d\}}|| S )z
    Helper function to get the quantization range for a type.
        parameter qType: quantization type.
        return: quantization range.
    r   )r~   )r   rr   rs   r   r   r   r   r   get_qrange_for_qType  s    r   r   ztuple[bool, int])axisrankreturnc                 C  s,   | dk r| | n| }|dko"||k }||fS )z
    Helper function that tries to return a normalized axis in the range [0, rank - 1].
    :parameter axis: The axis to normalize.
    :parameter rank: The tensor rank (number of dimensions).
    :return (is_valid, axis_norm)
    r   r   )r   r   Z	axis_normZis_validr   r   r   normalize_axis  s    r   bytes	bytearray)src_8bitr   c                 C  s   t | }|dkrt S |d d }t|}d}d}||d k rt| |d  d@ d> | | d@ B ||< |d7 }|d7 }q2||k r| | d@ ||< |S )aB  
    Copies a source array of 8-bit values into a destination bytearray of packed 4-bit values.
    Assumes that the source values are already in the appropriate int4 range.
    :parameter src_8bit: The 8-bit element values to pack.
    :return A bytearray with every two 8-bit src elements packed into a single byte.
    r   r   r1   rR   r3   )rc   r   )r   Z	num_elemsZdst_sizedstZsrc_iZdst_ir   r   r   pack_bytes_to_4bit  s    $
r   c                   @  s    e Zd ZdZg g dfddZdS )QuantizedInitializerzJ
    Represents a linearly quantized weight input from ONNX operators
    Nc
           
      C  s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S r    )	r"   initializerrminsrmaxszero_pointsscalesr   r   r   )
r$   r"   r   r   r   r   r   r   r   r   r   r   r   __init__  s    zQuantizedInitializer.__init__r*   r+   r,   __doc__r   r   r   r   r   r     s
   r   c                   @  s   e Zd ZdZdddZdS )QuantizedValuezI
    Represents a linearly quantized value (input\output\intializer)
    Nc
           
      C  s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S r    )	original_nameZq_name
scale_nameZzp_nameZ
value_typer   	node_type
node_qtype
scale_type)
r$   r"   Znew_quantized_namer   Zzero_point_nameZquantized_value_typer   r   r   r   r   r   r   r     s    zQuantizedValue.__init__)NNNNr   r   r   r   r   r     s       r   c                   @  s   e Zd ZdZdd ZdS )BiasToQuantizez+
    Represents a bias to be quantized
    c                 C  s   || _ || _|| _d S r    )	bias_name
input_nameweight_name)r$   r   r   r   r   r   r   r   5  s    zBiasToQuantize.__init__Nr   r   r   r   r   r   0  s   r   c                 C  s   | j dkrtd| j d| j dkr.| j}n| j dkr@| j}n| j dkrR| j}n| j dkrd| j}n| j dkrv| j}nt| j d	kr| j}nb| j d
kr| j	}nP| j dkr| j
}n>| j dkr| j}n,| j dkr| j}ntd| j d| j  d| j|iS )z
    Convert attribute to kwarg format for use with onnx.helper.make_node.
        :parameter attribute: attribute in AttributeProto format.
        :return: attribute in {key: value} format.
    r   z
attribute z does not have type specified.r   r1   r2   r3   r4   r5   rS      	   
   z has unsupported type r7   )r[   r'   r"   r   rg   sr6   gZfloatsZintsstringsZtensorsZgraphs)	attributern   r   r   r   attribute_to_kwarg;  s0    










r   c                   s*    fdd|D }t |dkr&|d S dS )z
    Helper function to find item by name in a list.
        parameter item_name: name of the item.
        parameter item_list: list of items.
        return: item if found. None otherwise.
    c                   s   g | ]}|j  kr|qS r   r!   )r   item	item_namer   r   r   g  s     
 z find_by_name.<locals>.<listcomp>r   N)rc   )r   Z	item_listitemsr   r   r   find_by_name`  s    r   c                 C  s*   d}t t|D ]}|| | kr|}q|S )zC
    Helper function to return index of an item in a node list
    rV   )r   rc   )Z	elem_nameZ	elem_listZelem_idxrg   r   r   r   get_elem_indexk  s
    r   c                 C  s   t jd| |g|S )z
    Helper function to create a Mul node.
        parameter inputs: list of input names.
        parameter output: output name.
        parameter name: name of the node.
        return: Mul node in NodeProto format.
    ZMul)r{   r|   r   )inputsoutputr"   r   r   r   get_mul_nodev  s    r   r   str)filename
identifierr   c                 C  s   | j | j| | j S )zp
    Helper function to generate a identifiable filepath by concatenating the given identifier as a suffix.
    )parentjoinpathstemsuffix)r   r   r   r   r   generate_identified_filename  s    r   c                 C  s   dd l }dd lm} dd l}|j|jd td t|  td t| |j| |dd |d |	d |
d	 |  d S )
Nr   )	thresholdz
Histogram:zHistogram Edges:T)fillzTensor valueZCountszTensor value V.S. Counts)sysZmatplotlib.pyplotZpyplotrZ   Zset_printoptionsmaxsizeprintZstairsZxlabelZylabeltitleshow)histZ
hist_edgesr   ZpltrZ   r   r   r   
apply_plot  s    


r   r7   c              	   C  st  ddl }ddl}ddlm  m  m} ddlm  m  m} t	d|   t
tj|dd}|||  W 5 Q R X |d}g }t|  D ]t}	| |	 }
ttt|
d t|
d }||	}||}|| ||| ||| ||}|| q||t| |D ]}|| q$| }| | |!|| |"|}|#| |$ }t
tj|dd	}|| W 5 Q R X tj%&d
ddkr|j'|d}|( }t)|D ],}|*|}t	|+  t	|,  qt
tj|dd\}t|  D ]H}	| |	 }|	d ttt|d t|d  }|| |d qW 5 Q R X dS )z>
    Helper function to write calibration table to files.
    r   Nzcalibration cache: zcalibration.jsonwi   r   zcalibration.flatbufferswbZQUANTIZATION_DEBUG)r   1zcalibration.cache 
)-jsonflatbuffersZ5onnxruntime.quantization.CalTableFlatBuffers.KeyValueZquantizationZCalTableFlatBuffersKeyValueZ5onnxruntime.quantization.CalTableFlatBuffers.TrtTableTrtTablelogginginfoopenospathjoinwritedumpsZBuildersortedkeysr   r   r   ZCreateStringZKeyValueStartZKeyValueAddKeyZKeyValueAddValueZKeyValueEndr]   ZTrtTableStartDictVectorrc   ZPrependUOffsetTRelativeZ	EndVectorZTrtTableStartZTrtTableAddDictZTrtTableEndZFinishOutputenvironr   ZGetRootAsTrtTableZ
DictLengthr   DictKeyValue)Zcalibration_cachedirr   r   r   r   filebuilderZkey_value_listkeyr   rn   Zflat_keyZ
flat_value	key_valueZ	main_dictZ	cal_tablebufZdict_lenrg   r   r   r   r   write_calibration_table  sV    








&
r
  -C6?c                 C  s   | dk tj}| dk tj}| }| j| }|s:dS |t| t| }|dk shtd|||f |  tj}||| | |  7 }|dk dkst|S )a~  Given a discrete distribution (may have not been normalized to 1),
    smooth it by replacing zeros with eps multiplied by a scaling factor
    and taking the corresponding amount off the non-zero values.
    Ref: http://web.engr.illinois.edu/~hanj/cs412/bk3/KL-divergence.pdf
         https://github.com//apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py
    r   Nr   z"n_zeros=%d, n_nonzeros=%d, eps1=%f)r   rZ   ra   sumsizefloatrv   )pepsZis_zerosZis_nonzerosZn_zerosZ
n_nonzerosZeps1r   r   r   r   smooth_distribution  s     
r  )
model_pathc                 C  s4   t j|  dd}|jjD ]}t|r dS qdS )NF)Zload_external_dataT)r{   loadas_posixgraphr   r   Zuses_external_data)r  modelZ
intializerr   r   r   model_has_external_data  s
    
r  )r  opt_model_pathc                 C  sF   t  }| |_tj|_i }dg|d< t|  |fddgi|}dS )z
        Generate model that applies graph optimization (constant folding, etc.)
        parameter model_path: path to the original onnx model
        parameter opt_model_path: path to the optimized onnx model
    :return: optimized onnx model
    ZConstantSharingZdisabled_optimizers	providersZCPUExecutionProviderN)r   r  Zoptimized_model_filepathr   ZORT_ENABLE_BASICZgraph_optimization_levelr   )r  r  Zsess_optionkwargs_r   r   r   optimize_model  s    

r  r   )r  c                 C  s>   ddi}| j r,| j D ]}||j|ji qtj| | dS )z>Tag the model that it went through quantization pre-processingonnx.quant.pre_processonnxruntime.quantNmetadata_propsupdater  rn   r{   r|   Zset_model_props)r  r   propr   r   r   add_pre_process_metadata  s
    
r#  bool)r  r   c                 C  s0   | j r,| j D ]}|jdkr|jdkr dS qdS )zCCheck the model whether it went through quantization pre-processingr  r  TFr   r  rn   )r  r"  r   r   r   model_has_pre_process_metadata  s
    
r&  c                 C  s>   ddi}| j r,| j D ]}||j|ji qtj| | d S )N
onnx.inferr  r  )r  r   r  r   r   r   add_infer_metadata$  s
    
r(  c                 C  s0   | j r,| j D ]}|jdkr|jdkr dS qdS )Nr'  r  TFr%  )r  r  r   r   r   model_has_infer_metadata,  s
    
r)  )r  r   c                 C  sB   t | d}tjt| t| t| }t| |  |S )Nz	-inferred)	r   r{   Zshape_inferenceZinfer_shapes_pathr   r  r  r(  unlink)r  Zinferred_model_pathr  r   r   r   load_model_with_shape_infer4  s    
r+  c              
   C  sN   t jdd8}t|d}tj| | dd t|W  5 Q R  S Q R X d S )Nz
ort.quant.)prefixz
model.onnxT)Zsave_as_external_data)tempfileTemporaryDirectoryr   r   r{   Z
save_modelr  r+  )r  Zquant_tmp_dirr  r   r   r   &save_and_reload_model_with_shape_infer=  s    r/  r   znumpy.ndarray)r   r   c                 C  sB   | j tjjtjjfkr"tj| S td| j	 dt
| j   d S )Nz&Only float type is supported. Weights z is )Z	data_typerw   r   ry   rz   r{   Znumpy_helperZto_arrayr'   r"   type_to_name)r   r   r   r   tensor_proto_to_arrayD  s
    r1  )tensor_namer   c                 C  s   | d S )NZ_QuantizeLinearr   r2  r   r   r   add_quant_suffixM  s    r4  c                 C  s   | t  S r    )QUANT_INPUT_SUFFIXr3  r   r   r   add_quant_input_suffixQ  s    r6  )r   c                 C  s   | d S )NZ_QuantizeLinear_Outputr   r3  r   r   r   add_quant_output_suffixU  s    r7  c                 C  s   | d S )NZ_DequantizeLinearr   r3  r   r   r   add_dequant_suffixY  s    r8  c                 C  s   | d S )NZ_DequantizeLinear_Inputr   r3  r   r   r   add_dequant_input_suffix]  s    r9  c                 C  s   | t  S r    )DEQUANT_OUTPUT_SUFFIXr3  r   r   r   add_dequant_output_suffixa  s    r;  )NN)FN)FNNN)FF)FF)r7   )r  )d
__future__r   r   r   r-  enumr   pathlibr   rZ   r{   r   r   r   r   rw   Zonnx.helperr	   r
   r   r   Zonnx.referencer   Zonnxruntimer   r   r   r   r   ImportErrorr   r   Z__producer____version__Zonnx_domainZ	ms_domainZQUANT_OP_NAMEr5  ZDEQUANT_OP_NAMEr:  ZTENSOR_NAME_QUANT_SUFFIXr   r  r0  r   r.   r0   rH   r9   rO   r;   r?   r=   rA   rE   rC   ru   r^   rK   rJ   rM   rL   r   r   r   ri   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r#  r&  r(  r)  r+  r/  r1  r4  r6  r7  r8  r9  r;  r   r   r   r   <module>   s   

&             
        

4
?&       
L
 

%
C
				