+
    –°³j÷3  ã                  óH  € R t ^ RIHt ^ RIt^ RIHtHt ^ RIt^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHtHt ^ RIHtHtHt ^ R	IHt ^ R
IHtHtHtHt ^ RIHt ^ RIHt R R lt ^ RI!H"t"H#t#H$t$H%t% ]'       d   ^ RI&H't' ^ RI(H)t) ^ RI*H+t+ R R lt, ! R R]4      t- ! R R4      t.R# )a  
Decomposition-based sharding propagation for DTensor.

When an operator doesn't have a registered sharding strategy, we derive one by
tracing through its decomposition. The decomposed ops (which do have strategies)
determine how placements propagate through the original op.
)ÚannotationsN)ÚAnyÚTYPE_CHECKING)Údecomposition_table)Ú_are_we_tracing)Ú
DeviceMesh)ÚDTensorSpecÚ
TensorMeta)ÚOpSchemaÚ
OpStrategyÚRuntimeSchemaInfo)Útry_find_mesh_from_args)Ú_StridedShardÚ	PlacementÚ	ReplicateÚShard)ÚGuardOnDataDependentSymNode)ÚTorchDispatchModec               ó    € V ^8„  d   QhRRRR/# )é   ÚopÚ
OpOverloadÚreturnr   © )Úformats   "Úi/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/distributed/tensor/_decompositions.pyÚ__annotate__r       s   € ÷ 'ñ ' :ð 'Ð2Cñ 'ó    c                óà  € V P                   pRp\        VP                  4       FB  w  r4VP                  '       d    M-VP                  P                  4       R8w  g   K:  Ve   K@  Tp M	  . pVP                   FS  pVP                  '       g   K  VP                  P                  4       R8w  g   K8  VP                  VP                  4       KU  	  / pVe   W&R&   V'       d   WVR&   \        R/ VB # )zGInfer RuntimeSchemaInfo from an operator's schema for decomposition opsNÚ
TensorTypeÚstatic_argnumÚstatic_kwargkeyr   )	Ú_schemaÚ	enumerateÚ	argumentsÚ
kwarg_onlyÚtypeÚkindÚappendÚnamer   )r   Úschemar    ÚiÚargÚkwarg_only_namesÚkwargss   &      r   Ú_infer_schema_info_from_opr/       sÉ   € à�Z‰Z€Fð €MÜ˜F×,Ñ,Ö-‰ˆØ�>�>ˆ>ÙØ�8‰8�=‰=‹?˜lÖ*¨}Ô/DØˆMÙñ .ð ÐØ×ÔˆØ�>�>Š>˜cŸh™hŸm™m›o°Ö=Ø×#Ñ# C§H¡HÖ-ñ  ð €FØÒ Ø"/ˆÑßà$4Ð Ñ!ô Ñ&˜vÑ&Ð&r   )Útree_anyÚtree_flattenÚtree_mapÚtree_map_only)ÚSequence)r   )ÚShardingPropagatorc               ó    € V ^8„  d   QhRRRR/# )r   Ú	op_schemar
   r   z tuple[DTensorSpec | object, ...]r   )r   s   "r   r   r   H   s   € ÷ Kñ K Hð KÐ1Qñ Kr   c                ój   € V P                   \        V P                  P                  4       4      ,           # ©N)Úargs_schemaÚtupleÚkwargs_schemaÚvalues)r7   s   &r   Ú_extract_input_specsr>   H   s'   € Ø× Ñ ¤5¨×)@Ñ)@×)GÑ)GÓ)IÓ#JÕJÐJr   c                  óH   a € ] tR t^LtRtR V 3R lltRR ltR R ltRtV ;t	# )	ÚPlacementTrackingModezå
TorchDispatchMode that tracks DTensor placements through op execution.

Used during decomposition tracing: intercepts each op, propagates sharding
via the ShardingPropagator, and records output placements on the result tensors.
c               ó    € V ^8„  d   QhRRRR/# )r   Úsharding_propr5   Úmeshr   r   )r   s   "r   r   Ú"PlacementTrackingMode.__annotate__T   s   € ÷ ñ Ð&8ð À
ñ r   c                	ó<   <€ \         SV `  4        Wn        W n        R # r9   )ÚsuperÚ__init__rB   rC   )ÚselfrB   rC   Ú	__class__s   &&&€r   rG   ÚPlacementTrackingMode.__init__T   s   ø€ Ü‰ÑÔØ*ÔØŽ	r   c                	ó$  € \        R  Y4;'       g    / 34      w  rV\        R WV34      '       g   \        RV 24      h\        WV4      pV P                  P
                  P                  V4      pVf&   V P                  P                  P                  V4      pVe   W‡n        VP                  4        \        4       '       d   V P                  P                  V4      p	MV P                  P                  V4      p	V	P                  '       dd   V	P                  ;p
 eS   \        VP                   V
P                   4       F.  w  r¼VP"                  VP"                  8w  g   K"  \%        RV 24      h	  V! V/ VB pV P'                  WÙP(                  4       V# )c                ó`   € \        V \        P                  4      '       d   \        V R V 4      # T # )Ú_spec)Ú
isinstanceÚtorchÚTensorÚgetattr©Úxs   &r   Ú<lambda>Ú:PlacementTrackingMode.__torch_dispatch__.<locals>.<lambda>[   s&   € ´
¸1¼e¿l¹l×0KÒ0K”g˜a ¨!Ó,ÐRÐQRÐRr   c                ó"   € \        V \        4      # r9   ©rN   r   rR   s   &r   rT   rU   `   ó   € ”j ¤KÔ0r   z(No DTensorSpec found in args/kwargs for z*Decomposition requires redistribution for )r2   r0   ÚNotImplementedErrorr
   rB   Úop_to_schema_infoÚgetÚ)op_to_schema_info_for_single_dim_strategyÚschema_infoÚ_recompute_comparison_keyr   Ú propagate_op_sharding_non_cachedÚpropagate_op_shardingÚneeds_redistributeÚredistribute_schemaÚzipÚ	args_specÚ
placementsÚRuntimeErrorÚ_record_output_specsÚoutput_spec)rH   ÚfuncÚtypesÚargsr.   r:   r<   r7   r]   Úoutput_shardingrb   ÚorigÚdesiredÚouts   &&&&&         r   Ú__torch_dispatch__Ú(PlacementTrackingMode.__torch_dispatch__Y   s•  € Ü%-ÙRØ—<�<˜RÐ ó&
Ñ"ˆô
 Ù0°;Ð2N÷
ò 
ô &Ð(PÐQUÐPVÐ&WÓXÐXô ˜T°Ó>ˆ	Ø×(Ñ(×:Ñ:×>Ñ>¸tÓDˆØÒà×"Ñ"×LÑL×PÑPÐQUÓVð ð Ò"Ø$/Ô!Ø×/Ñ/Ô1ä×ÒØ"×0Ñ0×QÑQØó‰Oð #×0Ñ0×FÑFÀyÓQˆOð ×.×.Ð.ð #×6Ñ6ð7Ð#ð ò	ô "%Ø×#Ñ#Ø#×-Ñ-ö"‘�ð —?‘? g×&8Ñ&8Ö8Ü&ØDÀTÀFÐKóð ñ"ñ �DÐ#˜FÑ#ˆà×!Ñ! #×'BÑ'BÔCØˆ
r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úoutputr   rh   zDTensorSpec | Anyr   ÚNoner   )r   s   "r   r   rD   �   s#   € ÷ 0ñ 0¨3ð 0Ð=Nð 0ÐSWñ 0r   c                	ó   € \        V\        P                  4      '       d   Ve	   W!n        R # \        V\        \
        34      '       dF   \        V\        \
        34      '       d(   \        W4       F  w  r4V P                  W44       K  	  R # R # R # r9   )rN   rO   rP   rM   r;   Úlistrc   rg   )rH   rs   rh   ÚtÚss   &&&  r   rg   Ú*PlacementTrackingMode._record_output_specs�   sl   € Ü�fœeŸl™l×+Ò+°Ò0GØ&ŽLÜ˜¤¬ ×.Ò.´:Øœ%¤˜÷4
ò 4
ô ˜FÖ0‘�Ø×)Ñ)¨!Ö/ó 1ñ4
Ñ.r   )rC   rB   )r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rG   rp   rg   Ú__static_attributes__Ú__classcell__)rI   s   @r   r@   r@   L   s"   ø† ñ÷ð ô
5÷n0ó 0r   r@   c                  ó†   € ] tR t^štRtR R ltR R lt]R R l4       tR R	 lt	RR R llt
R R lt]R R l4       tRtR
# )ÚDecompShardingStrategya-  
Generates sharding strategies for ops by tracing through their decompositions.

For each candidate input placement combination, runs the decomposition on meta
tensors under PlacementTrackingMode to determine the output placement. These
single-dimension strategies are then expanded to the full mesh.
c               ó   € V ^8„  d   QhRR/# )r   rB   r5   r   )r   s   "r   r   Ú#DecompShardingStrategy.__annotate__£   s   € ÷ 6ñ 6Ð&8ñ 6r   c                	ó    € Wn         / V n        R # r9   )rB   Ú_fake_meshes)rH   rB   s   &&r   rG   ÚDecompShardingStrategy.__init__£   s   € Ø*Ôð 46ˆÖr   c               ó    € V ^8„  d   QhRRRR/# )r   Údevice_typeÚstrr   r   r   )r   s   "r   r   r„   ¬   s   € ÷ ñ ¨#ð °*ñ r   c                	ó€   € V P                   P                  V4      pVf   \        V^ .R^ R7      pW P                   V&   V# )NF)Ú_init_backendÚ_rank)r†   r[   r   )rH   r‰   Ú	fake_meshs   && r   Ú_get_fake_meshÚ%DecompShardingStrategy._get_fake_mesh¬   sE   € Ø×%Ñ%×)Ñ)¨+Ó6ˆ	ØÒÜ" ;°°À5ÐPQÔRˆIØ-6×Ñ˜kÑ*ØÐr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   Úboolr   )r   s   "r   r   r„   ´   s   € ÷ @ñ @�zð @ dñ @r   c                	óD   € V \         9   ;'       g    V P                  4       # r9   )r   Ú_can_decompose)r   s   &r   Ú
has_decompÚ!DecompShardingStrategy.has_decomp³   s!   € ð Ô(Ñ(×?Ð?¨B×,=Ñ,=Ó,?Ð?r   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rt   r   )r   s   "r   r   r„   ¸   s   € ÷ Cñ C Zð C°Dñ Cr   c                ó„   € WP                   P                  9  d&   \        V4      pW P                   P                  V&   R# R# )zi
Register schema_info for decomposition op on first invocation.
Needed for correct shard prop cache key.
N)rB   rZ   r/   )rH   r   r]   s   && r   Úensure_schema_infoÚ)DecompShardingStrategy.ensure_schema_info¸   s9   € ð
 ×'Ñ'×9Ñ9Ô9Ü4°RÓ8ˆKØ7B×Ñ×0Ñ0°Ó4ñ :r   Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   r7   r
   Úoutput_tensor_metaz/TensorMeta | Sequence[TensorMeta | None] | Noner   zOpStrategy | Noner   )r   s   "r   r   r„   Á   s)   € ÷ 9
ñ 9
àð9
ð Lð9
ð 
ñ	9
r   c                	ó  € \        R  VP                  VP                  34      '       g   R# V P                  V4      p\	        VP
                  VP                  \        VP                  P                  4       4      ,           4      pV P                  VP                  4      p. p. pV F\  p V P                  VVV4      p	\!        T	\        4      '       g   T	.M
\#        T	4      pTP%                  T\#        T4      ,           4       K^  	  V'       g   \'        R4      h\)        V4      p
V P*                  P-                  V4      p^ RIHp V! VVVV
VR7      #   \         d      R# \         d      R# \        \        \        3 d     Ká  i ; i)c                ó"   € \        V \        4      # r9   rW   rR   s   &r   rT   Ú;DecompShardingStrategy.propagate_strategy.<locals>.<lambda>Ç   rX   r   NzGSharding propagation should have produced at least Replicate() strategy)Úexpand_to_full_mesh_op_strategy)Úinput_indexrœ   )r0   r:   r<   Ú_get_candidate_placementsr   r   r;   r=   r�   r‰   Ú_propagate_through_decomprY   r   rf   ÚKeyErrorÚ
IndexErrorrN   rv   r(   ÚAssertionErrorÚlenrB   Ú_wrap_with_op_strategyÚ#torch.distributed.tensor._ops.utilsr    )rH   r7   rœ   Úcandidate_placementsrC   rŽ   Úsingle_dim_strategiesÚoutput_placementsÚinput_placementsrs   Ú	n_outputsÚstrategy_schemar    s   &&&          r   Úpropagate_strategyÚ)DecompShardingStrategy.propagate_strategyÁ   s‚  € ô
 Ù0Ø×"Ñ" I×$;Ñ$;Ð<÷
ò 
ñ à#×=Ñ=¸iÓHÐÜ&Ø�L‰LØ×!Ñ!¤E¨)×*AÑ*A×*HÑ*HÓ*JÓ$KÕKó
ˆð
 ×'Ñ'¨×(8Ñ(8Ó9ˆ	Ø "ÐØEGÐÛ 4ÐðØ×7Ñ7ØØ$Øó�ô !+¨6´5× 9Ò 9�‘¼tÀF»|ð ð "×(Ñ(Ð):¼TÐBRÓ=SÕ)SÖTñ' !5÷* %Ü ØYóð ô Ð)Ó*ˆ	Ø×,Ñ,×CÑCÀIÓNˆåWá.ØØØ!Ø!Ø1ô
ð 	
øô1 'ô ÛÜ.ô ÛÜ ¤(¬JÐ7ô ò ðús*   Â*EÅFÅ!FÅ*FÅ/FÆFÆFc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r7   r
   Ú	placementztuple[Placement | None]rC   r   r   z!Placement | tuple[Placement, ...]r   )r   s   "r   r   r„   ü   s2   € ÷ 0ñ 0àð0ð +ð0ð ð	0ð
 
+ñ0r   c           	     	óè  aa€ VP                   pV\        9   d   \        V,          pM1VP                  4       '       d   VP                  pM\	        R V 24      h\        V4      oVV3R lp^ RIHp V! 4       ;_uu_ 4        \        WaP                  4      p\        WaP                  4      p	\        V P                  S4      ;_uu_ 4        V! V/ V	B p
RRR4       RRR4       R p\        VX
4      p\        V\        \        34      '       d;   V Uu. uF
  qÝf   K  VNK  	  pp\!        V4      ^8X  d
   V^ ,          # \        V4      # V#   + '       g   i     L; i  + '       g   i     LŠ; iu upi )zNo decomposition found for c                óø   <€ \        S4      p\        V \        4      '       dX   \        P                  ! V P
                  V P                  P                  R R7      p\        SV3V P                  R7      Vn        V# V # )Úmeta)ÚdtypeÚdevice)Útensor_meta)	ÚnextrN   r   rO   ÚemptyÚshaper¹   r·   rM   )rS   Úpr¶   rC   Úplacement_iters   &  €€r   Úto_metaÚADecompShardingStrategy._propagate_through_decomp.<locals>.to_meta  sZ   ø€ Ü�^Ó$ˆAÜ˜!œ[×)Ò)ä—{’{ 1§7¡7°!·-±-×2EÑ2EÈfÔU�ä(¨°¨tÀÇÁÔO�”
Ø�ØˆHr   )Úmaybe_disable_local_tensor_modeNc                óš   € \        V \        P                  4      '       d+   \        V R R4      pV'       d   VP                  ^ ,          # R# R# )rM   N)rN   rO   rP   rQ   re   )rw   Úspecs   & r   Úget_placementÚGDecompShardingStrategy._propagate_through_decomp.<locals>.get_placement"  s:   € Ü˜!œUŸ\™\×*Ò*Ü˜q '¨4Ó0�ß-1�t—‘ qÕ)Ð;°tÐ;Ùr   )r   r   r”   Ú	decomposerY   ÚiterÚtorch.distributed._local_tensorrÁ   r2   r:   r<   r@   rB   rN   r;   rv   r§   )rH   r7   r³   rC   r   Ú	decomp_fnr¿   rÁ   Ú	args_metaÚkwargs_metars   rÄ   Úresultr½   Úflatr¾   s   &&&f           @r   r£   Ú0DecompShardingStrategy._propagate_through_decompü   s)  ù€ ð �\‰\ˆØÔ$Ô$Ü+¨BÕ/‰IØ×Ñ× Ò ØŸ™‰Iä%Ð(CÀBÀ4Ð&HÓIÐIä˜i›ˆö	õ 	Tá,×.Õ.ä  ×*?Ñ*?Ó@ˆIÜ" 7×,CÑ,CÓDˆKä& t×'9Ñ'9¸4×@Õ@Ù" IÐ=°Ñ=�÷ A÷ /ò	ô ˜-¨Ó0ˆÜ�fœu¤d˜m×,Ò,Ù%Ó7™v˜!—A�A™vˆDÐ7Ü! $›i¨1œn�4˜•7Ð=´%¸³+Ð=Øˆ÷ A×@ú÷ /×.üò  8s1   Â A	EÃ		E		ÃEÄE/ÄE/Å	EÅEÅE,	c               ó    € V ^8„  d   QhRRRR/# )r   r7   r
   r   zlist[tuple[Placement | None]]r   )r   s   "r   r   r„   /  s   € ÷  4ñ  4Øð 4à	&ñ 4r   c                	óè  a	€ \        V 4      p\        \        V4      4      w  r#\        4       0o	\	        \
        V	3R  lV4       . pV EF  p\        V\
        4      '       g   VP                  R.4       K.  \        S	4      pS	 F¨  p\        V\        4      '       dC   T\        VP                  4       Uu0 uF  p\        W‡P                  R7      kK  	  up,          pK[  \        V\        4      '       g   Ks  T\        VP                  4       Uu0 uF  p\        V4      kK  	  up,          pKª  	  VP                  \        V4      4       EK  	  \        \        P                  ! V!  4      # u upi u upi )c                ó:   <€ SP                  V P                  4      # r9   )Úupdatere   )rÃ   Úall_placementss   &€r   rT   ÚBDecompShardingStrategy._get_candidate_placements.<locals>.<lambda>9  s   ø€ ˜×.Ñ.¨t¯©Ô?r   N)Úsplit_factor)r>   r1   rv   r   r3   r   rN   r(   Úsetr   ÚrangeÚndimrÕ   r   Ú	itertoolsÚproduct)
r7   Útensor_specsÚ
flat_specsÚ_Ú
candidatesrÃ   Úoptionsr½   r+   rÓ   s
   &        @r   r¢   Ú0DecompShardingStrategy._get_candidate_placements.  s0  ø€ ô ,¨IÓ6ˆÜ$¤T¨,Ó%7Ó8‰ˆ
ô +4«+¨ˆÜÜÜ?Øô	
ð 46ˆ
ÜˆDÜ˜d¤K×0Ò0Ø×!Ñ! 4 &Ö)ä˜nÓ-�Û'�AÜ! !¤]×3Ò3Øä%*¨4¯9©9Ô%5ó$á%5 ô *¨!¿.¹.×IÙ%5ñ$õ šô $ A¤u×-Ô-Ø´e¸D¿I¹IÔ6FÓ#GÑ6F°¤E¨!¦HÑ6FÑ#GÕGšñ (ð ×!Ñ!¤$ w£-×0ñ ô  ”I×%Ò% zÑ2Ó3Ð3ùò$ùò
 $Hs   Â3E*
ÄE/
)r†   rB   r9   )rz   r{   r|   r}   r~   rG   r�   Ústaticmethodr•   r™   r°   r£   r¢   r   r   r   r   r‚   r‚   š   sM   † ñõ6õð ô@ó ð@õC÷9
õv0ðd ô 4ó ô 4r   r‚   )/r~   Ú
__future__r   rÙ   Útypingr   r   rO   Útorch._decompr   Ú)torch.distributed._functional_collectivesr   Útorch.distributed.device_meshr   Ú&torch.distributed.tensor._dtensor_specr   r	   Ú#torch.distributed.tensor._op_schemar
   r   r   Útorch.distributed.tensor._utilsr   Ú(torch.distributed.tensor.placement_typesr   r   r   r   Ú%torch.fx.experimental.symbolic_shapesr   Útorch.utils._python_dispatchr   r/   Útorch.utils._pytreer0   r1   r2   r3   Úcollections.abcr4   Ú
torch._opsr   Ú'torch.distributed.tensor._sharding_propr5   r>   r@   r‚   r   r   r   Ú<module>rñ      s~   ðñõ #ã ß %ã Ý -Ý EÝ 4ß Jß WÑ WÝ C÷ó õ NÝ :õ'÷< PÓ O÷ Ý(å%ÝJõKôK0Ð-ô K0÷\u4ó u4r   