Ë
    ÄÓ^j«²  ã                   ó  — d dl mZ d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d	d
lmZmZmZ d	dlmZmZmZmZmZmZmZmZmZmZ dedede dz  fd„Z!dededede de de de de de de"de"de dz  defd„Z#dede$ee%e e f   f   de$ee%e e f   f   dede defd„Z&deded ed!ed"ejN                  e(z  d#ejN                  e"z  d$e defd%„Z)ded&edee*e   z  d'ed ed!ed(e ded)e$e e+e   f   dee*e   z  fd*„Z,ded'ed ed!edef
d+„Z-d,ed'ed-e"de.fd.„Z/d/ee*e   z  d0ee*e   z  dz  d,ed'ed ed(e defd1„Z0d/ee*e   z  d0ee*e   z  dz  ded'ed ed(e defd2„Z1	 d8d3e d'ed4e d ed5e$e e%eef   f   ded6e.d)e$e e+e   f   dz  defd7„Z2y)9é    )ÚCallable)ÚAnyN)Úget_node_type_to_io_type_map)Úget_new_attr_name_with_prefix)Ú_is_activation_post_process)ÚGraphModuleÚmap_arg)ÚGraphÚNodeé   )ÚNSNodeTargetTypeÚNSSingleResultValuesTypeÚ
NSSubgraph)
Ú get_arg_indices_of_inputs_to_logÚ$get_node_first_input_and_output_typeÚget_node_input_qparamsÚget_normalized_nth_inputÚget_number_of_non_param_argsÚget_target_type_strÚgetattr_from_fqnÚNodeInputOrOutputTypeÚop_type_supports_shadowingÚreturn_first_non_observer_nodeÚnodeÚgmÚreturnc                 óN  — d }t        |d«      r–| }| j                  dk(  rit        | j                  t        «      s!t        dt        | j                  «      › �«      ‚t        || j                  «      }t        |«      rt        | |d«      }|j                  |j                     d   }|S )NÚ_node_name_to_scopeÚcall_moduleúExpected str, got r   )ÚhasattrÚopÚ
isinstanceÚtargetÚstrÚAssertionErrorÚtyper   r   r   r   Úname)r   r   ÚfqnÚnode_to_use_for_fqnÚmodules        úf/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/ao/ns/fx/graph_passes.pyÚ_maybe_get_fqnr-      s™   € Ø
€CÜˆrÐ(Ô)ð #ÐØ�7‰7�mÒ#Ü˜dŸk™k¬3Ô/Ü$Ð'9¼$¸t¿{¹{Ó:KÐ9LÐ%MÓNÐNÜ% b¨$¯+©+Ó6ˆFÜ*¨6Ô2Ü&>¸tÀRÈÓ&KÐ#Ø×$Ñ$Ð%8×%=Ñ%=Ñ>¸qÑAˆØ€Jó    Ú
logger_clsÚlogger_node_name_suffixÚref_node_nameÚ
model_nameÚref_nameÚref_node_target_typeÚresults_typeÚindex_within_argÚindex_of_argr)   c                 óè   —  t        | j                  |z   «      |«      }t        | |«      } ||| j                  ||||||	|
|«
      }t        |||«       | j                  j                  d|| fi «      }|S )zÒ
    Given a starting graph of

    prev_node -> node -> next_node

    This function creates a new logger_cls obj and adds it
    after node, resulting in

    prev_node -> node -> logger_obj -> next_node
    r   )r   r(   r   ÚsetattrÚgraphÚcreate_node)r   r   r/   r0   r1   r2   r3   r4   r5   r6   r7   r)   Úlogger_node_nameÚtarget_typeÚ
logger_objÚlogger_nodes                   r,   Ú_insert_logger_after_noder@   ,   s”   € ð2Ô4Ø�	‰	Ð+Ñ+óàó
Ðô & d¨BÓ/€KáØØ�	‰	ØØØØØØØØó€Jô ˆBÐ  *Ô-Ø—*‘*×(Ñ(¨Ð8HÈ4È'ÐSUÓV€KØÐr.   Ú*node_to_instrument_inputs_to_ref_node_nameÚ+node_to_instrument_outputs_to_ref_node_namec                 ó®  ‡— t        «       }i Šˆfd„}| j                  j                  D �]  }|j                  dk(  r'|j	                  t        t        || d«      |«      «       Œ:||v s||v �r»t        || «      }||v �r(||   \  }	}
t        |«      }|D �]  }t        || |«      }t        |«      t        u rV‰|j                     }t        || |d|j                  ||	|
t        j                  j                  d||¬«      ‰|j                  <   Œxt        |«      t         j"                  j$                  j&                  u sŒ¨t)        |«      D ]Z  \  }}‰|j                     }t        || |d|j                  ||	|
t        j                  j                  |||¬«      ‰|j                  <   Œ\ �Œ |j+                  ||«      ‰|j                  <   ||v s�Œ¡||   \  }	}
t        ‰|j                     | |d|j                  ||	|
t        j,                  j                  dd|¬«      ‰|j                  <   �Œþ|j+                  ||«      ‰|j                  <   �Œ t/        | |«      }|S )z’
    Takes the graph of gm, adds loggers to the output
    of each node in nodes_to_instrument. Returns a GraphModule with the new
    graph.
    c                 ó"   •— t        | ˆfd„«      S )Nc                 ó"   •— ‰| j                      S ©N©r(   )r   Úenvs    €r,   ú<lambda>z8add_loggers_to_model.<locals>.load_arg.<locals>.<lambda>m   s   ø€  s¨4¯9©9¡~€ r.   ©r	   )ÚarH   s    €r,   Úload_argz&add_loggers_to_model.<locals>.load_argl   s   ø€ Ü�qÓ5Ó6Ð6r.   Úoutputr   Ú_ns_logger_©r6   r7   r)   )r
   r:   Únodesr"   rM   r	   r   r-   r   r'   r   r(   r@   r   Ú
NODE_INPUTÚvalueÚtorchÚfxÚimmutable_collectionsÚimmutable_listÚ	enumerateÚ	node_copyÚNODE_OUTPUTr   )r   rA   rB   r/   r2   Ú	new_graphrL   r   r)   r3   Úref_node_typeÚarg_indices_to_logÚnode_arg_idxÚnode_argÚ	prev_nodeÚarg_idxÚargÚnew_gmrH   s                     @r,   Úadd_loggers_to_modelrc   \   sk  ø€ ô “€IØ€Cô7ð —‘—‘ó TAˆØ�7‰7�hÒØ×ÑœWÔ%=¸dÀBÈÓ%JÈHÓUÔVØàÐ>Ñ>ØÐ?Ò?ä   rÓ*ˆCàÐAÒAØ*TØñ+Ñ'�˜-ô &FÀdÓ%KÐ"Ø$6ó &�LÜ7¸¸bÀ,ÓO�HÜ˜H“~¬Ñ-à$'¨¯©Ñ$6˜	Ü-FØ%ØØ&Ø)Ø ŸI™IØ&Ø$Ø)Ü4×?Ñ?×EÑEØ-.Ø)5Ø #ô.˜˜HŸM™MÒ*ô ˜X›¬%¯(©(×*HÑ*H×*WÑ*WÒWô -6°hÓ,?ò ™L˜G SØ(+¨C¯H©H©˜IÜ2KØ )Ø "Ø *Ø -Ø $§	¡	Ø *Ø (Ø -Ü 8× CÑ C× IÑ IØ18Ø-9Ø$'ô3˜C 	§¡Ò/òð/&ðT '×0Ñ0°°xÓ@ˆC�—	‘	‰NàÐBÓBØ*UØñ+Ñ'�˜-ô ";Ø˜Ÿ	™	‘NØØØ!Ø—I‘IØØØ!Ü,×8Ñ8×>Ñ>Ø%&Ø!"Øô"��D—I‘I“ð  '×0Ñ0°°xÓ@ˆC�—	‘	‹NðiTAôl ˜˜YÓ'€FØ€Mr.   Úprev_node_cÚnode_aÚgm_bÚgraph_cÚscaleÚ
zero_pointÚdtype_cast_namec                 ól  —  t        |j                  dz   «      |«      }t        |||«       |j                  d|di |«      } t        |j                  dz   «      |«      }	t        ||	|«       |j                  d|	di |	«      }
|j                  dt        j
                  | ||
t        j                  fi |«      S )NÚ_input_scale_Úget_attr© Ú_input_zero_point_Úcall_function)r   r(   r9   r;   rS   Úquantize_per_tensorÚquint8)rd   re   rf   rg   rh   ri   rj   Úscale_node_nameÚ
scale_nodeÚzero_point_node_nameÚzero_point_nodes              r,   Ú _insert_quantize_per_tensor_noderw   É   sÐ   € ð SÔ3°F·K±KÀ/Ñ4QÓRÐSWÓX€OÜˆD�/ 5Ô)Ø×$Ñ$Ø�O R¨¨_ó€JðÔ8Ø�‰Ð*Ñ*óà
óÐô ˆDÐ&¨
Ô3Ø×)Ñ)ØÐ(¨"¨bÐ2Fó€Oð ×ÑØÜ×!Ñ!Ø	�j /´5·<±<Ð@Ø
Øóð r.   Únode_cÚgm_aÚnode_name_prefixÚnode_type_to_io_type_mapc	           	      óè  — d}	d}
d}d}d}d}t        | |||«      \  }}t        ||||«      \  }}|t        j                  k(  r|t        j                  k(  sL|t        j                  k(  r|t        j                  k(  s&|t        j                  k(  r$|t        j
                  k(  rt        j                  }	nî||k(  r.|t        j                  k7  rt        j                  j                  }
n»|t        j                  k(  r8|t        j                  k(  r%t        | ||«      }|�†t        j                  }	|\  }}np|t        j                  k(  r&|t        j                  k(  rd}t        j                  }n7t        d|› d|j                  «       › d�|› d| j                  «       › d�z   «      ‚t!        |t"        «      rŽ t%        |«      |«      }|	r+|�|�t'        || |||||«      S |j)                  d|	|fi |«      S |r|j)                  d|||fi |«      S |
st        d	«      ‚ |
«       }t+        |||«       |j)                  d
||fi |«      S t!        |t,        «      rŽg }|D ]…  } t%        |«      |«      }|	r(|j)                  d|	|fi |«      }|j/                  |«       Œ>|
st        d	«      ‚ |
«       }t+        |||«       |j)                  d
||fi |«      }|j/                  |«       Œ‡ |S t        dt1        |«      › d�«      ‚)aÚ  
    Given a starting graph C (derived from graph B) of

    ... -> prev_node_c -> node_c -> ...

    And a corresponding related node_a, inserts the correct dtype
    cast node after prev_node_c to cast into the dtype expected
    by node_a, resulting in:

                          dtype_cast
                        /
    ... -> prev_node_c -> node_c -> ...

    For example, if node_c is an int8 op and node_a is an fp32 op, this function
    will insert a dequant.
    NÚtozdtype cast from ú z to z needs to be implementedrp   Úcall_methodz*Expected dtype_cast_mod_cls to be not Noner   ztype fz is not handled)r   r   ÚFP32ÚINT8ÚFP16ÚFP32_OR_INT8rS   Ú
dequantizeÚUNKNOWNÚnnÚIdentityr   rq   Úfloat16r&   Úformat_noder#   r   r   rw   r;   r9   ÚlistÚappendr'   )re   rx   rd   ry   rf   rg   rz   r/   r{   Údtype_cast_opÚdtype_cast_mod_clsÚdtype_cast_methodÚdtype_cast_method_dtypeÚdtype_cast_scaleÚdtype_cast_zero_pointÚnode_input_type_aÚ_node_output_type_aÚnode_input_type_cÚ_node_output_type_cÚnode_a_input_qparamsÚnew_dtype_cast_nameÚdtype_cast_modÚresultsÚprev_node_c_innerÚnew_dtype_cast_nodes                            r,   Ú_insert_dtype_cast_after_noderœ   ê   s’  € ð6 €MØÐØÐØ"ÐØÐØ ÐÜ-QØ��jÐ":ó.Ñ*ÐÐ*ô .RØ��jÐ":ó.Ñ*ÐÐ*ð Ô!6×!;Ñ!;Ò;Ø!Ô%:×%?Ñ%?Ò?ð Ô!6×!;Ñ!;Ò;Ø!Ô%:×%?Ñ%?Ò?ð Ô!6×!;Ñ!;Ò;Ø!Ô%:×%GÑ%GÒGô ×(Ñ(‰àÐ.Ò.ØÔ!6×!>Ñ!>Ò>ä"ŸX™X×.Ñ.ÑàÔ2×7Ñ7Ò7ØÔ!6×!;Ñ!;Ò;ô  6Ø�DÐ2ó 
Ðð  Ð+Ü!×5Ñ5ˆMØ6JÑ3ÐÑ3àÔ2×7Ñ7Ò7ØÔ!6×!;Ñ!;Ò;à ÐÜ"'§-¡-ÑäØÐ0Ð1°°6×3EÑ3EÓ3GÐ2HÈÐMØ"Ð# 1 V×%7Ñ%7Ó%9Ð$:Ð:RÐSñTó
ð 	
ô
 �+œtÔ$ØMÔ;Ð<LÓMÈdÓSÐÙØÐ+Ð0EÐ0QÜ7ØØØØØ$Ø)Ø'óð ð ×*Ñ*Ø#Ø!Ø �NØØ'óð ñ Ø×&Ñ&ØØ!ØÐ5Ð6ØØ#óð ñ &Ü$Ð%QÓRÐRÙ/Ó1ˆNÜ�DÐ-¨~Ô>Ø×&Ñ&ØØ#Ø�ØØ#óð ô 
�K¤Ô	&ØˆØ!,ò 	4ÐØ"QÔ"?Ð@PÓ"QÐRVÓ"WÐÙà&-×&9Ñ&9Ø#Ø!Ø&Ð(ØØ'ó'Ð#ð —‘Ð2Õ3á)Ü(Ð)UÓVÐVÙ!3Ó!5�Ü˜Ð1°>ÔBØ&-×&9Ñ&9Ø!Ø'Ø&Ð(ØØ'ó'Ð#ð —‘Ð2Õ3ð1	4ð2 ˆä˜v¤d¨;Ó&7Ð%8¸ÐHÓIÐIr.   c           
      ó²  — | j                   dk(  r‡ t        | j                  dz   «      |«      }t        || j                  «      }t        j                  |«      r|j                  «       }t        |||«       |j                  | j                   |di |«      }|S | j                   dk(  �r| j                  dvrt        d| j                  › d�«      ‚| j                  dk(  rct        t        | |d	«      |||«      } t        | j                  dz   «      |«      }|j                  | j                   | j                  |fi |«      }|S t        t        | |d	«      |||«      } t        | j                  dz   «      |«      }|j                  | j                   | j                  |t        | |d
«      fi |«      }|S t        d| j                  «       › d| j                   › d�«      ‚)z+
    Simple copy of node_a to graph_c.
    rm   Ú_shadow_copy_rn   r   ©r„   r}   ztarget ú is not implementedr„   r   r   zhandling of node z	 with op )r"   r   r(   r   r$   rS   Ú	is_tensorÚdetachr9   r;   r&   Ú_copy_node_from_a_to_cr   r‰   )re   ry   rf   rg   Únode_a_copy_nameÚ
node_a_objÚnode_a_copyÚarg_copys           r,   r£   r£   Œ  sï  € ð ‡y�y�JÒØWÔ8¸¿¹ÀÑ9VÓWØó
Ðô & d¨F¯M©MÓ:ˆ
Ü�?‰?˜:Ô&Ø#×*Ñ*Ó,ˆJÜ�Ð&¨
Ô3Ø×)Ñ)Ø�I‰IÐ'¨¨RÐ1Aó
ˆð ÐØ	�‰�mÓ	#Ø�=‰=Ð 4Ñ4Ü  7¨6¯=©=¨/Ð9LÐ!MÓNÐNØ�=‰=˜LÒ(Ü-Ü(¨°°qÓ9¸4ÀÀwóˆHð Ô<Ø—‘˜oÑ-ó àó Ðð "×-Ñ-Ø—	‘	˜6Ÿ=™=¨8¨+°rÐ;KóˆKð Ðä-Ü(¨°°qÓ9¸4ÀÀwóˆHð Ô<Ø—‘˜oÑ-ó àó Ðð "×-Ñ-Ø—	‘	Ø—‘ØÔ3°F¸DÀ!ÓDÐEØØ óˆKð Ðô Ø × 2Ñ 2Ó 4Ð5°Y¸v¿y¹y¸kÐI\Ð]ó
ð 	
r.   Ú
subgraph_aÚnum_non_param_args_node_ac                 ó`  — g }| j                   }|| j                  k7  r.|j                  |«       t        ||d«      }|| j                  k7  rŒ.|j                  |«       |j	                  «        d„ }|D ]º  }||d   u r|nd}|j                  |d¬«      }|�|\  }	}
n|j                  |j                  }
}	d}|t        |	«      k  r3|dk(  rn|dk(  r|dk(  rn ||	|   |«      s y|dz  }|t        |	«      k  rŒ3|
j                  «       D ]$  }|dk(  rn|dk(  r|dk(  rn |||«      s  y|dz  }Œ& Œ¼ y)zæ
    This function returns `False` if the input subgraph cannot be copied by
    `_insert_copy_of_subgraph_a_after_input_node_c`. This usually means
    that there is a corner case logic for which copy is not yet implemented.
    r   c                 óö   — t        | t        «      r:t        | |«      }|j                  dk(  r|j                  dv S |j                  dk(  ryyt        | t
        t        f«      r| D ]  }t        |t        «      rŒ y y)Nr   rŸ   rm   TF)r#   r   r   r"   r$   rŠ   Útuple)Ú
node_a_argry   Úarg_aÚels       r,   Ú_can_insertz3_can_insert_copy_of_subgraph_a.<locals>._can_insertØ  su   € Ü�j¤$Ô'Ü2°:¸tÓDˆEØ�x‰x˜=Ò(Ø—|‘|Ð';Ð;Ð;Ø—‘˜ZÒ'ØàÜ˜
¤T¬5 MÔ2Ø ò !�Ü! "¤dÕ+Ù ð!ð r.   r   T©Únormalize_to_only_use_kwargsé   F)
Úend_nodeÚ
start_noder‹   r   ÚreverseÚnormalized_argumentsÚargsÚkwargsÚlenÚvalues)r¨   ry   r©   rP   Úcur_noder°   re   Úlocal_num_non_param_args_node_aÚnorm_args_kwargsÚ	norm_argsÚnorm_kwargsÚcur_idxÚ	kwarg_vals                r,   Ú_can_insert_copy_of_subgraph_arÃ   Å  sw  € ð €EØ×"Ñ"€HØ
�j×+Ñ+Ò
+Ø�‰�XÔÜ+¨H°d¸AÓ>ˆð �j×+Ñ+Ó
+ð 
‡L�L�ÔØ	‡M�M„Oòð" ò "ˆà)/°5¸±8Ñ);Ñ%Àð 	(ð "×6Ñ6Ø¨tð 7ó 
Ðð Ð'Ø%5Ñ"ˆI‘{à%+§[¡[°&·-±-�{ˆIàˆàœ˜I›Ò&Ø˜!Š|ØØ˜A’Ð"AÀQÒ"FØá" 9¨WÑ#5°tÔ<Ù Ø�q‰LˆGð œ˜I›Ó&ð %×+Ñ+Ó-ò 		ˆIà˜!Š|ØØ˜A’Ð"AÀQÒ"FØá" 9¨dÔ3Ú Ø�q‰L‰Gñ		ð3"ðH r.   Úinput_node_cÚinput_node_c_2c           	      óš  — t        | t        t        f«      st        dt	        | «      › �«      ‚|j
                  g}|j
                  }||j                  k7  r/t        ||d«      }|j                  d|«       ||j                  k7  rŒ/|d   }t        | |||||«      }	t        dt        |«      «      D ]  }
||
   }|	}t        |d||||«      }	Œ |	S )z*
    TODO(before land): real docblock
    zExpected Node or list, got r   r   N)r#   r   rŠ   r&   r'   r´   rµ   r   ÚinsertÚ)_insert_copy_of_node_a_after_input_node_cÚrangerº   )rÄ   rÅ   r¨   ry   rf   rz   Ú
nodes_of_ar¼   Ú
cur_node_aÚ
cur_node_cÚ	cur_idx_ard   s               r,   Ú-_insert_copy_of_subgraph_a_after_input_node_crÎ     sô   € ô �l¤T¬4 LÔ1ÜÐ:¼4ÀÓ;MÐ:NÐOÓPÐPð ×%Ñ%Ð&€JØ×"Ñ"€HØ
�j×+Ñ+Ò
+Ü+¨H°d¸AÓ>ˆØ×Ñ˜!˜XÔ&ð �j×+Ñ+Ó
+ð ˜A‘€JÜ:Ø�n j°$¸Ð>Nó€Jô ˜1œc *›oÓ.ò 
ˆ	Ø 	Ñ*ˆ
Ø ˆÜ>ØàØØØØó
‰
ð
ð Ðr.   c                 ój  ‡‡‡‡— t        | t        «      r| j                  Šn6t        | t        «      st	        dt        | «      › �«      ‚| d   j                  Š|j                  ‰d¬«      }|�|\  }}n|j                  |j                  }}g }	i }
ˆˆˆˆfd„}d}|t        |«      k  rB|dk(  r| }n|dk(  r|�|}n |||   «      }|	j                  |«       |dz  }|t        |«      k  rŒB|j                  «       D ]-  \  }Š|dk(  r| |
|<   n|dk(  r|�||
|<   n |‰«      |
|<   |dz  }Œ/ t        |	«      }	 t        |«      ‰«      }|j                  dk(  r� t        |«      ‰«      }t        |j                  t         «      s!t	        dt        |j                  «      › �«      ‚t#        ‰|j                  «      }t%        ‰||«       ‰j'                  |j                  ||	|
|«      }|S |j                  d	vrt	        d
|j                  › �«      ‚‰j'                  |j                  |j                  |	|
|«      }|S )a  
    Assume that node_a from graph_a has
      args (input, (input2)?, arg1, ...), and
      kwargs {kw0: kwarg0, ...}

    Note: input2 is optional. If it equals to None, we assume that the op
    has a single non-param input.  If it is specified, we assume that the op
    has two non-param inputs.

    Copies the underlying values of arg1..argn and kwarg0..kwargn into gm_b,
    and creates the corresponding nodes in graph_c. Note: observers are ignored,
    so if an arg is an observer we navigate up until we find a non-observer parent.

    If node_a is a call_module, points the module pointed to by node_a to gm_b.

    Creates the copy of node_a in graph_c, with input as the first arg,
    and all other args and kwargs pointing to the copies of the objects
    in gm_b created above.

    An example in pictures:

    graph A:
    ========

    input -------------> node_a
                         / / /
    (input_2)?----------/ / /
                         / /
    weight -> weight_obs  /
                         /
    bias ----------------

    graph C (derived from B):
    =========================

    input_node_c --> node_a_copy
                     / / /
    (input_node_c_2)? / /
                     / /
    weight_copy ----/ /
                     /
    bias_copy ------/
    úExpected list, got r   Tr±   c                 óN  •— t        | t        «      rt        | ‰«      } t        | ‰‰‰«      } | S t        | t        t
        t        j                  f«      r| S t        ‰t        t        f«      r$‰D ]  }t        |t        «      sŒt        d«      ‚ | S t        dt        ‰«      › d�«      ‚)Nz/handling of Node inside list is not implementedzhandling for kwarg of type r    )r#   r   r   r£   ÚintÚfloatrS   ÚdtyperŠ   r¬   r&   r'   )ra   r¯   ry   rf   rg   rÂ   s     €€€€r,   Ú	_copy_argz<_insert_copy_of_node_a_after_input_node_c.<locals>._copy_arg�  s¥   ø€ ä�cœ4Ô Ü0°°dÓ;ˆCÜ(¨¨d°D¸'ÓBˆCØˆJÜ˜œc¤5¬%¯+©+Ð6Ô7ØˆJÜ˜	¤D¬% =Ô1Øò �Ü˜b¤$Õ'Ü(ØIóð ðð
 ˆJä Ø-¬d°9«oÐ->Ð>QÐRóð r.   r   r   r    )rp   r   zUnexpected op: )r#   r   r:   rŠ   r&   r'   r·   r¸   r¹   rº   r‹   Úitemsr¬   r   r"   r$   r%   r   r9   r;   )rÄ   rÅ   re   ry   rf   rz   r¾   r¿   rÀ   Únew_argsÚ
new_kwargsrÕ   rÁ   Únew_argÚ
kwarg_nameÚnode_a_shadows_c_nameÚnew_mod_copy_nameÚmod_aÚnode_a_shadows_crg   rÂ   s      ``              @@r,   rÈ   rÈ   <  s`  û€ ôf �,¤Ô%Ø×$Ñ$‰ä˜,¬Ô-Ü Ð#6´t¸LÓ7IÐ6JÐ!KÓLÐLØ˜q‘/×'Ñ'ˆà×2Ñ2Ø¨4ð 3ó Ðð Ð#Ø!1Ñˆ	‘;à!'§¡¨f¯m©m�;ˆ	à€HØ€J÷ð( €Gà
”C˜	“NÒ
"Ø�aŠ<Ø"‰GØ˜Š\˜nÐ8Ø$‰Gá 	¨'Ñ 2Ó3ˆGØ�‰˜Ô Ø�1‰ˆð ”C˜	“NÓ
"ð "-×!2Ñ!2Ó!4ò Ñˆ
�Ià�aŠ<Ø%1ˆJ�zÒ"Ø˜Š\˜nÐ8Ø%3ˆJ�zÒ"á%.¨yÓ%9ˆJ�zÑ"Ø�1‰‰ðô �X‹€HàKÔ9Ð:JÓKÈDÓQÐà‡y�y�MÒ!àKÔ9Ð:JÓKÈDÓQÐä˜&Ÿ-™-¬Ô-Ü Ð#5´d¸6¿=¹=Ó6IÐ5JÐ!KÓLÐLÜ   v§}¡}Ó5ˆÜ�Ð'¨Ô/Ø"×.Ñ.Ø�I‰IØØØØ!ó
Ðð  Ðà�9‰9Ð<Ñ<Ü  ?°6·9±9°+Ð!>Ó?Ð?Ø"×.Ñ.Ø�I‰IØ�M‰MØØØ!ó
Ðð  Ðr.   Úname_aÚname_bÚmatched_subgraph_pairsÚshould_log_inputsc                 óX  ‡3— |€
t        «       }t        «       }i Š3ˆ3fd„}	i }
i }|j                  «       D ]\  \  }}|\  }}t        |j                  |«      }t        |j                  |«      }||||f|
|j
                  <   ||||f||j                  <   Œ^ |j                  j                  D �]h  }|j                  dk(  r)|j                  t        |j                  d   |	«      «       Œ<||
v }||v }|s|�r|r|
|   \  }}}}n|st        d«      ‚||   \  }}}}t        |j
                  «      xr t        |«      }|sUt        dt        ||«      › �dt        |j
                  |«      › �z   dz   «       |j!                  ||	«      ‰3|j"                  <   Œæt%        |j
                  |||«      \  }}t%        ||||«      \  }}|t&        j(                  k7  xr= |t&        j(                  k7  xr( |t&        j(                  k7  xr |t&        j(                  k7  }|sVt        dt        ||«      › �dt        |j
                  |«      › �z   d	z   «       |j!                  ||	«      ‰3|j"                  <   �Œ¼|t&        j*                  k(  r‚|t&        j,                  k(  rot/        |j
                  ||«      }|sVt        dt        ||«      › �dt        |j
                  |«      › �z   d
z   «       |j!                  ||	«      ‰3|j"                  <   �ŒQt1        |j
                  |«      }t3        |||«      sVt        dt        ||«      › �dt        |j
                  |«      › �z   dz   «       |j!                  ||	«      ‰3|j"                  <   �ŒÊt5        |j                  |«      }t5        j                  |«      }|�r|�rt7        ||d«      } t9        | t:        «      rV‰3| j"                     }!t=        |!||d|j"                  |||t>        j@                  jB                  dd|¬«      ‰3|!j"                  <   nžt9        | tD        «      rv| D �"cg c]  }"‰3|"j"                     ‘Œ }#}"tG        |#«      D ]K  \  }$}!t=        |!||d|j"                  |||t>        j@                  jB                  |$d|¬«      ‰3|!j"                  <   ŒM nt        dtI        | «      › d�«      ‚|s|r.|j!                  ||	«      ‰3|j"                  <   ‰3|j"                     }%|�r¯t7        %|d«      }!|rHt9        |!t:        «      rt7        |%|d«      }!n*t9        |!tD        «      r|!D �"cg c]  }"t7        |"|d«      ‘Œ }!}"tK        |j
                  |%|!||||j"                  dz   ||«	      }&|rÄd}'t9        |&t:        «      r2t=        |&||d|'| ||t>        j@                  jB                  dd|¬«      }&|&}(n€t9        |&tD        «      st        dtI        |&«      › �«      ‚g })tG        |&«      D ]E  \  }*}+t=        |+||d|'| ||t>        j@                  jB                  |*d|¬«      },|)jM                  |,«       ŒG |)}&|&}(d}-t1        |j
                  |«      }|dk(  rt7        |%|d«      }-tO        |&|-||||%j"                  dz   «      }.|.‰3|.j"                  <   |r½|.}/t7        |/|d«      (k7  rt7        |/|d«      }/t7        |/|d«      |(k7  rŒt9        |(t:        «      r(tQ        ||(j"                  «      }0|/j"                  |0_)        nUt9        |(tD        «      st        dtI        |(«      › �«      ‚|(D ])  }1tQ        ||1j"                  «      }0|/j"                  |0_)        Œ+ t=        ‰3|.j"                     ||d|.j"                  | ||t>        jT                  jB                  dd|¬«      ‰3|.j"                  <   |s�Œõt=        ‰3|j"                     ||d|j"                  |||t>        jT                  jB                  dd|¬«      ‰3|j"                  <   �ŒJ|j!                  ||	«      ‰3|j"                  <   �Œk tW        ||«      }2|2S c c}"w c c}"w )a‘  
    Creates a new GraphModule consisting of the graph of C, with the meaningful
    nodes of A shadowing the corresponding nodes of B.  For example,

    Graph A:
    a0 -> op0_fp32 -> a1 -> op1_fp32 -> a2

    Graph B:
    b0 -> op0_int8 -> b1 -> op1_int8 -> b2

    matched_node_pairs: {'op0': (op0_fp32, op0_int8), 'op1': (op1_fp32, op1_int8)}

    Graph C (A shadows B):

        / dequant0 -> op0_fp32 -> logger_a_0  / dequant_1 -> op1_fp32 -> logger_a_1
       /                                     /
    b0 -------------> op0_int8 -> logger_b_0 --------------> op1_int8 -> logger_b_1

    In a nutshell, this function does the following for each node pair:
    * copies the necessary attributes and modules from gm_a to gm_b,
      keeping names unique
    * adds a dtype cast op (dequant, quant, etc)
    * adds a copy of node_a in gm_b's graph
    * adds loggers to the outputs of node_a and node_b
    Nc                 ó"   •— t        | ˆfd„«      S )Nc                 ó"   •— ‰| j                      S rF   rG   )r   Úenv_cs    €r,   rI   z6create_a_shadows_b.<locals>.load_arg.<locals>.<lambda>ù  s   ø€  u¨T¯Y©YÑ'7€ r.   rJ   )rK   ræ   s    €r,   rL   z$create_a_shadows_b.<locals>.load_argø  s   ø€ Ü�qÓ7Ó8Ð8r.   rM   r   z+Expected node_b_is_end_node to be not falsez$skipping shadow loggers for node_b: z, start_node_a: z, unsupportedz, unknown dtype castz, unknown input qparamsz", unhandled logic in subgraph copyÚ_ns_logger_b_inp_rO   ztype z is not handled yetÚ_dtype_cast_Ú Ú_ns_logger_a_inp_rÐ   r³   r   rž   Ú_ns_logger_a_Ú_ns_logger_b_),r   r
   rÖ   r   Úbase_op_noderµ   r´   r:   rP   r"   rM   r	   r¸   r&   r   ÚprintrX   r(   r   r   r…   r�   r€   r   r   rÃ   r-   r   r#   r   r@   r   rQ   rR   rŠ   rW   r'   rœ   r‹   rÎ   Úgetattrr1   rY   r   )4rß   ry   rà   rf   rá   r/   râ   r{   rg   rL   Ú+start_node_b_to_matched_subgraph_a_and_nameÚ)end_node_b_to_matched_subgraph_a_and_nameÚ
match_nameÚmatchr¨   Ú
subgraph_bÚref_node_type_aÚref_node_type_bÚnode_bÚnode_b_is_start_nodeÚnode_b_is_end_noder3   Úall_op_types_support_shadowingr’   Únode_output_type_aÚnode_input_type_bÚnode_output_type_bÚnode_io_types_known_a_and_br–   r©   Ú
fqn_base_aÚ
fqn_base_bÚprev_node_brd   ra   Úprev_node_c_listr`   rx   Údtype_cast_noder1   Úinput_loggerÚnew_loggersÚdtype_cast_idxÚdtype_cast_node_innerÚdtype_cast_loggerÚnode_c_second_non_param_argrÞ   r¼   Úinput_logger_modÚinput_logger_innerÚgm_cræ   s4                                                      @r,   Úcreate_a_shadows_br  Ì  s€	  ø€ ðH  Ð'Ü#?Ó#AÐ ô ‹g€GØ€Eô9ð 35Ð/Ø02Ð-Ø3×9Ñ9Ó;ò 
Ñˆ
�EØ!&Ñˆ
�JÜ-¨j×.EÑ.EÀtÓLˆÜ-¨j×.EÑ.EÀtÓLˆàØØØð	N
Ð3°J×4IÑ4IÑJð ØØØð	J
Ð1°*×2EÑ2EÒFð
ð" —*‘*×"Ñ"ó rEˆØ�9‰9˜Ò Ø�N‰Nœ7 6§;¡;¨q¡>°8Ó<Ô=Øð  &Ð)TÐTÐØ#Ð'PÐPÐáÒ#5Ù#ð @ÀÑGñØØØ#Ù#ñ *Ü(Ð)VÓWÐWð >¸fÑEñØØØ#Ø#ô .HØ×%Ñ%ó.ò .5ä,¨VÓ4ð +ñ 2ÜØ:Ô;NÈvÐW[Ó;\Ð:]Ð^Ø(Ô)<¸Z×=RÑ=RÐTXÓ)YÐ(ZÐ[ñ\à%ñ&ôð
 &-×%6Ñ%6°v¸xÓ%H��f—k‘kÑ"Øô 5Ø×%Ñ% t¨ZÐ9QóñØ!Ø"ô 5Ø˜˜jÐ*BóñØ!Ø"ð
 "Ô%:×%BÑ%BÑBò HØ&Ô*?×*GÑ*GÑGòHà%Ô)>×)FÑ)FÑFòHð 'Ô*?×*GÑ*GÑGð	 (ñ /ÜØ:Ô;NÈvÐW[Ó;\Ð:]Ð^Ø(Ô)<¸Z×=RÑ=RÐTXÓ)YÐ(ZÐ[ñ\à,ñ-ôð
 &-×%6Ñ%6°v¸xÓ%H��f—k‘kÑ"Ùð "Ô%:×%?Ñ%?Ò?Ø%Ô)>×)CÑ)CÒCä'=Ø×)Ñ)¨4Ð1Ió(Ð$ñ ,ÜØ>Ô?RÐSYÐ[_Ó?`Ð>aÐbØ,Ô-@À×AVÑAVÐX\Ó-]Ð,^Ð_ñ`à3ñ4ôð
 *1×):Ñ):¸6À8Ó)L�E˜&Ÿ+™+Ñ&Ùä(DØ×%Ñ% tó)Ð%ô 2Ø˜DÐ";ôô Ø:Ô;NÈvÐW[Ó;\Ð:]Ð^Ø(Ô)<¸Z×=RÑ=RÐTXÓ)YÐ(ZÐ[ñ\à:ñ;ôð
 &-×%6Ñ%6°v¸xÓ%H��f—k‘kÑ"Ùä'¨
×(?Ñ(?ÀÓFˆJÜ'¨
×(?Ñ(?ÀÓFˆJâ#â$Ü":¸6À4ÈÓ"K�KÜ! +¬tÔ4Ø&+¨K×,<Ñ,<Ñ&=˜Ü2KØ'Ø Ø&Ø/Ø"ŸK™KØ"Ø$Ø+Ü4×?Ñ?×EÑEØ-.Ø)*Ø *ô3˜˜k×.Ñ.Ò/ô $ K´Ô6ð HSÖ+SÀ¨E°#·(±(«OÐ+SÐ(Ð+Sä4=Ð>NÓ4Oò Ñ0˜G [Ü6OØ +Ø $Ø *Ø 3Ø &§¡Ø &Ø (Ø /Ü 8× CÑ C× IÑ IØ18Ø-.Ø$.ô7˜E +×"2Ñ"2Ò3ñô" -Ø#¤D¨Ó$5Ð#6Ð6IÐJóð ñ $Ñ'9à%,×%6Ñ%6°v¸xÓ%H��f—k‘kÑ"Ø˜vŸ{™{Ñ+�ò $ô 7°v¸tÀQÓG�Ù$ä! +¬tÔ4ä&>¸vÀtÈQÓ&O™Ü# K´Ô6ð (3ö'à #ô 5°S¸$ÀÕBð'˜ð 'ô #@Ø×)Ñ)àØØØØØ—K‘K .Ñ0ØØ,ó#�ñ, %à$&�MÜ! /´4Ô8Ü*CØ+Ø Ø&Ø/Ø)Ø"Ø$Ø+Ü4×?Ñ?×EÑEØ-.Ø)*Ø *ô+˜ð ;J™ä)¨/¼4Ô@Ü"0Ø"5´d¸?Ó6KÐ5LÐ Mó#ð ð ')˜ÜENØ+óFò BÑA˜NÐ,Aô 1JØ 5Ø $Ø *Ø 3Ø -Ø &Ø (Ø /Ü 8× CÑ C× IÑ IØ1?Ø-.Ø$.ô1Ð-ð (×.Ñ.Ð/@ÕAð#Bð$ +6˜Ø'6˜ð /3Ð+Ü,HØ×)Ñ)¨4ó-Ð)ð -°Ò1ä2JàØØó	3Ð/ô $QØ#Ø/ØØØà—K‘K /Ñ1ó$Ð ð 0@�Ð&×+Ñ+Ñ,ñ %ð  0�HÜ2°8¸TÀ1ÓEÈÒUÜ#;¸HÀdÈAÓ#N˜ô 3°8¸TÀ1ÓEÈÓUô " ,´Ô5ä+2°4¸×9JÑ9JÓ+KÐ(Ø9A¿¹Ð(Õ6ô  *¨,¼Ô=Ü"0à"5´d¸<Ó6HÐ5IÐ Jó#ð ð
 3?ò KÐ.Ü/6°tÐ=O×=TÑ=TÓ/UÐ,Ø=E¿]¹]Ð,Õ:ðKô
 0IØÐ*×/Ñ/Ñ0ØØØ#Ø$×)Ñ)ØØØ#Ü,×8Ñ8×>Ñ>Ø%&Ø!"Ø"ô0�Ð&×+Ñ+Ñ,ó( "ä%>Ø˜&Ÿ+™+Ñ&ØØØ#Ø—K‘KØØØ#Ü,×8Ñ8×>Ñ>Ø%&Ø!"Ø"ô&��f—k‘kÓ"ð0 ")×!2Ñ!2°6¸8Ó!DˆE�&—+‘+ÓðerEôh �t˜WÓ%€DØ€Kùòk ,Tùòl's   Ð+`"Ô+`'rF   )3Úcollections.abcr   Útypingr   rS   Útorch.ao.ns.fx.mappingsr   Útorch.ao.quantization.fx.utilsr   Útorch.ao.quantization.observerr   Útorch.fxr   r	   Útorch.fx.graphr
   r   Úns_typesr   r   r   Úutilsr   r   r   r   r   r   r   r   r   r   r%   r-   rÒ   r@   Údictr¬   rc   ÚTensorrÓ   rw   rŠ   Úsetrœ   r£   ÚboolrÃ   rÎ   rÈ   r  rn   r.   r,   ú<module>r     s  ðå $Ý ã Ý @Ý HÝ Fß )ß &ç LÑ L÷÷ ÷ ð˜ð  ;ð °3¸±:ó ð"-Ø
ð-àð-ð ð-ð !ð	-ð
 ð-ð ð-ð ð-ð ð-ð ð-ð ð-ð ð-ð 
ˆt‰ð-ð 
ó-ð`jØðjà04°T¸5ÀÀcÀ¹?Ð5JÑ0Kðjð 26°d¸EÀ#ÀsÀ(¹OÐ6KÑ1Lðjð ð	jð
 ðjð ójðZØðàðð ðð ð	ð
 �<‰<˜%Ñðð —‘˜sÑ"ðð ðð 
óðB^JØð^Jàð^Jð ˜˜T™
Ñ"ð^Jð ð	^Jð
 ð^Jð ð^Jð ð^Jð ð^Jð # 3¨Ð,<Ñ(=Ð#=Ñ>ð^Jð 
ˆD�‰JÑó^JðD6
Øð6
à
ð6
ð ð6
ð ð	6
ð
 
ó6
ðrHØðHà
ðHð  #ðHð 
ó	HðV)Ø˜˜d™Ñ#ð)à˜4 ™:Ñ%¨Ñ,ð)ð ð)ð ð	)ð
 ð)ð ð)ð 
ó)ðXM Ø˜˜d™Ñ#ðM à˜4 ™:Ñ%¨Ñ,ðM ð ðM ð ð	M ð
 ðM ð ðM ð 
óM ðp IMñwØðwà
ðwð ðwð ð	wð
 !  e¨J¸
Ð,BÑ&CÐ!CÑDðwð ðwð ðwð # 3¨Ð,<Ñ(=Ð#=Ñ>ÀÑEðwð ôwr.   