a
    ==ic1                     @   s(  d dl mZmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZmZmZ 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 d d
lmZmZ G dd deZG dd deZeedd Zeedd Zeedd Z ee
dd Z!eedd Z"eedd Z#dd Z$G dd deZ%G dd  d ee%Z&d!d" Z'd#d$ Z(d%d& Z)d'd( Z*d)d* Z+dGd-d.Z,d/d0 Z-e&ed1d2 Z.e&ed3d4 Z/e&ed5d6 Z0d7d8 Z1e&ed9d: Z2d;d< Z3e&e
d=d> Z4e&edHd?d@Z5e&edAdB Z6dCdD Z7dEdF Z8d+S )I    )OperatorDefNetDef)Job)NetExecutionStepPlan)Task	TaskGroupWorkspaceType
TaskOutputdefaultdict)contextmanager)copy)viewkeys)chain)binary_type	text_typec                   @   s    e Zd Zedd Zdd ZdS )Visitorc                    s<   t dsi _n jvs*J d  fdd}|S )Nvisitorsz{} already registered!c                    s   | j  < | S N)r   )funcTypecls j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/net_printer.py	_register   s    
z#Visitor.register.<locals>._register)hasattrr   format)r   r   r   r   r   r   register   s    
zVisitor.registerc                 O   sX   |d u rd S t |}|| jjvr4td| jj|f | jj| }|| |g|R i |S )Nz%s: unsupported object type: %s)type	__class__r   	TypeError__name__)selfobjargskwargsr   r   r   r   r   __call__#   s    zVisitor.__call__N)r$   
__module____qualname__classmethodr    r)   r   r   r   r   r      s   
r   c                   @   sD   e Zd ZdhZdd Zedd Zeddd	Zd
d Z	dd Z
dS )AnalyzerZdistributed_ctx_initc                 C   s   t dd | _g | _d S )Nc                   S   s   t dd S )Nc                   S   s   dS Nr   r   r   r   r   r   <lambda>4       z5Analyzer.__init__.<locals>.<lambda>.<locals>.<lambda>r   r   r   r   r   r/   4   r0   z#Analyzer.__init__.<locals>.<lambda>)r   
workspacesworkspace_ctxr%   r   r   r   __init__3   s    zAnalyzer.__init__c                 C   s
   | j d S N)r2   r3   r   r   r   	workspace7   s    zAnalyzer.workspaceNFc                 c   sV   |d ur|}n|d ur&| j t| }n| j}|r8t|}| j| |V  | jd= d S r5   )r1   strr7   r   r2   append)r%   nodewsdo_copyr   r   r   set_workspace;   s    zAnalyzer.set_workspacec                 C   s   | j |  d7  < d S )N   )r7   r%   blobr   r   r   define_blobI   s    zAnalyzer.define_blobc                    s6   t  fddtjD rd S  | jv s2J d  d S )Nc                 3   s   | ]}  |V  qd S r   )
startswith).0pr@   r   r   	<genexpr>M   r0   z%Analyzer.need_blob.<locals>.<genexpr>zBlob undefined: %s)anyr-   PREFIXES_TO_IGNOREr7   r?   r   rE   r   	need_blobL   s    zAnalyzer.need_blob)NNF)r$   r*   r+   rH   r4   propertyr7   r   r=   rA   rI   r   r   r   r   r-   0   s   
r-   c                 C   s0   |j D ]}| | q|jD ]}| | qd S r   )inputrI   outputrA   )analyzeropxr   r   r   
analyze_opR   s    

rP   c                 C   s   |  jD ]}| | q
d S r   )ProtorN   )rM   netrO   r   r   r   analyze_netZ   s    rS   c           	   
      sZ     }| j|jd |jr\| jdd  |  |j W d    n1 sR0    Y  t }   fdd|jD  }|D ]}| j|jd*}| | |j	r| 
|j	 W d    n1 s0    Y  |jrtt|tt| j }t||@ dksJ dd||@  ||O }qW d    n1 s60    Y  |D ]}| | qDd S )Nr<   Tc                    s   g | ]}  |qS r   get_netrC   nstepr   r   
<listcomp>h   r0   z analyze_step.<locals>.<listcomp>r   z3Error: Blobs created by multiple parallel steps: %s, )rQ   r=   create_workspace
report_netrV   setSubstepsnetworkconcurrent_substepsshould_stop_blobrI   r   r7   lenjoinrA   )	rM   rZ   protoZall_new_blobssubstepssubstepZws_inZ	new_blobsrO   r   rY   r   analyze_step`   s2    .**ri   c                 C   s   |  }t|j}|| t|  }|dk s@J d| | tj	k}| j
|d | | W d    n1 sx0    Y  d S )Ni   zeDue to a protobuf limitation, serialized tasks must be smaller than 64Mb, but this task has {} bytes.rT   )get_stepr   r:   ZAddSteprd   rQ   ZSerializeToStringZworkspace_typer
   GLOBALr=   )rM   taskrZ   ZplanZ	proto_len
is_privater   r   r   analyze_tasky   s    


rn   c              	   C   sL   |   D ]:}| j|jd | | W d    q1 s<0    Y  qd S )N)r:   )tasks_by_nodetasksr=   r:   )rM   tgrl   r   r   r   analyze_task_group   s    rr   c                 C   s   | |j  | |j d S r   )
init_groupepoch_group)rM   jobr   r   r   analyze_job   s    
rv   c                 C   s   t  |  dS )z
    Given a Job, visits all the execution steps making sure that:
      - no undefined blobs will be found during execution
      - no blob with same name is defined in concurrent steps
    N)r-   )r&   r   r   r   analyze   s    rw   c                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )
Textc                 C   s   d| _ dg| _g | _d S r.   )_indent_lines_in_contextlinesr3   r   r   r   r4      s    zText.__init__c                 c   sp   |d ur0|  d|  |  jd7  _| jd d V  |d url| jd dkrV|  d |  jd8  _| jd= d S )Nzwith %s:   r   r6   pass)addry   rz   r9   r%   textr   r   r   context   s    
zText.contextc                 C   s,   | j d  d7  < | jd| j |  d S )Nr6   r>    )rz   r{   r9   ry   r   r   r   r   r~      s    zText.addc                 C   s   d | jS )N
)re   r{   r3   r   r   r   __str__   s    zText.__str__N)r$   r*   r+   r4   r   r   r~   r   r   r   r   r   rx      s
   
rx   c                       s   e Zd Zd fdd	Z  ZS )PrinterFTc                    s2   t t|   t t|   || _|| _d | _d S r   )superr   r4   rx   factor_prefixes	c2_syntaxc2_net_name)r%   r   r   r"   r   r   r4      s
    zPrinter.__init__)FT)r$   r*   r+   r4   __classcell__r   r   r   r   r      s   r   c                 C   sj   t | tr| }n"t | tr*| jddd}nt| }t|dk rFd| S d|d d  dt|d   S d S )Nasciiignore)errors@   '%s'z...<+len=%d>)
isinstancer   r   decoder8   rd   )s	sanitizedr   r   r   _sanitize_str   s    

r   c                 C   s   |  drt| jS |  dr(t| jS |  dr<t| jS | jrPtt| jS | jrdtt| jS | j	r~tdd | j	D S dS )Nfir   c                 S   s   g | ]}t |qS r   )r   )rC   r   r   r   r   r[      r0   z_arg_val.<locals>.<listcomp>z[])
HasFieldr8   r   r   r   r   Zfloatslistintsstrings)argr   r   r   _arg_val   s    





r   c                 C   sJ   | sdS t | }t| }t|D ]$\}}||| kr |d|   S q |S )z:Given a list of strings, returns the longest common prefix N)minmax	enumerate)ms1s2r   cr   r   r   commonprefix   s    r   c                 C   s.   t | tr"dddd | D  S t| S d S )Nz[%s]r\   c                 s   s   | ]}d t | V  qdS )r   Nr8   rC   vr   r   r   rF      r0   zformat_value.<locals>.<genexpr>)r   r   re   r8   )valr   r   r   format_value   s    
r   c                    sV   dd | D } t | dkr&|r&t| nd d fdd| D } rRd |f S |S )	Nc                 S   s   g | ]}t |qS r   )r   r   r   r   r   r[      r0   z!factor_prefix.<locals>.<listcomp>r>   r   r\   c                 3   s   | ]}|t  d  V  qd S r   )rd   r   prefixr   r   rF      r0   z factor_prefix.<locals>.<genexpr>z%s[%s])rd   r   re   )valsdo_itZjoinedr   r   r   factor_prefix   s    r   NFc                 C   sx   |s
d}nHdd |D }dd |D }d dd tt||gdd |D D }d	| |f }|sf|S d
t|||f S )Nr   c                 S   s   g | ]}t |ts|qS r   r   tuplerC   ar   r   r   r[      r0   zcall.<locals>.<listcomp>c                 S   s   g | ]}t |tr|qS r   r   r   r   r   r   r[      r0   r\   c                 s   s   | ]}|r|V  qd S r   r   rC   rO   r   r   r   rF      s   zcall.<locals>.<genexpr>c                 s   s   | ]}d | V  qdS )z%s=%sNr   )rC   kvr   r   r   rF     r0   z%s(%s)z%s = %s)re   r   r   )rN   inputsoutputsr   Zinputs_vZ	inputs_kvcallr   r   r   r      s    



r   c                 C   s4   | r| j s| js| jsd S td| j | jd| j gS )NZDeviceOptionr   )Zdevice_typeZ	device_idZ	node_namer   )Zdev_optr   r   r   format_device_option  s    r   c              	   C   s   dd |j D }t|j}|r,|d|f | jrd| t| jd |j t|j	t|j
g|  n&| t|jt|j	| |j
| jd |j D ]H}|dr| d|j  | |j W d    q1 s0    Y  qd S )Nc                 S   s   g | ]}|j t|fqS r   )namer   r   r   r   r   r[     r0   zprint_op.<locals>.<listcomp>device_option.)r   rX   zarg: %s)r   r   r   r9   r   r~   r   r!   r   rK   rL   r   r   r   r   rX   )r   rN   r'   Zdev_opt_txtr   r   r   r   print_op  s&    


r   c                 C   sb   | j r.| tdd|j g|jg |j| _n| d|j  |jD ]}| | qD| j r^d | _d S )Nzcore.Netr   z	# net: %s)r   r~   r   r   r   rN   )r   Znet_defrN   r   r   r   print_net_def-  s    


r   c                 C   s   | |   d S r   )rQ   )r   rR   r   r   r   	print_net:  s    r   c                 C   s   |   }|jrtddfS |jr<|jdkr<td|jgdfS |jdkrhtdd|jfgt|  dkfS |jo|t|  dk}|rtddfS |jrtddfS dS )	NloopFr>   parallelZnum_instancesTZrun_once)NF)	rQ   rc   r   Znum_iterZnum_concurrent_instancesrd   r`   rb   r^   )rZ   rf   
concurrentr   r   r   _get_step_context?  s"    

r   c           
   
      st     }t \}}| |> |jrl| td|jg  |  |j W d    n1 sb0    Y     fdd|jD  }|D ]}t	|t
r|  nd }|d ur|jrtdt|d|jfg}n0|r|d ur|jrdnd}	t|	t|g}nd }| |4 | | |jr.| td|jg W d    q1 sD0    Y  qW d    n1 sf0    Y  d S )	Nr^   c                    s   g | ]}  |qS r   rU   rW   rY   r   r   r[   Z  r0   zprint_step.<locals>.<listcomp>reporterZinterval_msr7   rZ   zyield stop_if)rQ   r   r   r^   r   Zreport_intervalrV   r`   ra   r   r   Zrun_every_msr8   r]   rc   r~   )
r   rZ   rf   Zstep_ctxZ
do_substeprg   rh   Z	sub_protoZsubstep_ctxtitler   rY   r   
print_stepR  s8    .r   c                 C   s,   t | tsJ dddd | jD  d S )NzOutput[r\   c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   rF   r  r0   z%_print_task_output.<locals>.<genexpr>])r   r   re   names)rO   r   r   r   _print_task_outputp  s    r   c                 C   sr   d dd | D }d|jfd|jfd|fg}| td| | |  W d    n1 sd0    Y  d S )Nr\   c                 s   s   | ]}t |V  qd S r   )r   )rC   or   r   r   rF   w  r0   zprint_task.<locals>.<genexpr>r:   r   r   r   )re   r   r:   r   r   r   rj   )r   rl   Zoutsr   r   r   r   
print_tasku  s    r   c                 C   sP   |  |ptd* |  D ]}| | q W d    n1 sB0    Y  d S )Nr	   )r   r   ro   rp   )r   rq   headerrl   r   r   r   print_task_group}  s    r   c                 C   sx   | |j d | |jd | d* |jD ]}| t| q*W d    n1 sR0    Y  | |jd | |jd d S )NzJob.current().init_groupzJob.current().epoch_groupzJob.current().stop_conditionszJob.current().download_groupzJob.current().exit_group)rs   rt   r   Zstop_conditionsr~   r   Zdownload_groupZ
exit_group)r   ru   outr   r   r   	print_job  s    
.r   c                 K   s   t f i |}||  t|S )z
    Given a Net, ExecutionStep, Task, TaskGroup or Job, produces a string
    with detailed description of the execution steps.
    )r   r8   )r&   r(   printerr   r   r   	to_string  s    r   c                 C   sl   t | tsJ tt| }t | ts(J |  jD ]4}t }t|| |t| | j|g q2|S )z
    Given a Net, produce another net that logs info about the operator call
    before each operator execution. Use for debugging purposes.
    )	r   r   r8   rQ   rN   rx   r   ZLogInfoextend)rR   	debug_netrN   r   r   r   r   r     s    
r   )NNF)N)9Zcaffe2.proto.caffe2_pb2r   r   Zcaffe2.python.checkpointr   Zcaffe2.python.corer   r   r   Zcaffe2.python.taskr   r	   r
   r   collectionsr   
contextlibr   r   Zfuture.utilsr   	itertoolsr   sixr   r   objectr   r-   r    rP   rS   ri   rn   rr   rv   rw   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sf   "





		
	







