
    pi&                     4   d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
mZ ddlmZ ddlmZ ddlmZmZ  e j&                  e      Z	 	 	 	 	 	 	 	 	 	 	 	 	 dd	eez  ej.                  z  dz  d
eez  dz  dededededededededededz  deddfdZy)    N)Path)SymbolicShapeInference)extract_raw_data_from_modelhas_external_data   )ReplaceUpsampleWithResize)	ONNXModel)add_pre_process_metadata&save_and_reload_model_with_shape_inferinput_modeloutput_model_pathskip_optimizationskip_onnx_shapeskip_symbolic_shape
auto_mergeint_maxguess_output_rankverbosesave_as_external_dataall_tensors_to_one_fileexternal_data_locationexternal_data_size_thresholdreturnc           	      	   | |j                  dd      } | J |J d       t        j                  d      5 }t        |      }d}|s_t        j                  d       t        | t        j                        r| nt        j                  |       }t        j                  |||||      }|r|j                  D cg c]   }|j                  r|j                  dk(  s|" }}t        |      dk(  r|d	   j                  }|d
k  rt!        t#        |      |      j%                          |j                  j'                  |d	          d}|j                  j)                  t        j*                  j-                  d|      g       t        j.                  j1                  ||      }t3        |      }|s4|sDt5        |dz        } |	rt        j6                  || d|
|d       nt        j8                  ||        d}t5        |dz        }	 t;        j<                         }||_        t:        j@                  jB                  |_"        t        | t        j                        rYtG        |       rtI        d      tK        |       \  }}|jM                  tO        |      tO        |             | jQ                         } n|r|	r|jS                  dd       t;        jT                  | |dg      }~|} |s|Dt5        |dz        } |	rt        j6                  || d|
|d       nt        j8                  ||        d}t        | t        j                        r2t5        t        |      dz        } t        j6                  || d|
|d       t5        |dz        }t        j^                  ja                  | |       t        j                  |      }ddd       1t        | t        j                        r| nt        j                  |       }tc        |       |	rt        j6                  ||d|
||d       yt        j8                  ||       yc c}w # tV        $ r@ t        jY                  d       t        jY                  t[        j\                                Y w xY w# 1 sw Y   xY w)a  Shape inference and model optimization, in preparation for quantization.

    Args:
        input_model: Path to the input model file or ModelProto
        output_model_path: Path to the output model file
        skip_optimization: Skip model optimization step if true. This may result in ONNX shape
            inference failure for some models.
        skip_onnx_shape: Skip ONNX shape inference. Symbolic shape inference is most effective
            with transformer based models. Skipping all shape inferences may
            reduce the effectiveness of quantization, as a tensor with unknown
            shape can not be quantized.
        skip_symbolic_shape: Skip symbolic shape inference. Symbolic shape inference is most
            effective with transformer based models. Skipping all shape
            inferences may reduce the effectiveness of quantization, as a tensor
            with unknown shape can not be quantized.
        auto_merge: For symbolic shape inference, automatically merge symbolic dims when
            conflict happens.
        int_max: For symbolic shape inference, specify the maximum value for integer to be
            treated as boundless for ops like slice
        guess_output_rank: Guess output rank to be the same as input 0 for unknown ops
        verbose: Logs detailed info of inference, 0: turn off, 1: warnings, 3: detailed
        save_as_external_data: Saving an ONNX model to external data
        all_tensors_to_one_file: Saving all the external data to one file
        external_data_location: The file location to save the external file
        external_data_size_threshold: The size threshold for external data
    Ninput_model_pathzoutput_model_path is required.z
pre.quant.)prefixz&Performing symbolic shape inference...zai.onnxr   r   
       zsymbolic_shape_inferred.onnxTF)r   r   size_thresholdconvert_attributezoptimized.onnxzModelProto has external data not loaded into memory, ORT cannot create session. Please load external data before calling this function. See https://onnx.ai/onnx/repo-docs/ExternalData.html for more information.z7session.optimized_model_external_initializers_file_namezoptimized.onnx.dataCPUExecutionProvider)	providerszYONNX Runtime Model Optimization Failed! Consider rerun with option `--skip_optimization'.zmodel_input.onnxzonnx_shape_inferred.onnx)r   r   locationr    r!   )2poptempfileTemporaryDirectoryr   loggerinfo
isinstanceonnx
ModelProtoloadr   infer_shapesopset_importdomainlenversionr   r	   applyremoveextendhelpermake_opsetidversion_converterconvert_versionr   str
save_modelsaveonnxruntimeSessionOptionsoptimized_model_filepathGraphOptimizationLevelORT_ENABLE_BASICgraph_optimization_levelr   
ValueErrorr   add_external_initializerslistSerializeToStringadd_session_config_entryInferenceSession	Exceptionerror	traceback
format_excshape_inferenceinfer_shapes_pathr
   )r   r   r   r   r   r   r   r   r   r   r   r   r   deprecated_kwargsquant_tmp_dir	temp_pathmodelloaded_modelopsetai_onnx_domainopset_versionopt_model_pathsess_optionexternal_namesexternal_valuessessinferred_model_paths                              j/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/onnxruntime/quantization/shape_inference.pyquant_pre_processr^      s>   V '++,>E"""(J*JJ(		$	$L	9 t3]'	"KK@A*4[$//*R;X\XaXabmXnL*77!E 161C1Cu5<<[`[g[gkt[teuNu>"a' .q 1 9 9 2%-i.>NTTV&&--nQ.?@$&M&&--t{{/G/GM/Z.[\ 22BB5-XEB5IE &!).L"LM(OO#.20G'C*/ IIe[1 -=!=>N5)88:7E47B7Y7Y7j7j4k4??;(5(i 
 7RR]6^3NO99$~:NPTUdPef"-"?"?"AK )-B88QSh #33KYoXpq  )K
  !).L"LM(OO#.20G'C*/ IIe[1+t7!$}"58J"JK*.,C#?&+ #&i2L&L"M  22;@STII12Eit3l })+tGTYYWbMcU#"&$;+7#	
 			%*+g vp  5o Y1134	5Wt3 t3sL   A?R7 P2P2D#R CP7CR2R7AR <R?R  RR)NNFFFFiFr   FFNi   )loggingr&   rK   pathlibr   r+   r=   &onnxruntime.tools.symbolic_shape_inferr   #onnxruntime.transformers.onnx_utilsr   r   fusionsr   
onnx_modelr	   quant_utilsr
   r   	getLogger__name__r(   r:   r,   boolintr^        r]   <module>rl      s         I ^ . ! Y			8	$ 8<+/#! %#"'$))-(,w,tdoo-4w,TzD(w, w, 	w,
 w, w, w, w, w,  w, "w,  $Jw, #&w, 
w,rk   