
    [Th?              	          % S SK r S SKJr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KJr  S SKJr  SS	KJrJrJrJrJrJrJr  SS
KJrJrJrJrJ r J!r!  SSK"J#r#J$r$  S/r%\&\'   \(S'   S\S\S\)4S jr*S\&\   S\&\   S\&\   4S jr+S\RX                  S\4S jr-S\S\4S jr.S\S\S\4S jr/S\'S\S\ 4S jr0S\'S\S\S\ 4S jr1S\'S\RX                  S\ 4S jr2S\'S\4S  jr3S! r4S" r5S\'S#\S$\&\   S\&\   4S% jr6S&\S\4S' jr7S\'S(\S\&\    4S) jr8S\S\4S* jr9S\RX                  S\&\   4S+ jr:S\'S,\S-\S\&\   4S. jr;S&\<\'\4   S\4S/ jr=S0\S1\S2\S3\4S4 jr>g)5    N)AnyCallablecast)_get_device_module)ShardMetadata)ShardedTensor)DTensor)%compute_local_shape_and_global_offset   )BytesStorageMetadataChunkStorageMetadataMetadataIndexSTATE_DICT_TYPESTORAGE_TYPESTensorPropertiesTensorStorageMetadata)LoadItemTypeReadItemSavePlanTensorWriteData	WriteItemWriteItemType)"_check_shard_metadata_pair_overlap+_shards_get_overlap_region_wrt_saved_tensor create_read_items_for_chunk_list__all__plan
other_planreturnc                    U R                   UR                   :w  a  g[        U R                  5      [        UR                  5      :w  a  g[        U R                  UR                  5       GHn  u  p#UR                  UR                  :w  a    gUR
                  nUR
                  nUR                  UR                  :w  d4  UR                  UR                  :w  d  UR
                  UR
                  :w  a    gUR                  nUR                  nU(       a  U(       a  U(       d	  U(       a    gU(       d  M  U(       d  M  UR                  UR                  :w  a    gUR                  nUR                  n	U(       a  U	(       a  U(       d	  U	(       a    gU(       d  GM.  U	(       d  GM8  UR                  U	R                  :w  d  UR                  U	R                  :w  d  GMo    g   g)z
Compare the two Save plans and return True if they are equal.

Args:
    plan (SavePlan): First SavePlan to compare.
    other_plan (SavePlan): Second SavePlan to compare.

Returns:
   True if the two plans are equal, False otherwise.
FT)usablelenitemsziptypeindexfqnoffsettensor_datasizechunkoffsetssizes)
r   r   	plan_itemother_plan_itemplan_metadata_indexother_plan_metadata_indexr)   other_tensor_datar+   other_chunks
             d/var/www/auris/envauris/lib/python3.13/site-packages/torch/distributed/checkpoint/planner_helpers.py_compare_save_plansr5   '   sq    {{j''' 4::#j..// '*$**j6F6F&G"	>>_111'oo$3$9$9!  ##'@'D'DD"))-F-M-MM"((,E,K,KK  +++77 1 1;,,#4#9#99  %%E+11Kk5[ uMM[%8%88{{k&7&77 S 'HV     cached_plansdelta_plansc                     / n[        X5       HA  u  p4U(       a$  UR                  (       d  UR                  U5        M0  UR                  U5        MC     U$ )aG  
Merge a list of delta plans into a single plan.

Args:
    cached_plans (List[SavePlan]): A list of cached plans.
    delta_plans (List[SavePlan]): A list of delta plans to merge. It can contain empty plans

Returns:
    A single merged plan. If a delta plan is not usable, use the cached plan. Otherwise, use the delta plan.
)r$   r!   append)r7   r8   merged_planscached_plan
delta_plans        r4   _merge_delta_local_plansr>   h   sK     L#&|#Aj//,
+	 $B r6   tensorc           	          [        [        R                  " S/[        U R	                  5       5      -  5      U R	                  5       S9$ )Nr   r,   r-   )r   torchSizer"   r*   )r?   s    r4   _create_chunk_from_tensorrD      s5    

A3V[[]!334FKKM r6   shard_mdc                     [        [        R                  " U R                  5      [        R                  " U R                  5      S9$ NrA   )r   rB   rC   shard_offsetsshard_sizes)rE   s    r4   _chunk_for_shardrJ      s3    

8112jj--. r6   sharded_tensorc                    U R                  5       R                  n[        UR                  UR                  UR
                  UR                  UR                  S9n[        [        U5      UU R                  5       R                  S9$ )N)dtypelayoutrequires_gradmemory_format
pin_memoryr+   
propertiesr*   )metadatatensor_propertiesr   rM   rN   rO   rP   rQ   r   rJ   r*   )rK   rE   shard_propertiesrS   s       r4   _sharded_tensor_metadatarW      s|     &..0BB!$$&&&44&44#..J x($$&++ r6   r'   c                 x   [        UR                  UR                  UR                  5      u  p#[        R
                  " U5      [        R
                  " U5      p2[        [        X5      [        R                  [        [        UUS9[        R                  " UR                  5       5      UR                  5       S9S9$ )NrA   rR   r&   r%   r)   )r
   shapedevice_mesh
placementsrB   rC   r   r   r   SHARDr   r   r   create_from_tensorto_localr*   )r'   r?   r-   r,   s       r4   _create_write_items_for_dtensorr`      s    :f((&*;*;NE ZZ&

7(;7C)  #& (::6??;LM
 r6   c                     [         R                  " UR                  5      n[        [	        X5      [
        R                  [        X5      S9$ )NrY   )rB   rC   rH   r   r   r   r]   rW   )r'   rK   rE   r,   s       r4   _create_write_item_for_shardrb      s>     jj//0GC)  ,^F r6   c                 (   [         R                  " S/[        UR                  5       5      -  5      n[	        [        X5      [        R                  [        [        X!R                  5       S9[        R                  " U5      UR                  5       S9S9$ )Nr   rA   rR   rY   )rB   rC   r"   r*   r   r   r   TENSORr   r   r   r^   )r'   r?   r,   s      r4   _create_write_item_for_tensorre      sm    jj!s6;;=112GC)!!#&wkkmL'::6B
 r6   bytesc                 D    [        [        U 5      [        R                  S9$ )N)r&   r%   )r   r   r   BYTE_IO)r'   rf   s     r4   _create_write_item_for_bytesiori      s     C "" r6   c           
          [        [        R                  U [        R                  " U45      U[        R                  " U45      [        R                  " U45      S9$ N)r%   
dest_indexdest_offsetsstorage_indexstorage_offsetslengths)r   r   rh   rB   rC   rl   dest_offsetrn   storage_offsetlengths        r4   _create_read_item_for_byteioru      sK     !!ZZ/#

N#45

F9% r6   c           
          [        [        R                  U [        R                  " U5      U[        R                  " U5      [        R                  " U5      S9$ rk   )r   r   rd   rB   rC   rl   rm   rn   ro   rp   s        r4   _create_read_item_for_tensorrx      sD       ZZ-#

?3

7# r6   checkpoint_mdlocal_chunksc                    / n[        U5       H  u  pE[        UR                  5       H  u  pg[        XW5      (       d  M  / n/ n	/ n
[        XuS9 H;  u  nnnnUR	                  U5        U	R	                  U5        U
R	                  U5        M=     UR	                  [        [        XR                  U5      U	[        XR                  U5      UU
S95        M     M     U$ )a'  
Create a list of ``ReadItem`` based on the checkpoint and local chunks.

This applies the resharding algorithm and computes the reads needed
to satisfy ``local_chunks`` with a checkpoint described by ``checkpoint_md``.

Args:
    fqn (str) : The state_dict FQN to pass to ``ReadItem``.
    checkpoint_md (TensorStorageMetadata): metadata for a given tensor
        from a checkpoint.
    local_chunks (List[ChunkStorageMetadata]): Local chunks that needs to be
        loaded.

Returns:
    A list of ``ReadItem`` that will satisfy all input chunks.
)saved_shardcurrent_shardrw   )	enumeratechunksr   r   r:   rx   r   r,   )r'   ry   rz   
read_itemsidxshardstorage_idx
storage_mdro   rm   rp   _dimoffset_for_saved_tensoroffset_for_current_tensorrt   s                  r4   r   r      s    * J-
'01E1E'F#K5eHH OLG =&')  &&'>?##$=>v& ,,S--E!-"/5G5G"U$3#' (G .: r6   
state_dictc                   ^^ / nU R                  5        H  u  mm[        T[        5      (       a  UR                  [	        TT5      5        M8  [        T[
        5      (       a6  UR                  UU4S jTR                  5       R                   5       5        M  [        T[        R                  5      (       a  UR                  [        TT5      5        M  UR                  [        TT5      5        M     [        U5      $ )Nc              3   >   >#    U  H  n[        TTU5      v   M     g 7f)N)rb   ).0rE   r'   objs     r4   	<genexpr>5_create_default_metadata_only_plan.<locals>.<genexpr>,  s$       >H -S#x@@ >s   )r#   
isinstancer	   r:   r`   r   extendrT   shards_metadatarB   Tensorre   ri   r   )r   requestsr'   r   s     @@r4   "_create_default_metadata_only_planr   &  s    H$$&Sc7##OO;CEF]++OO  # > >  U\\**OO9#sCDOO:3DE ' Hr6   objectc                 R   [        US5      (       a  UR                  X5      $ [        U[        5      (       a5  UR	                  5        Vs/ s H  n[        XUR                  5      PM     sn$ [        U[        R                  5      (       a  [        X5      /$ [        X5      /$ s  snf )N__create_write_items__)hasattrr   r   r   local_shardsrb   rT   rB   r   re   ri   )r'   r   r   s      r4   _create_write_itemsr   7  s    v/00,,S99	FM	*	*  ,,.
. )ennE.
 	
 
FELL	)	)-c:;;.s;<<
s   
 B$c                     [        U R                  U R                  U R                  5      u  p[        R
                  " U5      [        R
                  " U5      p![        UUS9$ rG   )r
   rZ   r[   r\   rB   rC   r   )r?   r-   r,   s      r4   _create_chunk_from_dtensorr   F  sS    :f((&*;*;NE ZZ&

7(;7 r6   c                 n   [        U S5      (       a  U R                  5       nU$ [        U [        5      (       a5  U R	                  5        Vs/ s H  n[        UR                  5      PM     nnU$ [        U [        R                  5      (       a  [        U 5      /nU$ [        S[        U 5       35      es  snf )N__create_chunk_list__zMUnsupported Type, expecting one of [Tensor, DTensor, ShardedTensor] ,but got )r   r   r   r   r   rJ   rT   rB   r   rD   
ValueErrorr%   )r?   rz   r   s      r4   _create_chunk_listr   Q  s    v.//335  
FM	*	*:@:M:M:O
:OU^^,:O 	 
  
FELL	)	)1&9:  V~'
 	

s   B2mdr   c                     [        U[        5      (       d   [        U5      n[        XU5      $ [        [        U 5      S[        U 5      SSS9/$ ! [         a$  n[        SU  S3S[	        U5       3-   5      UeS nAff = f)Nz Invalid checkpoint metadata for z, z(expected BytesStorageMetadata but found r   rq   )r   r   r   r   r%   r   ru   r   )r'   r   r   rz   exs        r4   _create_read_itemsr   d  s    b.//	-c2L 0FF )(-+C0 
 	
  	23%r:<T"XJGH 	s   A 
A<A77A<c                 v    S[         4S jnS[        4S jnS[        R                  4S jn[	        U UUU5        g)zH
Initializes meta tensor if the meta tensor is DTensor or torch.Tensor.
valuec                    [        U SS 5      nU[        R                  " S5      :X  a  [        R                  R                  5       R                  n[        [        R                  [        U5      R                  5       5      n[        R                  " U R                  5       US9n[        R                  " UU R                  U R                  U R!                  5       U R#                  5       S9nU$ U $ )Ndevicemetar   )r[   r\   rZ   stride)getattrrB   r   distdistributed_c10d_get_pg_default_devicer%   r   r   current_device
empty_liker_   r	   
from_localr[   r\   r*   r   )r   r   device_typenew_local_tensordtensors        r4   dtensor_func&_init_state_dict.<locals>.dtensor_func  s    $/U\\&))//FFHMMK0=LLNF  %//0@P (( !-- ++jjl||~G NLr6   c                     [        U SS 5      nU[        R                  " S5      :X  a  [        S[	        U 5       S35      eU $ )Nr   r   zFound unsupported type z for meta device loading.)r   rB   r   RuntimeErrorr%   )r   r   s     r4   sharded_tensor_func-_init_state_dict.<locals>.sharded_tensor_func  sF    $/U\\&)))$u+6OP  Lr6   c                 2   [        U SS 5      nU[        R                  " S5      :X  ao  [        R                  R                  5       R                  n[        [        R                  [        U5      R                  5       5      n[        R                  " XS9nU$ U $ )Nr   r   r   )r   rB   r   r   r   r   r%   r   r   r   r   )r   r   r   r?   s       r4   tensor_func%_init_state_dict.<locals>.tensor_func  sy    $/U\\&))//FFHMMK0=LLNF %%e;FMLr6   N)r	   r   rB   r   _iterate_state_dict)r   r   r   r   s       r4   _init_state_dictr   {  s@    
G *3 
5<< 
 	r6   iter_objectr   r   r   c           	      p   [        U [        5      (       a  U" U 5      $ [        U [        5      (       a  U" U 5      $ [        U [        R                  5      (       a  U" U 5      $ [        U [
        [        [        [        [        R                  45      (       d  U c  U $ [        U [        5      (       a)  U R                  5        H  u  pE[        XQX#5      X'   M     U $ [        U [        [        45      (       a>  U  Vs/ s H  n[        XaX#5      PM     nn[        U [        5      (       a  [        U5      nU$ gs  snf )a  
Iterate through the state dict, applying the given functions to each tensor type
and update the state dict in place.

Args:
    iter_object (Any): the target state_dict.
    sharded_tensor_func (Callable): the function to apply to ShardedTensor
    dtensor_func (Callable): the function to apply to DTensor
    tensor_func (Callable): the function to apply to Tensor

# TODO: let state_dict_util._iterate_state_dict() to support in place option
so we don't need to have two versions of _iterate_state_dict.
N)r   r	   r   rB   r   intfloatstrrf   ioBytesIOdictr#   r   listtuple)r   r   r   r   keyr   vrets           r4   r   r     s   ( +w''K((	K	/	/";//	K	.	.;'';eS% DEE	K	&	&%++-JC2%8 K . 	K$	/	/ !
   1DR  	 
 k5))*C
 
0
s   8D3)?r   typingr   r   r   rB   torch.distributeddistributedr   torch._utilsr   !torch.distributed._shard.metadatar   'torch.distributed._shard.sharded_tensorr   torch.distributed.tensorr	   torch.distributed.tensor._utilsr
   rT   r   r   r   r   r   r   r   plannerr   r   r   r   r   r   
reshardingr   r   r   r   r   __annotations__boolr5   r>   r   rD   rJ   rW   r`   rb   re   ri   ru   rx   r   r   r   r   r   r   r   r   r    r6   r4   <module>r      s]   	 & &    + ; A , Q    99c 9>h >H > >Bx.h 
(^2ell 7K } 1E !-:( g ) (	+7D
s 
ELL 
Y 
 C 

4	4(4 +,4 
(^	4n? x "=S =# =$y/ =w 3G u|| 5I0J &
C 
] 
 
h 
.4c3h 4C 4n,,, ", 	,r6   