U
    qh*                     @  s   d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlZd dlmZmZmZ e ZG dd dZG d	d
 d
ZG dd dZG dd dZdS )    )annotationsN)OrderedDictdefaultdict)IOAny)tabulate)
GraphProtodefshelperc                   @  s*   e Zd ZddddZdddddZd	S )
AttrCoverageNonereturnc                 C  s   d | _ t | _d S N)namesetvaluesself r   E/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/report/coverage.py__init__   s    zAttrCoverage.__init__zonnx.AttributeProto)attrr   c                 C  sL   | j d |j hkst|j | _ t|}t|tr8t|}| jt	| d S r   )
r   AssertionErrorr
   Zget_attribute_value
isinstancelisttupler   addstr)r   r   valuer   r   r   r      s    

zAttrCoverage.addN__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c                   @  s*   e Zd ZddddZdddddZd	S )
NodeCoverager   r   c                 C  s   d | _ tt| _d S r   )op_typer   r   attr_coveragesr   r   r   r   r   &   s    zNodeCoverage.__init__onnx.NodeProto)noder   c                 C  sj   | j d |j fkst| j d krH|j | _ | j d k	s4ttj| j |jd| _|jD ]}| j|j 	| qNd S )N)domain)
r%   r   r	   Z
get_schemar)   schema	attributer&   r   r   )r   r(   r   r   r   r   r   *   s    

zNodeCoverage.addNr    r   r   r   r   r$   %   s   r$   c                   @  s*   e Zd ZddddZdddddZd	S )
ModelCoverager   r   c                 C  s   d | _ d | _tt| _d S r   )r   graphr   r$   node_coveragesr   r   r   r   r   7   s    zModelCoverage.__init__onnx.ModelProto)modelr   c                 C  sd   | j d |jj fkst| j d kr@|jj | _ | j d k	s8t|j| _|jjD ]}| j|j | qHd S r   )r   r-   r   r(   r.   r%   r   )r   r0   r(   r   r   r   r   <   s    

zModelCoverage.addNr    r   r   r   r   r,   6   s   r,   c                   @  s   e Zd ZddddZdddddd	Zd
dddddZdddddddZdddddddZdddddZdddddddZ	dS ) Coverager   r   c                 C  s,   t tt td| _t tt td| _d S )N)loadedpassed)r   r$   bucketsr,   modelsr   r   r   r   r   I   s    zCoverage.__init__r'   r   )r(   bucketr   c                 C  s   | j | |j | d S r   )r4   r%   r   )r   r(   r6   r   r   r   add_nodeS   s    zCoverage.add_nodezonnx.GraphProto)r-   r6   r   c                 C  s   |j D ]}| || qd S r   )r(   r7   )r   r-   r6   r(   r   r   r   	add_graphV   s    
zCoverage.add_graphr/   bool)r0   r6   is_modelr   c                 C  s.   |  |j| |r*| j| |jj | d S r   )r8   r-   r5   r   r   )r   r0   r6   r:   r   r   r   	add_modelZ   s    zCoverage.add_model)protor6   r:   r   c                 C  s"   t |tjst| ||| d S r   )r   onnxZ
ModelProtor   r;   )r   r<   r6   r:   r   r   r   	add_proto`   s    zCoverage.add_protozIO[str])writerr   c           
   	     s   | d | dt| jd  dt| jd  dtt d | d g }g }g }g }| jd  D ]p dd	  j D } fd
d	 jjD }t|t| }|rt	j
|}	nd}	| j|	g | j qh| t|ddgdd | d t	jdd k	r| ||| d S )Nz%---------- onnx coverage: ----------
z!Operators (passed/loaded/total): r3   /r2   
z%------------------------------------
c                 S  s"   g | ]}|j  d t|j qS )z: )r   lenr   ).0Zattr_covr   r   r   
<listcomp>p   s   z(Coverage.report_text.<locals>.<listcomp>c                   s    g | ]}| j kr| d qS )z: 0)r&   )rC   r   Zop_covr   r   rD   t   s   
zNo attributesZOperatorzAttributes
(name: #values)plain)headersZtablefmtCSVDIR)writerB   r4   _all_schemasr   r&   r*   
attributessortedoslinesepjoinappendr%   r   environget
report_csv)
r   r?   Zrowsr3   all_opsexperimentalZcovered_attrsZuncovered_attrsattrsZattrs_columnr   rE   r   report_textd   s@    
.


zCoverage.report_textz	list[str]zlist[str | None])rT   r3   rU   r   c              	   C  s  t D ]6}|jdkr||j |jtjjjkr||j q|	  t
jtt
jdd}t
jtt
jdd}t }t }g }	t
j|rt|H}
t|
}|jstt|j}	|D ]}|d }|d= ||t|< qW 5 Q R X t
j|r<t|6}t|}|D ] }|d }|d= ||t|< qW 5 Q R X t
jd}|	dd  }t|d	J}
d|	krv|	d ||	kr|	t| n|t| tj|
|	d
}|  |D ]t}|}||kr|d }||krt ||< |D ]}d|| |< q||krd|| t|< nd|| t|< qi }d|krJ|d }|d= t| dt| d|t|< d|d< |D ]$}t||| d< |||  qv|| W 5 Q R X t|d	}d|	d< tj||	d
}|  d}| jD ]}| j| D ]}d}| j| | jD ]}||kr|d7 }qd}|dkrL|| jd krHqd}|d7 }||krt ||< |D ]}d|| |< qlt| dt| j| | j d| || t|< qq|  d|kr|d }|d= t||kr|t|= t| jd  d| d|t|< d|d< |D ] }||| d< |||  q"|| W 5 Q R X tt
jtt
jddd	0}t |}|dt!j!" # $ddg W 5 Q R X d S )N>    ai.onnxrH   z	nodes.csvz
models.csvOpZModelZBACKEND   w)
fieldnamesz (Experimental)zSkipped!zPassed!zFailed!ZSummaryr@   z node tests passedr   r2   r3   z nodes covered: z model tests passedzmetadata.csvzLatest UpdateT )%rJ   r)   rP   r   Zsupport_levelr	   ZOpSchemaZSupportTypeZEXPERIMENTALsortrM   pathrO   r   rQ   rR   r   isfileopencsv
DictReaderr]   r   r   remove
DictWriterwriteheaderrB   writerowr5   r.   clearr?   datetimenow	isoformatreplace)r   rT   r3   rU   r*   Z
nodes_pathZmodels_pathZexisting_nodesZexisting_modelsZ
frameworksZ
nodes_filereaderrowopZmodels_filer0   backendZother_frameworksZnode_writerr(   Z	node_nameZother_frameworkZ	summariesZmodel_writerZ
num_modelsr6   Znum_coveredmsgZmetadata_fileZmetadata_writerr   r   r   rS      s    
  













 




"



zCoverage.report_csvN)
r!   r"   r#   r   r7   r8   r;   r>   rW   rS   r   r   r   r   r1   H   s   
/r1   )
__future__r   rd   rk   rM   collectionsr   r   typingr   r   r   r=   r   r	   r
   Zget_all_schemasrJ   r   r$   r,   r1   r   r   r   r   <module>   s   