o
    Ďi                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ d dl	mZ d d	lmZ d d
lmZ G dd deZG dd dZdS )    )OrderedDict)Enum)MappingProxyType)Mapping)Tuple)
GraphProto)	NodeProto)ValueInfoProtoOnnxNode)
OnnxTensorc                   @   s    e Zd ZdZdZdZdZdZdS )	ValueTyper               N)__name__
__module____qualname__GRAPH_INPUTNODE_OUTPUTGRAPH_INITIALIZERUNKNOWNEMPTY r   r   Q/home/jeff/fluffinator/venv/lib/python3.10/site-packages/onnx2torch/onnx_graph.pyr      s    r   c                   @   s  e Zd ZdefddZedefddZedeee	f fddZ
edefd	d
Zedeedf fddZedeedf fddZedeeef fddZedeeef fddZdedefddZdedeeef fddZededefddZdS )	OnnxGraphonnx_graph_protoc           	      C   s  || _ tdd | j jD | _tdd | j jD | _g }i }|jD ]&}t|}|	|d}||  d7  < |
| |dkrDd| nd  q"tdd t||jD | _d	d
 |jD | _dd
 | j D | _dd
 |jD | _|jD ]}|| j|j< qw|jD ]}|| j|j< qd S )Nc                 s       | ]}|j V  qd S Nname.0
value_infor   r   r   	<genexpr>       z%OnnxGraph.__init__.<locals>.<genexpr>c                 s   r   r   r    r"   r   r   r   r%      r&   r   r   _ c                 s   s$    | ]\}}|t ||d fV  qdS ))unique_nameNr
   )r#   r!   noder   r   r   r%   %   s    
c                 S   s   i | ]}|j t|qS r   )r!   r   )r#   initializerr   r   r   
<dictcomp>(   s    z&OnnxGraph.__init__.<locals>.<dictcomp>c                 S   s*   i | ]}t |jD ]	\}}|||fq	qS r   )	enumerateoutput_values)r#   r*   ioutput_namer   r   r   r,   )   s
    
c                 S   s   i | ]}|j |qS r   r    r"   r   r   r   r,   ,   s    )_prototupleinput_input_valuesoutput_output_valuesr*   r   generate_node_name
setdefaultappendr   zip_nodesr+   _initializersvalues_node_output_valuesr$   _value_infor!   )	selfr   unique_namescountersr*   r!   name_counterinput_value_infooutput_value_infor   r   r   __init__   s.   

$



zOnnxGraph.__init__returnc                 C      | j S r   )r1   r@   r   r   r   proto2      zOnnxGraph.protoc                 C   rH   r   )r?   rI   r   r   r   r$   6   rK   zOnnxGraph.value_infoc                 C   s   | j jS r   )r1   r!   rI   r   r   r   r!   :   s   zOnnxGraph.name.c                 C   rH   r   )r4   rI   r   r   r   input_values>   rK   zOnnxGraph.input_valuesc                 C   rH   r   )r6   rI   r   r   r   r.   B   rK   zOnnxGraph.output_valuesc                 C   rH   r   )r;   rI   r   r   r   nodesF   rK   zOnnxGraph.nodesc                 C   s
   t | jS r   )r   r<   rI   r   r   r   initializersJ   s   
zOnnxGraph.initializers
value_namec                 C   sD   || j v rtjS || jv rtjS || jv rtjS |dkrtjS tjS )Nr(   )	r4   r   r   r>   r   r<   r   r   r   r@   rO   r   r   r   
value_typeN   s   


zOnnxGraph.value_typec                 C   s
   | j | S r   )r>   rP   r   r   r   value_as_node_output]   s   
zOnnxGraph.value_as_node_outputr*   c                 C   s&   | j  d| jddp| j dS )a!  Generate a torch module name from the given onnx node import it with.

        Uses the ONNX node's name by default, falling back to the op_type in case the former is empty. The node's
        domain is prepended to this.

        Dots (.) are not allowed within names in torch, so they are replaced with a slash (/) instead.

        Parameters
        ----------
        node
            The ONNX node to create a name from.

        Returns
        -------
        A torch-compatible module name based on the given node's properties.
        /.)domainr!   replaceop_typelstrip)r*   r   r   r   r7   c   s   &zOnnxGraph.generate_node_nameN)r   r   r   r   rF   propertyrJ   r   strr	   r$   r!   r   rL   r.   r   rM   r   rN   r   rQ   intrR   staticmethodr   r7   r   r   r   r   r      s0    

r   N)collectionsr   enumr   typesr   typingr   r   onnx.onnx_ml_pb2r   r   r	   onnx2torch.onnx_noder   onnx2torch.onnx_tensorr   r   r   r   r   r   r   <module>   s    