§
    ŠŠtjí_  ã                   ó¢  — U d Z ddlZddlZddlmZmZ ddlmZmZ ddl	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mZ eeef         Z ej        e¦  «        Zdaeeee         f         dz  e d<   dee!e	j"        j#        f         fd„Z$de	j"        j%        dededeee                  deeee         f         deeeeedf         ef         f         de&e         de!deeee         f         deeee         f         ddfd„Z'dedeeee         f         fd„Z(de&e         de&e         fd„Z)dede*e         ddfd„Z+dede&e         dee	j"        j%        e&ee                  eeee         f         eeeeedf         ef         f         f         fd„Z,	 	 d7de	j"        j%        deeee         f         d!e-dee         dz  de-f
d"„Z.de	j"        j%        deeee         f         ddfd#„Z/de	j"        j%        dee         ddfd$„Z0de	j"        j%        deeee         f         de-fd%„Z1de	j"        j%        deeee         f         deeee         f         fd&„Z2de	j"        j%        deeee         f         ddfd'„Z3deeee         f         deeee         f         ddfd(„Z4ded)e&e         de&e         d*ee         de-f
d+„Z5d,ede-fd-„Z6d,edeeddf         fd.„Z7d,ededee         fd/„Z8d,ed0ed1e	j"        j%        dee&e         eeedf         ef         f         fd2„Z9d,ed3ed4eeedf         ef         d5ede	j"        j%        dee         fd6„Z:dS )8a"  
This module implements graph deduplication functionality for TorchDynamo's optimization pipeline.
Graph deduplication identifies identical subgraphs in the computational graph and merges them
to reduce redundancy and improve performance. The process involves analyzing regions of the graph,
identifying structurally equivalent regions, and replacing them with a single shared implementation.
This optimization is particularly effective for models with repeated patterns or similar computational
structures across different parts of the network.
é    N)ÚdefaultdictÚdeque)Ú	GeneratorÚIterable)Úconfig)ÚStorageWeakRef)Ú
OrderedSeté   )ÚNodeÚRegion)Ú_detect_cyclesÚ_get_flat_argsÚ_get_flat_args_uniqueÚlast_node_to_additional_depsÚreturnc                 ó®  — | j                              | j        ¦  «        }| j         j        }t	          | j        | j         j        ¦  «        }i }|D ]î}t          |¦  «        }|d         }t          ||¦  «        \  }}	}
}t          |	¦  «        sŒ>t          j	         
                    | j        |¦  «        }|                      d|¦  «        }|||<   | j                             ¦   «         5  | j                             d|di ¦  «        }ddd¦  «         n# 1 swxY w Y   |D ]}t          | j        |||	|
|||||¦
  «
         Œ Œï|at#          | j        |¦  «         |S )a¹  
    This is the main entry point for applying the graph deduplication pass. Deduplication occurs in two phases:
    1. Subgraph creation:
        Subgraph creation works by taking one representative region from each region group and creating a subgraph from it, which will then be used to replace all regions in the group. This is implemented by first copying all nodes of the region to the new subgraph and then finding all inputs which are not within the region and creating placeholders for them. For the outputs, all regions in a region group need to be scanned to ensure the largest set of outputs is found, and then an output node is created which returns a tuple of all outputs.

    2. Graph replacement:
        To replace each region with the extracted subgraph, the node index in the region and argument index within the node's flattened args and kwargs are recorded once during subgraph creation. This allows us to determine which (external to the region) nodes and in which order these nodes are passed as inputs. For the outputs, getitem nodes are created for each output, and all nodes in the region with external outputs are replaced by the proper getitem node. Finally, all original nodes are erased (there should be no uses of these left in the graph).

The deduplication mutates the output_graph argument in place.

Returns a mapping of nodes to their subgraph output replacement node to remap outputs
when they are created in output_graph.
    r   ÚsubgraphÚget_attr© N)Úregion_trackerÚget_identical_regionsÚgraphÚnode_to_mutated_arg_positionsÚ_populate_additional_depsÚ_get_all_output_indicesÚ_create_subgraphÚlistÚtorchÚfxÚGraphModuleÚ
nn_modulesÚinstall_subgraphÚinserting_beforeÚcreate_nodeÚ_replace_region_with_subgraphr   Ú_stable_topological_sort)Úoutput_graphÚduplicated_region_groupsr   Únode_to_additional_depsÚsub_gmsÚregion_groupÚinds_with_external_usersÚregionr   Úexternal_node_usagesÚnode_usage_to_tuple_elemsÚind_to_tuple_specÚsub_gmÚsubgraph_nameÚget_subgraph_nodes                  ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_dynamo/graph_deduplication.pyÚapply_graph_deduplicationr5   $   sô  € ð8  ,Ô:×PÒPØÔñ ô  Ðð 	Ô#ÔAð "õ 8ØÔ˜LÔ7ÔUñô Ðð 02€Gà0ð "ð "ˆÝ#:¸<Ñ#HÔ#HÐ Ø˜a”ˆõ ˜VÐ%=Ñ>Ô>ñ	
ØØ Ø%Øõ Ð(Ñ)Ô)ð 	Øå”×%Ò% lÔ&=¸xÑHÔHˆØ$×5Ò5°jÀ&ÑIÔIˆØ!'ˆ�ÑØÔ×0Ò0Ñ2Ô2ð 	ð 	Ø ,Ô 2× >Ò >Ø˜M¨2¨rñ!ô !Ðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 #ð 	ð 	ˆFÝ)ØÔ"ØØ!Ø$Ø)Ø!Ø(ØØ'Ø-ñô ð ð ð	ð  $;Ð åØÔØñô ð ð €Ns   Ã&DÄD	ÄD	r   r-   r3   r.   r/   r0   .r,   r2   r)   r   c
           
      ó�  ‡— g }
t          ¦   «         }|D ]Ö}t          t          |¦  «        ¦  «        }|\  }}‰|         }t          |i ¦  «        }|D ]:\  }}‰|         }||	v r)||	|         v rt                               d‰¦  «           d S Œ;||v r?ˆfd„||         D ¦   «         }|                     |¦  «         |
                     |¦  «         Œ»|
                     ||         ¦  «         Œ×t          ‰|
||¦  «        rd S ||g|
¢R }|  
                    dt          j        j        j        |i ¦  «        }d}t          ¦   «         }|D ]š}‰|         }t          |¦  «        rA||         }|                     t!          ||||| ¦  «        ¦  «         |t#          |¦  «        z  }ŒZ|  
                    dt$          j        ||fi ¦  «        }|                     |d¬¦  «         |dz  }Œ›t+          ‰¦  «        D ]ˆ}||v rŒ||vr|                      |¦  «         |                     |d ¦  «         |                     ¦   «         D ]=}	 |                     |¦  «         |                     |¦  «         Œ.# t6          $ r Y Œ:w xY wŒ‰t8          j        rCt=          t?          | |¦  «        ¦  «         tA          | |¦  «         |  !                    ¦   «          d S d S )Nz3NYI: Failed to substitute region %s due to mutationc                 ó    •— g | ]
}‰|         ‘ŒS r   r   )Ú.0Úir-   s     €r4   ú
<listcomp>z1_replace_region_with_subgraph.<locals>.<listcomp>—   s   ø€ ÐOÐOÐO¨˜6 !œ9ÐOÐOÐOó    Úcall_functionr   T©Úpropagate_metar
   )"r	   ÚnextÚiterr   ÚlogÚdebugÚupdateÚextendÚappendÚ_has_aliasingr$   r   ÚopsÚhigher_orderÚinvoke_subgraphÚ_is_tuple_nodeÚ_replace_tuple_outputsÚlenÚoperatorÚgetitemÚreplace_all_uses_withÚreversedÚ
erase_nodeÚpopÚvaluesÚremoveÚaddÚKeyErrorr   Úgraph_deduplication_lintÚprintr   r&   Úlint)r   r-   r3   r.   r/   r0   r,   r2   r)   r   Úsub_argsÚflattened_getitem_nodesÚusagesÚusageÚnode_indÚ	usage_indÚnodeÚflattened_args_kwargsÚuser_indÚnode_usage_indÚuserÚtuple_elemsÚinvoke_argsÚinvoke_subgraph_nodeÚindÚflattened_output_nodesÚexternal_user_indÚ
tuple_specÚsubgraph_outputÚdepss    `                            r4   r%   r%   {   s†  ø€ ð €HÝ0:±´ÐØ&ð >ð >ˆÝ•T˜&‘\”\Ñ"Ô"ˆØ#Ñˆ�)Ø�hÔˆÝ .¨t°RÑ 8Ô 8ÐØ(.ð 	ð 	Ñ$ˆH�nØ˜(Ô#ˆDØÐ4Ð4Ð4Ø!Ð%BÀ4Ô%HÐHÐHÝ—I’IØMÈvñô ð ð �F�F�FøØÐ-Ð-Ð-ØOÐOÐOÐOÐ.GÈÔ.NÐOÑOÔOˆKØ#×*Ò*¨;Ñ7Ô7Ð7Ø�OŠO˜KÑ(Ô(Ð(Ð(à�OŠOÐ1°)Ô<Ñ=Ô=Ð=Ð=õ
 Ø�Ð2Ð4Kñô ð ð 	ˆà$ mÐ?°hÐ?Ð?€Kà ×,Ò,ØÝŒ	ÔÔ.ØØ
ñ	ô Ðð €CÝ/9©|¬|ÐØ5ð ð ÐØÐ'Ô(ˆÝ˜$ÑÔð 	Ø*Ð+<Ô=ˆJØ"×)Ò)Ý&Ø˜#˜zÐ+?Àñô ñô ð ð
 •3�z‘?”?Ñ"ˆCˆCà#×/Ò/Ø¥Ô!1Ð4HÈ#Ð3NÐPRñô ˆOð ×&Ò& ÀtÐ&ÑLÔLÐLØ�1‰HˆCˆCõ ˜Ñ Ô ð ð ˆØÐ*Ð*Ð*ààÐ-Ð-Ð-Ø×Ò˜TÑ"Ô"Ð"ð 	 ×#Ò# D¨$Ñ/Ô/Ð/Ø+×2Ò2Ñ4Ô4ð 	ð 	ˆDðØ—’˜DÑ!Ô!Ð!Ø—’Ð-Ñ.Ô.Ð.Ð.øÝð ð ð Ø�ðøøøð		õ Ô&ð Ý�n˜UÐ$;Ñ<Ô<Ñ=Ô=Ð=Ý  Ð(?Ñ@Ô@Ð@Ø�
Š
‰Œˆˆˆðð s   È;*I&É&
I3É2I3c                 óf  — t          t          t          t                   f         t          ¦  «        }t	          | ¦  «        }t          | ¦  «        D ]`\  }}t          |i ¦  «        }t          |¦  «        D ];\  }}t          |t          ¦  «        r!||vr||                              ||f¦  «         Œ<Œa|S ©N)	r   r   r	   Ú
UsageIndexÚsetÚ	enumerater   Ú
isinstancerU   )r-   Úexternal_node_to_usagesÚregion_uniquer^   r`   ra   Úarg_indÚin_nodes           r4   Ú_get_external_inputsrx   Ü   sÄ   € õ *­$µ
½:Ô0FÐ*FÔGÍ
ÑSÔSÐÝ˜‘K”K€MÝ# FÑ+Ô+ð Jð J‰ˆ�$Ý .¨t°RÑ 8Ô 8ÐÝ )Ð*?Ñ @Ô @ð 	Jð 	JÑˆG�WÝ˜'¥4Ñ(Ô(ð J¨W¸MÐ-IÐ-Ið
 (¨Ô0×4Ò4°hÀÐ5HÑIÔIÐIøð	Jð #Ð"r;   Úregionsc                 óf   — t          ¦   «         }| D ]}t          ||¦  «         Œt          |¦  «        S ro   )rq   Ú_get_inds_with_external_usersÚsorted)ry   r,   r-   s      r4   r   r   î   sB   € õ *-©¬ÐØð Hð HˆÝ% fÐ.FÑGÔGÐGÐGåÐ*Ñ+Ô+Ð+r;   Úinds_uniquec                 ó~   — t          | ¦  «        D ],\  }}|j        D ]}|| vr||vr|                     |¦  «         Œ Œ-d S ro   )rr   ÚusersrU   )r-   r}   rh   r`   rd   s        r4   r{   r{   ø   sf   € Ý˜vÑ&Ô&ð )ð )‰	ˆˆTØ”Jð 	)ð 	)ˆDØ˜6Ð!Ð!Ø˜kÐ)Ð)Ø—O’O CÑ(Ô(Ð(øð	)ð)ð )r;   c                 ó"  ‡‡‡— t           j                             ¦   «         Št          | ¦  «        }t	          t
          t                            ¦   «         }i Št          ¦   «         }i }|                     ¦   «         D ]Æ\  }}t          |¦  «        r{t          || ¦  «        }|D ]H}	‰ 
                    d|j        › d|	› �¦  «        }
|
‰| |	         <   |                     | |	         ¦  «         ŒI||t          t          |¦  «        ¦  «        <   n"‰ 
                    d|j        › �¦  «        }
|
‰|<   |                     |¦  «         ŒÇdt           dt           fˆfd„Šdt           dt           fˆˆˆfd„}g }i }t#          | ¦  «        D ]i\  }	}||vr` ||¦  «        }|	|v rQt          |¦  «        r-t%          ||‰¦  «        \  }||	<   |                     |¦  «         ŒT|                     |¦  «         Œj‰                     t+          |¦  «        ¦  «         ‰|||fS )NÚsupgraph_input_Ú_flattened_Úsubgraph_input_r`   r   c                 ó    •— | ‰v r‰|          S | S ro   r   )r`   Úregion_to_subgraph_nodes    €r4   Úmap_argz!_create_subgraph.<locals>.map_arg'  s   ø€ ØÐ*Ð*Ð*Ø*¨4Ô0Ð0àˆKr;   c                 óD   •— ‰                      | ˆfd„¦  «        }|‰| <   |S )Nc                 ó   •—  ‰| ¦  «        S ro   r   )Úoldr†   s    €r4   ú<lambda>z<_create_subgraph.<locals>.copy_to_subgraph.<locals>.<lambda>.  s   ø€ ¸W¸WÀS¹\¼\€ r;   )Ú	node_copy)r`   Úsubgraph_noder†   r…   r   s     €€€r4   Úcopy_to_subgraphz*_create_subgraph.<locals>.copy_to_subgraph-  s3   ø€ Ø ×*Ò*¨4Ð1IÐ1IÐ1IÐ1IÑJÔJˆØ(5Ð Ñ%ØÐr;   )r   r   ÚGraphrx   r   r	   rp   ÚitemsrJ   Ú_get_flattened_node_indicesÚplaceholderÚnamerU   r?   r@   rE   r   rr   Ú_create_getitem_nodesrD   ÚoutputÚtuple)r-   r,   Úexternal_input_to_usagesr.   r[   r/   r`   Úusage_indicesÚflattened_node_indicesrh   r‘   r�   Úoutput_listr0   rŒ   Úgetitem_nodesr†   r…   r   s                   @@@r4   r   r      sš  øøø€ õ  %œxŸ~š~Ñ/Ô/€HÝ3°FÑ;Ô;ÐÝ¥
­:Ô 6Ô7Ñ9Ô9ÐØ ÐÝ0:±´ÐØCEÐà7×=Ò=Ñ?Ô?ð 3ð 3Ñˆˆmå˜$ÑÔð 	8õ
 &AÀÀvÑ%NÔ%NÐ"Ø-ð 9ð 9�Ø&×2Ò2ØA d¤iÐAÐA¸CÐAÐAñô �ð 8CÐ'¨¨s¬Ñ4Ø'×+Ò+¨F°3¬KÑ8Ô8Ð8Ð8à&ð &¥d­4°Ñ+>Ô+>Ñ&?Ô&?Ñ@Ð@ð #×.Ò.Ð/LÀÄÐ/LÐ/LÑMÔMˆKØ,7Ð# DÑ)à×#Ò# MÑ2Ô2Ð2Ð2ð•dð �tð ð ð ð ð ð ð�tð ­ð ð ð ð ð ð ð ð ð
 €KØÐÝ˜vÑ&Ô&ð 6ð 6‰	ˆˆTØÐ.Ð.Ð.Ø,Ð,¨TÑ2Ô2ˆMØÐ.Ð.Ð.å! $Ñ'Ô'ð 6Ý<QØ˜m¨Xñ=ô =Ñ9�MÐ#4°SÑ#9ð  ×&Ò& }Ñ5Ô5Ð5Ð5à×&Ò& }Ñ5Ô5Ð5øà‡O‚O•E˜+Ñ&Ô&Ñ'Ô'Ð'àÐ)Ð+DÐFWÐWÐWr;   TÚdo_sortc                 ó–  — t          t          |p| j        ¦  «        ¦  «        }t          ¦   «         }t	          t           ¦  «        }t          t                   ¦   «         }t          |¦  «        }d }	|�r|                     ¦   «         }
|
j	        dk    r,| 
                    |
¦  «         |
j        rt          d¦  «        ‚ŒN|rt          |
|¦  «        }n|
j        }d }|D ]}||vr|�||v r|}Œ|�||                              |
¦  «         no| 
                    |
¦  «         |	r |	j        |
ur|r|	                     |
¦  «         |
}	|                     t          |                     |
d¦  «        ¦  «        ¦  «         |�°|                     |¦  «         |�t'          |¦  «        nt'          | j        ¦  «        }| ot'          |¦  «        |k    S )Nr”   z!output nodes should have no usersr   )r   rP   Únodesrq   r   r	   r   ÚboolrR   ÚoprU   r   ÚAssertionErrorr   Ú_input_nodesrE   r?   rD   rC   rL   )r   r)   r›   r-   ÚpendingÚreadyÚwaitingÚoutputsÚhas_additional_depsÚcursorr`   rm   Úlast_unreadyÚxÚexpected_lens                  r4   Ú_stable_topological_sort_implr«   F  sè  € õ •8˜FÐ1 e¤kÑ2Ô2Ñ3Ô3€Gõ
 ‘u”u€Eõ �$ÑÔ€Gõ �ÔÑ Ô €GåÐ6Ñ7Ô7Ðð €FØ
ñ <Ø�{Š{‰}Œ}ˆàŒ7�hÒÐØ�KŠK˜ÑÔÐØŒzð JÝ$Ð%HÑIÔIÐIØð ð 	%Ý(¨Ð/FÑGÔGˆDˆDàÔ$ˆDàˆØð 	!ð 	!ˆAØ˜ˆ~ˆ~ 6 >°Q¸&°[°[Ø �øØÐ#ð �LÔ!×(Ò(¨Ñ.Ô.Ð.Ð.à�IŠI�d‰OŒOˆOØð $˜&œ+¨TÐ1Ð1°gÐ1Ø—’˜dÑ#Ô#Ð#ØˆFð �NŠN�8 G§K¢K°°bÑ$9Ô$9Ñ:Ô:Ñ;Ô;Ð;ð? ñ <ðB 
‡L‚L�ÑÔÐØ"(Ð"4•3�v‘;”;�;½#¸e¼kÑ:JÔ:J€LØˆ;Ð5�3˜u™:œ:¨Ò5Ð5r;   c                 óD   — t          | |¦  «        st          d¦  «        ‚d S )Nzstable topological sort failed©r«   r    ©r   r)   s     r4   r&   r&   ˆ  s0   € õ )¨Ð0GÑHÔHð ?ÝÐ=Ñ>Ô>Ð>ð?ð ?r;   c                 óH   — t          | i |¬¦  «        st          d¦  «        ‚d S )N)r-   z(stable topological sort of region failedr­   )r   r-   s     r4   Ú_stable_topological_sort_regionr°   �  s7   € õ )¨°¸6ÐBÑBÔBð IÝÐGÑHÔHÐHðIð Ir;   c                 ó(   — t          | |d¬¦  «         S )NF)r›   )r«   r®   s     r4   Ú
_has_cycler²   ˜  s(   € õ -ØÐ&°ðñ ô ð ð r;   c                 ón   — t          t          ¦  «        }t          ||¦  «         t          | |¦  «         |S ro   )r   r	   Ú_add_mutation_dependenciesÚ_add_global_state_dependencies)r   r   r)   s      r4   r   r   ¡  s<   € õ =HÍ
Ñ<SÔ<SÐÝÐ<Ð>UÑVÔVÐVÝ" 5Ð*AÑBÔBÐBØ"Ð"r;   c                 ó&  ‡— dd l }t          | j        ¦  «        }|j        j        |j        j        h}g }dt          t                   dt          t          t          t                   t          f         d d f         fd„} ||¦  «        D ]‰\  }}t          |i ¦  «        Šˆfd„|D ¦   «         }	|	r||         }
|
 
                    |	¦  «         |j        |v r>||         }
|
 
                    ˆfd„|D ¦   «         ¦  «         |                     |¦  «         ŒŠd S )Nr   Ú	all_nodesr   c              3   ó°   K  — g }t          t          | ¦  «        ¦  «        }|r3|                     ¦   «         }||fV — |                     |¦  «         |°1d S d S ro   )r   rP   rR   rE   )r·   Ú
prev_nodesÚ
next_nodesÚcur_nodes       r4   Úprev_cur_nodesz6_add_global_state_dependencies.<locals>.prev_cur_nodesµ  s|   è è € ð "$ˆ
Ý�( 9Ñ-Ô-Ñ.Ô.ˆ
àð 	(Ø!—~’~Ñ'Ô'ˆHØ˜hÐ&Ð&Ð&Ð&Ø×Ò˜hÑ'Ô'Ð'ð ð 	(ð 	(ð 	(ð 	(ð 	(r;   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   ©r8   ÚnÚargs_uniques     €r4   r:   z2_add_global_state_dependencies.<locals>.<listcomp>Â  s#   ø€ ÐHÐHÐH˜!°1¸KÐ3GÐ3G�AÐ3GÐ3GÐ3Gr;   c              3   ó$   •K  — | ]
}|‰v¯|V — Œd S ro   r   r¾   s     €r4   ú	<genexpr>z1_add_global_state_dependencies.<locals>.<genexpr>Ê  s-   øè è € Ð"QÐ"Q¨¸AÀ[Ð<PÐ<P 1Ð<PÐ<PÐ<PÐ<PÐ"QÐ"Qr;   )Ú	torch.ampr   r�   ÚampÚ_enter_autocastÚ_exit_autocastr   r   r•   r   rC   ÚtargetrE   )r   r)   r   r·   Úglobal_state_targetsÚall_nodes_dep_onr¼   r¹   r»   Únew_depsÚadditional_depsrÀ   s              @r4   rµ   rµ   ª  sN  ø€ ð ÐÐÐå�U”[Ñ!Ô!€Ið "œIÔ5°u´yÔ7OÐPÐØ#%Ðð	(Ý�”:ð	(å	•5��dœ¥TÐ)Ô*¨D°$Ð6Ô	7ð	(ð 	(ð 	(ð 	(ð !/ ¨yÑ 9Ô 9ð .ð .Ñˆ
�HÝ+¨H°bÑ9Ô9ˆØHÐHÐHÐHÐ/ÐHÑHÔHˆàð 	-Ø5°hÔ?ˆOØ×"Ò" 8Ñ,Ô,Ð,àŒ?Ð2Ð2Ð2Ø5°hÔ?ˆOØ×"Ò"Ð"QÐ"QÐ"QÐ"Q¨jÐ"QÑ"QÔ"QÑQÔQÐQØ×#Ò# HÑ-Ô-Ð-øð.ð .r;   c                 ó  — |                       ¦   «         D ]t\  }}t          |i ¦  «        }|D ]\}||         }|j        D ]J}||u rŒ||k     r||                              |¦  «         Œ)||k    r||                              |¦  «         ŒKŒ]Œud S ro   )r�   r   r   rU   )r   r)   r`   ÚindicesÚflat_args_kwargsÚindexÚmutated_argrd   s           r4   r´   r´   Î  sÈ   € ð 7×<Ò<Ñ>Ô>ð <ð <‰ˆˆgÝ)¨$°Ñ3Ô3Ðð ð 
	<ð 
	<ˆEØ*¨5Ô1ˆKØ#Ô)ð <ð <�Ø˜4�<�<Øà˜D’[�[Ø+¨DÔ1×5Ò5°dÑ;Ô;Ð;Ð;à˜D’[�[Ø+¨DÔ1×5Ò5°dÑ;Ô;Ð;øð<ð
	<ð<ð <r;   Úinputsr[   c                 ó²  ‡‡— t          ¦   «         Š|D ]~}||v rŒ|j        d         }t          |t          j        ¦  «        rPt          |                     ¦   «         ¦  «        }|‰v r&t                               d| ‰|         |¦  «          dS |‰|<   Œt          ¦   «         Š|D ]¬}| |         }||v rŒ|r›|j        d         }t          |t          ¦  «        rt          d¦  «        ‚t          |t          j        ¦  «        rPt          |                     ¦   «         ¦  «        }|‰v r&t                               d| ‰|         |¦  «          dS |‰|<   Œ­‰                     ¦   «         ‰                     ¦   «         z  }	t          |	¦  «        dk    rLˆˆfd„|	D ¦   «         }
d                     d	„ |
D ¦   «         ¦  «        }
t                               d
| |
¦  «         dS dS )NÚexample_valuezYNYI: Failed to substitute region %s due to input-output aliasing detected at nodes %s, %sTz'expected example_value to not be a listzZNYI: Failed to substitute region %s due to output-output aliasing detected at nodes %s, %sr   c                 ó0   •— g | ]}‰|         ‰|         f‘ŒS r   r   )r8   ÚsÚinput_storagesÚoutput_storagess     €€r4   r:   z!_has_aliasing.<locals>.<listcomp>  s5   ø€ ð 
ð 
ð 
Ø89ˆ^˜AÔ °Ô 2Ð3ð
ð 
ð 
r;   z, c                 ó"   — g | ]\  }}|› d |› �‘ŒS )z and r   )r8   r9   Úos      r4   r:   z!_has_aliasing.<locals>.<listcomp>  s&   € Ð@Ð@Ð@±°°1 ˜^˜^¨˜^˜^Ð@Ð@Ð@r;   zUNYI: Failed to substitute region %s due to input-output aliasing detected at nodes %sF)ÚdictÚmetars   r   ÚTensorr   Ú_typed_storagerA   rB   r   r    ÚkeysrL   Újoin)r-   rÑ   r,   r[   r`   rÓ   Ústorager9   Úout_nodeÚintersected_storagesÚaliasedrÖ   r×   s              @@r4   rF   rF   ç  s6  øø€ õ 26±´€NØð +ð +ˆØÐ*Ð*Ð*ØØœ	 /Ô2ˆÝ�m¥U¤\Ñ2Ô2ð 	+Ý$ ]×%AÒ%AÑ%CÔ%CÑDÔDˆGØ˜.Ð(Ð(å—	’	ØoØØ" 7Ô+Øñ	ô ð ð �t�tØ&*ˆN˜7Ñ#øÝ26±&´&€OØ%ð 4ð 4ˆØ˜!”9ˆØÐ.Ð.Ð.ØØð 	4Ø$œM¨/Ô:ˆMÝ˜-­Ñ.Ô.ð PÝ$Ð%NÑOÔOÐOÝ˜-­¬Ñ6Ô6ð 4Ý(¨×)EÒ)EÑ)GÔ)GÑHÔH�Ø˜oÐ-Ð-å—I’IØtØØ'¨Ô0Ø ñ	ô ð ð  ˜4˜4Ø+3� Ñ(øØ)×.Ò.Ñ0Ô0°?×3GÒ3GÑ3IÔ3IÑIÐÝ
ÐÑ Ô  1Ò$Ð$ð
ð 
ð 
ð 
ð 
Ø=Qð
ñ 
ô 
ˆð —)’)Ð@Ð@¸Ð@Ñ@Ô@ÑAÔAˆÝ�	Š	ØcØØñ	
ô 	
ð 	
ð
 ˆtØˆ5r;   r`   c                 óB   — t          | j        d         t          ¦  «        S )NrÓ   )rs   rÛ   r•   )r`   s    r4   rJ   rJ   #  s   € Ý�d”i Ô0µ%Ñ8Ô8Ð8r;   c              #   óŒ   K  — | j         D ]9}|j        t          j        u r$t	          |j        d         t          ¦  «        r|V — Œ:d S )Nr
   )r   rÇ   rM   rN   rs   ÚargsÚint)r`   rd   s     r4   Ú_get_children_getitemsrè   '  sP   è è € Ø”
ð ð ˆØŒ;�(Ô*Ð*Ð*­z¸$¼)ÀA¼,ÍÑ/LÔ/LÐ*ØˆJˆJˆJøðð r;   c                 ó‚  ‡— d„ t          ‰¦  «        D ¦   «         }t          ¦   «         }t          t          | ¦  «        ¦  «        }|rx|                     ¦   «         }t          ˆfd„|j        D ¦   «         ¦  «        r|                     ||         ¦  «         t          |¦  «        D ]}|                     |¦  «         Œ|°x|S )zaReturns an ordered set of indices, each representing a node in the region which will be flattenedc                 ó   — i | ]\  }}||“Œ	S r   r   )r8   r9   r¿   s      r4   ú
<dictcomp>z/_get_flattened_node_indices.<locals>.<dictcomp>/  s   € Ð@Ð@Ð@¡d a¨˜Q Ð@Ð@Ð@r;   c              3   ó    •K  — | ]}|‰v V — Œ	d S ro   r   )r8   rd   r-   s     €r4   rÂ   z._get_flattened_node_indices.<locals>.<genexpr>4  s'   øè è € Ð9Ð9 $ˆt�vˆ~Ð9Ð9Ð9Ð9Ð9Ð9r;   )	rr   r	   r   rè   ÚpopleftÚanyr   rU   rE   )r`   r-   Úflattened_node_to_indÚnode_indicesÚqueuer»   Úchilds    `     r4   r�   r�   -  sÒ   ø€ à@Ð@­i¸Ñ.?Ô.?Ð@Ñ@Ô@ÐÝ$.¡L¤L€LÝÕ(¨Ñ.Ô.Ñ/Ô/€EØ
ð  Ø—=’=‘?”?ˆÝÐ9Ð9Ð9Ð9¨(¬.Ð9Ñ9Ô9Ñ9Ô9ð 	>Ø×ÒÐ2°8Ô<Ñ=Ô=Ð=Ý+¨HÑ5Ô5ð 	 ð 	 ˆEØ�LŠL˜ÑÔÐÐð ð  ð Ðr;   Úsubgraph_tuple_noder   c                 óš  ‡‡	‡
— | j         d         }t          |t          ¦  «        st          d¦  «        ‚g }t	          ˆfd„t          |¦  «        D ¦   «         ¦  «        }i }|ræ|                     ¦   «         \  }Š
}|                     |¦  «        5  |                     dt          j
        |‰
d         fi ¦  «        Š	d d d ¦  «         n# 1 swxY w Y   |‰	j         d<   t          |¦  «        |‰
<   |                     ‰	¦  «         t          |t          ¦  «        r/|                     ˆ	ˆ
fd„t          |¦  «        D ¦   «         ¦  «         |°æ||fS )NrÓ   z#_get_getitem_children expects tuplec                 ó"   •— g | ]\  }}||f‰f‘ŒS r   r   )r8   r9   Úeró   s      €r4   r:   z)_create_getitem_nodes.<locals>.<listcomp>C  s'   ø€ ÐMÐMÐM±d°a¸�A˜�tÐ0Ð1ÐMÐMÐMr;   r<   éÿÿÿÿc                 ó(   •— g | ]\  }}|‰|fz   ‰f‘ŒS r   r   )r8   r9   rö   Únew_getitem_nodeÚpaths      €€r4   r:   z)_create_getitem_nodes.<locals>.<listcomp>T  s+   ø€ ÐTÐTÐT¹¸¸1�!�T˜Q˜D‘[Ð"2Ð3ÐTÐTÐTr;   )rÛ   rs   r•   r    r   rr   rí   Úinserting_afterr$   rM   rN   rL   rE   rD   )r`   ró   r   Útuprš   rñ   Úpath_to_output_indexÚcur_elemÚparentrù   rú   s    `       @@r4   r“   r“   ;  s²  øøø€ ð Œ)�OÔ
$€CÝ�c�5Ñ!Ô!ð DÝÐBÑCÔCÐCà "€MÝÐMÐMÐMÐM½iÈ¹n¼nÐMÑMÔMÑNÔN€EØÐà
ð Ø!&§¢¡¤Ñˆ�$˜à×%Ò% fÑ-Ô-ð 	ð 	Ø'×3Ò3Ø¥Ô!1°F¸DÀ¼HÐ3EÀrñ ô  Ðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 2:ÐÔ˜oÑ.å%(¨Ñ%7Ô%7Ð˜TÑ"Ø×ÒÐ-Ñ.Ô.Ð.å�h¥Ñ&Ô&ð 	Ø�LŠLØTÐTÐTÐTÐTÅ	È(Ñ@SÔ@SÐTÑTÔTñô ð ð ð ð" Ð.Ð.Ð.s   Â+CÃCÃCÚoutput_indexrk   rg   c           	      óÚ  — t          | ¦  «        st          d¦  «        ‚t          d„ t          | ¦  «        D ¦   «         ¦  «        }t	          ¦   «         }|rì|                     ¦   «         \  }}t          |¦  «        D ](}	|                     |	||	j        d         fz   f¦  «         Œ)|                     |¦  «        5  | 	                    dt          j        ||||         z   fi ¦  «        }
d d d ¦  «         n# 1 swxY w Y   |                     |
d¬¦  «         |                     |¦  «         |                     |¦  «         |°ì|                     | ¦  «         |                     | ¦  «         |S )Nz+_replace_tuple_outputs expects a tuple nodec              3   ó6   K  — | ]}||j         d          ffV — ŒdS )r
   N)ræ   )r8   Úcs     r4   rÂ   z)_replace_tuple_outputs.<locals>.<genexpr>d  s/   è è € ÐJÐJ¨�1�q”v˜a”y�lÐ#ÐJÐJÐJÐJÐJÐJr;   r
   r<   Tr=   )rJ   r    r   rè   r	   rR   rE   ræ   rû   r$   rM   rN   rO   rQ   rU   )r`   r   rk   rg   r   rñ   Úerased_nodesr»   rú   r  rl   s              r4   rK   rK   Z  sÃ  € õ ˜$ÑÔð LÝÐJÑKÔKÐKåÐJÐJÕ-CÀDÑ-IÔ-IÐJÑJÔJÑJÔJ€EÝ%/¡\¤\€LØ
ð #ØŸš™œ‰ˆ�$å'¨Ñ1Ô1ð 	3ð 	3ˆAØ�LŠL˜!˜T Q¤V¨A¤Y LÑ0Ð1Ñ2Ô2Ð2Ð2à×"Ò"Ð#7Ñ8Ô8ð 	ð 	Ø#×/Ò/ØÝÔ Ø% |°jÀÔ6FÑ'FÐGØñ	ô ˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×&Ò& ÀtÐ&ÑLÔLÐLØ×Ò˜Ñ"Ô"Ð"Ø×Ò˜Ñ"Ô"Ð"ð ð #ð" 
×Ò�TÑÔÐØ×Ò�TÑÔÐØÐs   Â9.C3Ã3C7Ã:C7)TN);Ú__doc__ÚloggingrM   Úcollectionsr   r   Úcollections.abcr   r   r   Útorch.fxÚtorch._dynamor   Ú torch.multiprocessing.reductionsr   Útorch.utils._ordered_setr	   Úgraph_region_trackerr   r   Úgraph_utilsr   r   r   r•   rç   rp   Ú	getLoggerÚ__name__rA   r   rÚ   Ú__annotations__Ústrr   r    r5   rŽ   r   r%   rx   r   rq   r{   r   rž   r«   r&   r°   r²   r   rµ   r´   rF   rJ   rè   r�   r“   rK   r   r;   r4   ú<module>r     sè  ððð ð ð €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à €€€Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø /Ð /Ð /Ð /Ð /Ð /à .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ Nð �3˜�8Œ_€
à€gÔ˜Ñ!Ô!€àDHÐ ˜d 4¨°DÔ)9Ð#9Ô:¸TÑAÐ HÐ HÑ HðT¨t°C¸¼Ô9MÐ4MÔ/Nð Tð Tð Tð Tðn^ØŒ8Œ>ð^àð^ð ð^ð # :¨jÔ#9Ô:ð	^ð
  $ J°
¸3´Ð$?Ô@ð^ð ˜C  e¨C°¨H¤o°sÐ&:Ô!;Ð;Ô<ð^ð # 3œið^ð ð^ð " $¨
°4Ô(8Ð"8Ô9ð^ð $(¨¨j¸¬oÐ(=Ô#>ð^ð 
ð^ð ^ð ^ð ^ðB#Øð#à	ˆ$�
˜:Ô&Ð
&Ô'ð#ð #ð #ð #ð$, T¨&¤\ð ,°d¸3´ið ,ð ,ð ,ð ,ð)¨&ð )¸sÀ3¼xð )ÈDð )ð )ð )ð )ðCXØðCXà" 3œiðCXð Ø	„H„NØˆ�JÔ	Ô Øˆ�Z ”_Ð	$Ô%Øˆˆd�5˜˜c˜”? CÐ'Ô(Ð	(Ô)ð+ôðCXð CXð CXð CXðR Ø&*ð	?6ð ?6ØŒ8Œ>ð?6à! $¨
°4Ô(8Ð"8Ô9ð?6ð ð?6ð �tÔ˜tÑ#ð	?6ð
 
ð?6ð ?6ð ?6ð ?6ðD?ØŒ8Œ>ð?à! $¨
°4Ô(8Ð"8Ô9ð?ð 
ð?ð ?ð ?ð ?ðIØŒ8Œ>ðIà�tÔðIð 
ðIð Ið Ið IðØŒ8Œ>ðà! $¨
°4Ô(8Ð"8Ô9ðð 
ðð ð ð ð#ØŒ8Œ>ð#Ø:>¸tÀZÐPSÄ_Ð?TÔ:Uð#à	ˆ$�
˜4Ô Ð
 Ô!ð#ð #ð #ð #ð!.ØŒ8Œ>ð!.Ø48¸¸zÈ$Ô?OÐ9OÔ4Pð!.à	ð!.ð !.ð !.ð !.ðH<Ø#'¨¨j¸¬oÐ(=Ô#>ð<à! $¨
°4Ô(8Ð"8Ô9ð<ð 
ð<ð <ð <ð <ð29Øð9à�ŒJð9ð # 3œið9ð (¨Ô-ð	9ð
 
ð9ð 9ð 9ð 9ðx9˜ð 9 $ð 9ð 9ð 9ð 9ð ð ¨)°D¸$ÀÐ4DÔ*Eð ð ð ð ð dð °Fð ¸zÈ#¼ð ð ð ð ð/Ø
ð/Ø%)ð/Ø5:´X´^ð/à
ˆ4�Œ:�t˜E # s (œO¨SÐ0Ô1Ð1Ô2ð/ð /ð /ð /ð>Ø
ðàðð �U˜3 ˜8”_ cÐ)Ô*ðð ð	ð
 Œ8Œ>ðð �Ôðð ð ð ð ð r;   