a
    ==ic>                     @   sz   d dl mZ d dlmZ d dlmZ d dlZd dlZee	Z
dd ZdddZd	d
 ZdddZdddZdddZdS )    )
caffe2_pb2)namedtupledict)	WorkspaceNc                    s   t   t|tr4| D ]\}} ||| j qn<t| jt|ksJJ t| j|D ]\}} ||| j qV 	|  | j
} fdd|D } td|| fS )Nc                    s   g | ]}  |qS  Z	FetchBlob.0namewsr   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/onnx/helper.py
<listcomp>        z$c2_native_run_op.<locals>.<listcomp>Outputs)r   
isinstancedictitemsFeedBlobdevice_optionleninputzipZRunOperatorOnceoutputr   )Zop_definputskeyvalueoutput_namesoutput_valuesr   r
   r   c2_native_run_op   s    

r   c           
         s\  t   | r |  t|trB| D ]\}} |||j q&n fdd|jD }t|t|krt	||D ]\}} |||j qpnt|t|jkrt
dt|dt|j t
d| t
dt|d| t
dt|d| t|t|jksJ tt|D ] } |j| || |j q | |j} fd	d|D }	 td
||	 fS )Nc                    s   g | ]}  |s|qS r   )ZHasBlob)r   Z
input_namer
   r   r   r   -   s   
z%c2_native_run_net.<locals>.<listcomp>z&c2_native_run_net assert. len(inputs)=z len(predict_net.external_input)=zdebug_arg: zpredict_net :zinputs c                    s   g | ]}  |qS r   r   r   r
   r   r   r   F   r   r   )r   
RunNetOncer   r   r   r   r   Zexternal_inputr   r   printtyperangeZexternal_outputr   )
init_netpredict_netr   Z	debug_argr   r   Zuninitializedir   r   r   r
   r   c2_native_run_net$   s:    





r'   c                 C   sD   t  }t| d}||  W d    n1 s60    Y  |S )Nrb)r   ZNetDefopenZParseFromStringread)filenetfr   r   r   load_caffe2_netJ   s    ,r.   Fc                 C   s|   t |d}||   W d    n1 s.0    Y  |rxt |d d}|t|  W d    n1 sn0    Y  d S )Nwbtxtw)r)   writeZSerializeToStringstr)r,   r+   Z
output_txtr-   r   r   r   save_caffe2_netQ   s
    ,r4      
   Tc                 C   s:   t  }| r||  || ||j|||}~|d S )zw
        Run the benchmark net on the target model.
        Return the execution time per iteration (millisecond).
    r   )r   r    Z	CreateNetZBenchmarkNetr	   )r$   r%   warmup_iters
main_itersZlayer_detailsr   resultsr   r   r   benchmark_caffe2_modelY   s    

r:   c           
      C   sv   t |D ]}| |  qd}t |D ](}t }| |  t }	||	| 7 }q"td|| d ||  |d | S )z
        Run the model several times, and measure the execution time.
        Return the execution time per iteration (millisecond).
    g        zRThe PyTorch model execution time per iter is {} milliseconds, {} iters per second.i  )r#   timeloginfoformat)
modelr   Ztrainingr7   r8   verboseZ_iZtotal_pytorch_timetster   r   r   benchmark_pytorch_modelg   s    

rC   )N)F)r5   r6   T)Fr5   r6   F)Zcaffe2.protor   Zonnx.backend.baser   Zcaffe2.python.onnx.workspacer   loggingr;   	getLogger__name__r<   r   r'   r.   r4   r:   rC   r   r   r   r   <module>   s   

&

  