ó
    Eñiq  ã                   ó®  • S SK r S SKrS SKJr  S SKJr  S SKJrJr  S SK	r	S SK
Jr  S SKJr  S SKJr  S SKJr  S	S
/r\R&                  " \5      =rr\" SS9 " S S	5      5       rS\	R0                  R2                  S\S\4S jr\" SS9    SSS.S\S\	R0                  R2                  S\\/\4   S\\\\4      S\\   S\\   S\S\\   4S jjj5       rg)é    N)ÚOrderedDict)ÚCallable)ÚAnyÚOptional)Úcompatibility)Úlazy_format_graph_code)ÚGraphModule)ÚNodeÚ	PartitionÚsplit_moduleT)Úis_backward_compatiblec                   ó0   • \ rS rSrS\4S jrS\4S jrSrg)r   é   Únamec                 óà   • Xl         SU 3U l        / U l        0 U l        0 U l        0 U l        0 U l        [        R                  R                  R                  5       U l	        0 U l        0 U l        g )NÚsubmod_)r   Úsubmod_nameÚ
node_namesÚinputsÚoutputsÚdependenciesÚ
dependentsÚtorchÚfxÚgraphÚGraphÚenvironmentÚtargets)Úselfr   s     ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/fx/passes/split_module.pyÚ__init__ÚPartition.__init__   sa   € ØŒ	Ø$ T FÐ+ˆÔØ%'ˆŒØ')ˆŒØ(*ˆŒØ-/ˆÔØ+-ˆŒÜ+0¯8©8¯>©>×+?Ñ+?Ó+AˆŒ
Ø-/ˆÔØ')ˆ�ó    Úreturnc                 ó¢   • SU R                    SU R                   SU R                   SU R                   SU R                   SU R
                   3$ )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__ÚPartition.__repr__!   sb   € à�T—Y‘Y�Kð  Ø—‘Ð'ð (ØŸ™�}ð %ØŸ™˜ð '(Ø(,×(9Ñ(9Ð':ð ;&Ø&*§o¡oÐ%6ð8ð	
r#   )
r   r   r   r   r   r   r   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ústrr!   r&   Ú__static_attributes__© r#   r    r   r      s   † ð
*˜Sô 
*ð
˜#÷ 
r#   ÚmodÚqualnamer$   c                 óŽ   • U nUR                  S5       H-  n[        X#5      (       d  [        SU S35      e[        X#5      nM/     U$ )NÚ.zNode target z not found!)ÚsplitÚhasattrÚAttributeErrorÚgetattr)r/   r0   Úattr_valÚatoms       r    Ú_get_attr_from_qualnamer9   ,   sJ   € Ø€HØ—‘˜sÖ#ˆÜ�x×&Ñ&Ü  <°¨z¸Ð!EÓFÐFÜ˜8Ó*Šñ $ð €Or#   )Úpartition_affixÚmÚroot_mÚsplit_callbackÚqualname_mapÚkeep_original_orderÚkeep_original_node_nameÚkeep_original_input_namer:   c                óö!  ^ ^^^^^2^?^@^A^B^C^D^E^F^G^H^I• [         R                  S[        ST SS95        S[        S[        [
        [        4   S[        [
        [        R                  R                  R                  4   4U@UU 4S jjnS	S
K
n	0 mG0 mE0 mIS[        S[        [           4UGUI4S jjmHUUGU4S jn
[        R                  R                  [        R                  R                  [        R                  R                   /n[#        5       n[#        5       n0 nS
n[%        5       nT R&                  R(                   GH  m2T2R*                  R-                  S5      =nb  [/        U[        R0                  [        R2                  45      (       aP  [/        UR4                  R6                  =nU	R8                  5      (       a  UTI;  a  T2TIUR4                  R6                  '   T2R:                  S;   a  M³  U
" T25        T2R:                  S:X  Ga  T2R<                  U;   Gaö  T2R<                  [        R                  R                   L a˜  [?        T2R@                  5      S:w  a!  [C        S[?        T2R@                  5       35      e[/        T2R@                  S	   [D        5      (       d$  [C        S[G        T2R@                  S	   5       35      eT2n[%        T" T25      15      XÏ'   GO7T2R<                  [        R                  R                  L aX  [I        S T2R@                   5       5      (       d  [C        S5      eURK                  T25        [%        T" T25      15      UT2'   S
UT2'   O¸T2R<                  [        R                  R                  L a‘  [?        T2R@                  5      S:w  a!  [C        S[?        T2R@                  5       35      eUT2R@                  S	      RK                  T" T25      5        URM                  T2R@                  S	   5        T2UT2R@                  S	   '   Ub  XÏ   RK                  T" T25      5        U H  nUU   RK                  T" T25      5        M     GM     [I        S URO                  5        5       5      (       d  [C        S5      eURQ                  5        VVs0 s H  u  nnU[S        U5      _M     nnnURQ                  5        VVs0 s H  u  nnU[S        U5      _M     nnn[T        RW                  [X        RZ                  5      (       a,  [T        R                  SU5        [T        R                  SU5        [E        U5      =(       d    [E        U5      nSnT R&                  R(                   GH  m2T2TET2R\                  '   T2R:                  S;   a  M%  T2R:                  S:X  a=  [        R                  R&                  R_                  T2R@                  S	   UH4S j5        Mr  U(       a!  T" T25      nUU:”  a  [C        S U S!U 35      eUnT2R<                  U;  d  M¬  [        R                  R&                  R_                  T2R@                  U2UH4S" j5        [        R                  R&                  R_                  T2R`                  U2UH4S# j5        GM!     [c        TGRe                  5       5      n/ nTGRQ                  5        H3  u  nmF[?        TFRf                  5      (       a  M"  URi                  U5        M5     / nU(       a…  URk                  5       nURi                  U5        TGU   Rl                   HH  nTGU   Rf                  Rk                  U5        TGU   Rf                  (       a  M7  URi                  U5        MJ     U(       a  M…  [?        U5      [?        TG5      :w  a  [o        S$5      eXÜ4 Hò  nURQ                  5        HÛ  u  m2n [?        U 5      S	:X  a  [C        S%5      eT2TG[        U S	   5         Rp                  T2'   U SS
  H”  n!TG[        U!5         mFTFR&                  Rs                  T2R:                  T2R<                  [u        S& T2R@                   5       5      0 T2RF                  S'9n"T2R*                  Rw                  5       U"l        U"TFRp                  T2'   M–     MÝ     Mô     U GHJ  nTGU   mF0 mDS	mATFRx                   GH%  mCTETC   n#UAUCUUDUEUF4S( jn$U#R:                  S):X  aÆ  [/        U#R<                  [
        5      (       d!  [C        S*[G        U#R<                  5       35      e[{        T U#R<                  5      n%[/        U%[        R|                  R~                  5      (       a?  TFR&                  R�                  U#R<                  5      n&U%TFR‚                  U#R<                  '   OU$" 5       n&OU$" 5       n&TETC   R*                  Rw                  5       U&l        U&TFRp                  TETC   '   GM(     TDTFl<        GMM     T R&                  R(                   GHð  m2[…        T2S+5      (       d  M  TGT2R†                     mFTFRp                  mB[        R                  R&                  R_                  T2R@                  UB4S, j5      n'[        R                  R&                  R_                  T2R`                  UB4S- j5      n(T2R:                  S.;  a  T2R<                  n)Od[{        T T2R<                  5      n*T2R<                  R‰                  S/S05      n)U*TFR‚                  U)'   Ub   TFRŠ                   S/U) 3n+T2R<                  UU+'   [/        U'[t        5      (       d  [C        S1[G        U'5       35      e[/        U([        5      (       d  [C        S2[G        U(5       35      eT(       a  T2R\                  OS
n,TFR&                  Rs                  T2R:                  U)U'U(T2RF                  U,S39n"T2R*                  Rw                  5       U"l        U"TFRp                  T2'   GMó     U4 HÉ  n[�        U5       H·  m2UT2   n [?        U 5      S	:X  a  [C        S45      eU S
S  HŒ  n!TG[        U!5         mFUT2   n-U-c  [C        S55      eTFR&                  Rs                  U-R:                  U-R<                  TFRp                  T2   40 U-RF                  S'9n"U-R*                  Rw                  5       U"l        MŽ     M¹     MË     0 n.0 m?[        R                  R&                  R�                  5       m@0 n/U(       d+  T R&                  R(                   H  m2U" T2T?U/5      u  m?n/M     O,T R&                  R(                   H  m2T2U.T2R\                  '   M     U(       d  UOUn0[%        5       n1T R&                  R(                   V2s/ s H  n2U2R:                  S6:X  d  M  U2PM     n3n2U0 GHH  nTGU   mF[u        UEUF4S7 jTFR�                   5       5      n4[?        U45      n5U5S:X  a  TFR&                  R“                  U4S	   5        O=U5S:”  a  TFR&                  R“                  U45        OTFR&                  R“                  S85        U(       a…  TFRx                   V6s/ s H  n6U6U3;  d  M  U.U6   PM     n7n6U3 H)  m2T2U1;   a  M  U" T2T?U/5      u  m?n8U1RK                  T25        M+     U7 H)  m2T2U1;   a  M  U" T2T?U/5      u  m?n/U1RK                  T25        M+     [        R                  R                  R                  TFR‚                  TFR&                  5      U/TFRŠ                  '   T@R•                  TFRŠ                  [u        U?4S9 jTFRx                   5       5      5      n9[?        TFR�                  5      n:U:S:”  a]  [        R                  R–                  R™                  U95      n;[›        TFR�                  5       H  u  n<n=U;U<   R4                  T?U='   M     GM  U:S:X  d  GM'  U9T?[�        [Ÿ        TFR�                  5      5      '   GMK     U(       a1  T?(       d*  T R&                  R(                   H  m2U" T2T?U/5      u  m?n/M     T R&                  R(                   H_  m2T2R:                  S:X  d  M  T@R“                  [        R                  R&                  R_                  T2R@                  S	   U?4S: j5      5        Ma     [        R                  R                  R                  U/T@5      n>[         R                  S[        S;U>SS95        U>$ s  snnf s  snnf s  sn2f s  sn6f )<aM  
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>".

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                 ó°  >• U R                   S:X  aý  [        U R                  5      S:”  a  U R                  S   O[        R                  R
                  nT(       aU  U[        R                  R
                  L a  SOU4nTR                  SU R                  UU R                  S9XR                  '   O1TR                  U R                  U R                  US9XR                  '   U R                  R                  5       XR                     l        X4$ U R                   S:X  a¶  TR                  U R                  5      XR                  '   U R                  R                  5       XR                     l        [        U R                  [        5      (       d!  [!        S[        U R                  5       35      e[#        TU R                  5      nXRU R                  '   X4$ )NÚplaceholderr   r.   )ÚargsÚ	type_expr)rJ   Údefault_valueÚget_attrúExpected str target, got )ÚopÚlenrI   ÚinspectÚ	SignatureÚemptyÚcreate_noder   ÚtyperH   ÚtargetÚmetaÚcopyrL   Ú
isinstancer,   ÚAssertionErrorr9   )	rD   rE   rF   rK   rI   r7   Úbase_mod_graphr@   r;   s	         €€€r    Úconstruct_graphÚ%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ð +�ŸY™YÒ'ð +9×*DÑ*DØ—K‘KØ"Ÿi™iØ"/ð +Eð +�Ÿ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˜4Ÿ;™;Ñ'ØÐ+Ð+r#   r   NÚdef_nodeÚuse_nodec                 ó¾  >• SSK Jn  [        U SS 5      n[        USS 5      n[        R	                  SU R
                  UUb  UR
                  OSU5        X4:w  Ga„  UbH  TU   nUR                  R                  U R
                  5        Ub  UR                  R                  U5        UGb4  TU   nUR                  R                  U R
                  5        U R                  R                  S5      =nbÌ  [        U" U5      [        S9 H´  nTU   n	UR                  R                  U	R
                  5        TU   R                  S:w  d  MB  [        U	SS 5      n
U
c  MT  TU
   nUR                  R                  U	R
                  5        UR                  R                  U5        UR                  R                  U
5        M¶     Ub  UR                  R                  U5        g g g g )	Nr   )Úfree_symbolsÚ_fx_partitionz*record_cross_partition_use %s (%s) %s (%s)Ú-Úexample_value)ÚkeyrH   )Ú%torch.fx.experimental.symbolic_shapesr`   r6   ÚlogÚdebugr   r   Ú
setdefaultr   r   rV   ÚgetÚsortedr,   rN   r   )r]   r^   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_useÚ0split_module.<locals>.record_cross_partition_useÔ   s°  ø€ ÝFä˜( O°TÓ:ˆÜ�x °$Ó7ˆä�	‰	Ø8Ø�M‰MØØ%Ñ1ˆH�MŠM°sØô	
ð Œ?ØÑ"Ø *¨7Ñ 3�Ø×%Ñ%×0Ñ0°·±Ô?ØÑ#Ø!×,Ñ,×7Ñ7¸Ô=àÒØ *¨4Ñ 0�Ø×$Ñ$×/Ñ/°·±Ô>ð  (Ÿ}™}×0Ñ0°ÓAÐA�GÑNÜ#¡L°Ó$9¼sÔC˜Ø!/°Ñ!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ñ# Dð$ Ñ&Ø!×.Ñ.×9Ñ9¸'ÕBð 'ð3  ð r#   c                 ó8  >• T" U 5      n[        U5      nTb  SR                  TU/5      n[        R                  SU R                  U5        TR                  U5      nUc  [        U5      =TU'   nUR                  R                  U R                  5        X l	        g )NÚ_z*instantiate_node_partition_mapping %s (%s))
r,   Újoinrf   rg   r   ri   r   r   Úappendra   )rD   Úpartition_idxÚpartition_nameÚ	partitionr:   rt   r=   s       €€€r    Ú"instantiate_node_partition_mappingÚ8split_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#   rc   )rH   rL   ÚoutputÚcall_functioné   z*Expected 1 arg for _set_grad_enabled, got zExpected bool arg, got c              3   óL   #   • U  H  n[        U[        5      (       + v •  M     g 7f©N)rX   r
   ©Ú.0Úargs     r    Ú	<genexpr>Úsplit_module.<locals>.<genexpr>U  s   é € ÐJÂ	¸œz¨#¬tÓ4×4Ñ4Â	ùs   ‚"$z3Expected all args to be python constants, not Nodesz'Expected 1 arg for _exit_autocast, got c              3   ó(   #   • U  H  oS Lv •  M
     g 7fr…   r.   )r‡   Úvs     r    r‰   rŠ   k  s   é € Ð>Ò&= ˜�}Ò&=ùs   ‚zautocast must exitzautocast_regions: %szgrad_regions: %séÿÿÿÿ)rH   rL   r�   c                 ó   >• T" U S 5      $ r…   r.   )Únrv   s    €r    Ú<lambda>Úsplit_module.<locals>.<lambda>„  s   ø€ Ñ(BÀ1ÀdÔ(Kr#   zSautocast or set_grad_enabled require monotonically increasing partitions: highest: z, this node's: c                 ó   >• T" U T5      $ r…   r.   ©r]   rD   rv   s    €€r    r�   r‘   •  s   ø€ Ñ,FÀxÐQUÔ,Vr#   c                 ó   >• T" U T5      $ r…   r.   r“   s    €€r    r�   r‘   ˜  s   ø€ Ñ.HÈÐSWÔ.Xr#   z cycle exists between partitions!z%Expected at least one region for nodec              3   ó$   #   • U  H  ov •  M     g 7fr…   r.   r†   s     r    r‰   rŠ   ¼  s   é € Ð8ªi sœsªiùs   ‚)rN   rU   rI   ÚkwargsrJ   c                  óˆ   >• T(       a  Tn O
ST 3n TS-  mTR                   R                  U TT   R                  S9nS TT'   U$ )NÚarg_rƒ   )rJ   )r   rH   rT   )r   rH   ÚcounterÚinprA   Ú
new_inputsÚ
orig_nodesr~   s     €€€€€€r    Úadd_placeholderÚ%split_module.<locals>.add_placeholderÑ  s\   ø€ Þ+Ø‘Dð " ' Ð+�DØ˜q‘L�GØ'Ÿo™o×9Ñ9ØØ(¨™o×2Ñ2ð :ð �ð #'�
˜3‘Ø"Ð"r#   rL   rM   ra   c                 ó   >• TU    $ r…   r.   ©r�   r   s    €r    r�   r‘   ø  s
   ø€ ÈÐTUÊr#   c                 ó   >• TU    $ r…   r.   r    s    €r    r�   r‘   ú  s	   ø€  {°1¢~r#   )Úcall_modulerL   r2   ry   z&Expected tuple for gathered_args, got z'Expected dict for gathered_kwargs, got )rN   rU   rI   r–   rJ   r   zExpected at least one regionzMissing exit noderH   c              3   óH   >#   • U  H  nTR                   TU      v •  M     g 7fr…   )r   )r‡   r   rœ   r~   s     €€r    r‰   rŠ   Z  s%   øé € ð 
Ú@Q¸ˆI×!Ñ! *¨TÑ"2Ö3Ò@Qùs   ƒ"r.   c              3   ó.   >#   • U  H
  nTU   v •  M     g 7fr…   r.   )r‡   r   rE   s     €r    r‰   rŠ   ˆ  s   øé € ÐBÒ1A¨�,˜tÖ$Ò1Aùs   ƒc                 ó"   >• TU R                      $ r…   )r   )r�   rE   s    €r    r�   r‘   ¢  s   ø€ ¸|ÈAÏFÉFÒ?Sr#   zpost split_module)Prf   rg   r   r
   Údictr,   r   r   Úgraph_moduler	   Úsympyr   ÚampÚ_enter_autocastÚ_exit_autocastÚ_CÚ_set_grad_enabledr   Úsetr   ÚnodesrV   ri   rX   ÚSymIntÚSymFloatrD   ÚexprÚSymbolrN   rU   rO   rI   rY   ÚboolrT   ÚallÚaddÚremoveÚvaluesÚitemsrj   Ú_LOGGERÚisEnabledForÚloggingÚDEBUGr   Úmap_argr–   ÚlistÚkeysr   r{   Úpopr   ÚRuntimeErrorr   rS   ÚtuplerW   r   r9   ÚnnÚModulerL   r   r4   ra   Úreplacer   Úreversedr   r   r�   r¢   ÚproxyÚProxyÚ	enumerateÚnextÚiter)Jr;   r<   r=   r>   r?   r@   rA   r:   r[   r¨   r   Ú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_partitionsr}   Úsorted_partitionsÚroot_partitionÚ	dependentÚregions_mappingÚregionsÚrÚnew_nodeÚ	orig_noder�   Ú	orig_attrrH   Úgathered_argsÚgathered_kwargsrU   Útarget_attrr0   r   Ú	exit_nodeÚorig_mod_envrF   Úconstruct_order_partitionsÚalready_constructed_attr_nodesrD   Úoriginal_orderÚoutput_valsÚnum_output_valsrd   Úorig_mod_attr_nodesÚ_based_mod_attrsÚ
output_valÚnum_outputsÚoutput_val_proxyÚiÚoutput_nameÚretrE   rZ   r™   r   rš   r›   rœ   r~   rt   rv   ru   sJ   ` `  ```                                          `            @@@@@@@@@@@r    r   r   6   s“  ÿÿø€ ô` ‡I�IØÜÐ1°1¸dÑCôð
!,Üð!,äœ3¤˜9‘oð!,ô œS¤%§(¡(×"7Ñ"7×"CÑ"CÐCÑD÷!,ñ !,óF à')€JØ"$€JØ/1€Nð/C¬Tð /C¼XÄd¹^÷ /Cð /C÷b,ô. 	�	‰	×!Ñ!Ü�	‰	× Ñ Ü�‰×"Ñ"ðÐô 1<³€Lô 5@³MÐØ13€Nà€KÜ“uÐà—‘—•ˆð —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Ñ5Ü(Ð+BÄ4ÈÏ	É	ÐRSÉÓCUÐBVÐ)WÓXÐXØ"�Ü,/±ÀÓ1EÐ0FÓ,G�Ó)Ø—‘¤§	¡	× 9Ñ 9Ò9äÑJÀÇ	Â	Ó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 ôn Ñ> n×&;Ñ&;Ô&=Ó>×>Ñ>ÜÐ1Ó2Ð2ð 2B×1GÑ1GÔ1IÔJÒ1I©¨¨A˜œ6 !›9šÑ1IÐÑJà-9×-?Ñ-?Ô-AÔBÒ-A¡T Q¨�A”v˜a“y’LÑ-A€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Ñ!ˆ˜	Ü�9×)Ñ)×*Ó*Ø×"Ñ" >Ö2ñ &8ð
 $&ÐÞ
Ø(×,Ñ,Ó.ˆØ× Ñ  Ô0Ø# NÑ3×>Ô>ˆIØ�yÑ!×.Ñ.×2Ñ2°>ÔBØ˜iÑ(×5×5Ñ5Ø×&Ñ& yÖ1ñ ?÷ ˆ/ô ÐÓ¤ Z£Ó0ÜÐ=Ó>Ð>ð -Ó;ˆØ,×2Ñ2Ö4‰MˆD�'Ü�7‹|˜qÓ Ü$Ð%LÓMÐMà<@ˆJ”s˜7 1™:“Ñ'×3Ñ3°DÑ9ð ˜Q˜R“[�Ø&¤s¨1£vÑ.�	Ø$Ÿ?™?×6Ñ6Ø—w‘wØŸ;™;ÜÑ8¨d¯iªiÓ8Ó8ØØ"Ÿi™ið 7ð �ð —I‘I—N‘NÓ$ð ”ð /7�	×%Ñ% dÓ+ó !ó 5ñ <ô. ,ˆØ˜~Ñ.ˆ	Ø&(ˆ
àˆà×#Õ#ˆCØ" 3™ˆI÷#ò #ð �|‰|˜zÓ)Ü! )×"2Ñ"2´C×8Ñ8Ü(Ø3´D¸×9IÑ9IÓ4JÐ3KÐLóð ô 4°A°y×7GÑ7GÓH�	Ü˜i¬¯©¯©×9Ñ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 $ðF &ˆ	×ñS ,ðX —‘—•ˆÜ�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Ñ3Ü$Ø<¼TÀ-Ó=PÐ<QÐRóð ô ˜o¬t×4Ñ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 ð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¡}€NÐQä4ˆØ˜~Ñ.ˆ	ô õ 
Ø@I×@QÒ@Qó
ó 
ˆô
 ˜kÓ*ˆØ˜aÓØ�O‰O×"Ñ" ;¨q¡>Õ2Ø˜qÓ Ø�O‰O×"Ñ" ;Õ/ð �O‰O×"Ñ" 2Ô&æð %×+Ò+ó/â+�CØ˜nÑ,ó "�˜SÔ!Ù+ð  ð /ó '�ØÐ9Ó9ÙÙ1@Ø˜,¨ó2Ñ.�Ð.ð /×2Ñ2°4Ö8ñ 'ó ,�ØÐ9Ó9ÙÙ/>Ø˜,¨ó0Ñ,�˜nð /×2Ñ2°4Ö8ñ ,ô 16·±×0EÑ0E×0QÑ0QØ×Ñ˜yŸ™ó1
ˆ�y×,Ñ,Ñ-ð
 $×/Ñ/Ø×!Ñ!ÜÔB°×1AÒ1AÓBÓBó
ˆ
ô
 ˜)×+Ñ+Ó,ˆØ˜‹?ä$Ÿx™xŸ~™~×3Ñ3°JÓ?ÐÜ"+¨I×,=Ñ,=Ö">‘��;Ø,<¸QÑ,?×,DÑ,D�˜[Ó)ô #?à˜AÖØ:DˆLœœd 9×#4Ñ#4Ó5Ó6Ô7ñy 5öD ¦<Ø—G‘G—M”MˆDÙ+:Ø�l Nó,Ñ(ˆLš.ñ "ð —‘—”ˆØ�7‰7�hÕØ×!Ñ!Ü—‘—‘×&Ñ& t§y¡y°¡|Ô5SÓTöñ ô �(‰(×
Ñ
×
+Ñ
+¨N¸NÓ
K€CÜ‡I�IØÜÐ2°CÀÑFôð €Jùów	 KùãBùòF Rùò,/s*   ÒAC%ÓAC+õ:AC1öAC1ù
AC6ù	AC6)NFFT) rP   r¼   Úcollectionsr   Úcollections.abcr   Útypingr   r   r   Útorch.fx._compatibilityr   Útorch.fx._utilsr   Útorch.fx.graph_moduler	   Útorch.fx.noder
   Ú__all__Ú	getLoggerr(   rf   rº   r   rÄ   rÅ   r,   r9   Úintr¦   r´   r   r.   r#   r    Ú<module>r     s8  ðã Û Ý #Ý $ß  ã Ý 1Ý 2Ý -Ý ð ˜Ð
'€Ø×!Ò! (Ó+Ð +€€gñ  dÑ+÷
ð 
ó ,ð
ð0 §¡§¡ð ¸Cð ÀCô ñ  dÑ+ð
 .2Ø*/Ø.3Ø%)ðs	ð &*òs	Øðs	à�H‰H�O‰Oðs	ð ˜d˜V S˜[Ñ)ðs	ð ˜4  S ™>Ñ*ð	s	ð
 " $™ðs	ð & d™^ðs	ð #ðs	ð ˜c‘]õs	ó ,ñs	r#   