Ë
    M²jeq  ã                   óÀ  — 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Zd dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d
dgZ ej(                  e«      xZZ e
d¬«       G d„ d
«      «       Zdej2                  j4                  dedefd„Z e
d¬«      	 	 	 	 ddddœdedej2                  j4                  deegef   deeef   dz  dedz  dedz  dededz  defd„«       Z y) é    N)ÚOrderedDict)ÚCallable)ÚAny)Úcompatibility)Ú_make_graph_module)Úlazy_format_graph_code)ÚGraphModule)ÚNodeÚ	PartitionÚsplit_moduleT)Úis_backward_compatiblec                   ó$   — e Zd Zdefd„Zdefd„Zy)r   Únamec                 óâ   — || _         d|› �| _        g | _        i | _        i | _        i | _        i | _        t        j                  j                  j                  «       | _	        i | _        i | _        y )NÚsubmod_)r   Úsubmod_nameÚ
node_namesÚinputsÚoutputsÚdependenciesÚ
dependentsÚtorchÚfxÚgraphÚGraphÚenvironmentÚtargets)Úselfr   s     ú[/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/fx/passes/split_module.pyÚ__init__zPartition.__init__   sc   € ØˆŒ	Ø$ T FÐ+ˆÔØ%'ˆŒØ')ˆŒØ(*ˆŒØ-/ˆÔØ+-ˆŒÜ+0¯8©8¯>©>×+?Ñ+?Ó+AˆŒ
Ø-/ˆÔØ')ˆ�ó    Úreturnc                 ó¢   — d| j                   › d| j                  › d| j                  › d| j                  › d| j                  › d| j
                  › �S )Nzname: z
,
 nodes: z,
 inputs: z,
 outputs: z,
 partitions depended on: z,
 partition dependents: )r   r   r   r   r   r   )r   s    r   Ú__repr__zPartition.__repr__"   sb   € à�T—Y‘Y�Kð  Ø—‘Ð'ð (ØŸ™�}ð %ØŸ™˜ð '(Ø(,×(9Ñ(9Ð':ð ;&Ø&*§o¡oÐ%6ð8ð	
r!   N)Ú__name__Ú
__module__Ú__qualname__Ústrr    r$   © r!   r   r   r      s   „ ð
*˜Só 
*ð
˜#ô 
r!   ÚmodÚqualnamer"   c                 ó„   — | }|j                  d«      D ])  }t        ||«      st        d|› d�«      ‚t        ||«      }Œ+ |S )Nú.zNode target z not found!)ÚsplitÚhasattrÚAttributeErrorÚgetattr)r*   r+   Úattr_valÚatoms       r   Ú_get_attr_from_qualnamer4   -   sP   € Ø€HØ—‘˜sÓ#ò +ˆÜ�x Ô&Ü  <°¨z¸Ð!EÓFÐFÜ˜8 TÓ*‰ð+ð €Or!   F)Úpartition_affixÚtuple_returnÚmÚroot_mÚsplit_callbackÚqualname_mapÚkeep_original_orderÚkeep_original_node_nameÚkeep_original_input_namer5   r6   c                ó„  ‡ ‡‡‡‡‡3‡?‡@‡A‡B‡C‡D‡E‡F‡G‡H‡I— t         j                  dt        d‰ d¬«      «       dt        dt        t
        t        f   dt        t
        t        j                  j                  j                  f   fˆ@ˆˆ fd„}	d	d
l
}
i ŠGi ŠEi ŠIdt        dt        d
z  fˆGˆIfd„ŠHˆˆGˆfd„}t        j                  j                  t        j                  j                  t        j                  j                  g}t!        «       }t!        «       }i }d
}t#        «       }‰ j$                  j&                  D �]î  Š3‰3j(                  j+                  d«      x}�st-        |t        j.                  t        j0                  f«      rIt-        |j2                  j4                  x}|
j6                  «      r|‰Ivr‰3‰I|j2                  j4                  <   ‰3j8                  dv rŒ£ |‰3«       ‰3j8                  dk(  �r÷‰3j:                  |v �rè‰3j:                  t        j                  j                  u r“t=        ‰3j>                  «      dk7  r!tA        dt=        ‰3j>                  «      › �«      ‚t-        ‰3j>                  d	   tB        «      s$tA        dtE        ‰3j>                  d	   «      › �«      ‚‰3}t#         ‰‰3«      h«      ||<   �n/‰3j:                  t        j                  j                  u rStG        d„ ‰3j>                  D «       «      stA        d«      ‚|jI                  ‰3«       t#         ‰‰3«      h«      |‰3<   d
|‰3<   n¶‰3j:                  t        j                  j                  u r�t=        ‰3j>                  «      dk7  r!tA        dt=        ‰3j>                  «      › �«      ‚|‰3j>                  d	      jI                   ‰‰3«      «       |jK                  ‰3j>                  d	   «       ‰3|‰3j>                  d	   <   |�||   jI                   ‰‰3«      «       |D ]  }||   jI                   ‰‰3«      «       Œ �Œñ tG        d„ |jM                  «       D «       «      stA        d«      ‚|jO                  «       D ��ci c]  \  }}|tQ        |«      “Œ }}}|jO                  «       D ��ci c]  \  }}|tQ        |«      “Œ }}}tR        jU                  tV        jX                  «      r,tR        j                  d|«       tR        j                  d|«       tC        |«      xs tC        |«      }d}‰ j$                  j&                  D �]  Š3‰3‰E‰3jZ                  <   ‰3j8                  dv rŒ"‰3j8                  dk(  r;t        j                  j$                  j]                  ‰3j>                  d	   ˆHfd„«       Œl|r  ‰‰3«      }||kD  rtA        d |› d!|› �«      ‚|}‰3j:                  |vsŒ�t        j                  j$                  j]                  ‰3j>                  ˆ3ˆHfd"„«       t        j                  j$                  j]                  ‰3j^                  ˆ3ˆHfd#„«       �Œ ta        ‰Gjc                  «       «      }g }‰GjO                  «       D ],  \  }ŠFt=        ‰Fjd                  «      rŒ|jg                  |«       Œ. g }|rw|ji                  «       }|jg                  |«       ‰G|   jj                  D ]A  }‰G|   jd                  ji                  |«       ‰G|   jd                  rŒ1|jg                  |«       ŒC |rŒwt=        |«      t=        ‰G«      k7  rtm        d$«      ‚||fD ]ï  } | jO                  «       D ]Ú  \  Š3}!t=        |!«      d	k(  rtA        d%«      ‚‰3‰Gt        |!d	   «         jn                  ‰3<   |!dd
 D ]–  }"‰Gt        |"«         ŠF‰Fj$                  jq                  ‰3j8                  ‰3j:                  ts        d&„ ‰3j>                  D «       «      i ‰3jD                  ¬'«      }#‰3j(                  ju                  «       |#_        |#‰Fjn                  ‰3<   Œ˜ ŒÜ Œñ |D �];  }‰G|   ŠFi ŠDd	ŠA‰Fjv                  D �]  ŠC‰E‰C   }$ˆAˆCˆˆDˆEˆFfd(„}%|$j8                  d)k(  r¼t-        |$j:                  t
        «      s!tA        d*tE        |$j:                  «      › �«      ‚ty        ‰ |$j:                  «      }&t-        |&t        jz                  j|                  «      r?‰Fj$                  j                  |$j:                  «      }'|&‰Fj€                  |$j:                  <   n |%«       }'n |%«       }'‰E‰C   j(                  ju                  «       |'_        |'‰Fjn                  ‰E‰C   <   �Œ ‰D‰F_;        �Œ> ‰ j$                  j&                  D �]Ø  Š3tƒ        ‰3d+«      sŒ‰G‰3j„                     ŠF‰Fjn                  ŠBt        j                  j$                  j]                  ‰3j>                  ˆBfd,„«      }(t        j                  j$                  j]                  ‰3j^                  ˆBfd-„«      })‰3j8                  d.vr‰3j:                  }*ncty        ‰ ‰3j:                  «      }+‰3j:                  j‡                  d/d0«      }*|+‰Fj€                  |*<   |� ‰Fjˆ                  › d/|*› �},‰3j:                  ||,<   t-        |(tr        «      stA        d1tE        |(«      › �«      ‚t-        |)t        «      stA        d2tE        |)«      › �«      ‚‰r‰3jZ                  nd
}-‰Fj$                  jq                  ‰3j8                  |*|(|)‰3jD                  |-¬3«      }#‰3j(                  ju                  «       |#_        |#‰Fjn                  ‰3<   �ŒÛ |fD ]Å  } t‹        | «      D ]µ  Š3| ‰3   }!t=        |!«      d	k(  rtA        d4«      ‚|!d
d D ]�  }"‰Gt        |"«         ŠF|‰3   }.|.€tA        d5«      ‚‰Fj$                  jq                  |.j8                  |.j:                  ‰Fjn                  ‰3   fi |.jD                  ¬'«      }#|.j(                  ju                  «       |#_        Œ� Œ· ŒÇ i }/i Š?t        j                  j$                  j�                  «       Š@i }0|s)‰ j$                  j&                  D ]  Š3 |	‰3‰?|0«      \  Š?}0Œ n*‰ j$                  j&                  D ]  Š3‰3|/‰3jZ                  <   Œ |s|n|}1t#        «       }2‰ j$                  j&                  D �3cg c]  }3|3j8                  d6k(  sŒ|3‘Œ }4}3|1D �]ï  }‰G|   ŠFts        ˆEˆFfd7„‰FjŽ                  D «       «      }5t=        |5«      dk(  r!|s‰Fj$                  j‘                  |5d	   «       n‰Fj$                  j‘                  |5«       |rt‰Fjv                  D �6cg c]  }6|6|4vr|/|6   ‘Œ }7}6|4D ]%  Š3‰3|2v rŒ |	‰3‰?|0«      \  Š?}8|2jI                  ‰3«       Œ' |7D ]%  Š3‰3|2v rŒ |	‰3‰?|0«      \  Š?}0|2jI                  ‰3«       Œ' t“        ‰Fj€                  ‰Fj$                  «      |0‰Fjˆ                  <   ‰@j•                  ‰Fjˆ                  ts        ˆ?fd8„‰Fjv                  D «       «      «      }9t=        ‰FjŽ                  «      }:|:dkD  s|:dk(  r\|rZt        j                  j–                  j™                  |9«      };t›        ‰FjŽ                  «      D ]  \  }<}=|;|<   j2                  ‰?|=<   Œ �ŒÈ|:dk(  s�ŒÏ|9‰?t�        tŸ        ‰FjŽ                  «      «      <   �Œò |r*‰?s(‰ j$                  j&                  D ]  Š3 |	‰3‰?|0«      \  Š?}0Œ ‰ j$                  j&                  D ][  Š3‰3j8                  dk(  sŒ‰@j‘                  t        j                  j$                  j]                  ‰3j>                  d	   ˆ?fd9„«      «       Œ] t“        |0‰@«      }>t         j                  dt        d:|>d¬«      «       |>S c c}}w c c}}w c c}3w c c}6w );a’  
    Creates subgraphs out of main graph

    Args:
        m (GraphModule): Graph module to split
        root_m (torch.nn.Module): root nn module. Not currently used. Included
            because the root nn module is usually transformed via
            torch.fx._symbolic_trace.symbolic_trace (see example below)
        split_callback (Callable[[Node], int]): Callable function
            that maps a given Node instance to a numeric partition identifier.
            split_module will use this function as the policy for which operations
            appear in which partitions in the output Module.
        qualname_map: Optional[Dict[str, str]]: optional output parameter that returns a
            mapping from new target names in the module after split to old target
            names in the original module.
        keep_original_order: Optional[bool]: keep the original order of the GraphModule
            or use the Topological order of the new constructed GraphModule
        keep_original_node_name: Optional[bool]: If the partitioned graphs should
            have the same node names as the original graph.
        keep_original_input_name: bool: If the partitioned graphs should
            have the same input names as the original graph.
        partition_affix: Optional[str]: If specified, the submodules' names will contain
            the affix, e.g. "submod_<affix>_<idx>".
        tuple_return: bool: If True, submodule outputs are always wrapped in a tuple,
            even when there is only a single output value.  This makes all subgraphs
            conform to the convention expected by ``torch._inductor.compile_fx``.

    Returns:
        GraphModule: the module after split.

    Example:

        This is a sample setup:

            import torch
            from torch.fx._symbolic_trace import symbolic_trace
            from torch.fx.graph_module import GraphModule
            from torch.fx.node import Node
            from torch.fx.passes.split_module import split_module

            class MyModule(torch.nn.Module):
                def __init__(self) -> None:
                    super().__init__()
                    self.param = torch.nn.Parameter(torch.rand(3, 4))
                    self.linear = torch.nn.Linear(4, 5)

                def forward(self, x, y):
                    z = self.linear(x + self.param).clamp(min=0.0, max=1.0)
                    w = self.linear(y).clamp(min=0.0, max=1.0)
                    return z + w

            # symbolically trace model
            my_module = MyModule()
            my_module_traced = symbolic_trace(my_module)

            # random mod partitioning
            partition_counter = 0
            NPARTITIONS = 3

            def mod_partition(node: Node):
                global partition_counter
                partition = partition_counter % NPARTITIONS
                partition_counter = (partition_counter + 1) % NPARTITIONS
                return partition

            # split module in module with submodules
            module_with_submodules = split_module(
                my_module_traced, my_module, mod_partition
            )

        Output looks like this. Original graph is broken into partitions

            > print(module_with_submodules)
            GraphModule(
                (submod_0): GraphModule(
                    (linear): Linear(in_features=4, out_features=5, bias=True)
                )
                (submod_1): GraphModule(
                    (linear): Linear(in_features=4, out_features=5, bias=True)
                )
                (submod_2): GraphModule()
            )

            def forward(self, x, y):
                param = self.param
                submod_0 = self.submod_0(x, param, y);  x = param = y = None
                getitem = submod_0[0]
                getitem_1 = submod_0[1];  submod_0 = None
                submod_1 = self.submod_1(getitem, getitem_1);  getitem = getitem_1 = None
                getitem_2 = submod_1[0]
                getitem_3 = submod_1[1];  submod_1 = None
                submod_2 = self.submod_2(getitem_2, getitem_3);  getitem_2 = getitem_3 = None
                return submod_2

        Output of split module is the same as output of input traced module.
        This is an example within a test setting:

            > orig_out = my_module_traced(x, y)
            > submodules_out = module_with_submodules(x, y)
            > self.assertEqual(orig_out, submodules_out)
            True
    z%szpre split_moduleT)ÚcoloredÚnodeÚbase_mod_envÚbase_mod_attrsc                 ó²  •— | j                   dk(  �r t        | j                  «      dkD  r| j                  d   nt        j                  j
                  }‰rX|t        j                  j
                  u rdn|f}‰j                  d| j                  || j                  ¬«      || j                  <   n5‰j                  | j                  | j                  |¬«      || j                  <   | j                  j                  «       || j                     _        ||fS | j                   dk(  r´‰j                  | j                  «      || j                  <   | j                  j                  «       || j                     _        t        | j                  t        «      s!t!        dt        | j                  «      › �«      ‚t#        ‰| j                  «      }||| j                  <   ||fS )NÚplaceholderr   r)   )ÚargsÚ	type_expr)rF   Údefault_valueÚget_attrúExpected str target, got )ÚopÚlenrE   ÚinspectÚ	SignatureÚemptyÚcreate_noder   ÚtyperD   ÚtargetÚmetaÚcopyrH   Ú
isinstancer(   ÚAssertionErrorr4   )	r@   rA   rB   rG   rE   r2   Úbase_mod_graphr<   r7   s	         €€€r   Úconstruct_graphz%split_module.<locals>.construct_graph°   s�  ø€ ð
 �7‰7�mÓ#ä # D§I¡I£°Ò 2�—	‘	˜!’¼×8IÑ8I×8OÑ8Oð ñ 'à'¬7×+<Ñ+<×+BÑ+BÑB‘BÈÐHXð ð +9×*DÑ*DØ!Ø—I‘IØØ"Ÿi™ið	 +Eó +�˜TŸY™YÒ'ð +9×*DÑ*DØ—K‘KØ"Ÿi™iØ"/ð +Eó +�˜TŸY™YÑ'ð
 ,0¯9©9¯>©>Ó+;ˆL˜Ÿ™Ñ#Ô(ð ˜^Ð+Ð+ð �W‰W˜
Ò"Ø&4×&=Ñ&=¸d¿k¹kÓ&JˆL˜Ÿ™Ñ#Ø+/¯9©9¯>©>Ó+;ˆL˜Ÿ™Ñ#Ô(Ü˜dŸk™k¬3Ô/Ü$Ð'@ÄÀdÇkÁkÓARÐ@SÐ%TÓUÐUÜ.¨q°$·+±+Ó>ˆHØ*2ˆN˜4Ÿ;™;Ñ'Ø˜^Ð+Ð+r!   r   NÚdef_nodeÚuse_nodec                 ó¬  •— ddl m} t        | dd «      }t        |dd «      }t        j	                  d| j
                  ||�|j
                  nd|«       ||k7  �r||�G‰|   }|j                  j                  | j
                  «       |�|j                  j                  |«       |��/‰|   }|j                  j                  | j
                  «       | j                  j                  d«      x}�Ét         ||«      t        ¬«      D ]¯  }‰|   }	|j                  j                  |	j
                  «       ‰|   j                  dk7  sŒ@t        |	dd «      }
|
€ŒP‰|
   }|j                  j                  |	j
                  «       |j                  j                  |«       |j                  j                  |
«       Œ± |�|j                  j                  |«       y y y y )	Nr   )Úfree_symbolsÚ_fx_partitionz*record_cross_partition_use %s (%s) %s (%s)ú-Úexample_value)ÚkeyrD   )Ú%torch.fx.experimental.symbolic_shapesr[   r1   ÚlogÚdebugr   r   Ú
setdefaultr   r   rR   ÚgetÚsortedr(   rJ   r   )rX   rY   r[   ÚdefinedÚusedÚdef_partitionÚuse_partitionÚdef_valÚsÚs_nodeÚ	s_definedÚs_def_partitionÚ
partitionsÚsymbol_to_nodes               €€r   Úrecord_cross_partition_usez0split_module.<locals>.record_cross_partition_useÙ   s¸  ø€ ÝFä˜( O°TÓ:ˆÜ�x °$Ó7ˆä�	‰	Ø8Ø�M‰MØØ%Ð1ˆH�MŠM°sØô	
ð �d‹?ØÐ"Ø *¨7Ñ 3�Ø×%Ñ%×0Ñ0°·±Ô?ØÐ#Ø!×,Ñ,×7Ñ7¸Ô=àÑØ *¨4Ñ 0�Ø×$Ñ$×/Ñ/°·±Ô>ð  (Ÿ}™}×0Ñ0°ÓAÐA�GÐNÜ#¡L°Ó$9¼sÔCò Q˜Ø!/°Ñ!2˜Ø%×,Ñ,×7Ñ7¸¿¹ÔDØ)¨!Ñ,×/Ñ/°=Ó@ô )0°¸ÈÓ(N˜IØ(Ñ4Ø2<¸YÑ2G Ø /× 7Ñ 7× BÑ BÀ6Ç;Á;Ô OØ /× :Ñ :× EÑ EÀdÔ KØ -× :Ñ :× EÑ EÀiÕ Pð#Qð$ Ð&Ø!×.Ñ.×9Ñ9¸'ÕBð 'ð3  ð r!   c                 ó6  •—  ‰| «      }t        |«      }‰�dj                  ‰|g«      }t        j                  d| j                  |«       ‰j                  |«      }|€t        |«      x‰|<   }|j                  j                  | j                  «       || _	        y )NÚ_z*instantiate_node_partition_mapping %s (%s))
r(   Újoinra   rb   r   rd   r   r   Úappendr\   )r@   Úpartition_idxÚpartition_nameÚ	partitionr5   ro   r9   s       €€€r   Ú"instantiate_node_partition_mappingz8split_module.<locals>.instantiate_node_partition_mapping
  s“   ø€ Ù& tÓ,ˆÜ˜]Ó+ˆØÐ&ð !ŸX™X ¸Ð&GÓHˆNä�	‰	Ø8¸$¿)¹)À^ô	
ð
 —N‘N >Ó2ˆ	ØÐÜ5>¸~Ó5NÐNˆJ�~Ñ&¨à×Ñ×#Ñ# D§I¡IÔ.Ø+ˆÕr!   r^   )rD   rH   ÚoutputÚcall_functioné   z*Expected 1 arg for _set_grad_enabled, got zExpected bool arg, got c              3   ó>   K  — | ]  }t        |t        «       –— Œ y ­w©N)rT   r
   ©Ú.0Úargs     r   ú	<genexpr>zsplit_module.<locals>.<genexpr>Z  s   è ø€ ÒJ¸œz¨#¬tÓ4Ô4ÑJùs   ‚z3Expected all args to be python constants, not Nodesz'Expected 1 arg for _exit_autocast, got c              3   ó$   K  — | ]  }|d u–— Œ
 y ­wr~   r)   )r€   Úvs     r   r‚   zsplit_module.<locals>.<genexpr>p  s   è ø€ Ò> ˆq˜Œ}Ñ>ùs   ‚zautocast must exitzautocast_regions: %szgrad_regions: %séÿÿÿÿ)rD   rH   rz   c                 ó   •—  ‰| d «      S r~   r)   )Únrq   s    €r   ú<lambda>zsplit_module.<locals>.<lambda>‰  s   ø€ Ñ(BÀ1ÀdÓ(K€ r!   zSautocast or set_grad_enabled require monotonically increasing partitions: highest: z, this node's: c                 ó   •—  ‰| ‰«      S r~   r)   ©rX   r@   rq   s    €€r   rˆ   zsplit_module.<locals>.<lambda>š  s   ø€ Ñ,FÀxÐQUÓ,V€ r!   c                 ó   •—  ‰| ‰«      S r~   r)   rŠ   s    €€r   rˆ   zsplit_module.<locals>.<lambda>�  s   ø€ Ñ.HÈÐSWÓ.X€ r!   z cycle exists between partitions!z%Expected at least one region for nodec              3   ó    K  — | ]  }|–— Œ y ­wr~   r)   r   s     r   r‚   zsplit_module.<locals>.<genexpr>Á  s   è ø€ Ò8 sœsÑ8ùs   ‚)rJ   rQ   rE   ÚkwargsrF   c                  ó„   •— ‰r‰} n
d‰› �} ‰dz  Š‰j                   j                  | ‰‰   j                  ¬«      }d ‰‰<   |S )NÚarg_r|   )rF   )r   rD   rP   )r   rD   ÚcounterÚinpr=   Ú
new_inputsÚ
orig_nodesrx   s     €€€€€€r   Úadd_placeholderz%split_module.<locals>.add_placeholderÖ  s\   ø€ Ù+Ø‘Dð " ' Ð+�DØ˜q‘L�GØ'Ÿo™o×9Ñ9ØØ(¨™o×2Ñ2ð :ó �ð #'�
˜3‘Ø"Ð"r!   rH   rI   r\   c                 ó   •— ‰|    S r~   r)   ©r‡   r   s    €r   rˆ   zsplit_module.<locals>.<lambda>ý  s   ø€ ÈÐTUÉ€ r!   c                 ó   •— ‰|    S r~   r)   r–   s    €r   rˆ   zsplit_module.<locals>.<lambda>ÿ  s   ø€  {°1¡~€ r!   )Úcall_modulerH   r-   rs   z&Expected tuple for gathered_args, got z'Expected dict for gathered_kwargs, got )rJ   rQ   rE   r�   rF   r   zExpected at least one regionzMissing exit noderD   c              3   óB   •K  — | ]  }‰j                   ‰|      –— Œ y ­wr~   )r   )r€   r   r“   rx   s     €€r   r‚   zsplit_module.<locals>.<genexpr>_  s&   øè ø€ ò 
Ø8<ˆI×!Ñ! *¨TÑ"2Õ3ñ
ùs   ƒc              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr~   r)   )r€   r   rA   s     €r   r‚   zsplit_module.<locals>.<genexpr>ˆ  s   øè ø€ ÒB¨�,˜tÕ$ÑBùs   ƒc                 ó"   •— ‰| j                      S r~   )r   )r‡   rA   s    €r   rˆ   zsplit_module.<locals>.<lambda>¢  s   ø€ ¸|ÈAÏFÉFÑ?S€ r!   zpost split_module)Pra   rb   r   r
   Údictr(   r   r   Úgraph_moduler	   ÚsympyÚampÚ_enter_autocastÚ_exit_autocastÚ_CÚ_set_grad_enabledr   Úsetr   ÚnodesrR   rd   rT   ÚSymIntÚSymFloatr@   ÚexprÚSymbolrJ   rQ   rK   rE   rU   ÚboolrP   ÚallÚaddÚremoveÚvaluesÚitemsre   Ú_LOGGERÚisEnabledForÚloggingÚDEBUGr   Úmap_argr�   ÚlistÚkeysr   ru   Úpopr   ÚRuntimeErrorr   rO   ÚtuplerS   r   r4   ÚnnÚModulerH   r   r/   r\   Úreplacer   Úreversedr   r   rz   r   r˜   ÚproxyÚProxyÚ	enumerateÚnextÚiter)Jr7   r8   r9   r:   r;   r<   r=   r5   r6   rW   rž   ry   ÚGLOBAL_STATE_NODESÚgrad_regionsÚautocast_regionsÚautocast_exitsÚactive_gradÚactive_autocastsÚvalÚs0ÚaÚkr„   Úassert_monotonically_increasingÚhighest_partitionÚpidÚoriginal_partition_orderÚroot_partitionsrw   Úsorted_partitionsÚroot_partitionÚ	dependentÚregions_mappingÚregionsÚrÚnew_nodeÚ	orig_noder”   Ú	orig_attrrD   Úgathered_argsÚgathered_kwargsrQ   Útarget_attrr+   r   Ú	exit_nodeÚorig_mod_envrB   Úconstruct_order_partitionsÚalready_constructed_attr_nodesr@   Úoriginal_orderÚoutput_valsr_   Úorig_mod_attr_nodesÚ_based_mod_attrsÚ
output_valÚnum_outputsÚoutput_val_proxyÚiÚoutput_nameÚretrA   rV   r�   r   r‘   r’   r“   rx   ro   rq   rp   sJ   ` `  ```                                           `           @@@@@@@@@@@r   r   r   7   s™  ÿÿø€ ôh ‡I�IØÜÐ1°1¸dÔCôð
!,Üð!,äœ3¤˜9‘oð!,ô œS¤%§(¡(×"7Ñ"7×"CÑ"CÐCÑD÷!,óF à')€JØ"$€JØ/1€Nð/C¬Tð /C¼TÀD¹[ö /Cöb,ô. 	�	‰	×!Ñ!Ü�	‰	× Ñ Ü�‰×"Ñ"ðÐô 1<³€Lô 5@³MÐØ.0€Nà€KÜ“uÐà—‘—‘ó 5:ˆð —I‘I—M‘M /Ó2Ð2ˆSÐ?Ü˜3¤§¡¬u¯~©~Ð >Ô?Ü §¡§¡Ð.˜2°·±Ô=Ø˜.Ñ(à,0ˆN˜3Ÿ8™8Ÿ=™=Ñ)à�7‰7Ð;Ñ;Øá*¨4Ô0à�7‰7�oÓ%¨$¯+©+Ð9KÒ*KØ�{‰{œeŸh™h×8Ñ8Ñ8Ü�t—y‘y“> QÒ&Ü(ØDÄSÈÏÉÃ^ÐDTÐUóð ô " $§)¡)¨A¡,´Ô5Ü(Ð+BÄ4ÈÏ	É	ÐRSÉÓCUÐBVÐ)WÓXÐXØ"�Ü,/±ÀÓ1EÐ0FÓ,G�˜[Ó)Ø—‘¤§	¡	× 9Ñ 9Ñ9äÑJÀÇ	Á	ÔJÔJÜ(ØMóð ð !×$Ñ$ TÔ*Ü),©n¸TÓ.BÐ-CÓ)DÐ  Ñ&Ø'+�˜tÒ$Ø—‘¤§	¡	× 8Ñ 8Ñ8Ü�t—y‘y“> QÒ&Ü(ØAÄ#ÀdÇiÁiÃ.ÐAQÐRóð ð ! §¡¨1¡Ñ.×2Ñ2±>À$Ó3GÔHØ ×'Ñ'¨¯	©	°!©Ô5Ø/3�˜tŸy™y¨™|Ñ,àÐ"Ø˜Ñ%×)Ñ)©.¸Ó*>Ô?à!ò 	:ˆAØ˜QÑ×#Ñ#¡N°4Ó$8Õ9ò	:ði5:ôn Ñ> n×&;Ñ&;Ó&=Ô>Ô>ÜÐ1Ó2Ð2ð 2B×1GÑ1GÓ1I×J©¨¨A˜œ6 !›9™ÐJÐÑJà-9×-?Ñ-?Ó-A×B¡T Q¨�A”v˜a“y‘LÐB€LÑBä×ÑœGŸM™MÔ*Ü�‰Ð,Ð.>Ô?Ü�‰Ð(¨,Ô7ä&*Ð+;Ó&<Ò&RÄÀ\Ó@RÐ#ð ÐØ—‘—‘ó ˆØ $ˆ
�4—9‘9Ñð �7‰7Ð1Ñ1ØØ�7‰7�hÒÜ�H‰H�N‰N×"Ñ"Ø—	‘	˜!‘ÓKôð á*Ù  Ó&ˆCØ  3Ò&Ü$ð,Ø,=Ð+>¸oÈcÈUðTóð ð !$Ðð �;‰;Ð0Ò0Ü�H‰H�N‰N×"Ñ"Ø—	‘	ÔVôô �H‰H�N‰N×"Ñ"Ø—‘ÔXöð9ô@  $ J§O¡OÓ$5Ó6Ðà!#€OØ%/×%5Ñ%5Ó%7ò 3Ñ!ˆ˜	Ü�9×)Ñ)Õ*Ø×"Ñ" >Õ2ð3ð
 $&ÐÙ
Ø(×,Ñ,Ó.ˆØ× Ñ  Ô0Ø# NÑ3×>Ñ>ò 	2ˆIØ�yÑ!×.Ñ.×2Ñ2°>ÔBØ˜iÑ(×5Ó5Ø×&Ñ& yÕ1ð	2ò ô ÐÓ¤ Z£Ò0ÜÐ=Ó>Ð>ð -¨lÐ;ò 7ˆØ,×2Ñ2Ó4ò 	7‰MˆD�'Ü�7‹|˜qÒ Ü$Ð%LÓMÐMà<@ˆJ”s˜7 1™:“Ñ'×3Ñ3°DÑ9ð ˜Q˜R�[ò 7�Ø&¤s¨1£vÑ.�	Ø$Ÿ?™?×6Ñ6Ø—w‘wØŸ;™;ÜÑ8¨d¯i©iÔ8Ó8ØØ"Ÿi™ið 7ó �ð —I‘I—N‘NÓ$ð ”ð /7�	×%Ñ% dÒ+ñ7ñ	7ð7ð. ,ó )&ˆØ˜~Ñ.ˆ	Ø&(ˆ
àˆà×#Ñ#ó "	AˆCØ" 3™ˆI÷#ñ #ð �|‰|˜zÒ)Ü! )×"2Ñ"2´CÔ8Ü(Ø3´D¸×9IÑ9IÓ4JÐ3KÐLóð ô 4°A°y×7GÑ7GÓH�	Ü˜i¬¯©¯©Ô9Ø"+§/¡/×":Ñ":¸9×;KÑ;KÓ"L�KØ:C�I×%Ñ% i×&6Ñ&6Ò7á"1Ó"3‘Ká-Ó/�Ø)¨#™×3Ñ3×8Ñ8Ó:ˆKÔØ5@ˆI×!Ñ! *¨S¡/Ó2ðE"	AðF &ˆ	ÖðS)&ðX —‘—‘ó *3ˆÜ�4˜Õ)Ø" 4×#5Ñ#5Ñ6ˆIð $×/Ñ/ˆKÜ!ŸH™HŸN™N×2Ñ2°4·9±9Ó>VÓWˆMÜ#Ÿh™hŸn™n×4Ñ4Ø—‘Ó5óˆOð �w‰wÐ9Ñ9ØŸ™‘ä5°a¸¿¹ÓE�ØŸ™×,Ñ,¨S°#Ó6�Ø,7�	×!Ñ! &Ñ)àÐ+ð #,×"7Ñ"7Ð!8¸¸&¸ÐB�HØ-1¯[©[�L Ñ*ä˜m¬UÔ3Ü$Ø<¼TÀ-Ó=PÐ<QÐRóð ô ˜o¬tÔ4Ü$Ø=¼dÀ?Ó>SÐ=TÐUóð ñ !8�4—9’9¸TˆDØ —‘×2Ñ2Ø—7‘7ØØ"Ø&ØŸ)™)Øð 3ó ˆHð !ŸI™IŸN™NÓ,ˆHŒMØ*2ˆI×!Ñ! $Ó'ðU*3ðZ -Ð-ò ˆÜ˜_Ó-ò 	ˆDØ% dÑ+ˆGÜ�7‹|˜qÒ Ü$Ð%CÓDÐDà˜S˜b�\ò �Ø&¤s¨1£vÑ.�	Ø*¨4Ñ0�	ØÐ$Ü(Ð)<Ó=Ð=Ø$Ÿ?™?×6Ñ6Ø —|‘|Ø$×+Ñ+Ø#×/Ñ/°Ñ5Ð7ØØ'Ÿn™nð 7ó �ð —N‘N×'Ñ'Ó)ð •ññ	ðð. %'€Là$&€LÜ+0¯8©8¯>©>×+?Ñ+?Ó+A€NØCE€NÙØ—G‘G—M‘Mò 	ˆDÙ+:Ø�l Nó,Ñ(ˆL™.ñ	ð —G‘G—M‘Mò 	+ˆDØ&*ˆL˜Ÿ™Ò#ð	+ñ "5ÑÐ:Rð ô &)£UÐ"ð ()§w¡w§}¡}ÖQ˜t¸¿¹À=Ó8P’dÐQ€NÐQà4ó 7EˆØ˜~Ñ.ˆ	ô ô 
Ø@I×@QÑ@Qô
ó 
ˆô ˆ{Ó˜qÒ ©Ø�O‰O×"Ñ" ;¨q¡>Õ2à�O‰O×"Ñ" ;Ô/áð %×+Ñ+ö/àØ˜nÑ,ð ˜SÓ!ð/Ðð /ð 'ò 9�ØÐ9Ñ9ØÙ1@Ø˜,¨ó2Ñ.�Ð.ð /×2Ñ2°4Õ8ð9ð ,ò 9�ØÐ9Ñ9ØÙ/>Ø˜,¨ó0Ñ,�˜nð /×2Ñ2°4Õ8ð9ô 1CØ×Ñ˜yŸ™ó1
ˆ�y×,Ñ,Ñ-ð
 $×/Ñ/Ø×!Ñ!ÜÓB°×1AÑ1AÔBÓBó
ˆ
ô
 ˜)×+Ñ+Ó,ˆØ˜Š?˜{¨aÒ/±Lä$Ÿx™xŸ~™~×3Ñ3°JÓ?ÐÜ"+¨I×,=Ñ,=Ó">ò E‘��;Ø,<¸QÑ,?×,DÑ,D�˜[Ò)òEà˜AÔØ:DˆLœœd 9×#4Ñ#4Ó5Ó6Ó7ðo7Eñz ¡<Ø—G‘G—M‘Mò 	ˆDÙ+:Ø�l Nó,Ñ(ˆL™.ð	ð —‘—‘ò ˆØ�7‰7�hÓØ×!Ñ!Ü—‘—‘×&Ñ& t§y¡y°¡|Ó5SÓTõðô ˜^¨^Ó
<€CÜ‡I�IØÜÐ2°CÀÔFôð €Jùóm	 KùãBùòF Rùò"/s   Ñ"~,Ò~2ó~8ó!~8õ+~=)NFFT)!rL   r²   Úcollectionsr   Úcollections.abcr   Útypingr   r   Útorch.fx._compatibilityr   Útorch.fx._lazy_graph_moduler   Útorch.fx._utilsr   Útorch.fx.graph_moduler	   Útorch.fx.noder
   Ú__all__Ú	getLoggerr%   ra   r°   r   rº   r»   r(   r4   Úintrœ   rª   r   r)   r!   r   ú<module>r÷      sK  ðã Û Ý #Ý $Ý ã Ý 1Ý :Ý 2Ý -Ý ð ˜Ð
'€Ø!�×!Ñ! (Ó+Ð +€€gñ  dÔ+÷
ð 
ó ,ð
ð0 §¡§¡ð ¸Cð ÀCó ñ  dÔ+ð
 +/Ø',Ø+0Ø%)ðr	ð #'Øòr	Øðr	à�H‰H�O‰Oðr	ð ˜d˜V S˜[Ñ)ðr	ð �s˜C�x‘. 4Ñ'ð	r	ð
  ™ðr	ð " D™[ðr	ð #ðr	ð ˜4‘Zðr	ð òr	ó ,ñr	r!   