o
    e!                     @   s  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
ee dedee fddZedZedZedZd
ee dedee fddZedZedZd
ee dee fddZdedededededdfddZd ed!edededef
d"d#Zejeje fd$ed%edefd&d'Z!d3d*eded+ed,ed-ededdfd.d/Z"d4d0d1Z#e$d2kre#  dS dS )5    N)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*$linesonnx_mlreturnc                 c   s    d}| D ]K}t |rd|ksJ d}qt|r#d|ks J d}qt|r5d|ks2d|ks2J d}qd|kr=|V  qd|krG|rG|V  qd|krP|sP|V  qd S )Nr         )IF_ONNX_ML_REGEXmatchELSE_ONNX_ML_REGEXENDIF_ONNX_ML_REGEX)r   r   Zin_ifline r   >D:\Projects\ConvertPro\env\Lib\site-packages\onnx/gen_proto.pyprocess_ifs#   s(   


r   z#(\s*)import\s*"([^"]*)\.proto";\s*$z\{PACKAGE_NAME\}z(.*)\-mlpackage_namec                 c   s    |t k}| D ]@}|rt|nd }|r@|d}t|}|r,|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(.*)$c                 c   s    | D ]?}t |}|r|dd V  qt|}|r(|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_proto3Q   s    


r"   protoc_pathproto3_pathinclude_pathcpp_out
python_outc                 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_codeh   s   r,   sourceprotoc                 C   sH   |   }t||d}t||d}|dkrt|}n|dksJ d|S )N)r   )r      r	   
)
splitlinesr   r   r"   join)r-   r.   r   r   r   r   r   r   	translateo   s   

r3   fpardirc                 C   s   t j|| S )N)ospathr2   )r4   r5   r   r   r   qualifyz   s   r8   F stemoutput
do_onnx_mllitec                 C   sj  t |  d}|tk}|}d|v rd}|r%|r|  d| dn|  d}	n|r.|  d| n|  }	t |	 d|d}
t |	 d|d}td	|  t|}| }td
|
  t|
ddd}|t |t|d||d |ry|t W d    n1 sw   Y  td
|  t|ddd}|t |t|d||d |r|t W d    n1 sw   Y  |rt	j
|}t	j
|}t||||| tt	j
|d}|D ]}td|  t	| q|r3|rt |  d|d}n	t |  d|d}td
|  t|ddd}|d |d|	 d W d    n	1 s.w   Y  W d    n	1 s>w   Y  t | dd d|d}|rat |	dd d|d}n|rrt | dd d|d}nt | dd d|d}td|  t|d}|ttdt	j
t	j
|d  W d    d S 1 sw   Y  d S )Nz	.in.proto	onnx-dataFr   r   z.proto)r5   z.proto3zProcessing zWriting wr9   )newliner	   )r.   r   r   r/   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 zg        # This file is generated by setup.py. DO NOT EDIT!


        from .{} import *  # noqa
        r   )r8   r   r(   openreadwriteautogen_headerr3   LITE_OPTIONr6   r7   dirnamer,   globr2   removereplacestrr   formatsplitextbasename)r:   r   r;   r<   r=   r#   Zproto_inr   Z	import_mlZ
proto_baser.   Zproto3Zfinr-   ZfoutZ
porto3_dirbase_dirZ	pb3_filesZpb3_fileZproto_headerZpb_pyZpb2_pyr4   r   r   r   convert~   sx    





#

$rP   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g ddd |  }tj	|j
sVt|j
 |jD ]}t||j|j
|j|j|jd qYd 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)actionrS   z-lz--litez-generate lite proto to use with protobuf-litez-oz--outputz'output directory (default: %(default)s)z--protoc_pathr9   z)path to protoc for proto3 file validationstems*)r   zonnx-operatorsr>   z3list of .in.proto file stems (default: %(default)s))nargsrR   rS   )r   r;   r<   r=   r#   )argparseArgumentParseradd_argumentr6   r7   realpathrG   __file__
parse_argsexistsr;   makedirsrV   rP   packager   r=   r#   )parserargsr:   r   r   r   main   sB   


rd   __main__)FFr9   )r   N)%rY   r6   rerH   r*   textwrapr   typingr   rE   rF   r   compiler
   r   r   rK   boolr   r   r   r   r   r    r!   r"   r,   intr3   r7   r\   rG   r]   r8   rP   rd   __name__r   r   r   r   <module>   s:   







"*(
H 
