U
    d?                     @   sj   d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 ejjZdd ZG dd	 d	eZe Zd
S )    )core	workspace)
caffe2_pb2)	Workspace)
namedtuple)string_typesc                    sF   dd t |D  |dd t| |f||} fdd}||_|S )Nc                 S   s   i | ]\}}||qS  r   ).0inr   r   </tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/functional.py
<dictcomp>   s      z"namedtupledict.<locals>.<dictcomp>renameTc                    s&   t |tr | }tt| | |S )N)
isinstancer   supertype__getitem__)selfkeyZfield_names_mapr   r   getitem   s    
znamedtupledict.<locals>.getitem)	enumerate
setdefaultr   r   )typenamefield_namesargskwargsdatar   r   r   r   namedtupledict   s    r   c                   @   s   e Zd Zdd ZdS )_Functionalc                    s    fdd}|S )Nc               
      s  t   t}d}d}dd }g g  }}||t| |j}t|}||jksb||jk sb||svtd|j|jd|kr|d }	|	|j	ks|	|j
k s||	r|||	std|j
|j	|||	|j	}|d ||}
|s|
dkr|||
|j	}|s0|j	}|j|kr$td	||||}tt|D ]4}tt|D ] }|||rL|| ||< qLq<tj||f|}|d
ttj}t|\ t| D ]\}} || | q |  fdd|D }td|| W  5 Q R  S Q R X d S )NZinput_Zoutput_c                    s    fddt t||D S )Nc                    s   g | ]} t | qS r   )strr	   xprefixr   r   
<listcomp>'   s     zX_Functional.__getattribute__.<locals>.op_func.<locals>.get_name_list.<locals>.<listcomp>)rangemin)r$   numZmax_numr   r#   r   get_name_list&   s    zD_Functional.__getattribute__.<locals>.op_func.<locals>.get_name_listzUFunctional C2: Number of inputs not in                 range: {} - {} or not allowed.
num_outputzXFunctional C2: Number of output                     not in range: {} - {} or not allowedzdFor operators with max_output == inf,                        user should pass num_output explicitly.device_optionc                    s   g | ]}  |qS r   )Z	FetchBlobr!   wsr   r   r%   l   s     zA_Functional.__getattribute__.<locals>.op_func.<locals>.<listcomp>output)r   OpSchemagetlenZ	max_inputZ	min_inputZnum_inputs_allowed
ValueErrorformat
max_outputZ
min_outputZnum_outputs_allowedZnum_inputs_outputs_allowedpopZCalculateOutputinfr&   Zinplace_enforcedr   ZCreateOperatorZDeviceOptionr   ZCPUZDeviceScoper   ZFeedBlobZRunOperatorOncer   )inputsr   ZschemaZinput_prefixZoutput_prefixr)   Zinput_namesZoutput_namesZ	num_inputr*   Z
calculatedr5   r
   jopr,   Z
input_blobZoutput_valuesop_typer-   r   op_func    s    

   
   

      
z-_Functional.__getattribute__.<locals>.op_funcr   )r   r<   r=   r   r;   r   __getattribute__   s    Oz_Functional.__getattribute__N)__name__
__module____qualname__r>   r   r   r   r   r      s   r   N)Zcaffe2.pythonr   r   Zcaffe2.protor   Zcaffe2.python.onnx.workspacer   collectionsr   sixr   Cr0   r   objectr   Z
Functionalr   r   r   r   <module>   s   T