
    Yj                    B    d dl mZ d dlZd dlmZ d dlZd Zd Zd	dZdS )
    )annotationsN)abcc                   fdg d}d}t          |           D ]Z\  }}|j        t          j        j        k    rIt          |t          |                    D ]*}|j         d| }|dz  }||         }	| ||	          z  }+i|j        t          j        j        k    s4|j        t          j        j	        k    s|j        t          j        j
        k    r_|j        }d }	||z  }d}
|t          |          k     r||         	||         }	n||v r||         
||         }	d}
 ||	          }|
r||z  }|j        t          j        j        k    r*|                                D ]\  }}	|vr ||	           \S )Nc                \   |dS d}t          |t          j                  r+t          |          D ]\  }}| |  d| |          z  }|S t          |t          j                  r0|                                D ]\  }}| |  d| |          z  }|S                     |            dS )z;Returns number of expanded inputs that _add_input processedNr   _   )
isinstancer   Sequence	enumerateMappingitemsappend)nameinputnum_expanded_non_none_inputsivalkey
_add_inputinput_namess         e/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/onnxruntime/tools/pytorch_export_helpers.pyr   z1_parse_inputs_for_onnx_export.<locals>._add_input   s     =1'($eS\** 	0 $E** O O3 -

d==Q==#0N0NN,, 0/s{++ 	0 "KKMM Q QS,

d??S??C0P0PP,, 0/ 	4    q    r   r   r   TF)r   kindinspect	ParameterVAR_POSITIONALrangelenr   POSITIONAL_ONLYPOSITIONAL_OR_KEYWORDKEYWORD_ONLYVAR_KEYWORDr   )all_input_parametersinputskwargsvar_positional_idx'num_expanded_non_none_positional_inputs	input_idxinput_parameterargs_ir   inpis_positional"num_expanded_non_none_inputs_localr   r   s               @@r   _parse_inputs_for_onnx_exportr.      s   " " " " " "H K./+&/0D&E&E * *"	?7#4#CCC	3v;;77 Q Q).EE1CEE"a'"Vn7::dC;P;PP77	Q  G$5$EEE#w'8'NNN#w'8'EEE #'DC++I M3v;;&&6)+<+HY'F4L$<Tl %1;D#1F1F. ^7;]]7!W%6%BBB#\\^^ * *	c{**JtS)))r   c                    d d fd|D             }|fd| D             z  }s|                     i            t          |          S )z5Flatten args and kwargs in a single tuple of tensors.c                H    t          |           t          t          t          hv S N)typeintboolfloatvalues    r   is_primitive_typez0_flatten_module_input.<locals>.is_primitive_type^   s    E{{sD%000r   c                *    t          j        |           S r1   )torchtensorr6   s    r   	to_tensorz(_flatten_module_input.<locals>.to_tensora   s    |E"""r   c                @    g | ]} |          r |          n|S  r>   ).0argr8   r<   s     r   
<listcomp>z)_flatten_module_input.<locals>.<listcomp>d   s6    
M
M
M..s33<99S>>>
M
M
Mr   c                l    g | ]0}|v  |                   r |                   n|         1S r>   r>   )r?   r   r8   r%   r<   s     r   rA   z)_flatten_module_input.<locals>.<listcomp>e   sX       Y]jnrxjxjx#4#4VD\#B#BT		&,tjxjxjxr   )r   tuple)namesargsr%   retr8   r<   s     ` @@r   _flatten_module_inputrG   Z   s    1 1 1# # # N
M
M
M
M
M
M
MC      af   C  

2::r   moduletorch.nn.Modulec                    t          j        | 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.   rG   )rH   r$   r%   module_parametersr   inputs_as_tuples         r   infer_input_inforQ   q   sT       )&.99DKKMM/0A66RRK+KHHO''r   )rH   rI   )	
__future__r   r   collectionsr   r:   r.   rG   rQ   r>   r   r   <module>rT      s}    # " " " " "        K K K\  .( ( ( ( ( (r   