U
    d.                     @   sJ  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZ dd Zdd Zed	krFejd
dZejddd ejddddd ejdddd ejdddeg d ejdddd ejdd d!d ejd"d#d$d ejd%d&d'd ejd(d)d*d ejd+d,d-d ejd.d/d0d1d ejd2d3d4d1d e Zee dS )5    N)ModelHelper)mobile_exporter)core	workspacebrewutilsc                 C   sd   t tj| dd\}}zt|}W n6 tk
rZ   zt|}W n tk
rT   Y nX Y nX ||fS )N=   )mapstringstripsplitint
ValueErrorfloat)Z	kwarg_strkeyvalue r   E/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/benchmark_generator.pyparse_kwarg   s    r   c              	      s6  ddi}| t| j t| jd}| j}| j}| j}t| j	}t
|D ]\}||dkrd| jrdt|nd }|t|d  }	tt|}
|
|||	f| | jrH|| }}qHt|j g   fdd}| jD ]H}|d	\}}d
d |dD }tjj| tj}|||| j qtt|j|j\}}|j  | j  dkrdd |jD }|jd d = |D ]}d!|j"|_"qd|j| | j#rt$d |jD ]}t$d|j"|j%d|j& qt$d |jD ]}t$d|j"|j%d|j& qt'| j(d}|)|*  W 5 Q R X t'| j+d}|)|*  W 5 Q R X d S )NorderZNCHW)namer    r	   c              	      s|   |  dkrd| }n| }tjdg |gtd|jtd|gd} | |  dkrxtd|g| g} | d S )	NCPUz{}_CPUZGivenTensorFillshapevalues)argOPENGLZCopyToOpenGL)upperformatr   ZCreateOperatorr   ZMakeArgumentr   append)Z	blob_nameZ	blob_datacontextZblob_name_modifiedZfill_opZcopy_opZextra_init_net_opsr   r   make_blob_on_context5   s"      


z"main.<locals>.make_blob_on_contextr   c                 S   s   g | ]}t |qS r   )r   ).0dr   r   r   
<listcomp>M   s     zmain.<locals>.<listcomp>,r   c                 S   s   g | ]}|qS r   r   )r$   opr   r   r   r&   X   s     zOpenGL{}z	init_net: z-->zpredict_net:wb),updatedictkwargsr   Zbenchmark_nameoperator
input_nameoutput_namer   itersrangechainstrgetattrr   r   Z
RunNetOnceZparam_init_netZblobr   nprandomZrandZastypeZfloat32r!   r   ZExportnetparamsr(   extendr   r   typedebugprintinputoutputopenpredict_netwriteZSerializeToStringinit_net)argsr-   modelZop_typer/   r0   r1   iZinput_blob_nameZoutput_blob_nameZadd_opr#   Zunparsed_blobr   Zunparsed_dimsZdimsZnp_inputrC   rA   Zold_opsr(   fr   r"   r   main   sZ    


  

rH   __main__z,Utility to generate Caffe2 benchmark models.)descriptionr.   zCaffe2 operator to benchmark.)helpz-bz--blobz-Instantiate a blob --blob name=dim1,dim2,dim3r    )rK   actionz	--contextzContext to run on.r   )rK   defaultz--kwargszkwargs to pass to operator.*)rK   nargsr;   rM   z
--init_netzOutput initialization net.zinit_net.pbz--predict_netzOutput prediction net.zpredict_net.pbz--benchmark_namezName of the benchmark networkZ	benchmarkz--input_namezName of the input blob.dataz--output_namezName of the output blob.r?   z--itersz)Number of iterations to run the operator.1z-dz--debugzPrint debug information.
store_truez-cz--chainz-Chain ops together (create data dependencies))r   argparseZnumpyr6   Zcaffe2.python.model_helperr   Zcaffe2.python.predictorr   Zcaffe2.pythonr   r   r   r   r   rH   __name__ArgumentParserparseradd_argument
parse_argsrD   r   r   r   r   <module>   sf   M
  
