+
    –°³j\I  ã                  óÔ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
Ht ^ RIHt ^ RIHtHtHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^R	IHt ]! R
4      t]'       d   ^ RIHt ^RI H!t! ]PD                  PF                  t#]$]#,          t%]$]#,          t&]'](](])]'](](3,          ]'](](3,          ]PT                  ](](](](3
,          t+]PX                  ! ]-4      t.]P^                  Pa                  ]-R4      t1R R lt2R R lt3 ! R R]44      t5 ! R R]Pl                  4      t7R R lt8R R lt9R R lt:R R lt; ! R R4      t< ! R  R!4      t= ! R" R#4      t>R$ R% lt?R& R' lt@R# )(a±  
This module provides functionality for tracking and managing regions in computational graphs.
It supports graph optimization by identifying and grouping similar regions based on their
structure and behavior. The module implements algorithms for:

1. Tracking nodes and their relationships in the computational graph
2. Identifying identical or similar regions across the graph
3. Managing graph regions for optimization purposes
4. Supporting deduplication and other graph transformation passes

The core functionality revolves around the GraphRegionTracker class which maintains
mappings between nodes and their duplicates, enabling efficient graph analysis and
optimization operations.
)ÚannotationsN)ÚdefaultdictÚdeque)Úfields)ÚAnyÚTYPE_CHECKINGÚTypeVar)Ú
FakeTensor)Ú
OrderedSet)Útree_flatten)Ú_get_flat_args_uniqueÚT)ÚCallable)ÚInstructionTranslatorBaseÚgraph_region_expansionc               ó    € V ^8„  d   QhRRRR/# )é   ÚmsgÚstrÚreturnÚNone© )Úformats   "Úc/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_dynamo/graph_region_tracker.pyÚ__annotate__r   D   s   € ÷ *ñ *�3ð * $ñ *ó    c                ó6   € \         P                  ! V .VO5!   R # ©N)Úgraph_expansion_logÚdebug)r   Úargss   &*r   Ú	debug_logr!   D   s   € Ü×Ò˜cÐ) DÖ)r   c               ó    € V ^8„  d   QhRRRR/# )r   Úxztorch.Tensorr   z(tuple[Callable[[T], T], tuple[Any, ...]]r   )r   s   "r   r   r   H   s   € ÷ 
 ñ 
 Øð
 à-ñ
 r   c                ó¬   € ^ RI HpHp . pV! V 4      p\        V4       F'  pVP	                  \        WEP                  4      4       K)  	  V\        V4      3# )é    )Ú_identÚ%extract_tensor_metadata_for_cache_key)Útorch._inductor.codecacher&   r'   r   ÚappendÚgetattrÚnameÚtuple)r#   r&   r'   ÚoutÚmetadataÚfields   &     r   Ú&_extract_tensor_metadata_for_node_hashr0   H   sL   € ÷ Xà
€CÙ4°QÓ7€HÜ˜Ö!ˆØ�
‰
”7˜8§Z¡ZÓ0Ö1ñ "ð ”E˜#“JÐÐr   c                  ó   € ] tR t^UtRtR# )ÚNodeHashExceptionr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r   r2   r2   U   s   † Ûr   r2   c                  ó:   a € ] tR t^YtR V 3R lltR R ltRtV ;t# )ÚInputPicklerc               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   ÚInputPickler.__annotate__Z   s   € ÷ ñ ˜$ñ r   c                	ó€  <a€ ^ RI Ho \        P                  ! 4       pWn        \
        SV `  V4       \        P                  P                  4       V n        V P                  P                  \        \        \        P                  V3R l\        P                  V3R l\        P                   V3R l/4       RV n        R# )r%   )r&   c                ó    <€ S\        V 4      33# r   ©r   ©r#   r&   s   &€r   Ú<lambda>Ú'InputPickler.__init__.<locals>.<lambda>d   s   ø€ ¨´#°a³&°Ñ(;r   c                ó    <€ S\        V 4      33# r   r?   r@   s   &€r   rA   rB   e   s   ø€ ¨&´3°q³6°)Ñ)<r   c                ó    <€ S\        V 4      33# r   r?   r@   s   &€r   rA   rB   f   s   ø€ ¨6´C¸³F°9Ñ*=r   TN)r(   r&   ÚioÚBytesIOÚ_streamÚsuperÚ__init__ÚcopyregÚdispatch_tableÚcopyÚupdater	   r0   ÚtorchÚSymIntÚSymBoolÚSymFloatÚfast)ÚselfÚstreamr&   Ú	__class__s   & @€r   rI   ÚInputPickler.__init__Z   s€   ù€ Ý4ä—’“ˆØŒÜ‰Ñ˜Ô Ü%×4Ñ4×9Ñ9Ó;ˆÔØ×Ñ×"Ñ"äÔBÜ—‘Ô;Ü—‘Ô<Ü—‘Ô =ð	ô	
ð ˆŽ	r   c               ó    € V ^8„  d   QhRRRR/# )r   Úobjr   r   Úbytesr   )r   s   "r   r   r<   k   s   € ÷ %ñ %˜ð % ñ %r   c                ó|  €  V P                  V4       V P                  P                  4       V P                  P                  ^ 4       V P                  P	                  ^ 4       #   \
        \        3 d   p\        ThRp?ii ; i  T P                  P                  ^ 4       T P                  P	                  ^ 4       i ; i)z,
Pickle an object and return a byte string.
N)ÚdumprG   ÚgetvalueÚseekÚtruncateÚ	TypeErrorÚAttributeErrorr2   )rS   rX   Úes   && r   ÚdumpsÚInputPickler.dumpsk   sŽ   € ð	%Ø�I‰I�cŒNØ—<‘<×(Ñ(Ó*ð �L‰L×Ñ˜aÔ Ø�L‰L×!Ñ! !Õ$øô	 œ>Ð*ô 	+Ü#¨Ð*ûð	+ûð �L‰L×Ñ˜aÔ Ø�L‰L×!Ñ! !Õ$ús#   ‚*A# Á#B Á4A;Á;B Â B Â8B;)rG   rK   rR   )r3   r4   r5   r6   rI   rb   r7   Ú__classcell__)rU   s   @r   r9   r9   Y   s   ø† ÷ð ÷"%ó %r   r9   c               ó    € V ^8„  d   QhRRRR/# )r   Úargr   r   r   )r   s   "r   r   r   y   s   € ÷ ñ �sð ˜sñ r   c                ó¸   € \        V \        4      '       d   V P                  P                  R 4      # \        V \        P
                  \        34      '       d   V # R# )Úexample_valueN)Ú
isinstanceÚNodeÚmetaÚgetrN   ÚTensorÚint)rf   s   &r   Ú_extract_argsro   y   s@   € Ü�#”t×ÒØ�x‰x�|‰|˜OÓ,Ð,Ü	�Cœ%Ÿ,™,¬Ð,×	-Ò	-Øˆ
ár   c               ó    € V ^8„  d   QhRRRR/# )r   Únoderj   r   z.tuple[tuple[str, ...], tuple[Any | None, ...]]r   )r   s   "r   r   r   ‚   s    € ÷ Hñ HØ
ðHà3ñHr   c                ó‚  € \        V P                  4      w  r\        V P                  P	                  4       \
        P                  ! ^ 4      R7      p\        \        V P                  P                  4       4      4      p\        V4      w  rRW,           pT\        ;QJ d    . R V 4       F  NK  	  53# ! R V 4       4      3# )r%   ©Úkeyc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir   )ro   )Ú.0rf   s   & r   Ú	<genexpr>Ú"_normalize_args.<locals>.<genexpr>Š   s   é € ÐF¹X°cœ}¨S×1Ð1»Xùs   ‚)	r   r    ÚsortedÚkwargsÚitemsÚoperatorÚ
itemgetterr,   Úkeys)rq   Ú	flat_argsÚ_Úsorted_kwargsÚsorted_keysÚflat_kwargsÚall_argss   &      r   Ú_normalize_argsr…   ‚   s’   € ô   §	¡	Ó*�L€IÜ˜4Ÿ;™;×,Ñ,Ó.´H×4GÒ4GÈÓ4JÔK€MÜœ˜tŸ{™{×/Ñ/Ó1Ó2Ó3€KÜ! -Ó0�N€KØÕ&€HØŸœÑF¹XÓFŸÐGÐG˜ÑF¹XÓFÓFÐGÐGr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úindex_to_rankúdict[int, int]Úregionszlist[list[Any]]r   r   r   )r   s   "r   r   r   �   s$   € ÷ 	8ñ 	8Ø!ð	8Ø,;ð	8à	ñ	8r   c                ó²   a € V^ ,          p\        \        \        V4      4      V 3R lR7      pV F  pV Uu. uF  qTV,          NK  	  upVR&   K   	  R# u upi )r%   c                ó   <€ SV ,          # r   r   )Úir‡   s   &€r   rA   Ú'_sort_with_ref_region.<locals>.<lambda>”   s   ø€ À-ÐPQÖBRr   rs   :NNNN)ry   ÚrangeÚlen)r‡   r‰   Ú
ref_regionÚsorted_indicesÚregionrŒ   s   f&    r   Ú_sort_with_ref_regionr“   �   sM   ø€ ð ˜•€JÜœE¤# j£/Ó2Ô8RÔS€NÛˆÙ(6Ó7© 1˜A—Y�Y©Ñ7ˆˆq‹	ó ùÚ7s   ·Ac               ó   € V ^8„  d   QhRR/# )r   r   ÚGlobalStateKeyr   )r   s   "r   r   r   ™   s   € ÷ ñ ˜nñ r   c                 óò  € \         P                  ! 4       \         P                  ! 4       \         P                  ! 4       \         P                  P                  4       \         P                  P                  4       \         P                  ! 4       \         P                  ! 4       \         P                  P                  4       \         P                  ! 4       \         P                  P                  P                  4       3
# r   )rN   Úis_grad_enabledÚis_inference_mode_enabledÚget_num_threadsÚ_CÚ2_get_cublas_allow_fp16_reduced_precision_reductionÚ2_get_cublas_allow_bf16_reduced_precision_reductionÚget_default_dtypeÚ$are_deterministic_algorithms_enabledÚ_get_cublas_allow_tf32Ú-is_deterministic_algorithms_warn_only_enabledÚ	_autogradÚ_saved_tensors_hooks_is_enabledr   r   r   Úget_global_state_keyr£   ™   sš   € ä×ÒÓÜ×'Ò'Ó)Ü×ÒÓÜ�‰×CÑCÓEÜ�‰×CÑCÓEÜ×ÒÓ!Ü×2Ò2Ó4Ü�‰×'Ñ'Ó)Ü×;Ò;Ó=Ü�‰×Ñ×:Ñ:Ó<ðð r   c                  ót   € ] tR t^¯tR R lt]R R l4       tR R ltR R ltR	 R
 lt	R R lt
R R ltRtR# )ÚBackwardBfsArgIterc               ó    € V ^8„  d   QhRRRR/# )r   Úoriginrj   r   r   r   )r   s   "r   r   ÚBackwardBfsArgIter.__annotate__°   s   € ÷ 2ñ 2˜tð 2¨ñ 2r   c                	ó0   € Wn         \        4       V n        R # r   )Ú_curr   Ú_queue)rS   r§   s   &&r   rI   ÚBackwardBfsArgIter.__init__°   s   € Ø!'Œ	Ü*/«'ˆŽr   c               ó    € V ^8„  d   QhRRRR/# )r   r§   rj   r   r¥   r   )r   s   "r   r   r¨   µ   s   € ÷ ñ �tð Ð 2ñ r   c                	ó€   € \        V 4      pVP                  V 4       VP                  4       '       g   \        R 4      hV# )z/expected origin node to be popped from iterator)r¥   Úadd_childrenÚnextÚAssertionError)r§   Úits   & r   ÚcreateÚBackwardBfsArgIter.create´   s6   € ä Ó'ˆØ
�‰˜Ôð �w‰w�yŠyÜ Ð!RÓSÐSØˆ	r   c               ó   € V ^8„  d   QhRR/# ©r   r   zNode | Noner   )r   s   "r   r   r¨   ¾   s   € ÷ ñ �kñ r   c                	ó’   € V P                   pV P                  '       g
   R V n         V# V P                  P                  4       V n         V# r   )rª   r«   Úpopleft)rS   Úrets   & r   r°   ÚBackwardBfsArgIter.next¾   s=   € Ø�i‰iˆØ�{�{ˆ{ØˆDŒIð ˆ
ð Ÿ™×+Ñ+Ó-ˆDŒIØˆ
r   c               ó   € V ^8„  d   QhRR/# r¶   r   )r   s   "r   r   r¨   Æ   s   € ÷ ñ �kñ r   c                	ó   € V P                   # r   )rª   ©rS   s   &r   ÚpeekÚBackwardBfsArgIter.peekÆ   s   € Ø�y‰yÐr   c               ó    € V ^8„  d   QhRRRR/# ©r   rq   rj   r   r   r   )r   s   "r   r   r¨   É   s   € ÷ "ñ " ð "¨$ñ "r   c                	ó‚   € \        V/ 4      pV F,  p\        V\        4      '       g   K  V P                  V4       K.  	  R # r   )r   ri   rj   Ú_append)rS   rq   r   rf   s   &&  r   r¯   ÚBackwardBfsArgIter.add_childrenÉ   s1   € Ü)¨$°Ó3ˆ	ÛˆCÜ˜#œt×$Ô$Ø—‘˜SÖ!ó r   c               ó    € V ^8„  d   QhRRRR/# )r   rf   rj   r   r   r   )r   s   "r   r   r¨   Ï   s   € ÷ $ñ $˜4ð $ Dñ $r   c                	óh   € V P                   f	   Wn         R # V P                  P                  V4       R # r   )rª   r«   r)   )rS   rf   s   &&r   rÃ   ÚBackwardBfsArgIter._appendÏ   s#   € Ø�9‰9ÒØŽIà�K‰K×Ñ˜sÖ#r   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r¨   Õ   s   € ÷ Kñ K˜ñ Kr   c                	ó<   € R V P                    RV P                   R2# )zBackwardBfsArgIter(cur=z, queue=Ú)©rª   r«   r½   s   &r   Ú__str__ÚBackwardBfsArgIter.__str__Õ   s   € Ø(¨¯©¨°8¸D¿K¹K¸=ÈÐJÐJr   rÌ   N)r3   r4   r5   r6   rI   Ústaticmethodr³   r°   r¾   r¯   rÃ   rÍ   r7   r   r   r   r¥   r¥   ¯   s;   † õ2ð ôó ðõõõ"õ$÷Kñ Kr   r¥   c                  óz   € ] tR t^ÙtRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltRtR# )ÚGraphRegionTrackera  
GraphRegionTracker tracks each node added to the output graph and generates a key based on the source location,
instruction pointer, input shapes, and global state at the time the node is inserted into the graph. Nodes with
the same key are grouped together in a list of identical nodes (the value of node_to_duplicates).

hash_to_duplicates: Dict[str, IdenticalNodes] - A dictionary mapping the key to a list of identical nodes
node_to_duplicates: Dict[Node, IdenticalNodes] - A dictionary mapping a node to the list of identical nodes it belongs to
input_pickler: InputPickler - An instance of InputPickler used to generate a node hash
c               ó   € V ^8„  d   QhRR/# r;   r   )r   s   "r   r   ÚGraphRegionTracker.__annotate__ä   s   € ÷ ,ñ ,˜$ñ ,r   c                	óh   € \        \        4      V n        / V n        / V n        \        4       V n        R # r   )r   ÚlistÚhash_to_duplicatesÚnode_to_duplicatesÚnode_to_mutated_arg_positionsr9   Úinput_picklerr½   s   &r   rI   ÚGraphRegionTracker.__init__ä   s)   € Ü=HÌÓ=NˆÔØ>@ˆÔàJLˆÔ*Ü)›^ˆÖr   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   Úfilenamer   Úlinenorn   Úinstruction_pointerz
int | Nonerq   rj   r   r   )r   s   "r   r   rÓ   ë   s4   € ÷ :ñ :Øð:Ø%(ð:Ø?Ið:ØQUð:à	ñ:r   c                	ó€   € ^ RI Hp \        4       VVV\        V4      3pV! V P                  P                  V4      4      # )r%   )Úsha256_hash)r(   rà   r£   r…   rÙ   rb   )rS   rÜ   rÝ   rÞ   rq   rà   rt   s   &&&&&  r   Ú
_hash_nodeÚGraphRegionTracker._hash_nodeë   sE   € õ 	:ô !Ó"ØØØÜ˜DÓ!ð
ˆñ ˜4×-Ñ-×3Ñ3°CÓ8Ó9Ð9r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ún0rj   Ún1r   Úboolr   )r   s   "r   r   rÓ   ù   s!   € ÷ 
ñ 
 ð 
¨$ð 
°4ñ 
r   c                	ó¼   € WP                   9   ;'       dH    W P                   9   ;'       d2    V P                   V,          V P                   V,          J ;'       d    WJ# r   )r×   )rS   rä   rå   s   &&&r   Ú_is_identicalÚ GraphRegionTracker._is_identicalù   sb   € à×)Ñ)Ñ)÷ ð Ø×-Ñ-Ñ-÷ð à×'Ñ'¨Õ+¨t×/FÑ/FÀrÕ/JÐJ÷ð ð �ð		
r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útxr   rq   rj   r   r   r   )r   s   "r   r   rÓ     s'   € ÷ Kñ KÐ6ð K¸dð KÀtñ Kr   c                ób  €  W P                   9  do   V P                  V P                  VP                  P                  VP
                  VP                  V4      ,          pVP                  V4       W0P                   V&   R# R#   \         d"   p\        P                  RY$4        Rp?R# Rp?ii ; i)zß
The main entry point for tracking a node. This function will hash the node argument and group
nodes with the same hash together. It updates the hash_to_duplicates and node_to_duplicates dictionaries
to track the new node.
z(Unable to hash node %s with exception %sN)r×   rÖ   rá   Úf_codeÚco_filenamerÝ   rÞ   r)   r2   Úlogr   )rS   rë   rq   Ú
duplicatesra   s   &&&  r   Ú
track_nodeÚGraphRegionTracker.track_node  s—   € ð	Kà×3Ñ3Ô3à!×4Ñ4Ø—O‘OØŸ	™	×-Ñ-¨r¯y©y¸"×:PÑ:PÐRVóõ�
ð
 ×!Ñ! $Ô'Ø0:×'Ñ'¨Ó-ñ 4øô !ô 	KÜ�I‰IÐ@À$×JÒJûð	Kús   ‚A<B ÂB.ÂB)Â)B.c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rq   rj   Úflat_args_kwargsz	list[Any]Úid_to_initial_versionrˆ   r   r   r   )r   s   "r   r   rÓ     s8   € ÷ Mñ MàðMð $ðMð  .ð	Mð
 
ñMr   c                ó  € \         \        ,          ! 4       p\        V4       FB  w  rV\        V4      pWs9   g   K  W7,          VP                  8w  g   K1  VP                  V4       KD  	  V'       d   W@P                  V&   R# R# )z¾
This function tracks which argument positions are mutated by the given node. Subgraph HOP does not support
input mutations today so we will skip regions which have inputs that are mutated.
N)r
   rn   Ú	enumerateÚidÚ_versionÚaddrØ   )rS   rq   rô   rõ   Úmutated_arg_positionsrŒ   rf   Úval_ids   &&&&    r   Útrack_node_mutationsÚ'GraphRegionTracker.track_node_mutations  sg   € ô !+¬3¦Ó 1ÐÜÐ 0Ö1‰FˆAÜ˜“WˆFàÖ/Ø)Õ1°S·\±\ÖAà%×)Ñ)¨!Ö,ñ 2÷ !Ø7L×.Ñ.¨tÓ4ñ !r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rq   rj   Úarg_posrn   r   r   r   )r   s   "r   r   rÓ   +  s-   € ÷ Mñ MàðMð ðMð 
ñ	Mr   c                	ó    € WP                   9   d%   V P                   V,          P                  V4       R # \        V.4      V P                   V&   R # r   )rØ   rú   r
   )rS   rq   r   s   &&&r   Úadd_node_mutationÚ$GraphRegionTracker.add_node_mutation+  s@   € ð
 ×5Ñ5Ô5Ø×.Ñ.¨tÕ4×8Ñ8¸ÖAä7AÀ7À)Ó7LˆD×.Ñ.¨tÓ4r   c               ó    € V ^8„  d   QhRRRR/# )r   Úgraphútorch.fx.Graphr   zlist[list[Region]]r   )r   s   "r   r   rÓ   5  s   € ÷ @
ñ @
¨>ð @
Ð>Pñ @
r   c                óH  € \        VP                  4       UUu/ uF  w  r#W2bK	  	  ppp. p\        V4      pV P                  P	                  4        F€  p\        V4      ^8”  g   K  . p\        P                  p	V F/  pW49   g   K  \        W”V,          4      p	VP                  V.4       K1  	  \        V4      ^8”  g   Kn  VP                  W‰34       K‚  	  VP                  R R7       V U
Uu. uF  w  r«V
NK	  	  pp
p\        4       pV FV  p\        VVVV P                  4       V^ ,          p\        V4       UUu/ uF  w  ppWôV,          bK  	  ppp\        VV4       KX  	  V Uu. uF  p\        V^ ,          4      ^8”  g   K  VNK   	  up# u uppi u upp
i u uppi u upi )a‚  
This function is responsible for extracting the largest regions of identical nodes from the given graph.
**Note**: This function assumes the nodes that have been tracked with track_node are in the provided graph argument.

The algorithm proceeds as follows:
The nodes tracked via track_node above are organized into region groups. The initial region groups look like this:
[[IdenticalNode1], [IdenticalNode2], [IdenticalNode3]] and each sublist is called a region. For each region group
(starting at the topologically latest region group), the inner regions are gradually expanded one node at time from
the flattened args and kwargs of the node in each region provided that for all regions in the group, the nodes being
added are also identical (ie have the same key computed by track_node). This is checked by verifying that the two
nodes have the same identical node list in node_to_duplicates.
c                ó   € V ^,          ) # )é   r   )Úrgs   &r   rA   Ú:GraphRegionTracker.get_identical_regions.<locals>.<lambda>\  s
   € °R¸µU±Fr   rs   )r÷   ÚnodesÚ _populate_recursive_ancestor_maprÖ   Úvaluesr�   ÚmathÚinfÚminr)   ÚsortÚsetÚfully_expand_region_grouprè   r“   )rS   r  rŒ   rq   Útopological_rankingÚregion_groups_with_rankÚnode_to_recursive_ancestorsÚgroupÚregion_groupÚmin_rankr
  r€   Úregion_groupsÚ
seen_nodesr�   ÚindexÚnr‡   s   &&                r   Úget_identical_regionsÚ(GraphRegionTracker.get_identical_regions5  s£  € ô 7@ÀÇÁÔ6LÔMÑ6L©7¨1˜tšwÑ6LÐÑMØ"$Ðä&FÀuÓ&MÐ#ð ×,Ñ,×3Ñ3Ö5ˆEÜ�5‹z˜AŽ~à!�ÜŸ8™8�ã!�DàÖ2Ü#& xÀTÕ1JÓ#K˜Ø$×+Ñ+¨T¨FÖ3ñ	 "ô �|Ó$ qÖ(Ø+×2Ñ2°LÐ3KÖLñ 6ð 	 ×$Ñ$Ñ):Ð$Ô;Ù)@ÔAÑ)@¡ ›Ñ)@ˆÑAô
 !$£ˆ
Û)ˆLÜ%ØØØ+Ø×"Ñ"ô	ð & a�ˆJä>GÈ
Ô>SôÙ>S±(°%¸�¨1Õ-Ò-Ñ>Sð ñ ô " -°Ö>ñ *ñ" .;ó
Ù-:˜\¼cÀ,ÈqÅ/Ó>RÐUVÑ>V�LˆL©]ñ
ð 	
ùóc Nùó6 Bùó"ùò

s   ™FÃ,FÄ:FÅ&FÆFc               ó   € V ^8„  d   QhRR/# rÉ   r   )r   s   "r   r   rÓ   w  s   € ÷ Añ A˜ñ Ar   c                	ó<   € R V P                    RV P                   R2# )z&GraphRegionTracker(hash_to_duplicates=z, node_to_duplicates=rË   )rÖ   r×   r½   s   &r   rÍ   ÚGraphRegionTracker.__str__w  s.   € Ø7¸×8OÑ8OÐ7PÐPeÐfj×f}Ñf}Ðe~Ð~ð  Að  	Ar   )rÖ   rÙ   r×   rØ   N)r3   r4   r5   r6   Ú__doc__rI   rá   rè   rñ   rý   r  r  rÍ   r7   r   r   r   rÑ   rÑ   Ù   s;   † ñõ,õ:õ
õKõ(Mõ,Mõ@
÷DAñ Ar   rÑ   c                  óJ   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltRt	R# )ÚRegionWrapperi{  zPHolds state for regions e.g. ancestors and new candidate nodes for considerationc               ó$   € V ^8„  d   QhRRRRRR/# )r   r’   ÚRegionr  údict[Node, set[Node]]r   r   r   )r   s   "r   r   ÚRegionWrapper.__annotate__~  s$   € ÷ 
ñ 
Øð
Ø;Pð
à	ñ
r   c                	óè   € \        V4      ^8w  d   \        R4      hV^ ,          pW n        \        P	                  V4      V n        \        V.4      V n        \        W#,          4      V n	        Wn
        R# )r	  ú&all regions should start with one nodeN)r�   r±   r  r¥   r³   Úiterr
   Únodes_uniquer  Ú	ancestorsr’   )rS   r’   r  rq   s   &&& r   rI   ÚRegionWrapper.__init__~  sa   € ô ˆv‹;˜!ÔÜ Ð!IÓJÐJØ�a�yˆØ+FÔ(Ü&×-Ñ-¨dÓ3ˆŒ	Ü&¨ vÓ.ˆÔÜÐ8Õ>Ó?ˆŒØŽr   c               ó   € V ^8„  d   QhRR/# r¶   r   )r   s   "r   r   r*  Š  s   € ÷  ñ   ñ  r   c                	ó6   € V P                   P                  4       # r   )r-  r°   r½   s   &r   Únext_candidateÚRegionWrapper.next_candidateŠ  s   € Ø�y‰y�~‰~ÓÐr   c               ó    € V ^8„  d   QhRRRR/# )r   rq   rj   r   ræ   r   )r   s   "r   r   r*  �  s   € ÷ ñ °ð ¸ñ r   c                	ó¢   € VP                    Uu. uF  q"V P                  9  g   K  VNK  	  ppV F  pW P                  9   g   K   R # 	  R# u upi )TF)Úusersr.  r/  )rS   rq   ÚuserÚexternal_userss   &&  r   Úwill_inclusion_create_cycleÚ)RegionWrapper.will_inclusion_create_cycle�  sI   € Ø+/¯:ª:ÓW©: 4ÀT×EVÑEVÑ9VŸ$˜$©:ˆÐWÛ"ˆDØ—~‘~Ö%Úñ #ñ ùò Xs
   �A¦Ac               ó    € V ^8„  d   QhRRRR/# rÁ   r   )r   s   "r   r   r*  •  s   € ÷ Fñ F˜ð F ñ Fr   c                	ó   € V P                   P                  V4       V P                  P                  V4       V P                  P                  V4       V P                  P                  V P                  V,          4       R # r   )	r.  rú   r’   r)   r-  r¯   r/  rM   r  )rS   rq   s   &&r   rú   ÚRegionWrapper.add•  sW   € Ø×Ñ×Ñ˜dÔ#Ø�‰×Ñ˜4Ô Ø�	‰	×Ñ˜tÔ$Ø�‰×Ñ˜d×>Ñ>¸tÕDÖEr   )r/  r-  r  r.  r’   N)
r3   r4   r5   r6   r$  rI   r3  r:  rú   r7   r   r   r   r&  r&  {  s    † ÙZõ
õ õ÷Fñ Fr   r&  c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r‰   zlist[Region]r  z	set[Node]r  r)  Úis_identical_fnzCallable[[Node, Node], bool]r   r   r   )r   s   "r   r   r   œ  sH   € ÷ PDñ PDØðPDàðPDð "7ðPDð 2ð	PDð
 
ñPDr   c           	     óà  € \        R 4       \        RV 4       \        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      '       g   \        R4      hV  Uu. uF  p\        WB4      NK  	  pp\        \
        ,          ! 4       pV^ ,          P                  4       pVf   R# V'       Ed   V^ ,          P                  V4      '       * pVP                  4        VP                  V4       VR,           Fû  p	V	P                  4       p
\        R4       \        R	W§4       V
'       d	   V'       g   RpK>  \        R
W¡9   4       \        RV! W§4      4       TW¡9  ;'       da    W¦9  ;'       dU    V
P                  R8g  ;'       d>    V
P                  R8g  ;'       d'    V! W§4      ;'       d    V	P                  V
4      '       * ,          pVP                  V
4       \        RV 24       \        R4       Ký  	  V'       dŸ   \        V4      \        V4      8w  d   \        R4      h\        WV4       Fk  w  r›V	P                  V4       \        RV4       \        RVP                  \        VP                  P!                  4       4      4       VP                  V4       Km  	  V^ ,          P                  4       pEK  V  F  pVP#                  4        K  	  \        RV 4       \        R 4       R# u upi )z2--------------------------------------------------zexpanding new region group: %sc              3  ó>   "  € T F  p\        V4      ^8H  x € K  	  R# 5i)r	  N)r�   )rv   r’   s   & r   rw   Ú,fully_expand_region_group.<locals>.<genexpr>¦  s   é € Ð6©g FŒs�6‹{˜aÖ«gùs   ‚FTr,  N:r	  NNz--------------------z'considering candidate: %s, cur_node: %sz*candidate in previously claimed nodes?: %szis_identical: %sÚplaceholderÚget_attrzadd_to_all_regions: z7Number of nodes to add must equal the number of regionszadding %s's childrenz%s %szend expand new region group: %s)r!   Úallr±   r&  r
   rj   r3  r:  Úclearrú   Úopr�   Úzipr    rÕ   rz   r{   Úreverse)r‰   r  r  r@  r’   Úregion_wrappersÚnodes_to_addÚcurrent_nodeÚadd_to_all_regionsÚregion_wrapperÚ	candidaterq   s   &&&&        r   r  r  œ  s¾  € ô ÐBÔCÜÐ.°Ô8÷ ‹3Ñ6©gÓ6�3�3Š3Ñ6©gÓ6×6Ò6ÜÐEÓFÐFáIPóÙIP¸vŒ�fÖ:Éð ð ô œdÖ#Ó%€LØ" 1Õ%×4Ñ4Ó6€Lð ÒÙ÷
 ˆ,Ø!0°Õ!3×!OÑ!OØó"
ô 
Ðð 	×ÑÔØ×Ñ˜Ô&Ø-¨b×1Ð1ˆNØ&×5Ñ5Ó7ˆIäÐ,Ô-ÜØ9¸9ô÷ ×$6Ø%*Ð"ÙäØ<¸iÑ>Uôô Ð(©/¸)Ó*RÔSàØÑ+÷ Nð NØÑ1÷Nð Nà—L‘L MÑ1÷Nð Nð —L‘L JÑ.÷Nð Nñ $ IÓ<÷	Nð Nð
 '×BÑBÀ9ÓMÔMõÐð ×Ñ˜YÔ'äÐ,Ð-?Ð,@ÐAÔBÜÐ,Ö-ñ9 2÷< Ü�?Ó#¤s¨<Ó'8Ô8Ü$ØMóð ô ),¨OÖ(JÑ$�Ø×"Ñ" 4Ô(ÜÐ0°$Ô7Ü˜' 4§9¡9¬d°4·;±;×3DÑ3DÓ3FÓ.GÔHØ—‘˜tÖ$ñ	 )Kð ' qÕ)×8Ñ8Ó:‹ó ˆØ�‰Öñ ô Ð/°Ô9ÜÐBÖCùòIs   Á!K+c               ó    € V ^8„  d   QhRRRR/# )r   r  r  r   r)  r   )r   s   "r   r   r   ï  s   € ÷ 'ñ '¨Nð 'Ð?Tñ 'r   c                ó0  € / pV P                    F  p\        4       W&   K  	  V P                    Fd  p\        V/ 4      pV FO  p\        V\        4      '       g   K  W,          P                  W,          4       W,          P                  V4       KQ  	  Kf  	  V# r   )r  r  r   ri   rj   rM   rú   )r  r  rq   r„   rf   s   &    r   r  r  ï  s„   € Ø9;ÐØ—”ˆÜ,/«EÐ#Ó)ñ à—”ˆÜ(¨¨rÓ2ˆÛˆCÜ˜#œt×$Ô$Ø+Õ1×8Ñ8Ø/Õ4ôð ,Õ1×5Ñ5°cÖ:ó ñ ð 'Ð&r   )Ar$  Ú
__future__r   rJ   rE   Úloggingr  r|   ÚpickleÚcollectionsr   r   Údataclassesr   Útypingr   r   r   Útorch._loggingrN   Útorch.fxÚtorch._subclasses.fake_tensorr	   Útorch.utils._ordered_setr
   Útorch.utils._pytreer   Úgraph_utilsr   r   Úcollections.abcr   Úsymbolic_convertr   Úfxrj   rÕ   r(  ÚIdenticalNodesr,   ræ   rn   Údtyper•   Ú	getLoggerr3   rï   Ú_loggingÚgetArtifactLoggerr   r!   r0   Ú	Exceptionr2   ÚPicklerr9   ro   r…   r“   r£   r¥   rÑ   r&  r  r  r   r   r   Ú<module>ri     sX  ðñõ #ã Û 	Û Û Û Û ß *Ý ß .Ñ .ã Û Ý 4Ý /Ý ,å .ñ ˆCƒL€÷ Ý(å;ð ‡x�x‡}�}€Ø	ˆd�€Ø�d•€ØØØØØ	ˆ$�ˆ*ÕØ	ˆ$�ˆ*ÕØ	‡K�KØØØØð	
õ€ð ×Ò˜Ó!€Ø—n‘n×6Ñ6ØÐ&óÐ õ
*õ
 ô	˜	ô 	ô%�6—>‘>ô %õ@õHõ	8õ÷,'Kñ 'K÷T_Añ _A÷DFñ FõBPD÷f'r   