U
    qh!                  	   @  s\  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 dZdZdZedZed	Zed
ZddddddZedZedZedZddddddZedZedZdddddZdddddddddZdd dddd!d"d#Zd1dd$dd%d&d'Zd2dddddddd*d+d,Zdd-d.d/Zed0krXe  dS )3    )annotationsN)dedent)IterablezV//
// WARNING: This file is automatically generated!  Please edit onnx.in.proto.
//


zB

// For using protobuf-lite
option optimize_for = LITE_RUNTIME;

onnxz\s*//\s*#if\s+ONNX-ML\s*$z\s*//\s*#endif\s*$z\s*//\s*#else\s*$zIterable[str]bool)linesonnx_mlreturnc                 c  s   d}| D ]}t |r(|dks"td}qt|rD|dks>td}qt|rh|dksb|dksbtd}q|dkrx|V  q|dkr|r|V  q|dkr|s|V  qd S )Nr         )IF_ONNX_ML_REGEXmatchAssertionErrorELSE_ONNX_ML_REGEXENDIF_ONNX_ML_REGEX)r   r   Zin_ifline r   2/tmp/pip-unpacked-wheel-xnis5xre/onnx/gen_proto.pyprocess_ifs$   s"    


r   z#(\s*)import\s*"([^"]*)\.proto";\s*$z\{PACKAGE_NAME\}z(.*)\-mlstr)r   package_namer	   c                 c  s   |t k}| D ]}|rt|nd }|r~|d}t|}|rV|d d| d}n| d| }|dd| d V  qt||V  qd S )Nr   r
   _-mlimport "z.proto";)DEFAULT_PACKAGE_NAMEIMPORT_REGEXr   groupML_REGEXPACKAGE_NAME_REGEXsub)r   r   need_renamer   mZinclude_namemlr   r   r   process_package_name>   s    

r#   z"(\s*)syntax\s*=\s*"proto2"\s*;\s*$z(\s*)optional\s(.*)$)r   r	   c                 c  s   | D ]~}t |}|r(|dd V  qt|}|rN|d|d V  qt|}|r||dd|d d V  q|V  qd S )Nr
   zsyntax = "proto3";r   r   z	.proto3";)PROTO_SYNTAX_REGEXr   r   OPTIONAL_REGEXr   )r   r   r!   r   r   r   convert_to_proto3R   s    


r&   None)protoc_pathproto3_pathinclude_pathcpp_out
python_outr	   c                 C  s:   t d|   | |d|g}|d|d|g t| d S )NzGenerate pb3 code using z-Iz	--cpp_outz--python_out)printextend
subprocess
check_call)r(   r)   r*   r+   r,   Z
build_argsr   r   r   gen_proto3_codei   s    r1   int)sourceprotor   r   r	   c                 C  sH   |   }t||d}t||d}|dkr2t|}n|dks>td|S )N)r   )r      r   
)
splitlinesr   r#   r&   r   join)r3   r4   r   r   r   r   r   r   	translater   s    
r9   z
str | None)fpardirr	   c                 C  s*   |d krt jt jt}t j|| S )N)ospathrealpathdirname__file__r8   )r:   r;   r   r   r   qualify}   s    rA   F )stemr   output
do_onnx_mlliter(   r	   c              
   C  s  t |  d}|tk}|}d|kr&d}|rJ|r>|  d| dn|  d}	n|r\|  d| n|  }	t |	 d|d}
t |	 d|d}td	|  t|d
d}| }td|
  t|
ddd
d4}|t |t|d||d |r|t W 5 Q R X td|  t|ddd
d6}|t |t|d||d |rT|t W 5 Q R X |rt	j
|}t	j
|}t||||| tt	j
||	 d}|D ]}td|  t	| q|rB|rt |  d|d}nt |  d|d}td|  t|ddd
d"}|d |d|	 d W 5 Q R X W 5 Q R X t | dd d|d}|rt |	dd d|d}n<|rt | dd d|d}nt | dd d|d}td|  t|dd
d0}|tdt	j
t	j
|d   d! W 5 Q R X d S )"Nz	.in.proto	onnx-dataFr   r   z.proto)r;   z.proto3zProcessing zutf-8)encodingzWriting wrB   )newlinerH   r   )r4   r   r   r5   z	.proto3.*z	Removing z-ml.pb.hz.pb.hz#pragma once
z
#include "z.pb.h"
-z_pb.pyz_pb2.pyz
_ml_pb2.pyzgenerating z[                # This file is generated by setup.py. DO NOT EDIT!


                from .r   z" import *  # noqa
                )rA   r   r-   openreadwriteautogen_headerr9   LITE_OPTIONr<   r=   r?   r1   globr8   removereplacer   splitextbasename)rC   r   rD   rE   rF   r(   Zproto_inr    Z	import_mlZ
proto_baser4   Zproto3Zfinr3   ZfoutZ
porto3_dirbase_dirZ	pb3_filesZpb3_fileZproto_headerZpb_pyZpb2_pyr:   r   r   r   convert   sx     


&rW   )r	   c               	   C  s   t jdd} | jddddd | jdd	d
dd | jddd
dd | jddtjtjtdd | jdddd | jdddddgdd |  }tj	|j
st|j
 |jD ]"}t||j|j
|j|j|jd qd S )Nz/Generates .proto file variations from .in.proto)descriptionz-pz	--packager   z@package name in the generated proto files (default: %(default)s))defaulthelpz-mz--ml
store_truezML mode)actionrZ   z-lz--litez-generate lite proto to use with protobuf-litez-oz--outputz'output directory (default: %(default)s)z--protoc_pathrB   z)path to protoc for proto3 file validationstems*zonnx-operatorsrG   z3list of .in.proto file stems (default: %(default)s))nargsrY   rZ   )r   rD   rE   rF   r(   )argparseArgumentParseradd_argumentr<   r=   r>   r?   r@   
parse_argsexistsrD   makedirsr]   rW   packager"   rF   r(   )parserargsrC   r   r   r   main   sZ      
ri   __main__)N)FFrB   ) 
__future__r   r`   rQ   r<   rer/   textwrapr   typingr   rO   rP   r   compiler   r   r   r   r   r   r   r#   r$   r%   r&   r1   r9   rA   rW   ri   __name__r   r   r   r   <module>   s>   







	
   W0
