
    AVh(              	          d Z ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ dej&                  ej(                  fdZdedej,                  fdZdee   dej0                  dej,                  fdZej&                  ej(                  fdedej0                  dee   fdZ	 ddej,                  dej0                  dedefdZdedej0                  defdZe
j<                  d        Zy)z:Utilities to convert data buffers to/from DTensor tensors.    )ListN)apilayout)polymorphic_function)	array_ops)array_ops_stack)
sparse_ops)stateless_random_ops)Tensor
TensorLikec           	           || |d   |      }t        |      dkD  r"|dd }|D cg c]  }t        |||dz          }} ||      S c c}w )zPSplit `value` into a sharded nparray/tf tensor based on the number of splits.
  r   axis   N)len_split)valuesplitsr   split_fnstack_fnchildrenchilds          T/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/dtensor/python/numpy_util.pyr   r   !   s]     eVAYT2([1_ABZF=EFEufdQh/FHF	(	 Gs   Atensorreturnc                    t        j                  |       }|j                  j                         rt	        j
                  dg      S t        j                  |       D  cg c]  } | j                          }} t        ||      S c c} w )z8Copy `input` DTensor to an equivalent local numpy array.N)	r   fetch_layoutmesh	is_remotenparrayunpacknumpyunpacked_to_numpy)r   r   unpackeds      r   to_numpyr'   +   sg    F#&[[88TF+.::f+=>flln>(>	8V	,, ?s   Br&   r   c                 >   t        |       t        |j                               k7  rt        d      t        j                  t        |j                        D cg c]  }|j                  |       c}t              }t        |j                               D ]  \  }}| |   ||<    t        j                  |j                               }|j                  | d   j                  kD  r4t        j                  |d      }|j                  | d   j                  kD  r4|S c c}w )z/Heals local Tensor components to a numpy array.z"Wrong number of component Tensors.)dtyper   r   )r   offset_to_shard
ValueErrorr!   ndarrayrangerank
num_shardsobject	enumerateblocktolistndimsqueeze)r&   r   i
unravelledoffsetlocconcat_tensors          r   r%   r%   5   s     	]c&00233
9
::zzv{{9KLA6,,Q/L &(* v5578 'kfcv&JsO' ((:,,./- 	Xa[---JJ}15M 	Xa[---	 Ms   Dtc           	         |j                   s| g|j                  j                  z  S t        | t	        |j                         D cg c]  }|j                  |       c}||      }t        j                  g       g|j                  j                  z  }t        |j                               D ]  \  }}|t        |         ||<    |S c c}w )z?Slice `t` into a flattened list of tensors suitable for `pack`.r   r   )r.   r   sizer   r-   r/   r!   r,   r1   r*   tuple)	r;   r   r   r   r6   sharded_tensor	flattenedr8   shards	            r   r#   r#   K   s    
 
3!!!!fkk(:	;1&

A
	;. zz"~!1!11) !7!7!9: 5mfe&uU|4If5	 
<s   C
r   make_sparsec                     | J t        | |      }|r7t        j                  |D cg c]  }t        j                  |       c}|      S t        j                  ||      S c c}w )N)r#   r   packr
   
from_dense)r   r   rC   r&   r;   s        r   
pack_numpyrG   \   s]     
		E6"(88x@!Z**1-@&II	(F	## As   A c                     | t        d      t        | |t        j                  t        j
                        }t        j                  ||      S )Nz$pack requires values to be passed inr=   )r+   r#   r   splitr	   stackr   rE   )r   r   r&   s      r   pack_tf_tensorrK   f   sB    
]
;
<<Vioo8M8MO(	(F	##    c                 Z    t        j                  t        j                  | |      |      S )z4Creates uniform random tensor with the given layout.)shapeseedr   )r   relayoutr   stateless_random_uniform)rN   rO   r   s      r   rQ   rQ   n   s(     
33%dK
 rL   )F) __doc__typingr   r$   r!   tensorflow.dtensor.pythonr   r   
layout_lib,tensorflow.python.eager.polymorphic_functionr   tensorflow.python.opsr   r	   r
   r   tensorflow.python.types.corer   r   rI   rJ   r   r,   r'   Layoutr%   r#   boolrG   rK   functionrQ    rL   r   <module>r]      s'   A   ) : M + 1 , 6 ;  !288bhh -Z -BJJ -Z 0 (//46JJ0 HHHHj $$ "&j!1& $)$bjj $!(($ $-3$$& $**;*; $ $  rL   