§
    ŒWêj2)  ã                   ó  — 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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dS )é    N)ÚPath)Úextract_raw_data_from_modelÚhas_external_dataé   )ÚReplaceUpsampleWithResize)Ú	ONNXModel)Úadd_pre_process_metadataÚ&save_and_reload_model_with_shape_inferFéÿÿÿé   Ú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           	      óT	  — | €|                      dd¦  «        } | €J ‚|€
J d¦   «         ‚t          j        d¬¦  «        5 }t          |¦  «        }t	          | t
          j        ¦  «        r| nt          j        | ¦  «        }d}d„ |j        D ¦   «         }t          |¦  «        dk    rs|d	         j
        }|d
k    r`t          t          |¦  «        |¦  «                             ¦   «          t
          j                             |d¦  «        }t!          |¦  «        }d}|s_	 d	dlm} n"# t&          $ r}t'          d¦  «        |‚d}~ww xY wt(                               d¦  «         |                     |||||¦  «        }d}|�s¾| }|rDt/          |dz  ¦  «        }|	rt          j        ||d|
|d¬¦  «         nt          j        ||¦  «         t/          |dz  ¦  «        }	 t5          j        ¦   «         }||_        t4          j        j        |_        t	          |t
          j        ¦  «        rutA          |¦  «        rtC          d¦  «        ‚tE          |¦  «        \  }}| #                    tI          |¦  «        tI          |¦  «        ¦  «         | %                    ¦   «         }n|r|	r| &                    dd¦  «         t5          j'        ||dg¬¦  «        }~|rt          j        |¦  «        }nd}|} nU# tP          $ rH t(           )                    d¦  «         t(           )                    tU          j+        ¦   «         ¦  «         Y nw xY w|sá|�Ft/          |dz  ¦  «        } |	rt          j        || d|
|d¬¦  «         nt          j        || ¦  «         d}t	          | t
          j        ¦  «        r9t/          t          |¦  «        dz  ¦  «        } t          j        || d|
|d¬¦  «         t/          |dz  ¦  «        }t
          j,         -                    | |¦  «         t          j        |¦  «        }|€0t	          | t
          j        ¦  «        r| nt          j        | ¦  «        }ddd¦  «         n# 1 swxY w Y   t]          |¦  «         |	rt          j        ||d|
||d¬¦  «         dS t          j        ||¦  «         dS )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.)ÚprefixFc                 ó6   — g | ]}|j         r|j         d k    ¯|‘ŒS )zai.onnx)Údomain)Ú.0Úopsets     úš/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/onnxruntime/quantization/shape_inference.pyú
<listcomp>z%quant_pre_process.<locals>.<listcomp>R   s.   € ÐqÐqÐq EÀuÄ|ÐqÐW\ÔWcÐgpÒWpÐWp˜%ÐWpÐWpÐWpó    r   r   é
   é   T)ÚSymbolicShapeInferencez¨sympy is required for symbolic shape inference in quantization preprocessing. Install with: 'pip install sympy' or pass skip_symbolic_shape=True to quant_pre_process().z&Performing symbolic shape inference...zpreprocessed.onnx)r   r   Úsize_thresholdÚconvert_attributezoptimized.onnxzÒModelProto 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symbolic_shape_inferred.onnxzmodel_input.onnxzonnx_shape_inferred.onnx)r   r   Úlocationr(   r)   )/ÚpopÚtempfileÚTemporaryDirectoryr   Ú
isinstanceÚonnxÚ
ModelProtoÚloadÚopset_importÚlenÚversionr   r   ÚapplyÚversion_converterÚconvert_versionr
   Ú&onnxruntime.tools.symbolic_shape_inferr'   ÚImportErrorÚloggerÚinfoÚinfer_shapesÚ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Úmodel_updatedÚai_onnx_domainÚopset_versionr'   ÚeÚoptimization_input_modelÚopt_model_pathÚsess_optionÚexternal_namesÚexternal_valuesÚsessÚinferred_model_paths                                r"   Úquant_pre_processrc      sð  € ðV ÐØ'×+Ò+Ð,>ÀÑEÔEˆØÐ"Ð"Ð"àÐ(Ð(Ð*JÑ(Ô(Ð(å	Ô	$¨LÐ	9Ñ	9Ô	9ð Bh¸]Ý˜Ñ'Ô'ˆ	Ý)¨+µt´ÑGÔGÐc��ÍTÌYÐWbÑMcÔMcˆØˆð
 rÐq¨UÔ-?ÐqÑqÔqˆÝˆ~ÑÔ !Ò#Ð#Ø*¨1Ô-Ô5ˆMØ Ò"Ð"Ý)­)°EÑ*:Ô*:¸MÑJÔJ×PÒPÑRÔRÐRÝÔ.×>Ò>¸uÀbÑIÔI�Ý>¸uÑEÔE�Ø $�à"ð 	!ðØYÐYÐYÐYÐYÐYÐYøÝð ð ð Ý!ðqñô ð ðøøøøðøøøõ
 �KŠKÐ@ÑAÔAÐAØ*×7Ò7ØØØØ!Øñô ˆEð !ˆMà ñ 9	5à'2Ð$Øð ?å+.¨yÐ;NÑ/NÑ+OÔ+OÐ(Ø(ð 
?Ý”OØØ0Ø.2Ø0GØ'CØ*/ðñ ô ð ð õ ”I˜eÐ%=Ñ>Ô>Ð>å  Ð-=Ñ!=Ñ>Ô>ˆNð&5Ý)Ô8Ñ:Ô:�Ø7E�Ô4Ý7BÔ7YÔ7j�Ô4åÐ6½¼ÑHÔHð Ý(Ð)AÑBÔBð Ý(ðiñô ð õ
 7RÐRjÑ6kÔ6kÑ3�N OØ×9Ò9½$¸~Ñ:NÔ:NÕPTÐUdÑPeÔPeÑfÔfÐfØ/G×/YÒ/YÑ/[Ô/[Ð,Ð,ð )ð Ð-Bð Ø×8Ò8ØQÐShñô ð õ #Ô3Ø,¨kÐF\ÐE]ðñ ô �ð
 Ø"ð 1å œI nÑ5Ô5�E�Eà �EØ"0�KøøÝð 5ð 5ð 5Ý—’Øoñô ð õ —’�YÔ1Ñ3Ô3Ñ4Ô4Ð4Ð4Ð4ð	5øøøð ð !	3ð
 Ð Ý! )Ð.LÑ"LÑMÔM�Ø(ð 
2Ý”OØØ#Ø.2Ø0GØ'CØ*/ðñ ô ð ð õ ”I˜e [Ñ1Ô1Ð1Ø�å˜+¥t¤Ñ7Ô7ð 	Ý!¥$ }Ñ"5Ô"5Ð8JÑ"JÑKÔK�Ý”ØØØ*.Ø,CØ#?Ø&+ðñ ô ð õ #& iÐ2LÑ&LÑ"MÔ"MÐÝÔ ×2Ò2°;Ð@SÑTÔTÐTÝ”IÐ1Ñ2Ô2ˆEàˆ=Ý#-¨k½4¼?Ñ#KÔ#KÐg�K�KÕQUÔQZÐ[fÑQgÔQgˆEðEBhð Bhð Bhñ Bhô Bhð Bhð Bhð Bhð Bhð Bhð Bhøøøð Bhð Bhð Bhð BhõH ˜UÑ#Ô#Ð#àð ,ÝŒØØØ"&Ø$;Ø+Ø7Ø#ð	
ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	Œ	�%Ð*Ñ+Ô+Ð+Ð+Ð+s^   ¾CQÄD!Ä QÄ!
E Ä+D;Ä;E Å BQÇDK$Ë#QË$AL6Ì3QÌ5L6Ì6DQÑQÑ!Q)NNFFFFr   Fr   FFNr   )Úloggingr.   rP   Úpathlibr   r1   rB   Ú#onnxruntime.transformers.onnx_utilsr   r   Úfusionsr   Ú
onnx_modelr   Úquant_utilsr	   r
   Ú	getLoggerÚ__name__r<   r?   r2   ÚboolÚintrc   © r$   r"   ú<module>ro      s¸  ðð €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à Ð Ð Ð Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^à .Ð .Ð .Ð .Ð .Ð .Ø !Ð !Ð !Ð !Ð !Ð !Ø YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yà	ˆÔ	˜8Ñ	$Ô	$€ð 8<Ø+/Ø#Ø!Ø %ØØØ#ØØ"'Ø$)Ø)-Ø(,ðB,ð B,Ø�t‘˜dœoÑ-°Ñ4ðB,à˜T‘z DÑ(ðB,ð ðB,ð ð	B,ð
 ðB,ð ðB,ð ðB,ð ðB,ð ðB,ð  ðB,ð "ðB,ð   $™JðB,ð #&ðB,ð 
ðB,ð B,ð B,ð B,ð B,ð B,r$   