o
    wi                     @  s"  U 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	m
Z
mZmZmZmZ d dl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mZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* e	rud dlm+Z+m,Z, d dl-m.Z. ee/e0e1e1e1f e/e0e1e1e1e1f f Z2e3e2 Z4e3e/e0e0f  Z5g dZ6d	e7d
< e8e/e0e1f e1f Z9dddZ:e:e6Z;	dd	ddZ<				d
dd%d&Z=dd)d*Z>				d
dd5d6Z?dd7d8Z@					ddd@dAZAddDdEZBddFdGZCddMdNZDddPdQZEddUdVZFejGdWeHdXddYdZZIddd^d_ZJejGdWeHdXdd`daZK	b	c		cdddhdiZLejGdWeHdXddkdlZM	b			cdddmdnZNejGdWeHdXddsdtZOddudvZPejGdWeHdXddwdxZQddydzZR	ddddZSdddZTdddZUdddZVd ddZWd!ddZX		d"d#ddZY	d$d%ddZZd&ddZ[d'ddZ\d(ddZ]	d$d)ddZ^		d*d+ddZ_	d$d)ddZ`		d*d+ddZad,ddZbd,ddZcd-ddńZd	d.d/ddȄZed0dd˄Zf		d*d1dd΄Zg	dd2dd҄Zhd3ddքZid4ddلZjd5dd܄Zkd6ddބZl	d7d8ddZmd.d9ddZnd:ddZod;ddZpd<ddZqd=ddZrd>ddZsd>ddZtd?ddZud@dd Zvdd ejwx D Zyde7d< dAddZzdS (B      )annotationsN)isnan)TYPE_CHECKINGAnyCallableTypeVarUnioncast)
IR_VERSIONAttributeProtoFunctionProto
GraphProtoMapProto
ModelProto	NodeProtoOperatorSetIdProtoOptionalProtoSequenceProtoSparseTensorProtoTensorProtoTensorShapeProtoTrainingInfoProto	TypeProtoValueInfoProtodefsmappingsubbyte)KeysViewSequence)RepeatedCompositeFieldContainer))z1.0      r!   )z1.1r       r!   )z1.1.2r       r!   )z1.2r       r!   )z1.3r       r!   )z1.4.1   	   r!   )z1.5.0r"   
   r!   )z1.6.0r#         )z1.7.0r$      r*   r!   )z1.8.0r$      r*   r!   )z1.8.1r$   r,   r*   r!   )z1.9.0r$      r*   r!   )z1.10.0r%      r*   r!   )z1.10.1r%   r.   r*   r!   )z1.10.2r%   r.   r*   r!   )z1.11.0r%      r    r!   )z1.12.0r%      r    r!   )z1.13.0r%      r    r!   )z1.13.1r%   r1   r    r!   )z1.14.0r'      r    r!   )z1.14.1r'   r2   r    r!   )z1.15.0r'      r&   r!   )z1.16.0r(      r"   r!   )z1.17.0r(      r"   r!   )z1.18.0r)      r"   r!   VersionTableTypeVERSION_TABLEtablereturnVersionMapTypec                   s(   i  d fd	d
}| D ]}||  q S )zOCreate a map from (opset-domain, opset-version) to ir-version from above table.release_versionstr
ir_versionintargsr   r:   Nonec                   sF   ~ t g d|D ]}| vr | |< |d dkr | d|d f< qd S )N)ai.onnxz
ai.onnx.mlai.onnx.trainingr   rC   zai.onnx.preview.trainingr!   )zip)r<   r>   r@   pairresult H/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/helper.pyprocessV   s   z-create_op_set_id_version_map.<locals>.processN)r<   r=   r>   r?   r@   r   r:   rA   rH   )r9   rJ   rowrH   rF   rI   create_op_set_id_version_mapR   s
   
rL   FopsetidlistSequence[OperatorSetIdProto]ignore_unknownboolr?   c                   s2   d d fdd| rt fd	d
| D S  S )a=  Given list of opset ids, determine minimum IR version required.

    Args:
        opsetidlist: A sequence of OperatorSetIdProto.
        ignore_unknown: If True, ignore unknown domain and return default minimum
            version for that domain.

    Returns:
        The minimum IR version required (integer)
    r    domain
str | Noneversionr?   r:   c                   s,   | pd|f}|t v rt | S r S td)NrB   zUnsupported opset-version.)OP_SET_ID_VERSION_MAP
ValueError)rQ   rS   key)default_min_versionrO   rH   rI   find_minu   s   z)find_min_ir_version_for.<locals>.find_minc                 3  s    | ]
} |j |jV  qd S N)rQ   rS   .0x)rX   rH   rI   	<genexpr>~   s    z*find_min_ir_version_for.<locals>.<genexpr>N)rQ   rR   rS   r?   r:   r?   )max)rM   rO   rH   )rW   rX   rO   rI   find_min_ir_version_forf   s
   r_   op_typer=   inputsSequence[str]outputsnamerR   
doc_stringrQ   overloadkwargsr   r   c           	      K  sz   t  }| |_|j| |j| |r||_|r||_|dur#||_|dur*||_|r;|j	dd t
| D  |S )a  Construct a NodeProto.

    Args:
        op_type (string): The name of the operator to construct
        inputs (list of string): list of input names
        outputs (list of string): list of output names
        name (string, default None): optional unique identifier for NodeProto
        doc_string (string, default None): optional documentation string for NodeProto
        domain (string, default None): optional domain for NodeProto.
            If it's None, we will just use default domain (which is empty)
        overload (string, default None): optional field, used to
            resolve calls to model-local functions
        **kwargs (dict): the attributes of the node.  The acceptable values
            are documented in :func:`make_attribute`.

    Returns:
        NodeProto
    Nc                 s  s&    | ]\}}|d urt ||V  qd S rY   )make_attribute)r[   rV   valuerH   rH   rI   r]      s    zmake_node.<locals>.<genexpr>)r   r`   inputextendoutputrd   re   rQ   rf   	attributesorteditems)	r`   ra   rc   rd   re   rQ   rf   rg   noderH   rH   rI   	make_node   s"   
rq   rS   r   c                 C     t  }| |_||_|S zConstruct an OperatorSetIdProto.

    Args:
        domain (string): The domain of the operator set id
        version (integer): Version of operator set id
    Returns:
        OperatorSetIdProto
    r   rQ   rS   )rQ   rS   operatorsetidrH   rH   rI   make_operatorsetid   s   rv   nodesSequence[NodeProto]Sequence[ValueInfoProto]initializerSequence[TensorProto] | None
value_infoSequence[ValueInfoProto] | Nonesparse_initializer"Sequence[SparseTensorProto] | Noner   c           	      C  s   |du rg }|du rg }|du rg }t  }|j|  ||_|j| |j| |j| |j| |j| |rA||_	|S )a  Construct a GraphProto

    Args:
        nodes: list of NodeProto
        name (string): graph name
        inputs: list of ValueInfoProto
        outputs: list of ValueInfoProto
        initializer: list of TensorProto
        doc_string (string): graph documentation
        value_info: list of ValueInfoProto
        sparse_initializer: list of SparseTensorProto
    Returns:
        GraphProto
    N)
r   rp   rk   rd   rj   rl   rz   r~   r|   re   )	rw   rd   ra   rc   rz   re   r|   r~   graphrH   rH   rI   
make_graph   s"   r   c                 C  rr   rs   rt   )rQ   rS   opsetidrH   rH   rI   make_opsetid   s   	r   fnameopset_imports
attributesSequence[str] | Noneattribute_protosSequence[AttributeProto] | Noner   c                 C  s   |d u rg }|d u rg }|
d u rg }
t  }| |_||_|j| |j| |j| |j| |j| |j	| |rD||_
|	d urK|	|_|j|
 |S rY   )r   rQ   rd   rj   rk   rl   rp   opset_importrm   attribute_protore   rf   r|   )rQ   r   ra   rc   rw   r   r   r   re   rf   r|   frH   rH   rI   make_function   s*   r   r   r   c                 K  s   t  }t|_|j|  |dd}|dur|j| n
|j }t	
 |_|dd}|dur7|j| | D ]
\}}t||| q;|S )zConstruct a ModelProto

    Args:
        graph (GraphProto): *make_graph* returns
        **kwargs: any attribute to add to the returned instance
    Returns:
        ModelProto
    r   N	functions)r   r
   r>   r   CopyFrompopr   rk   addr   onnx_opset_versionrS   r   ro   setattr)r   rg   modelr   impr   kvrH   rH   rI   
make_model#  s    	

r   c                 K  s8   d}||vrd}| |g }t|||< t| fi |S )Nr>   r   )getr_   r   )r   rg   ir_version_fieldopset_imports_fieldimportsrH   rH   rI   make_model_gen_versionH  s   r   protoRModelProto | GraphProto | FunctionProto | NodeProto | TensorProto | ValueInfoProto
dict_valuedict[str, str]rA   c                 C  s8   | j d d = | D ]\}}| j  }||_||_q
d S rY   )metadata_propsro   r   rV   ri   )r   r   r   r   entryrH   rH   rI   set_metadata_propsQ  s   
r   r   c                 C  s   t | | d S rY   )r   )r   r   rH   rH   rI   set_model_propsc     r   caSequence[np.complex64]Sequence[int]c                   s    fddt t d D S )Nc                   s4   g | ]}|d  dkr |d   j n |d   jqS )r*   r   )realimagr[   ir   rH   rI   
<listcomp>h  s    &z+_split_complex_to_pairs.<locals>.<listcomp>r*   )rangelenr   rH   r   rI   _split_complex_to_pairsg  s   
r   zpDeprecated since 1.18. Scheduled to remove in 1.20. Consider using libraries like ml_dtypes for dtype conversion)categoryc                  O     t | i |S rY   )_float32_to_bfloat16r@   rg   rH   rH   rI   float32_to_bfloat16n     r   fvalfloattruncatec                 C  sH   t td| d}|r|d? S t| rdS |d? d@ d }|| d? S )N<flittler/   i  r!   i  )r?   
from_bytesstructpackr   )r   r   ivalroundedrH   rH   rI   r   |  s   r   c                  O  r   rY   _float32_to_float8e4m3r   rH   rH   rI   float32_to_float8e4m3  r   r         ?Tscalefnuzsaturatec                 C  s  |st d| | }ttdt|d}|d@ d? }|r|d@ dkr'dS t|r4|r2|dB S dS |d	@ d
? }|d@ }	|dk rHd}t|S |dk r|d }
|
dkre|dd|
 > O }||	d|
 ? O }n|	dkrn|dO }nd}dd|
 > }|	|@ r|d@ s|	|d @ dks|	|@ r|	|d> @ r|	|d @ dkr|d7 }t|S |dk r|d }
|
dkr|dO }||	d? O }n||
d> O }||	d? O }|	d@ r|	d@ s|	d@ r|d@ dk r|d7 }t|S |sdS t|S |r|dO }t|S d}t|S |d@ dkrd|B S t|r|r|dB S d|B S |d	@ d
? }|d@ }	|dkr|dk r)	 t|S |dk r|d }
|
dkrH|dd|
 > O }||	d|
 ? O }n	|	dkrQ|dO }dd|
 > }|	|@ r|d@ s|	|d @ dks|	|@ r|	|d> @ r|	|d @ dkr|d7 }t|S |dk r|d }
|
dkr|dO }||	d? O }n||
d> O }||	d? O }|d@ dkr|dM }|	d@ r|	d@ s|	d@ r|d@ dk r|d7 }t|S |s|dO }t|S |r|dO }t|S |dO }t|S ) a  Convert a float32 value to a float8, e4m3 (as int).

    See :ref:`onnx-detail-float8` for technical details.

    Args:
        fval: float to convert
        scale: scale, divide *fval* by *scale* before casting it
        fn: no infinite values
        uz: no negative zero
        saturate: if True, any value out of range included inf becomes
            the maximum value, otherwise, it becomes NaN. The
            description of operator Cast fully describes the
            differences.

    Returns:
        converted float
    z4float32_to_float8e4m3 not implemented with fn=False.r   r                        r6    t   r   x   w   r!   r*   r4   r3      r&   r    i      i ~   u   y         )NotImplementedErrorr?   r   r   r   npfloat32isinfr   r   r   r   r   r\   bretemexmaskrH   rH   rI   r     s   
&



&






r   r@   c                  O  r   rY   _float32_to_float8e5m2r   rH   rH   rI   float32_to_float8e5m2  r   r   c                 C  s  | | }t tdt|d}|d@ d? }|r|r|d@ dkr#dS |d@ dkr1|r/|d	B S dS |d@ d
? }|d@ }	|dk rEd}t |S |dk r|d }
|
dkrb|dd|
 > O }||	d|
 ? O }n|	dkrk|dO }nd}dd|
 > }|	|@ r|d@ s|	|d @ dks|	|@ r|	|d> @ r|	|d @ dkr|d7 }t |S |dk r|d }
||
d> O }||	d? O }|	d@ r|	d@ s|	d@ r|d	@ d	k r|d7 }t |S |sd}t |S |dkr|	dkrd}t |S |r|d	O }t |S d}t |S |s|s|d@ dkrd	|B S t|r|rd|B S d|B S |d@ d
? }|d@ }	|dkr|dk r,	 t |S |dk r|d }
|
dkrK|dd|
 > O }||	d|
 ? O }n	|	dkrT|dO }dd|
 > }|	|@ r|d@ s|	|d @ dks|	|@ r|	|d> @ r|	|d @ dkr|d7 }t |S |dk r|d }
||
d> O }||	d? O }|	d@ r|	d@ s|	d@ r|d	@ dk r|d7 }t |S |r|dO }t |S |dO }t |S |r|dO }t |S |dO }t |S td)a  Convert a float32 value to a float8, e5m2 (as int).

    Args:
        fval: float to convert
        scale: scale, divide *fval* by *scale* before casting it
        fn: no infinite values
        uz: no negative zero
        saturate: if True, any value out of range included inf becomes
            the maximum value, otherwise, it becomes NaN. The
            description of operator Cast fully describes the
            differences.

    Returns:
        converted float
    r   r   r   r   r   r   ir   r   r6   r   m   r   p   o   r!   r5   r4      r*   r   i i       {   |   n   q   z%fn and uz must be both False or True.)r?   r   r   r   r   r   r   r   r   rH   rH   rI   r     s   $

	

"





	r   arraynp.ndarray | Sequencesigned
np.ndarrayc                 C  s
   t | |S rY   )_pack_float32_to_4bit)r   r   rH   rH   rI   pack_float32_to_4bit  s   
r   c                   s   t | tjstj| tjd} |  }t| jd dk}|r(t|t	dg}d
 fdd}t
|dd}||dd	d |dd	d }|tjS )ax  Convert an array of float32 value to a 4bit data-type and pack every two concecutive elements in a byte.
    See :ref:`onnx-detail-int4` for technical details.

    Args:
        array: array of float to convert and pack
        signed: Whether the 4 bit variant is signed or unsigned

    Returns:
        Packed array with size `ceil(farray.size/2)` (single dimension).
    dtyper*   r!   r   r:   r   c                   s   t | | S rY   )r   _float32x2_to_4bitx2)r\   yr   rH   rI   single_func  r   z*_pack_float32_to_4bit.<locals>.single_funcN)r:   r   )
isinstancer   ndarrayasarrayr   ravelprodshapeappendr   
frompyfuncastypeuint8)r   r   
array_flatis_odd_volumer   funcarrrH   r   rI   r     s   r   c                 C     t | S rY   )_pack_float32_to_float4e2m1)r   rH   rH   rI   pack_float32_to_float4e2m1  s   r  c                 C  s|   t | tjstj| tjd} |  }t| jd dk}|r(t|t	dg}t
|ddd |ddd }|tjS )aM  Convert an array of float32 value to float4e2m1 and pack every two concecutive elements in a byte.
    See :ref:`onnx-detail-float4` for technical details.

    Args:
        array: array of float to convert and pack

    Returns:
        Packed array of float4e2m1 (as uint8) with size `ceil(farray.size/2)` (single dimension).
    r   r*   r!   r   N)r  r   r  r  r   r  r  r  r  r   r   _float32x2_to_float4e2m1x2r	  r
  )r   r  r  r  rH   rH   rI   r    s   
 r  	data_typedimsvalsrawr   c                 C  sv  t  }||_| |_|t jkr|rtdt|}d}|rC|t jkr$d}n|t jt jt j	t j
fv r3d}n|t jt jt jfv r@d}n|j}t|tjrTt|jdkrT| }|D ]}||9 }qVt||kr|t jt jt jfv rut||d kstd| dt| d|r||_n|t jt jfv rt|}n|t jkrt||jtjd  }n{|t jt jt jt j	t j
fv rt jt t jt!t jd	d
 t j	t"t j
dd
 i| }	t#t$|	t||  }nD|t jt jfv r|t jk}
t%||
d  }n,|t jkr
t&|  }n|t j'krt|t(}n|t jkr't|t)}t*|}t+||,| |j-,| |S )a  Make a TensorProto with specified arguments.  If raw is False, this
    function will choose the corresponding proto field to store the
    values based on data_type. If raw is True, use "raw_data" proto
    field to store the values, and values should be of type bytes in
    this case.

    Args:
        name (string): tensor name
        data_type (int): a value such as onnx.TensorProto.FLOAT
        dims (List[int]): shape
        vals: values
        raw (bool): if True, vals contains the serialized content of the tensor,
            otherwise, vals should be a list of values of the type defined by *data_type*

    Returns:
        TensorProto
    z*Can not use raw_data to store string type.r!   r*   g      ?z8Number of values does not match tensor's size. Expected z, but it is z. r   c                  W  s   t | ddiS )Nr   Tr   r@   rH   rH   rI   <lambda>1  s
    zmake_tensor.<locals>.<lambda>c                  W  s   t | dddS )NT)r   r   r   r  rH   rH   rI   r  5  s    r   ).r   r  rd   STRING	TypeErrortensor_dtype_to_np_dtypeBFLOAT16FLOAT8E4M3FNFLOAT8E4M3FNUZ
FLOAT8E5M2FLOAT8E5M2FNUZUINT4INT4
FLOAT4E2M1itemsizer  r   r  r   r  flattenrU   raw_data	COMPLEX64
COMPLEX128r   FLOAT16r   r	  viewuint16tolistr   r   r   listmapr   r  BOOLr?   bytestensor_dtype_to_fieldgetattrrk   r  )rd   r  r  r  r  tensornp_dtypeexpected_sizedfcastr   fieldrH   rH   rI   make_tensor  s   



 


r9  valuesindicesr   c                 C  s.   t  }|j|  |j| |j| |S )zConstruct a SparseTensorProto

    Args:
        values (TensorProto): the values
        indices (TensorProto): the indices
        dims: the shape

    Returns:
        SparseTensorProto
    )r   r:  r   r;  r  rk   )r:  r;  r  sparserH   rH   rI   make_sparse_tensorY  s
   r=  	elem_typeSequenceProto.DataTypeSequence[Any]r   c                 C  s   t  }| |_||_|t jkr|S d}|t jkr|j}n(|t jkr$|j}n|t jkr-|j	}n|t j
kr6|j}n|tjkr?|j}ntd|| |S )z/Make a Sequence with specified value arguments.Nz8The element type in the input sequence is not supported.)r   rd   r>  	UNDEFINEDTENSORtensor_valuesSPARSE_TENSORsparse_tensor_valuesSEQUENCEsequence_valuesMAP
map_valuesr   OPTIONALoptional_valuesr  rk   )rd   r>  r:  sequencerm   rH   rH   rI   make_sequencem  s&   






rM  key_typekeys	list[Any]r   c                 C  sr   t  }tjtjtjtjtjtjtjtj	g}| |_
||_|tjkr'|j| n
||v r1|j| |j| |S )zMake a Map with specified key-value pair arguments.

    Criteria for conversion:
    - Keys and Values must have the same number of elements
    - Every key in keys must be of the same type
    - Every value in values must be of the same type
    )r   r   INT8INT16INT32INT64UINT8UINT16UINT32UINT64rd   rN  r  string_keysrk   rO  r:  r   )rd   rN  rO  r:  	map_protovalid_key_int_typesrH   rH   rI   make_map  s$   


r\  OptionalProto.DataTyperi   &google.protobuf.message.Message | Noner   c                 C  s   t  }| |_||_|t jkr|S d}|t jkr|j}n(|t jkr$|j}n|t jkr-|j	}n|t j
kr6|j}n|t jkr?|j}ntd|dusIJ || |S )z0Make an Optional with specified value arguments.Nz8The element type in the input optional is not supported.)r   rd   r>  rA  rB  tensor_valuerD  sparse_tensor_valuerF  sequence_valuerH  	map_valuerJ  optional_valuer  r   )rd   r>  ri   optionalrm   rH   rH   rI   make_optional  s(   






re  str | bytesr0  c                 C  s   t | tr
| dS | S )z2Coerce a string (or bytes) value into UTF-8 bytes.utf-8)r  r=   encode)ri   rH   rH   rI   	_to_bytes  s   

ri  rV   	attr_type
int | Noner   c              
     s$  t  }| |_|r||_t|tjrt||_t j|_	nRt|tj
r-t||_t j|_	nAt|ttfr?t||_t j|_	n/t|trP|j| t j|_	nt|tra|j| t j|_	nt|trq|j| t j|_	nt|tr|j| t j|_	nt|t j!j"rft#|}t$|dkr|du rt%d|  d|du rdd |D }tjt j&ftj
t j'fttft j(ftt j)ftt j*ftt j+ftt j,ffD ]\ }t- fdd|D r|} nq|du rt%d	|t j&kr|j./| t j&|_	nv|t j'kr	|j0/| t j'|_	ne|t j(kr|j1/d
d |D  t j(|_	nO|t j)kr0|j2/| t j)|_	n>|t j*krA|j3/| t j*|_	n-|t j+krR|j4/| t j+|_	n|t j,krc|j5/| t j,|_	nt6 t7d| d|dur|j	|krt7dt8|j	 d|j	 dt8| d| d	|S )z0Makes an AttributeProto based on the value type.r   NzCould not infer attribute `z` type from empty iteratorc                 S  s   h | ]}t |qS rH   )typer[   r   rH   rH   rI   	<setcomp>  s    z!make_attribute.<locals>.<setcomp>c                 3  s    | ]}t | V  qd S rY   )
issubclassr[   texp_trH   rI   r]     s    z!make_attribute.<locals>.<genexpr>zRCould not infer the attribute type from the elements of the passed Iterable value.c                 s  s    | ]}t |V  qd S rY   )ri  rm  rH   rH   rI   r]     s    'z%' is not an accepted attribute value.zInferred attribute type 'z'(z") mismatched with specified type '))9r   rd   re   r  numbersIntegralr?   r   INTrl  Realr   r   FLOATr=   r0  ri  sr  r   rq  r   rB  r   sparse_tensorrD  r   gGRAPHr   tp
TYPE_PROTOcollectionsabcIterabler-  r   rU   INTSFLOATSSTRINGSTENSORSSPARSE_TENSORSGRAPHSTYPE_PROTOSallintsrk   floatsstringstensorssparse_tensorsgraphstype_protosAssertionErrorr  _attr_type_to_str)rV   ri   re   rj  attrtypesexp_enumrH   rr  rI   rh     s   











	







(rh   AttributeProto.AttributeTypec                 C  s    t  }| |_||_|r||_|S )zeMake an AttributeProto holding a reference to the parent function's attribute of given name and type.)r   rd   rl  re   )rd   rj  re   r  rH   rH   rI   make_attribute_ref/  s   r  r  c                 C  sJ  | j r
td|  | jtjkr| jS | jtjkr| jS | jtjkr%| j	S | jtj
kr.| jS | jtjkr7| jS | jtjkr@| jS | jtjkrI| jS | jtjkrTt| jS | jtjkr_t| jS | jtjkrjt| jS | jtjkrut| jS | jtjkrt| jS | jtjkrt| jS | jtjkrt| j S | jtj!krd S td|  )Nz)Cannot get value of reference attribute: zUnsupported ONNX attribute: )"ref_attr_namerU   rl  r   rz  r   rx  r   r  r{  rB  rq  rD  r|  r~  r}  r  r  r  r-  r  r  r  r  r  r  r  r  r  r  r  r  r  rA  )r  rH   rH   rI   get_attribute_value;  sB   






r  rp   	attr_namec                   sT    fdd| j D }t|dkrtd  t|dk r$td  t|d S )Nc                   s   g | ]	}|j  kr|qS rH   rd   rZ   r  rH   rI   r   `  s    z'get_node_attr_value.<locals>.<listcomp>r!   z'Node has multiple attributes with name z Node has no attribute with name r   )rm   r   rU   r  )rp   r  matchingrH   r  rI   get_node_attr_value_  s   r  r   c                 C  s   t  }| |_|S rY   )r   rd   )rd   value_info_protorH   rH   rI   make_empty_tensor_value_infoh  s   r  r  !Sequence[str | int | None] | Noneshape_denotationlist[str] | Noner   c           	      C     t  }|j}| |_|j}|durX|jg  |r$t|t|kr$tdt|D ]/\}}|j	 }|du r6nt
|tr?||_nt
|trH||_ntd| d|rW|| |_q(|S )z:Makes a Tensor TypeProto based on the data type and shape.N>Invalid shape_denotation. Must be of the same length as shape.Invalid item in shape: z. Needs to be of int or str.)r   tensor_typer>  r  dimrk   r   rU   	enumerater   r  r?   	dim_valuer=   	dim_param
denotation)	r>  r  r  
type_prototensor_type_prototensor_shape_protor   r6  r  rH   rH   rI   make_tensor_type_proton  2   




r   c                 C  s2   t  }| |_|r||_t|||}|j| |S )z8Makes a ValueInfoProto based on the data type and shape.)r   rd   re   r  rl  r   )rd   r>  r  re   r  r  r  rH   rH   rI   make_tensor_value_info  s   r  c           	      C  r  )z@Makes a SparseTensor TypeProto based on the data type and shape.Nr  r  z. Needs to be of int or text.)r   sparse_tensor_typer>  r  r  rk   r   rU   r  r   r  r?   r  r=   r  r  )	r>  r  r  r  sparse_tensor_type_protosparse_tensor_shape_protor   r6  r  rH   rH   rI   make_sparse_tensor_type_proto  r  r  c                 C  s6   t  }| |_|r||_t|||}|jj|j |S )zEMakes a SparseTensor ValueInfoProto based on the data type and shape.)r   rd   re   r  rl  r  r   )rd   r>  r  re   r  r  r  rH   rH   rI   make_sparse_tensor_value_info  s   r  inner_type_protoc                 C     t  }|jj|  |S )zMakes a sequence TypeProto.)r   sequence_typer>  r   r  r  rH   rH   rI   make_sequence_type_proto     r  c                 C  r  )zMakes an optional TypeProto.)r   optional_typer>  r   r  rH   rH   rI   make_optional_type_proto  r  r  
value_typec                 C  s    t  }| |j_|jj| |S )zMakes a map TypeProto.)r   map_typerN  r  r   )rN  r  r  rH   rH   rI   make_map_type_proto  s   r  r  c                 C  s&   t  }| |_|r||_|j| |S )z1Makes a ValueInfoProto with the given type_proto.)r   rd   re   rl  r   )rd   r  re   r  rH   rH   rI   make_value_info  s   r  r{  c                 C  sb   t | tr| }nt | tr| jddd}nt| }t|dk r!|S |d d dt|d  d S )Nrg  ignore)errors@   z	...<+len=>)r  r=   r0  decoder   )r{  	sanitizedrH   rH   rI   _sanitize_str  s   

 r  elem_shape_denotationc                 C  s>   t  }| |_|r||_t|||}t|}|jj|j |S )zJMakes a Sequence[Tensors] ValueInfoProto based on the data type and shape.)r   rd   re   r  r  rl  r  r   )rd   r>  r  re   r  r  r  sequence_type_protorH   rH   rI   make_tensor_sequence_value_info(  s   r  	subgraphs"str | tuple[str, list[GraphProto]]c                 C  s  g }| | j | d d%dd}d&d
d}td}d'dd}g }| dr1| || j n| dr@| || j n| drP| tt| j n| drwt	| j
jdkrc| d nt| j
j}| dt| j
| d n| dr| d| jj d | | j n| dr| d| j d n| jr| ||| j n| jr| ||| j n| jr| tttt| j ny| jr| d np| jr| d t| jD ]\}	}
|	t	| jd krd nd!}| d|
 d|  q| d" n?| jr=| d t| jD ]\}	}|	t	| jd kr!d nd!}| d|j d|  q| d" || j n| d# |rLd$||fS d$|S )(N=r   r   r:   r=   c                 S  s   | dS )Nz.15grH   )r   rH   rH   rI   	str_floatC  s   z&printable_attribute.<locals>.str_floatr   r?   c                 S  r  rY   )r=   )r   rH   rH   rI   str_intI  s   z$printable_attribute.<locals>.str_int_Tstr_elemCallable[[_T], str]xsSequence[_T]c                 S  s   dd t| | d S )N[, ])joinr.  )r  r  rH   rH   rI   str_listN  s   z%printable_attribute.<locals>.str_listr{  rq  r   z<Tensor>z<Scalar Tensor r  r}  z<graph r  z<Type Proto z[<Tensor>, ...]r  r!   ,r  r  z	<Unknown> )r   r   r:   r=   )r   r?   r:   r=   )r  r  r  r  r:   r=   )r  rd   r   HasFieldr   r   reprr  r{  r   rq  r  r1  r  r2  r}  r  r  r  r  r=   r-  r.  r  r  r  r  rk   r  )r  r  contentr  r  r  r  r  r8  r   r  commar}  rH   rH   rI   printable_attribute<  sb   



	










r  r  TensorShapeProto.Dimensionc                 C  s$   |  d}|d u rdS tt| |S )Nri   ?)
WhichOneofr=   r2  )r  whichrH   rH   rI   printable_dim  s   
r  rq  c                 C  s   |  ddkr5tj| jj}| jdr3t| jjj	r/|t
ddtt| jjj	 7 }|S |d7 }|S |  dd u r>dS d|  d S )	Nri   r  r  r  r\   , scalarr  zUnknown type )r  r   DataTypeNamer  r>  r  r   r  r  r=   r  r.  r  rq  r{  rH   rH   rI   printable_type  s   "r  r   c                 C  s,   d| j  }| jr| dt| j d}|S )N%r  r  )rd   rl  r  )r   r{  rH   rH   rI   printable_value_info  s   r  c                 C  sh   d| j  d}|tj| j7 }| jd ur.t| jr*|tddt	t| j 7 }n|d7 }|d7 }|S )Nr  r  r  r\   r  r  )
rd   r   r  r  r  r  r   r=   r  r.  r  rH   rH   rI   printable_tensor_proto  s   

 r  prefixc                 C  sD  g }t | jr|ddd | jD  |d g }g }| jD ]=}|rHt||}t|d ts9tdt d|	|d  ||d  q!t|}t|t
sYtd	t
 d|| q!dt|}	dd
d | jD }
| jr|| j d|	 d|
 d n|| j d|
 d |r|d| |fS |d| S )Nr  c                 S     g | ]}d | qS r  rH   r[   rd   rH   rH   rI   r         z"printable_node.<locals>.<listcomp>r  r!   z1printed_attr_subgraphs[1] must be an instance of .r   zprinted must be an instance of c                 S  r  r  rH   r  rH   rH   rI   r     r  r  z](ru  (r  )r   rl   r  r  rm   r  r  r-  r  rk   r=   rn   rj   r`   )rp   r  r  r  r  printed_attrsr  printed_attr_subgraphsprintedprinted_attributesprinted_inputsrH   rH   rI   printable_node  s6   





 r   c                   sn  g }|d }d| j g}dd | jD }t| jr|d g }g }| jD ]}|j |vr3|t| q$|t| q$|rW||d|  g }|D ]}	||d |	  qK|d |r|d ||d|  g }|D ]}	||d |	  qq|d t|t|k rd	d | jD   fd
d| jD }
|d ||d|  g }|
D ]}	||d |	  q|d |d ||d|  g }| jD ]&}t||dd}t	|d t
stdt
 d||d  ||d  qdg}t| jr|ddd | jD  ||d|  ||d  |D ]}|dt|  q%d|S )zDisplay a GraphProto as a string.

    Args:
        graph (GraphProto): the graph to display
        prefix (string): prefix of every line

    Returns:
        string
    z  r   c                 S     h | ]}|j qS rH   r  rp  rH   rH   rI   rn        z"printable_graph.<locals>.<setcomp>r  r  ru  z,optional inputs with matching initializers (c                 S  r  rH   r  r   rH   rH   rI   rn    r  c                   s   g | ]}|j  vrt|qS rH   )rd   r  r   graph_inputsrH   rI   r     s
    
z#printable_graph.<locals>.<listcomp>zinitializers ({T)r  r!   z-contents_subgraphs[1] must be an instance of r  r   r:   r  c                 S  s   g | ]}d |j  qS r  r  )r[   outrH   rH   rI   r     s    }
)rd   rz   r   rj   r  r  r  rp   r   r  r-  r  rk   rl   printable_graph)r   r  r  indentheaderinitializersin_strsin_with_init_strsinpline	init_strsr  rp   contents_subgraphstailr}  rH   r  rI   r	    sj   














r	  google.protobuf.message.Messagec                 C  s   t | tjjjstdtjjj d| jjD ]6}|jdkr%| 	|j q|j
|jkrM|j|jkr?t| |jD ]}t| q7q| |jrMtt| |j qdS )z:Empties `doc_string` field on any nested protobuf messageszproto must be an instance of r  re   N)r  googleprotobufmessageMessager  
DESCRIPTORfieldsrd   
ClearFieldrl  TYPE_MESSAGElabelLABEL_REPEATEDr2  strip_doc_stringr  )r   
descriptorr\   rH   rH   rI   r     s    

r  	algorithmalgorithm_bindingsAssignmentBindingTypeinitializationGraphProto | Noneinitialization_bindingsAssignmentBindingType | Noner   c                 C  sr   t  }|j|  |D ]\}}|j }||_||_q|r#|j| |r7|D ]\}}|j }||_||_q'|S rY   )	r   r!  r   update_bindingr   rV   ri   r$  initialization_binding)r!  r"  r$  r&  training_infor   r   bindingrH   rH   rI   make_training_info1  s   

r,  tensor_dtypenp.dtypec                 C     t j|  jS )zConvert a TensorProto's data_type to corresponding numpy dtype. It can be used while making tensor.

    Args:
        tensor_dtype: TensorProto's data_type

    Returns:
        numpy's data_type
    )r   TENSOR_TYPE_MAPr4  r-  rH   rH   rI   r  J     	r  c                 C  r/  )zConvert a TensorProto's data_type to corresponding data_type for storage.

    Args:
        tensor_dtype: TensorProto's data_type

    Returns:
        data_type for storage
    )r   r0  storage_dtyper1  rH   rH   rI   $tensor_dtype_to_storage_tensor_dtypeV  r2  r4  c                 C  r/  )zGet the name of given TensorProto's data_type.

    Args:
        tensor_dtype: TensorProto's data_type

    Returns:
        the name of data_type
    )r   r0  rd   r1  rH   rH   rI   tensor_dtype_to_stringb  r2  r5  c                 C  s   t jt j|  j S )zConvert a TensorProto's data_type to corresponding field name for storage. It can be used while making tensors.

    Args:
        tensor_dtype: TensorProto's data_type

    Returns:
        field name
    )r   _STORAGE_TENSOR_TYPE_TO_FIELDr0  r3  r1  rH   rH   rI   r1  n  s   	
r1  r4  c              	   C  sz   | t jv rttt j|  S t| tjrtjS | t	j
t	jt	jt	jt	jt	jt	jt	jhv r5t	j| jd d  S td| d)zConvert a numpy's dtype to corresponding tensor type. It can be used while converting numpy arrays to tensors.

    Args:
        np_dtype: numpy's data_type

    Returns:
        TensorsProto's data_type
    r   zUnable to convert type z into TensorProto element type.)r   _NP_TYPE_TO_TENSOR_TYPEr	   r?   r   
issubdtypestr_r   r  custom_np_typesbfloat16float8e4m3fnfloat8e4m3fnuz
float8e5m2float8e5m2fnuzint4uint4
float4e2m1mapping_name_to_data_typedescrrU   )r4  rH   rH   rI   np_dtype_to_tensor_dtype|  s*   
	

rE  KeysView[int]c                   C  s
   t j S )zcGet all tensor types from TensorProto.

    Returns:
        all tensor types from TensorProto
    )r   r0  rO  rH   rH   rH   rI   get_all_tensor_dtypes  s   
rG  c                 C  s   i | ]\}}||qS rH   rH   )r[   r   r   rH   rH   rI   
<dictcomp>  s    
rH  zdict[int, str]_ATTRIBUTE_TYPE_TO_STRc                 C  s$   | t j v rt|  S t j d S )zConvert AttributeProto type to string.

    Args:
        attr_type: AttributeProto type.

    Returns:
        String representing the supplied attr_type.
    r   )r   AttributeTyper:  rI  rO  )rj  rH   rH   rI   r    s   	r  )r9   r7   r:   r;   )F)rM   rN   rO   rP   r:   r?   )NNNN)r`   r=   ra   rb   rc   rb   rd   rR   re   rR   rQ   rR   rf   rR   rg   r   r:   r   )rQ   r=   rS   r?   r:   r   )rw   rx   rd   r=   ra   ry   rc   ry   rz   r{   re   rR   r|   r}   r~   r   r:   r   )NNNNN)rQ   r=   r   r=   ra   rb   rc   rb   rw   rx   r   rN   r   r   r   r   re   rR   rf   rR   r|   r}   r:   r   )r   r   rg   r   r:   r   )r   r   r   r   r:   rA   )r   r   r   r   r:   rA   )r   r   r:   r   )r:   r?   )r   r   r   rP   r:   r?   )r   TFT)r   r   r   r   r   rP   r   rP   r   rP   r:   r?   )r@   r   rg   r   r:   r?   )r   FFT)r   r   r   rP   r:   r   )r   r   r:   r   )rd   r=   r  r?   r  r   r  r   r  rP   r:   r   )r:  r   r;  r   r  r   r:   r   )rd   r=   r>  r?  r:  r@  r:   r   )
rd   r=   rN  r?   rO  rP  r:  r   r:   r   )rd   r=   r>  r]  ri   r^  r:   r   )ri   rf  r:   r0  )NN)
rV   r=   ri   r   re   rR   rj  rk  r:   r   rY   )rd   r=   rj  r  re   rR   r:   r   )r  r   r:   r   )rp   r   r  r=   r:   r   )rd   r=   r:   r   )r>  r?   r  r  r  r  r:   r   )r  N)rd   r=   r>  r?   r  r  re   r=   r  r  r:   r   )r  r   r:   r   )rN  r?   r  r   r:   r   )r  )rd   r=   r  r   re   r=   r:   r   )r{  rf  r:   r=   )rd   r=   r>  r?   r  r  re   r=   r  r  r:   r   )r  r   r  rP   r:   r  )r  r  r:   r=   )rq  r   r:   r=   )r   r   r:   r=   )rq  r   r:   r=   )r  F)rp   r   r  r=   r  rP   r:   r  )r   r   r  r=   r:   r=   )r   r  r:   rA   )
r!  r   r"  r#  r$  r%  r&  r'  r:   r   )r-  r?   r:   r.  )r-  r?   r:   r?   )r-  r?   r:   r=   )r4  r.  r:   r?   )r:   rF  )rj  r?   r:   r=   ){
__future__r   collections.abcr  rv  r   cmathr   typingr   r   r   r   r   r	   google.protobuf.messager  numpyr   typing_extensionsonnx._custom_element_types_custom_element_typesr:  onnxr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   #google.protobuf.internal.containersr   tupler=   r?   VersionRowTyper-  r7   r#  r8   __annotations__dictr;   rL   rT   r_   rq   rv   r   r   r   r   r   r   r   r   
deprecatedDeprecationWarningr   r   r   r   r   r   r   r   r  r  r9  r=  rM  r\  re  ri  rh   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r	  r  r,  r  r4  r5  r1  rE  rG  rJ  ro   rI  r  rH   rH   rH   rI   <module>   s   T& 1+$%	
 ~z
_$		11		L#M#
	