+
    –°³jØw  ã                   ó¨  a € RW tX0 t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIt^ RIt^ RIHu Ht ^ RIHt ^ RIHt ^RIHt ^RIHtHtHt ^R	IHt ]P8                  ! ]4      t ! R
 R]4      t ! R R]4      t  ! R R]4      t!]! RR7       ! R R4      4       t"RXt#]!PH                  ]"! RRR4      ]!PJ                  ]"! RRR4      ]!PL                  ]"! RRR4      ]!PN                  ]"! RRR4      ]!PP                  ]"! RRR^d]#,          R7      ]!PR                  ]"! RRR^K]#,          R7      ]!PT                  ]"! RRR 4      /t+] ^ k ] PX                  ]!PN                  ] PZ                  ]!PJ                  ] P\                  ]!PH                  ] P^                  ]!PL                  /t0] ^k ] PX                  ]!PR                  ] PZ                  ]!PR                  ] P\                  ]!PP                  ] P^                  ]!PP                  /t1] ^k ]Pd                  R! R" l4       t3]Pd                  R# R$ l4       t4R% R& lt5R' R( lt6R) R* lt7RYR+ R, llt8RYR- R. llt9R/ R0 lt:R1 R2 lt; ! R3 R4]4      t< ! R5 R6]4      t= ! R7 R8]4      t>^t?^t@. RZO. R[O.tA. R\O. R]O.. R^O. R_O.. R`O. RaO..tB. RbO. RcO. RdO. ReO.tC. RfO. RfO. RgO. RhO.tD. RfO. RfO. RiO. RjO.tE. RkO. RlO. RmO. RnO.tF. RoO. RpO. RqO.tG] PX                  ^] PZ                  ^] P\                  ^] P^                  ^ /tH] PX                  R:] PZ                  R;] P\                  R<] P^                  R=/tI] ^k R9tJ] PX                  R] PZ                  R>] P\                  R] P^                  R/tK] ^k R? R@ ltLRA RB ltMRC RD ltNRE RF ltORG RH ltPRI RJ ltQRK RL ltRRrRM RN lltSRO RP ltTRQ RR ltURS RT ltVRsRU RV lltWR# )té    N)Ú	dataclass)ÚIntEnum©ÚAny)Úoptimization_hint)Únormalize_function)Úir)Úget_dtype_sizeÚsnode_args_kwargsÚsympy_product)ÚVc                   ó.   € ] tR t^t^ t^t^t^t^t^t	Rt
R# )Ú	NCCL_COLL© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú
ALL_REDUCEÚ
ALL_GATHERÚREDUCE_SCATTERÚ
ALL_TO_ALLÚUNSUPPORTEDÚP2PÚ__static_attributes__r   ó    Ú^/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/comm_analysis.pyr   r      s    † Ø€JØ€JØ€NØ€JØ€KØ
„Cr   r   c                   ó&   € ] tR t^!t^ t^t^t^tRtR# )ÚNVIDIA_GPU_TYPEr   N)	r   r   r   r   ÚVOLTAÚAMPEREÚHOPPERÚ	BLACKWELLr   r   r   r   r   r   !   s   † Ø€EØ€FØ€FØ„Ir   r   c                   ó2   € ] tR t^(t^ t^t^t^t^t^t	^t
RtR# )ÚInterconnectTyper   N)r   r   r   r   ÚNVLINK_V100ÚNVLINK_A100ÚNVLINK_H100ÚNVLINK_B200ÚIB_HDRÚIB_NDRÚPCIEr   r   r   r   r%   r%   (   s%   † Ø€KØ€KØ€KØ€KØ€FØ€FØ„Dr   r%   T)Úfrozenc                   ó4   a € ] tR t^2t o Rt^ tV 3R ltRtV tR# )ÚInterconnectProfilezIEmpirically calibrated interconnect parameters for saturation estimation.c                óJ   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[;R&   # )é   Úbus_bw_GBpsÚlatency_per_hop_usÚbase_latency_usÚmin_saturation_bytes)ÚfloatÚint)ÚformatÚ__classdict__s   "€r   Ú__annotate__Ú InterconnectProfile.__annotate__2   s9   ø‡ ‚ ñ Ññ	 ñ
 Ññ ñ Ññ ñ Ñ!ò r   r   N)	r   r   r   r   Ú__doc__r5   Ú__annotate_func__r   Ú__classdictcell__)r9   s   @r   r/   r/   2   s   ø‡ € áSð
 !"Ð÷ ƒ r   r/   ç      B@ç      D@ç      $@g      6@ç     €F@g      N@g      >@ç      ,@g      I@g      (@)r5   g      &@g      .@c                ó$   € V ^8„  d   QhR\         /# ©r1   Úreturn)Úbool)r8   s   "r   r:   r:   b   s   € ÷ ñ ”Tñ r   c                 óê  € ^ RI p \        P                  P                  4       '       d$   \        P                  P	                  4       ^8  d   R#  V P                  . RORR^R7      pVP                  ^ 8X  d(   VP                  P                  R4      ^ ,          pRV9   #   \        P                  P                  ^ ^4      #   T P                  \        3 d     L:i ; i  \        \        3 d     R# i ; i)zIDetect NVLink via nvidia-smi topology, falling back to peer access check.NT)Úcapture_outputÚtextÚtimeoutÚLegendÚNV)z
nvidia-smiÚtopoz-m)Ú
subprocessÚtorchÚcudaÚis_availableÚdevice_countÚrunÚ
returncodeÚstdoutÚsplitÚTimeoutExpiredÚOSErrorÚcan_device_access_peerÚAssertionErrorÚRuntimeError)rO   ÚresultrN   s      r   Ú_has_nvlinkr^   a   sà   € ó ä�:‰:×"Ñ"×$Ò$¬¯
©
×(?Ñ(?Ó(AÀAÔ(EÙðØ—‘Ú(ØØØð	  ó 
ˆð ×Ñ Ô!à—=‘=×&Ñ& xÓ0°Õ3ˆDØ˜4‘<Ðð "ðÜ�z‰z×0Ñ0°°AÓ6Ð6øð	 ×%Ñ%¤wÐ/ô Ùðûô
 œLÐ)ô Úðús%   ÁAC  Â C Ã CÃCÃC2Ã1C2c                ó$   € V ^8„  d   QhR\         /# rE   )r   )r8   s   "r   r:   r:   }   s   € ÷ &ñ &”oñ &r   c                  ó�  a€ \         P                  P                  4       '       d©   \         P                  P                  4       ^ 8”  d†   \         P                  P	                  ^ 4      P
                  p V ^
8¼  d   \        P                  # V ^	8¼  d   \        P                  # V ^8¼  d   \        P                  # V ^8¼  d   \        P                  # \         P                  P                  P                  \         P                  P                  P                  4      ;'       g    RoRS9   d   \        P                  # RS9   d   \        P                  # RS9   d   \        P                  # \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   \        P                  # \        P                  # )	r   Ú ÚV100ÚA100ÚH100c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5i©Nr   )Ú.0ÚgpuÚgpu_infos   & €r   Ú	<genexpr>Úget_gpu_type.<locals>.<genexpr>‘   s   øé € ÐAÑ(@ �HŽ_Ó(@ùó   ƒTF)ÚB100ÚB200ÚB300)rP   rQ   rR   rS   Úget_device_propertiesÚmajorr   r#   r"   r!   r    ÚutilsÚcollect_envÚget_gpu_inforT   Úany)rq   ri   s    @r   Úget_gpu_typerv   |   s<  ø€ ô ‡z�z×Ñ× Ò ¤U§Z¡Z×%<Ñ%<Ó%>ÀÔ%BÜ—
‘
×0Ñ0°Ó3×9Ñ9ˆØ�BŒ;Ü"×,Ñ,Ð,Ø�AŒ:Ü"×)Ñ)Ð)Ø�AŒ:Ü"×)Ñ)Ð)Ø�AŒ:Ü"×(Ñ(Ð(ä�{‰{×&Ñ&×3Ñ3´E·K±K×4KÑ4K×4OÑ4OÓP×VÐVÐTV€HØ�ÔÜ×$Ñ$Ð$Ø	�8Ô	Ü×%Ñ%Ð%Ø	�8Ô	Ü×%Ñ%Ð%ß	‹ÔAÑ(@ÓA��ŠÔAÑ(@ÓA×	AÒ	AÜ×(Ñ(Ð(ä×%Ñ%Ð%r   c                ó0   € V ^8„  d   QhR\         R\        /# )r1   Ú
group_sizerF   )r7   r%   )r8   s   "r   r:   r:   —   s   € ÷ ?ñ ?¤Cð ?Ô,<ñ ?r   c                ó°  € \         P                  P                  4       '       d   \         P                  P                  4       M^p\	        4       p\
        P                  ! W,          4      ^8X  dE   \        4       '       g   \        P                  # \        P                  V\        P                  4      # \        P                  V\        P                  4      # )zEAuto-detect interconnect type from GPU generation and group topology.)rP   rQ   rR   rS   rv   ÚmathÚceilr^   r%   r,   Ú_GPU_TO_INTRAÚgetr'   Ú_GPU_TO_INTERr*   )rx   Úgpus_per_nodeÚgpu_gens   &  r   Údetect_interconnectr�   —   s‹   € ä16·±×1HÑ1H×1JÒ1J”E—J‘J×+Ñ+Ô-ÐPQ€MÜ‹n€GÜ‡y‚y�Õ+Ó,°Ô1Ü�}Š}Ü#×(Ñ(Ð(Ü× Ñ  Ô*:×*FÑ*FÓGÐGÜ×Ñ˜WÔ&6×&=Ñ&=Ó>Ð>r   c                ó0   € V ^8„  d   QhR\         R\        /# )r1   Úkernel_namerF   )Ústrr   )r8   s   "r   r:   r:   ¢   s   € ÷ %ñ %´cð %¼iñ %r   c                 ó  a € S f   \        R4      hRS 9   d   \        P                  # RS 9   d   \        P                  # RS 9   d   \        P                  # \
        ;QJ d    V 3R lR	 4       F  '       g   K   RM	  RM! V 3R lR	 4       4      '       d   \        P                  # \
        ;QJ d    V 3R lR
 4       F  '       g   K   RM	  RM! V 3R lR
 4       4      '       d   \        P                  # \        P                  # )Nzkernel_name must not be NoneÚ
all_reduceÚ
all_gatherÚreduce_scatterc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irf   r   ©rg   Úcommrƒ   s   & €r   rj   Ú7get_collective_type_from_kernel_name.<locals>.<genexpr>«   s   øé € ÐHÑ-G T�[Ö Ó-Gùrl   TFc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irf   r   rŠ   s   & €r   rj   rŒ   ­   s   øé € ÐMÑ-L T�[Ö Ó-Lùrl   )Ú
all_to_allÚalltoall)ÚisendÚirecvÚ	batch_p2p)	r[   r   r   r   r   ru   r   r   r   )rƒ   s   fr   Ú$get_collective_type_from_kernel_namer“   ¢   s¹   ø€ ØÒÜÐ;Ó<Ð<Ø�{Ô"Ü×#Ñ#Ð#Ø	˜Ô	$Ü×#Ñ#Ð#Ø	˜[Ô	(Ü×'Ñ'Ð'ß	‹ÔHÑ-GÓH��ŠÔHÑ-GÓH×	HÒ	HÜ×#Ñ#Ð#ß	‹ÔMÑ-LÓM��ŠÔMÑ-LÓM×	MÒ	MÜ�}‰}Ðä×$Ñ$Ð$r   c                óD   € V ^8„  d   QhR\         P                  R\        /# ©r1   ÚnoderF   )r	   ÚIRNoder   )r8   s   "r   r:   r:   ³   s   € ÷ 6ñ 6œbŸi™ið 6¬Iñ 6r   c                 óª   € \        V \        P                  4      '       g   \        R V  24      hV P                  pVf   \        R4      h\        V4      # )z!node is not a collective kernel: z(node.python_kernel_name must not be None)Ú
isinstancer	   Ú_CollectiveKernelÚ
ValueErrorÚpython_kernel_namer[   r“   )r–   Únames   & r   Úget_collective_typerž   ³   sO   € Ü�dœB×0Ñ0×1Ò1ÜÐ<¸T¸FÐCÓDÐDà×"Ñ"€DØ‚|ÜÐGÓHÐHÜ/°Ó5Ð5r   c                óP   € V ^8„  d   QhR\         P                  R\        R\        /# ©r1   ÚsizeÚfallbackrF   ©rP   ÚSizer7   )r8   s   "r   r:   r:   ½   s*   € ÷ Hñ H¤§¡ð H´sð HÌSñ Hr   c                 óÂ   € \        V 4      p\        V\        P                  4      '       d   \	        V4      # \
        P                  P                  P                  W!R 7      # )©r¢   )	r   r™   ÚsympyÚIntegerr7   r   ÚgraphÚsizevarsr   )r¡   r¢   Únumels   && r   Úget_ir_node_size_numelr¬   ½   sE   € Ü˜$Ó€EÜ�%œŸ™×'Ò'Ü�5‹zÐÜ�7‰7×Ñ×-Ñ-¨eÐ-ÓGÐGr   c                óP   € V ^8„  d   QhR\         P                  R\        R\        /# r    r£   )r8   s   "r   r:   r:   Ä   s%   € ÷ ñ ¤§¡ð ´sð ÌSñ r   c                 ój   € \         P                  ! \        P                  V ^4      p\	        W!R7      pV# )é   r¦   )Ú	functoolsÚreduceÚoperatorÚmulr   )r¡   r¢   r«   r]   s   &&  r   Úget_fx_node_size_numelr´   Ä   s)   € Ü×ÒœXŸ\™\¨4°Ó3€EÜ˜uÔ8€FØ€Mr   c                óD   € V ^8„  d   QhR\         P                  R\        /# r•   ©r	   r—   r7   )r8   s   "r   r:   r:   Ê   s   € ÷ ñ ¬"¯)©)ð ¼ñ r   c                 óÆ   € ^ pV P                    FN  p\        VP                  P                  4      pW\	        VP                  P
                  4      ,          ,          pKP  	  V# )r   )Úinputsr¬   Úlayoutr¡   r
   Údtype)r–   Úsz_bytesÚinpr«   s   &   r   Úget_collective_input_size_bytesr½   Ê   sJ   € Ø€HØ�{Œ{ˆÜ& s§z¡z§¡Ó7ˆØœN¨3¯:©:×+;Ñ+;Ó<Õ<Õ<Šñ ð €Or   c                óD   € V ^8„  d   QhR\         P                  R\        /# r•   r¶   )r8   s   "r   r:   r:   Ò   s"   € ÷ @ñ @¤B§I¡Ið @´#ñ @r   c                 óÜ   € \        V \        P                  4      '       d@   \        V \        P                  4      '       g    ^ RIHp V! V P                  R,          4      # \        RV  24      h)r   ©Ú_get_group_size_by_namezUnsupported collective type: éÿÿÿÿ)r™   r	   rš   Ú_WaitKernelÚ"torch.distributed.distributed_c10drÁ   Úconstant_argsÚ	TypeError)r–   rÁ   s   & r   Úget_collective_group_sizerÇ   Ò   sQ   € Ü�$œ×,Ñ,×-Ò-´jÀÄrÇ~Á~×6VÒ6VÝNá& t×'9Ñ'9¸"Õ'=Ó>Ð>äÐ7¸°vÐ>Ó?Ð?r   c                   ó"   € ] tR t^àt^ t^t^tRtR# )ÚNCCL_HWr   N)r   r   r   r   ÚNVLINKÚPCIÚNETr   r   r   r   rÉ   rÉ   à   s   † Ø€FØ
€CØ
„Cr   rÉ   c                   ó   € ] tR t^æt^ t^tRtR# )Ú	NCCL_ALGOr   N)r   r   r   r   ÚTREEÚRINGr   r   r   r   rÎ   rÎ   æ   s   † Ø€DØ„Dr   rÎ   c                   ó"   € ] tR t^ët^ t^t^tRtR# )Ú
NCCL_PROTOr   N)r   r   r   r   ÚLLÚLL128ÚSIMPLEr   r   r   r   rÒ   rÒ   ë   s   † à	
€BØ€EØ„Fr   rÒ   ç      8@g      ^@ç      n@g      w@g     €†@ç      9@c                ó$   € V ^8„  d   QhR\         /# rE   ©r6   )r8   s   "r   r:   r:   ­  s   € ÷ 5ñ 5œ5ñ 5r   c                 óÐ   € \         P                  P                  P                  p V e   \	        V 4      # \        4       '       g   \        # \        P                  \        4       R4      # )zEReturn intra-node bandwidth in GB/s. Config overrides auto-detection.r×   )
rP   Ú	_inductorÚconfigÚintra_node_bwr6   r^   Ú_PCIE_INTRA_NODE_BWÚ_GPU_NVLINK_BWr}   rv   ©Úoverrides    r   Úget_intra_node_bwrã   ­  sI   € ä�‰×%Ñ%×3Ñ3€HØÒÜ�X‹ÐÜ�=Š=Ü"Ð"Ü×Ñœl›n¨eÓ4Ð4r   c                ó$   € V ^8„  d   QhR\         /# rE   rÚ   )r8   s   "r   r:   r:   ·  s   € ÷ 8ñ 8œ5ñ 8r   c                 ó¤   € \         P                  P                  P                  p V e   \	        V 4      # \
        P                  \        4       R4      # )zOReturn inter-node (IB/RoCE) bandwidth in GB/s. Config overrides auto-detection.rØ   )rP   rÜ   rÝ   Úinter_node_bwr6   Ú_GPU_INTER_NODE_BWr}   rv   rá   s    r   Úget_inter_node_bwrè   ·  s<   € ä�‰×%Ñ%×3Ñ3€HØÒÜ�X‹ÐÜ×!Ñ!¤,£.°$Ó7Ð7r   c                ó0   € V ^8„  d   QhR\         R\         /# )r1   ÚnrF   )r7   )r8   s   "r   r:   r:   ¿  s   € ÷ ñ Œcð ”cñ r   c                óR   € V ^ 8:  d   ^ # ^ pV ^8”  d   V ^,          p V^,          pK  V# )z4Integer log2, matching NCCL's log2i (floor of log2).r   )rê   Úrs   & r   Ú_log2irí   ¿  s/   € àˆA„vÙØ	€AØ
ˆaŒ%Ø	ˆa�ˆØ	ˆQ�ŠØ€Hr   c                ó2   € V ^8„  d   QhR\         R,          /# ©r1   rF   NrÚ   )r8   s   "r   r:   r:   Ê  s   € ÷ !ñ !¼eÀd½lñ !r   c                 óÌ  € V P                   pVf   \        R4      h\        VRR4      pVP                  R,          p^ RIHp V! V4      p\        P                  P                  V4      p\        P                  ! RV 24      p\        V4      p\        V 4      w  ršRV9   d   V	R,          V	^ ,          ,           p	\        P                  P                  WWR7      ;_uu_ 4       pV! V	/ V
B p\        P                  P                  P                  P!                  V4       R R R 4       XP"                  pVf   \        R	4      hV^ 8  d   R # VR
,          pV#   + '       g   i     L?; i)Nzsnode.node must not be Nonerœ   ra   )Ú_resolve_process_groupzcuda:Úall_gather_into_tensor_out:r¯   NN©ÚgroupÚdeviceú,NCCL time estimator did not produce a resultç     @�@rÂ   )r–   r[   ÚgetattrrÅ   rÄ   rñ   rP   ÚdistributedÚget_rankrõ   Úevalr   Ú_time_estimatorÚopsÚ_c10d_functionalÚwait_tensorÚdefaultÚestimated_time)ÚsnodeÚkernelÚpy_kernel_nameÚpg_namerñ   ÚpgÚrankrõ   ÚfnÚargsÚkwargsÚtime_estimatorÚwÚest_time_usÚest_time_mss   &              r   Ú/estimate_nccl_collective_runtime_nccl_estimatorr  Ê  s:  € Ø�Z‰Z€FØ‚~ÜÐ:Ó;Ð;Ü˜VÐ%9¸2Ó>€NØ×"Ñ" 2Õ&€GÝIá	 Ó	(€BÜ×!Ñ!×*Ñ*¨2Ó.€Dô �\Š\˜E $ ˜.Ó)€Fä	ˆnÓ	€BÜ$ UÓ+�L€Dð $ ~Ô5Ø�B�x˜$˜q�'Õ!ˆä	×	Ñ	×	*Ñ	*°Ð	*×	CÔ	CÀ~Ù�Ð˜ÑˆÜ�	‰	×"Ñ"×.Ñ.×6Ñ6°qÔ9÷ 
Dð !×/Ñ/€KØÒÜÐKÓLÐLð �Q„ÙØ Õ#€KØÐ÷ 
D×	Cús   Ã <EÅE#	c                ó`   € V ^8„  d   QhR\         R\         R\        R\         R\         R\        /# )r1   ÚnBytesrx   ÚcollÚalgoÚprotorF   ©r7   r   r6   )r8   s   "r   r:   r:   î  sL   € ÷ Rñ RÜðRäðRô ðRô ð	Rô
 ðRô ñRr   c                ó4  € \         P                  P                  4       '       d   \         P                  P                  4       M^p\        P
                  ! W,          4      pTp\        4       pV^8:  d
   V^,
          M^p	\        4       p
\        4       p\        P                  V^4      p\        V4      pV\        P                  \        P                  39   pV\        P                   8X  d   V^8”  d   R# V^8”  d   V'       d   R# V^8X  d   T
pMV'       d   TpMV^8:  d   T
MTpV'       dc   V^8”  d\   RR\#        RV^,
          ^,          4      ,          ,           pVV,          pV^8”  d$   \%        V R4      R,          R,          pVV,          pTpV^8X  d   TM^ p\&        V,          V	,          pV\(        P*                  8X  d+   V\        P,                  8X  d   \#        VVR,          4      pEMcV\(        P*                  8X  dD   V\        P                   8X  d/   \#        VR,          V\.        V,          V	,          ,          4      pEMV\(        P0                  8X  d*   V\        P,                  8X  d   \#        VR,          V4      pMÍV\(        P0                  8X  dN   V\        P                   8X  d9   V^8X  d   RMRp\#        VV,          V\2        V,          V	,          ,          4      pMkV\(        P0                  8X  dW   V\        P4                  8X  dB   V\6        P8                  8X  d-   \#        VR,          V\:        V,          V	,          ,          4      pV^ 8:  d   R# V\6        P8                  8X  d   ^V^,
          ,          pMoV\6        P<                  \6        P>                  39   d   V^,
          pM@V\6        P@                  8X  d   ^V^,
          ,          pMV\6        PB                  8X  d   ^pMR# V\(        P0                  8X  d    V\6        P8                  8X  d   VR,          pM6V\(        P*                  8X  d   VRV,          V,          ,          pM	VR,          pV^ 8:  d   R# V\        PD                  8X  d   \F        PH                  M\F        PJ                  p\L        V,          V,          p\N        V,          V,          V,          p\N        \F        PP                  ,          V,          V,          pV^8”  d   RMRpV\        P4                  8X  d   V^8”  d
   VR	,          p\%        VV4      pV\(        P*                  8X  d^   V^8X  d   ^ M-V\6        P8                  8X  d   ^V^,
          ,          MV^,
          pVVV,
          V,          VV,          ,           ,          pMpV\(        P0                  8X  d\   V\6        P8                  8X  dG   V^V\%        V^4      ,          ^,
          V,          \S        V4      V,          ,           ,          ,          pV\(        P0                  8X  d^   V\6        P8                  8X  dI   V ^@8¼  d   \S        V ^,	          4      M^ p^ Tu;8:  d   ^8  d   M MV\T        V,          V,          ,          pVV R
V,          ,          ,           pV# )zøCompute NCCL estimated time in us for a given (algo, proto) pair.

Mirrors ncclTopoTuneModel bandwidth/latency computation and
ncclTopoGetAlgoTime from NCCL tuning.cc. Returns -1 if the
(algo, proto) combination is disabled for this configuration.
ç      ð?g¤p=
×£è?gq=
×£pÍ?i€ðúgÃõ(\�ÂÅ?ç      à?gq=
×£pí?g        g      @r÷   g      ð¿g      î?gyå5”×Ð?g9Žã8Žãè?)+rP   rQ   rR   rS   rz   r{   rv   rã   rè   Ú_GPU_NCHANNELSr}   r�   r%   r+   r*   rÒ   rÔ   ÚminÚmaxÚllMaxBwsrÎ   rÐ   rÓ   ÚperChMaxRingLL128BwsrÏ   ÚperChMaxTreeLL128BwsrÕ   r   r   ÚperChMaxTreeBwsr   r   r   r   r,   rÉ   rË   rÊ   ÚbaseLatÚhwLatrÌ   rí   ÚtreeCorrectionFactor) r  rx   r  r  r  r   ÚnNodesÚnRanksÚcompCapIndexÚindex2ÚbwIntraÚbwInterÚ	nChannelsÚinterconnectÚis_ibÚbwÚnic_efficiencyÚ
multi_railÚbusBwÚindex1ÚllMaxBwÚfactorÚnstepsÚ	bandwidthÚintraHwÚlatÚintraLatÚinterLatÚnetOverheadÚnInterStepsÚlogSizeÚtime_uss    &&&&&                           r   Ú_nccl_algo_timer=  î  s  € ô 27·±×1HÑ1H×1JÒ1J”E—J‘J×+Ñ+Ô-ÐPQ€MÜ�YŠY�zÕ1Ó2€FØ€FÜ“>€LØ! Qœ;ˆV�aŽZ¨A€Fô
  Ó!€GÜÓ!€GÜ×"Ñ" <°Ó3€Iô ' zÓ2€LØÔ-×4Ñ4Ô6F×6MÑ6MÐNÑN€Eð ”
× Ñ Ô Ø�AŒ:ØˆKØ�AŒ:Ÿ%ØˆKð �„{Ø‰ß	Ø‰à !œ‰W¨ˆ÷ �˜!”ð  ¤s¨3°¸!µ¸qÕ0@Ó'AÕ AÕAˆØ
ˆnÕˆð �AŒ:Ü˜f jÓ1°JÕ>À4ÕGˆJØ�*ÕˆBà€Eà# qœ[‰\¨a€FÜ�vÕ˜vÕ&€GàŒy�~‰~Ô %¬:¯=©=Ô"8Ü�G˜U S�[Ó)ŠØ	”—‘Ô	 E¬Z×-=Ñ-=Ô$=ÜØ�]Õ#ØÔ,¨\Õ:¸6ÕBÕBó
Šð 
”—‘Ô	 E¬Z¯]©]Ô$:Ü�E˜YÕ'¨Ó1‰Ø	”—‘Ô	 E¬Z×-=Ñ-=Ô$=Ø$¨œk‘¨}ˆÜØ�F�NØÔ,¨\Õ:¸6ÕBÕBó
‰ð 
”—‘Ô	 E¬Z×->Ñ->Ô$>Ø”9×'Ñ'Ô'Ü˜ � i´/À,Õ2OÐPVÕ2WÕ&WÓXˆEð �„zØˆð Œy×#Ñ#Ô#Ø�f˜q•jÕ!‰Ø	”)×*Ñ*¬I×,@Ñ,@ÐAÔ	AØ˜!•‰Ø	”×%Ñ%Ô	%Ø�f˜q•jÕ!‰Ø	”—‘Ô	Ø‰àˆð Œy�~‰~Ô $¬)×*>Ñ*>Ô">Ø˜C•K‰	Ø	”—‘Ô	Ø˜S 6�\¨FÕ2Õ3‰	à˜C•Kˆ	à�A„~Øˆð *Ô-=×-BÑ-BÔBŒg�kŠkÌÏÉ€GÜ
�$�-˜Õ
€CÜ�W�~˜dÕ# EÕ*€HÜ”W—[‘[Õ! $Õ'¨Õ.€Hà !œ‘#¨€KØ”
×!Ñ!Ô! f¨q¤jØ�sÕˆÜ�8˜[Ó)€HàŒy�~‰~Ôð ˜Œ{ñ à&*¬i×.BÑ.BÔ&B�!�v •zÖ"ÈÐQRÍ
ð 	ð
 	�˜Õ$¨Õ0°;ÀÕ3IÕIÕI‰Ø	”—‘Ô	Ø”9×'Ñ'Ô'Ø�1Øœ3˜v q›>Õ)¨AÕ-°Õ9¼FÀ6»NÈXÕ<UÕUõõ ˆCð Œy�~‰~Ô $¬)×*>Ñ*>Ô">Ø)/°2¬”&˜ 1�Ô%¸1ˆØ�Ö˜"×ØÔ-¨eÕ4°WÕ=Õ=ˆIà�F˜f yÕ0Õ1Õ1€GØ€Nr   c                ót   € V ^8„  d   QhR\         R\         R\        R\        \        \         \         3,          /# )r1   r  rx   r  rF   )r7   r   Útupler6   )r8   s   "r   r:   r:   ƒ  s;   € ÷ ,ñ ,Üð,äð,ô ð,ô Œ5”#”sˆ?Õñ	,r   c           	     óÂ  € \        R4      p\        P                  p\        P                  p\        P
                  \        P                  3 F�  pV\        P
                  8X  d   V\        P                  8w  d   K/  \        P                  \        P                  \        P                  3 F+  p\        WW&V4      p^ Tu;8:  d
   V8  g   K!  M K%  TpTpTpK-  	  K�  	  W4V3# )zÞFind the best (algo, proto) for a given collective and return (time_us, algo, proto).

Iterates all supported (algo, proto) combinations and picks the one with
minimum estimated time, mirroring NCCL's algorithm selection.
Úinf)r6   rÎ   rÐ   rÒ   rÓ   rÏ   r   r   rÔ   rÕ   r=  )	r  rx   r  Ú	best_timeÚ	best_algoÚ
best_protor  r  Úts	   &&&      r   Ú_nccl_best_algo_timerF  ƒ  s®   € ô �e“€IÜ—‘€IÜ—‘€Jä—‘¤§¡Ó0ˆà”9—>‘>Ô! d¬i×.BÑ.BÔ&BÙÜ —m‘m¤Z×%5Ñ%5´z×7HÑ7HÓIˆEÜ °DÀÓFˆAØ�AÖ!˜	×!Ò!Ø�	Ø �	Ø"’
ó Jñ	 1ð  Ð+Ð+r   c                óH   € V ^8„  d   QhR\         R\         R\        R\        /# )r1   Útensor_storage_size_bytesrx   r  rF   r  )r8   s   "r   r:   r:   Ÿ  s,   € ÷ ñ Ü"ðÜ03ðÜ;Dðä
ñr   c                ó¦   € V^8:  d   ^ # V\         P                  8X  d   ^ # \        WV4      w  p pV^ 8  g   V\        R4      8X  d   ^ # VR,          # )aD  Returns estimated NCCL collective runtime in milliseconds (ms).

Uses a multi-algorithm, multi-protocol model aligned with NCCL's
ncclTopoTuneModel and ncclTopoGetAlgoTime (tuning.cc). Evaluates
Ring and Tree algorithms across LL, LL128, and SIMPLE protocols,
selecting the (algo, proto) pair that minimizes estimated time.
rA  r÷   )r   r   rF  r6   )rH  rx   r  r<  Ú_s   &&&  r   Ú%estimate_nccl_collective_runtime_implrK  Ÿ  sS   € ð �Q„ÙàŒy×$Ñ$Ô$Ùä(Ð)BÐPTÓU�M€GˆQ�Ø�„{�g¤ u£Ô-ÙØ�VÕÐr   c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r1   rx   r  Útarget_efficiencyrF   r  )r8   s   "r   r:   r:   µ  s0   € ÷ !8ñ !8Üð!8ä
ð!8ô ð!8ô 	ñ	!8r   c                ór  € \         P                  \         P                  \         P                  3pW9  d   \	        RV RV 24      hV ^8:  d   ^ # \
        \        V 4      ,          pV\         P                  \         P                  39   d   V ^,
          pM(V\         P                  8X  d   ^V ^,
          ,          pM^ # VP                  WTP                  ,          ,           pVR,          pVP                  R,          pVRV,
          ,          p	\        W—,          V,          4      p
\        W¤P                  4      # )zØCompute min message size for target BW efficiency using empirical profiles.

Uses per-interconnect profiles calibrated to real NCCL behavior (algorithm,
protocol, channel selection) rather than the analytical model.
zUnsupported collective z, expected one of g�íµ ÷Æ°>g    eÍÍAr  )r   r   r   r   r[   ÚINTERCONNECT_PROFILESr�   r4   r3   r2   r7   r  r5   )rx   r  rM  Ú
_SUPPORTEDÚprofiler3  Útotal_latency_usÚ	latency_sÚbw_bytes_per_sÚ	eff_ratioÚ	min_bytess   &&&        r   Úcompute_min_saturation_bytesrW  µ  s
  € ô ×&Ñ&¬	×(@Ñ(@Ä)×BVÑBVÐW€JØÔÜØ% d VÐ+=¸j¸\ÐJó
ð 	
ð �Q„Ùä#Ô$7¸
Ó$CÕD€Gà”	×$Ñ$¤i×&>Ñ&>Ð?Ô?Ø˜a•‰Ø	”×%Ñ%Ô	%Ø�j 1•nÕ%‰áà×.Ñ.°×:TÑ:TÕ1TÕTÐØ  4Õ'€IØ×(Ñ(¨3Õ.€NØ! SÐ+<Õ%<Õ=€IÜ�IÕ)¨NÕ:Ó;€IÜˆy×6Ñ6Ó7Ð7r   c                óD   € V ^8„  d   QhR\         P                  R\        /# r•   )r	   r—   r6   )r8   s   "r   r:   r:   Þ  s   € ÷ ñ ¬2¯9©9ð ¼ñ r   c                ó\   € \        V 4      p\        V 4      p\        V 4      p\        WV4      # )zëReturns estimated NCCL collective runtime in milliseconds (ms).

Uses the multi-algorithm, multi-protocol analytical model aligned with
NCCL's tuning.cc to select the best (algo, proto) pair for the given
collective size and topology.
)r½   rÇ   rž   rK  )r–   rH  rx   r  s   &   r   Ú estimate_nccl_collective_runtimerZ  Þ  s6   € ô !@ÀÓ EÐÜ*¨4Ó0€JÜ˜tÓ$€DÜ0Ø!¨tóð r   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# ©r1   Úfx_noderF   ©rP   ÚfxÚNoder7   )r8   s   "r   r:   r:   í  s"   € ÷ ,&ñ ,&¬¯©¯©ð ,&¼3ñ ,&r   c                ó  aa€ RoV P                   V P                  r!\        V4      pVP                  RR4       R R loR VV3R llp\        P
                  ! \        P                  P                  VW34       V P                  P                  RR4      pSe   Vf   ^ # \        V\        \        34      '       d   \        V3R lV 4       4      pSV,           # \        V\        P                  4      '       d   S! V4      pSV,           # ^ # )	zSEstimate the size of a collective operation in bytes, including inputs and outputs.NÚoutc                óD   € V ^8„  d   QhR\         P                  R\        /# )r1   rE  rF   )rP   ÚTensorr7   )r8   s   "r   r:   Ú1estimate_fx_collective_size.<locals>.__annotate__÷  s"   € ÷ Jñ JœŸ™ð J¬ñ Jr   c                 óh   € \        V P                  4       4      \        V P                  4      ,          # rf   )r´   r¡   r
   rº   )rE  s   &r   Útensor_bytesÚ1estimate_fx_collective_size.<locals>.tensor_bytes÷  s!   € Ü% a§f¡f£hÓ/´.ÀÇÁÓ2IÕIÐIr   c                óL   € V ^8„  d   QhR\         P                  P                  /# )r1   r¼   )rP   r_  r`  )r8   s   "r   r:   re  ú  s   € ÷ -ñ -œ5Ÿ8™8Ÿ=™=ñ -r   c                 ó®   <€ V P                   P                  R R4      p\        V\        P                  4      '       g   R# Sf   ^ oSS! V4      ,          oR# )ÚvalN)Úmetar}   r™   rP   rd  )r¼   Úinp_valÚinput_bytesrg  s   & €€r   Úadd_inp_bytesÚ2estimate_fx_collective_size.<locals>.add_inp_bytesú  sG   ø€ Ø—(‘(—,‘,˜u dÓ+ˆÜ˜'¤5§<¡<×0Ò0Ùð ÒØˆKØ‘| GÓ,Õ,Šr   rk  c              3   óx   <"  € T F/  p\        V\        P                  4      '       g   K%  S! V4      x € K1  	  R # 5irf   )r™   rP   rd  )rg   rE  rg  s   & €r   rj   Ú.estimate_fx_collective_size.<locals>.<genexpr>  s)   øé € ð 
Ù%/ ´:¸aÄÇÁ×3NŒO‰L˜�OˆO£Zùs   ƒ":ª:)r	  r
  ÚdictÚpopÚpytreeÚtree_map_onlyrP   r_  r`  rl  r}   r™   Úlistr?  Úsumrd  )r]  r	  r
  ro  Ú
output_valÚoutput_bytesrn  rg  s   &     @@r   Úestimate_fx_collective_sizer{  í  sï   ù€ à€Kà—<‘< §¡ˆ&Ü�&‹\€Fð ‡J�Jˆu�dÔõJ÷-ñ -ô ×ÒÜ�‰�‰ØØ	ˆôð —‘×!Ñ! %¨Ó.€JàÒ˜jÒ0Ùô �*œt¤U˜m×,Ò,Üô 
Ù%/ó
ó 
ˆð ˜Õ%Ð%ô 
�J¤§¡×	-Ò	-Ù# JÓ/ˆð ˜Õ%Ð%ñ r   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# r\  r^  )r8   s   "r   r:   r:     s"   € ÷ =ñ =´U·X±X·]±]ð =Äsñ =r   c                óV   € ^ RI Hp \        V 4      pV! V 4      '       g   V# V^,          # )zËEstimate the memory footprint of a collective operation in bytes.

This returns the total bytes that need to be live concurrently in memory.
For all_reduce, we divide by 2 since it can be done in-place.
)Úis_all_reduce_tensor)Ú#torch._inductor.fx_passes.bucketingr~  r{  )r]  Úis_all_reducer¡   s   &  r   Ú'estimate_fx_collective_memory_footprintr�    s,   € õô ' wÓ/€DÙ$ W×-Ò-ˆ4Ð<°4¸1µ9Ð<r   c                ó~   € V ^8„  d   QhR\         P                  P                  R\        R,          R\        R\
        /# )r1   r]  Úoverride_sizeNÚuse_nccl_estimatorrF   )rP   r_  r`  r7   rG   r6   )r8   s   "r   r:   r:   *  sB   € ÷ pñ pÜ�X‰X�]‰]ðpä˜•:ðpô ðpô ñ	pr   c                ó0  a aaaa€ ^ RI Hp S P                  \        P                  P
                  P                  P                  J d   RpSf   \        S 4      pMSp\        S P                  \        4      '       d   \        RS P                   24      h\        S P                  S P                  S P                  RR7      pVf   \        R4      hTw  oo^ RIHp V! SR,          4      oV! S4      p\        S P                  \        P"                  P$                  4      '       g"   \        R	\'        S P                  4       24      h\)        S P                  P+                  4       4      pR
 VV VVV3R llp	V'       d   V	! 4       p
V
e   V
# \-        WGV4      # )zÀReturns estimated NCCL collective runtime in milliseconds (ms).

Tries the NCCL simulator first (if available and enabled), falls back
to the multi-algo/proto analytical model from tuning.cc.
rÀ   Fz&fx_node.target must not be a str, got T)r	  r
  Únormalize_to_only_use_kwargsz normalize_function returned None)Ú_resolve_group_nameÚ
group_nameú1expected fx_node.target to be an OpOverload, got c                ó2   € V ^8„  d   QhR\         R,          /# rï   rÚ   )r8   s   "r   r:   ÚCestimate_nccl_collective_runtime_from_fx_node.<locals>.__annotate__V  s   € ÷ ;ñ ;œE D�Lñ ;r   c                  ó¢  <aa€ ^ RI Hp Hp V ! S4      p\        P                  P
                  P                  V4      VP                  8X  d   R# \        P                  ! R4      p VP                  V4      pTP                  '       g   R# \        P                  ! SS34      w  rVR T3R lloR TT3R lloT Uu. uF  pS! T4      NK  	  pp\        P                  ! YV4      w  r‰SP                  p
\!        T
\        P"                  P$                  4      '       g   \'        R\)        T
4       24      h\        P                  P+                  Y#R	7      ;_uu_ 4       pT
! T/ T	B p\!        T\,        \.        34      '       d>   T F6  p\        P0                  P2                  P4                  P7                  T4       K8  	  M3\        P0                  P2                  P4                  P7                  T4       RRR4       XP8                  pTf   \'        R
4      hT^ 8  d   R# TR,          pT#   \         d     R# i ; iu upi   + '       g   i     LV; i)r   )rñ   ÚBackendNrQ   c                ó8   € V ^8„  d   QhR\         P                  /# rE   )rP   rd  )r8   s   "r   r:   Ú[estimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimate.<locals>.__annotate__i  s   € ÷ 	ñ 	¬E¯L©Lñ 	r   c                 óD   <€ \         P                  ! Sf   T MS.VVR7      # )N)rº   rõ   )rP   Úempty)r¡   rº   rõ   rƒ  s   &&&€r   Ú_tensorÚVestimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimate.<locals>._tensori  s&   ø€ Ü—;’;Ø%Ò-‘°M°?ØØôð r   c                ó0   € V ^8„  d   QhR\         R\         /# )r1   ÚerF   r   )r8   s   "r   r:   r�  p  s   € ÷ 	ñ 	œcð 	¤cñ 	r   c                 ó:  <€ \        V \        P                  P                  4      '       d   S! V P                  R ,          4      # \        V \        P
                  4      '       d7   S! \        V P                  4       4      .V P                  V P                  4      # V # )rk  )
r™   rP   r_  r`  rl  rd  r´   r¡   rº   rõ   )r•  r’  Úto_real_tensors   &€€r   r—  Ú]estimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimate.<locals>.to_real_tensorp  sg   ø€ Ü˜!œUŸX™XŸ]™]×+Ò+Ù% a§f¡f¨U¥mÓ4Ð4Ü˜!œUŸ\™\×*Ò*ÙÔ 6°q·v±v³xÓ @ÐAÀ1Ç7Á7ÈAÏHÉHÓUÐUØˆHr   r‰  ró   rö   r÷   )rÄ   rñ   r�  rP   rù   Údistributed_c10dÚget_backendÚFAKErõ   Ú_get_backendr\   Úsupports_time_estimateru  Útree_flattenÚtree_unflattenÚtargetr™   Ú_opsÚ
OpOverloadr[   Útyperü   rw  r?  rý   rþ   rÿ   r   r  )rñ   r�  r  rõ   ÚbackendÚ	flat_argsÚflat_args_pytree_specÚaÚ	real_argsÚreal_kwargsr  r  r  rE  r  r  r’  r—  r	  r]  rˆ  r
  rƒ  s                   @@€€€€€r   Ú_nccl_estimateÚEestimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimateV  sî  ú€ çVá# JÓ/ˆÜ×Ñ×-Ñ-×9Ñ9¸"Ó=ÀÇÁÔMáä—’˜fÓ%ˆð	Ø—o‘o fÓ-ˆGð ×-×-Ð-Ùä+1×+>Ò+>ÀÀf¸~Ó+NÑ(ˆ	÷	ð 	÷	ñ 	ñ 1:Ó:±	¨1‘^ AÖ&±	ˆ	Ð:Ü!'×!6Ò!6°yÓ!XÑˆ	à�^‰^ˆÜ˜"œeŸj™j×3Ñ3×4Ò4Ü ØCÄDÈÃHÀ:ÐNóð ô ×Ñ×.Ñ.Øð /÷ 
ô 
àÙ�IÐ- Ñ-ˆAä˜!œd¤E˜]×+Ò+Û�AÜ—I‘I×.Ñ.×:Ñ:×BÑBÀ1ÖEò ô —	‘	×*Ñ*×6Ñ6×>Ñ>¸qÔA÷
ð %×3Ñ3ˆØÒÜ Ð!OÓPÐPð ˜Œ?ÙØ! CÕ'ˆØÐøô_ ô 	Úð	üò* ;÷
÷ 
ús%   Á%H' Â;H9ÅBH>È'H6È5H6È>I	)rÄ   rÁ   r   rP   rý   rþ   Úall_to_all_singler   r{  r™   r„   r[   r   r	  r
  r  r‡  r¡  r¢  r£  r“   r�   rK  )r]  rƒ  r„  rÁ   rH  Úopt_args_kwargsr‡  rx   r  rª  r  r	  rˆ  r
  s   ff&        @@@r   Ú-estimate_nccl_collective_runtime_from_fx_noder®  *  sY  ü€ õ Kà‡~�~œŸ™×3Ñ3×EÑE×MÑMÓMð #ÐàÒÜ$?ÀÓ$HÑ!à$1Ð!ä�'—.‘.¤#×&Ò&ÜÐEÀgÇnÁnÐEUÐVÓWÐWÜ(Ø�‰Ø�\‰\Ø�~‰~Ø%)ô	€Oð ÒÜÐ?Ó@Ð@Ø"�L€Dˆ&åGá$ V¨LÕ%9Ó:€JÙ(¨Ó4€JÜ�g—n‘n¤e§j¡j×&;Ñ&;×<Ò<ÜØ?ÄÀWÇ^Á^Ó@TÐ?UÐVó
ð 	
ô 0°·±×0CÑ0CÓ0EÓF€D÷;ô ;÷z Ù$Ó&ˆØÒ"ØÐä0Ø!¨tóð r   c                óŠ  € V ^8„  d   Qh/ ^ \         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \
        3,          ;R&   ^\         9   d   \        \        \
        3,          ;R&   # )r1   rO  r|   r~   rà   rç   )Ú__conditional_annotations__rs  r%   r/   r   r6   )r8   s   "r   r:   r:      s¶   € × Ñ ÷Fò ”tÔ,Ô.AÐAÕBñ ñG ÷dò Œt”OÔ%5Ð5Õ6ñ ñe ÷pò Œt”OÔ%5Ð5Õ6ñ ñq ÷nò ””_¤eÐ+Õ,ñ ño ÷Hò ”Dœ¬%Ð/Õ0ñ òI r   i   )i   )g333333@rC   çÍÌÌÌÌÌ @)gffffff@rC   r±  )ç333333ã?g      ô?ç      @)r²  çffffffþ?g333333@)r  r´  r³  )r  g      @gÍÌÌÌÌÌ@)g      @g      !@rC   )gš™™™™™@r³  rC   )ç     €C@rµ  gffffff4@)gÍÌÌÌÌìU@g     €6@g      3@)g      a@rB   g     €A@)g      q@g     €V@ç     €Q@)ç      4@r·  r·  )çš™™™™YB@r¸  r¸  )r@   r@   r@   )r¸  r¸  g      =@)gÍÌÌÌÌÌK@gìQ¸…«?@r·  )g     €:@g     €2@rA   )rÖ   gš™™™™™7@gÍÌÌÌÌÌ1@)gš™™™™YC@g33333³D@r?   )r¶  gffffffE@rÖ   )r  r  r  r  çÍÌÌÌÌÌì?çš™™™™™é?çffffffæ?r»  r»  r»  r²  r  çš™™™™™Ù?r¼  r  r²  r»  rº  r¹  r  r  r  r  r  )r  r  r  r  r  r¹  rº  rº  rº  r»  r²  r²  r²  r²  r²  r²  rº  r¹  r¹  r¹  r¹  r  r  r  )r¹  r¹  r¹  r¹  r¹  r¹  r¹  rº  r»  r²  r²  r  r  r  r  r²  r»  rº  r»  r»  rº  r¹  r¹  r¹  )r¹  )NT)Yr°  r°   Úloggingrz   r²   Údataclassesr   Úenumr   Útypingr   r§   rP   Útorch.utils._pytreerr   Ú_pytreeru  Ú%torch.fx.experimental.symbolic_shapesr   Útorch.fx.operator_schemasr   ra   r	   r
   r   r   Úvirtualizedr   Ú	getLoggerr   Úlogr   r   r%   r/   Ú_MBr(   r'   r)   r&   r+   r*   r,   rO  r    r!   r"   r#   r|   r~   Ú	lru_cacher^   rv   r�   r“   rž   r¬   r´   r½   rÇ   rÉ   rÎ   rÒ   Ú
_NUM_ALGOSÚ_NUM_PROTOSr   r!  r  r  r  r  r"  r  rà   rß   rç   rã   rè   rí   r  r=  rF  rK  rW  rZ  r{  r�  r®  r:   )r°  s   @r   Ú<module>rÌ     s,  øðß Ð Û Û Û Ý !Ý Ý ã ã ß $Ð $Ý CÝ 8å ß CÑ CÝ ð ×Ò˜Ó!€ô�ô ô�gô ô�wô ñ �$Ô÷"ð "ó ð"ð €ð × Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ×ÑÑ0Øˆd�D¨s°S­yôð ×ÑÑ0Øˆd�D¨r°C­xôð ×ÑÑ.¨t°T¸4Ó@ðFÐ ó ð  ×ÑÐ+×7Ñ7Ø×ÑÐ,×8Ñ8Ø×ÑÐ,×8Ñ8Ø×ÑÐ/×;Ñ;ð	:€ó ð ×ÑÐ+×2Ñ2Ø×ÑÐ,×3Ñ3Ø×ÑÐ,×3Ñ3Ø×ÑÐ/×6Ñ6ð	:€ó ð ×Ñôó ðð4 ×Ñô&ó ð&õ4?õ%õ"6÷H÷õõ@ôˆgô ô�ô ô
�ô ð €
Ø€ò âð	€ò 	Úðò 	Úðò 	Úðð	€ò, ÚÚÚð	€ò ÚÚÚð	Ð ò ÚÚÚð	Ð ò ÚÚÚð	€òò6ò6ðqRÐ ðp ×Ñ˜1Ø×Ñ˜AØ×Ñ˜BØ×Ñ˜rð	€ð ×Ñ˜5Ø×Ñ˜EØ×Ñ˜EØ×Ñ˜uð	0€ó ð Ð ð
 ×Ñ˜4Ø×Ñ˜DØ×Ñ˜DØ×Ñ˜tð	4Ð ó õ5õ8õõ!õHRõj,õ8÷,!8õRõ,&õ^=÷pñ pr   