B
    #=6\                 @   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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 )    )absolute_import)division)print_function)unicode_literals)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-install-l3r2oljg/torch/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)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	||||}xHtt|D ]8}x0tt|D ] }|||rP|| ||< qPW q>W tj||f|}|d
ttj}t|T x&t| D ]\}} || | qW  |  fdd|D }td|| 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 allowedzcFor operators with max_output == inf,                        user should pass num_output explicity.device_optionc                s   g | ]}  |qS r   )Z	FetchBlob)r   r%   )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
calculatedr6   r   jopr.   Z
input_blobZoutput_values)op_type)r/   r   op_func    sf    








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)
__future__r   r   r   r   Zcaffe2.pythonr   r   Zcaffe2.protor   Zcaffe2.python.onnx.workspacer	   collectionsr
   sixr   Cr1   r"   objectr#   Z
Functionalr   r   r   r   <module>   s   T