U
    qh(-                     @  s
  U d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ dd	d
ddZdd	ddddZg aded< g aded< d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!Zed"kre  dS )#    )annotationsN)IOAnySequence)AttributeProtodefsload)collect_snippets)load_model_tests)RunnerzSequence[defs.OpSchema]bool)schemasreturnc                 C  s   t dd | D S )Nc                 s  s   | ]}|j d kV  qdS 
ai.onnx.mlN)domain.0s r   C/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/stat_coverage.py	<genexpr>   s     zis_ml.<locals>.<genexpr>)any)r   r   r   r   is_ml   s    r   zIO[Any]None)fmlr   c                 C  sP   |  d |r|  d n
|  d |  d |  d |  d |  d d S )Nz# Test Coverage Reportz (ONNX-ML Operators)
z (ONNX Core Operators)
z## Outlines
z,* [Node Test Coverage](#node-test-coverage)
z.* [Model Test Coverage](#model-test-coverage)
z2* [Overall Test Coverage](#overall-test-coverage)
write)r   r   r   r   r   gen_outlines   s    




r   zSequence[str]common_coveredexperimental_covered)r   r   r   r   c                   s  t dddddh t tfdd| D atfdd| D }t fd	d|D }tfd
d| D atfdd| D }t fdd|D }ttt| t| }ttt| t| }|d |d |r.|dtt d| dttt| d ddt| d	 n
|d |rn|dtt|ttt| d t| n
|d ddddg}	t|t|g}
|	D ]:}|d|dd   d|dd  	 
d d! d" q|d# t|	|
D ]\}}|d$| d# |D ]}|d%|  |kr|d&t|  d' t| D ]B\}}|d( |d)| d* |d+| d, |d- qFn | kr|d. n
|d/ |d0 q|d1 qd S )2NZMultinomialZRandomNormalZRandomNormalLikeZRandomUniformZRandomUniformLikec                 3  s<   | ]4}|j kr|jtjjjkr|jd k kr|j V  qdS r   namesupport_levelr   OpSchemaSupportTypeZCOMMONr   r   r   
node_testsr   r   r   4   s
   
z)gen_node_test_coverage.<locals>.<genexpr>c                 3  s<   | ]4}|j kr|jtjjjkr|jd k kr|j V  qdS r   r"   r   r'   r   r   r   ;   s
   
c                 3  s   | ]}| kr|V  qd S Nr   r   r#   
generatorsr   r   r   B   s      c                 3  s<   | ]4}|j kr|jtjjjkr|jd k kr|j V  qdS r   r#   r$   r   r%   r&   ZEXPERIMENTALr   r   r'   r   r   r   C   s
   
c                 3  s<   | ]4}|j kr|jtjjjkr|jd k kr|j V  qdS r   r-   r   r'   r   r   r   J   s
   
c                 3  s   | ]}| kr|V  qd S r)   r   r*   r+   r   r   r   Q   s     z# Node Test Coverage
z## Summary
zNode tests have covered /z (d   z.2fz%, z) generators excluded) common operators.

z6Node tests have covered 0/0 (N/A) common operators. 

zYNode tests have covered {}/{} ({:.2f}%, {} generators excluded) experimental operators.

z;Node tests have covered 0/0 (N/A) experimental operators.

z!&#x1F49A;Covered Common Operatorsz"&#x1F494;No Cover Common Operatorsz'&#x1F49A;Covered Experimental Operatorsz(&#x1F494;No Cover Experimental Operatorsz* [	   z](# -z)

## z### z
There are z" test cases, listed as following:

<details>
	<summary>z</summary>

z
```python
z
```

</details>
z (random generator operator)
z (call for test cases)
z

z<br/>

)setr	   sortedr    r!   lenr   floatformatlowerreplacezip)r   r   r   Zcommon_no_coverZcommon_generatorZexperimental_no_coverZexperimental_generatorZ
num_commonZnum_experimentaltitlesZ	all_liststlr   summarycoder   )r,   r   r(   r   gen_node_test_coverage%   s    	

6


8




rE   c                 C  sH  | d i }| D ]}|||j< qi }g }tddD ]|}|jdrtjtjtj	t
ddd|j}tj|std|d|| q4t|}	|tj|	d q4|  d	}
|D ]h}t|}|rd	}|jD ]}|jd
krd}q|sqnd}
| d|jj d d}|jjD ]}|jtks>|jtkr |d7 }|jD ]}|j|krhi ||j< |j||j krg ||j |j< |jtjkr|j||j |j kr||j |j |j qL|jtjkr|j||j |j kr||j |j |j qL|jtj krP|j!||j |j kr||j |j |j! qL|jtj"kr|j#||j |j kr||j |j |j# qL|jtj$kr|j%||j |j kr||j |j |j% qL|jtj&kr|j'||j |j kr||j |j |j' n|jtj(krT|j)||j |j kr||j |j |j) n|jtj*kr|j+||j |j kr||j |j |j+ n~|jtj,kr|j-||j |j kr||j |j |j- n>|jtj.krL|j/||j |j krL||j |j |j/ qLq | d|jj d| dt0|jj ddt1| t1t0|jj  d	 | d | d t2|D ]}| d | d| dt0||  dt0|| j3 d t2|| j3D ]H}||| kr | | dt0|| |  d n| | d q| d q~| d q|
sD|rD| d d S )Nz# Model Test Coverage
real)kindzonnx/backend/test/data/light/z..zUnable to find model .z
model.onnxFr   Tr4   r3   r      z has z nodes. Of these, z are covered by node tests (g      Y@z%)


r5   z<summary>nodes</summary>

r6   z: z out of z attributes covered</summary>

z: 0
r7   z</details>


z+No model tests present for selected domain
)4r   r#   r
   url
startswithospathnormpathjoindirname__file__existsFileNotFoundErrorappendr   Zprepare_model_datasortr   Zopset_importr   graphnodeZop_typer    r!   	attributetyper   FLOATr   INTiSTRINGr   ZTENSORrA   ZGRAPHgZFLOATSZfloatsZINTSZintsZSTRINGSstringsZTENSORSZtensorsZGRAPHSZgraphsr:   r;   r9   
attributes)r   r   r   Zschema_dictZschemaattrsZmodel_pathsrtZ
model_nameZ	model_dirZmodel_writtenZmodel_pb_pathmodelZ
ml_presentZopsetZnum_coveredrW   attroprX   r   r   r   gen_model_test_coverage   s    





 @


($rf   c                 C  s   | d | d d S )Nz# Overall Test Coverage
z## To be filled.
r   )r   r   r   r   r   r   gen_overall_test_coverage   s    
rg   )r   r   c                 C  s   |  d d S )Nz.<!--- SPDX-License-Identifier: Apache-2.0 -->
r   )r   r   r   r   gen_spdx  s    rh   )r   c                  C  s  t jt jt jt jt jt} t j| d}t }t|}t j|d}t	|dddd<}t
| t|d t||d t||d t||d W 5 Q R X |rt j|d}t	|dddd<}t
| t|d	 t||d	 t||d	 t||d	 W 5 Q R X d S )
NZdocszTestCoverage.mdzw+ zutf-8)newlineencodingFzTestCoverage-ml.mdT)rL   rM   rP   realpathrQ   rO   r   Zget_all_schemasr   openrh   r   rE   rf   rg   )base_dirZdocs_dirr   Zhas_mlfnamer   r   r   r   main	  s*    "

rp   __main__)
__future__r   rL   typingr   r   r   Zonnxr   r   r   Zonnx.backend.test.caser	   Zonnx.backend.test.loaderr
   Zonnx.backend.test.runnerr   r   r   r    __annotations__r!   rE   rf   rg   rh   rp   __name__r   r   r   r   <module>   s$    pi
