U
    T?h                     @   sB   d dl Z d dlmZ d dlZdd Zdd Zejjddd	ZdS )
    N)abcc                    s\   fdd g d}d}t | D ]2\}}|jtjjkr~t|t|D ]2}|j d| }|d7 }|| }	| ||	7 }qHq"|jtjjks|jtjj	ks|jtjj
kr |j}d }	||7 }d}
|t|k r|| d k	r|| }	n$||kr|| d k	r|| }	d}
 ||	}|
rV||7 }q"|jtjjkr"| D ]\}}	|kr6 ||	 q6q"S )Nc                    s   |dkrdS d}t |tjrJt|D ] \}}| |  d| |7 }q$|S t |tjr| D ] \}}| |  d| |7 }q^|S |  dS )z;Returns number of expanded inputs that _add_input processedNr   _   )
isinstancer   Sequence	enumerateMappingitemsappend)nameinputZnum_expanded_non_none_inputsivalkey
_add_inputinput_names Z/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/tools/pytorch_export_helpers.pyr      s    
z1_parse_inputs_for_onnx_export.<locals>._add_inputr   r   r   TF)r   kindinspect	ParameterVAR_POSITIONALrangelenr   POSITIONAL_ONLYPOSITIONAL_OR_KEYWORDKEYWORD_ONLYVAR_KEYWORDr	   )Zall_input_parametersinputskwargsZvar_positional_idxZ'num_expanded_non_none_positional_inputsZ	input_idxZinput_parameterZargs_ir   ZinpZis_positionalZ"num_expanded_non_none_inputs_localr   r   r   _parse_inputs_for_onnx_export
   sD    $



r!   c                    sT   dd  dd  fdd|D }| fdd| D 7 }sL| i  t|S )z5Flatten args and kwargs in a single tuple of tensors.c                 S   s   t | ttthkS N)typeintboolfloatvaluer   r   r   is_primitive_type\   s    z0_flatten_module_input.<locals>.is_primitive_typec                 S   s
   t | S r"   )torchZtensorr'   r   r   r   	to_tensor_   s    z(_flatten_module_input.<locals>.to_tensorc                    s    g | ]} |r|n|qS r   r   ).0arg)r)   r+   r   r   
<listcomp>b   s     z)_flatten_module_input.<locals>.<listcomp>c                    s4   g | ],}|kr | r(| n| qS r   r   )r,   r   r)   r    r+   r   r   r.   c   s     )r
   tuple)namesargsr    retr   r/   r   _flatten_module_inputX   s    
r4   )modulec                 O   s2   t | jj }t|||}t|||}||fS )a  
    Infer the input names and order from the arguments used to execute a PyTorch module for usage exporting
    the model via torch.onnx.export.
    Assumes model is on CPU. Use `module.to(torch.device('cpu'))` if it isn't.

    Example usage:
    input_names, inputs_as_tuple = infer_input_info(module, ...)
    torch.onnx.export(module, inputs_as_type, 'model.onnx', input_names=input_names, output_names=[...], ...)

    :param module: Module
    :param inputs: Positional inputs
    :param kwargs: Keyword argument inputs
    :return: Tuple of ordered input names and input values. These can be used directly with torch.onnx.export as the
            `input_names` and `inputs` arguments.
    )r   	signatureforward
parametersvaluesr!   r4   )r5   r   r    Zmodule_parametersr   Zinputs_as_tupler   r   r   infer_input_infoo   s    r:   )	r   collectionsr   r*   r!   r4   nnModuler:   r   r   r   r   <module>   s
   N