
    `i'                     8    S SK r SSKJr  S SKJr   " S S5      rg)    N   )find_by_name)Pathc                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS!S jrS!S jrS!S jrS rS rS rS"S jr\S 5       rS r\S 5       rS rS r S r!S r"g)#	ONNXModel   c                     Xl         0 U l        g Nmodelnode_name_counter)selfr   s     h/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/quantization/onnx_model.py__init__ONNXModel.__init__   s    
!#    c                 B    U R                   R                  R                  $ r
   )r   graphnoder   s    r   nodesONNXModel.nodes   s    zz$$$r   c                 B    U R                   R                  R                  $ r
   )r   r   initializerr   s    r   r   ONNXModel.initializer   s    zz+++r   c                 .    U R                   R                  $ r
   )r   r   r   s    r   r   ONNXModel.graph   s    zzr   c                 .    U R                   R                  $ r
   )r   
ir_versionr   s    r   r   ONNXModel.ir_version   s    zz$$$r   c                 .    U R                   R                  $ r
   )r   opset_importr   s    r   r"   ONNXModel.opset_import   s    zz&&&r   c                     XR                   R                  R                  ;   a0  U R                   R                  R                  R                  U5        g g r
   )r   r   r   remover   r   s     r   remove_nodeONNXModel.remove_node   s;    ::##(((JJ!!((. )r   c                 8    U H  nU R                  U5        M     g r
   )r'   )r   nodes_to_remover   s      r   remove_nodesONNXModel.remove_nodes   s    #DT" $r   c                 d    U R                   R                  R                  R                  U/5        g r
   r   r   r   extendr&   s     r   add_nodeONNXModel.add_node"   s"    

$$dV,r   c                 b    U R                   R                  R                  R                  U5        g r
   r.   )r   nodes_to_adds     r   	add_nodesONNXModel.add_nodes%   s     

$$\2r   c                     [        UR                  U R                  R                  R                  5      c1  U R                  R                  R                  R                  U/5        g g r
   )r   namer   r   r   r/   )r   tensors     r   add_initializerONNXModel.add_initializer(   sI    TZZ%5%5%A%ABJJJ((//9 Kr   c                 z    U R                   R                  R                   H  nUR                  U:X  d  M  Us  $    g r
   )r   r   r   r7   )r   r7   r8   s      r   get_initializerONNXModel.get_initializer,   s2    jj&&22F{{d" 3 r   c                    XR                   R                  R                  ;   a  U R                   R                  R                  R                  U5        U R                   R                  R                   HN  nUR
                  UR
                  :X  d  M  U R                   R                  R                  R                  U5          g    g g r
   )r   r   r   r%   inputr7   )r   r8   r?   s      r   remove_initializerONNXModel.remove_initializer2   s    ZZ%%111JJ((//7))//::,JJ$$**11%8 0 2r   c                 8    U H  nU R                  U5        M     g r
   )r@   )r   init_to_remover   s      r   remove_initializersONNXModel.remove_initializers:   s    )K##K0 *r   c                     0 nU R                   R                  R                   H5  nUR                   H"  nX1;  a  U/X'   M  X   R	                  U5        M$     M7     U$ r
   )r   r   r   r?   append)r   input_name_to_nodesr   
input_names       r   rH   ONNXModel.input_name_to_nodes>   sZ     JJ$$))D"jj
87;f'3'3::4@	 ) * #"r   c                     0 nU R                   R                  R                   H  nUR                   H  nX!U'   M	     M     U$ r
   )r   r   r   output)r   output_name_to_noder   output_names       r   rM   ONNXModel.output_name_to_nodeH   s@     JJ$$))D#{{37K0  + * #"r   Nc                     Uc  U R                  5       n/ nUR                   H&  nXB;   d  M
  X$    H  nUR                  U5        M     M(     U$ r
   )rH   rL   rG   )r   r   rH   childrenrL   s        r   get_childrenONNXModel.get_childrenO   sP    &"&":":"<kkF,/7DOOD) 8 " r   c                     Uc  U R                  5       n/ nUR                   H  nXB;   d  M
  UR                  X$   5        M     U$ r
   )rM   r?   rG   )r   r   rM   parentsr?   s        r   get_parentsONNXModel.get_parentsZ   sG    &"&":":"<ZZE+29:   r   c                     Uc  U R                  5       n[        UR                  5      U::  a  g UR                  U   nXC;  a  g X4   $ r
   )rM   lenr?   )r   r   idxrM   r?   s        r   
get_parentONNXModel.get_parentd   sI    &"&":":"<tzz?c!

3+"))r   c                 h    [        UR                  5      nUR                  U5        [        X5      nU$ )z
Find out if a node exists in a graph or a node is in the 
new set of nodes created during quantization. Return the node found.
)listr   r/   r   )r   	node_namenew_nodes_listr   graph_nodes_listr   s         r   find_node_by_nameONNXModel.find_node_by_nameq   s0    
  

+/I8r   c                     / nUR                    H8  nUR                   H%  nXRR                  :X  d  M  UR                  U5        M'     M:     U$ )z4
Find all nodes with given initializer as an input.
)r   r?   r7   rG   )r   r   r   r   r   
node_inputs         r   find_nodes_by_initializer#ONNXModel.find_nodes_by_initializer{   sD     JJD"jj
!1!11LL& )  r   c           	      x   / nU R                  5        GH[  nUR                  S:X  Ga5  SnSnSnSnUR                   H  nUR                  S:X  a!  [        R
                  R                  U5      nM4  UR                  S:X  a!  [        R
                  R                  U5      nMe  UR                  S:X  a!  [        R
                  R                  U5      nM  UR                  S:X  d  M  [        R
                  R                  U5      nM     US:X  Ga;  US:X  Ga4  US:X  Ga-  UR                  S   nUS:X  a  U R                  UR                  S   5      n	U	(       a|  [        R                  R                  U	5      n
[        R                  R                  U
R                  5      nU	R                  Ul        U R                  U	5        U R                  U5        ORUS	-  n[        R
                  R                  S
UR                  S   /U/UR                  S-   S9nUR!                  U5        [        R
                  R                  SUR                  S   U/UR"                  S   [%        UR                  5      S:  a  SOS-   /UR                  (       a  UR                  S-   OSS9nUR!                  U5        [%        UR                  5      S:  a}  [        R
                  R                  SUR"                  S   S-   UR                  S   /UR"                  UR                  (       a  UR                  S-   OSS9nUR!                  U5        GM3  GM6  UR!                  U5        GMJ  UR!                  U5        GM^     U R'                  5       R)                  S5        U R'                  5       R*                  R-                  U5        g )NGemmg      ?r   alphabetatransAtransBr   _Transposed	Transpose
_Transpose)inputsoutputsr7   MatMul   _MatMul Add_Addr   )r   op_type	attributer7   onnxhelperget_attribute_valuer?   r<   numpy_helperto_array
from_arrayTr@   r9   	make_noderG   rL   rY   r   
ClearFieldr   r/   )r   	new_nodesr   rj   rk   rl   rm   attrinputBBB_arrayB_transtranspose_nodematmul_noder0   s                  r   replace_gemm_with_matmul"ONNXModel.replace_gemm_with_matmul   s   	JJLD||v% NNDyyG+ $ ? ? Ef,#{{>>tDh.!%!@!@!Fh.!%!@!@!F + C<DCKFaK!ZZ]F{ 00A?&*&7&7&@&@&CG&*&7&7&B&B799&MG+,66GL 33A6 009"m3F-1[[-B-B;KO::VW=/LR8HL		T`H` .C .bN &,,^<"&++"7"7  $

1v6!%QDJJRS@S9Y[!\ ]6:iiTYY2R	 #8 #IK
 $$[14::*#';;#8#8AEQR[A[]a]g]ghi]j@kAETXT]T]dii&>Pce $9 $g "((2 + $$T*   &m !p 	

'

  +r   c                     U(       a?  [         R                  R                  U R                  S[	        U5      R
                  S-   S9  [         R                  " U R                  U5        g)zC
Save model to external data, which is needed for model size > 2GB
Tz.data)all_tensors_to_one_filelocationN)r{   external_data_helperconvert_model_to_external_datar   r   r7   
save_model)r   output_pathuse_external_data_formats      r   save_model_to_fileONNXModel.save_model_to_file   sT     $%%DDTZZ]aNRS^N_NdNdgnNn E p 	

K0r   c                     [        U[        5      (       a  [        U[        5      (       d   e[        [        U R                  5      5       H&  nU R                  U   U:X  d  M  X R                  U'   M(     g r
   )
isinstancestrrangerY   r?   )r   old_input_namenew_input_namejs       r   replace_node_inputONNXModel.replace_node_input   sS    .#..:nc3R3RRRs4::'Azz!}. .

1 (r   c                 ~    U R                   R                  R                   H  n[        R	                  X1U5        M     g r
   )r   r   r   r   r   )r   r   r   r   s       r   replace_input_of_all_nodes$ONNXModel.replace_input_of_all_nodes   s,    JJ$$))D((~N *r   c                     [        U[        5      (       a  [        U[        5      (       d   e[        [        U R                  5      5       H&  nU R                  U   U:X  d  M  X R                  U'   M(     g r
   )r   r   r   rY   rL   )r   old_output_namenew_output_namer   s       r   replace_node_outputONNXModel.replace_node_output   sU    /3//JPS4T4TTTs4;;'(A{{1~0!0A )r   c                 ~    U R                   R                  R                   H  n[        R	                  X1U5        M     g r
   )r   r   r   r   r   )r   r   r   r   s       r   replace_output_of_all_nodes%ONNXModel.replace_output_of_all_nodes   s,    JJ$$))D))$Q *r   c                    U R                  5       n/ nU R                  5       nU H`  nUR                  S:X  d  M  U R                  UR                  S   5      (       a  M:  UR                  S   U;  d  MO  UR                  U5        Mb     U R                  U5        / nU R                  5        H  nUR                  U;  d  M  U R                  UR                  5      (       a  M7  UR                  U5        U R                  5       R                   HH  nUR                  UR                  :X  d  M  U R                  5       R                  R                  U5        MJ     M     U R                  U5        g )NConstantr   )rH   r   ry   is_graph_outputrL   rG   r+   r   r7   r   r?   r%   rD   )r   rH   unused_nodesr   r   ununsed_weightswgraph_inputs           r   remove_unused_constant ONNXModel.remove_unused_constant   s   "668 

D||z)$2F2FKKN3$ 3$(,A>Q(Q##D) 
 	,'!!#Avv009M9Maff9U9U&&q)#'::<#5#5K"''1661

**11+> $6	 $ 	  1r   c                 v    U R                   R                  R                   H  nUR                  U:X  d  M    g   g)NTF)r   r   rL   r7   )r   rN   rL   s      r   r   ONNXModel.is_graph_output   s0    jj&&--F{{k) . r   r   r
   )F)#__name__
__module____qualname____firstlineno__r   r   r   r   r   r"   r'   r+   r0   r4   r9   r<   r@   rD   rH   rM   rR   rV   r[   rb   rf   r   r   staticmethodr   r   r   r   r   r   __static_attributes__ r   r   r   r      s    $%, %'/#-3:1##	*	<,|1 / /O 1 1R20r   r   )r{   quant_utilsr   pathlibr   r   r   r   r   <module>r      s     % z zr   