o
    i e(                  	   @   s4  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dZdedejfddZdee dejdejfddZejejfdedejdee fddZ	d"dejdejdedefddZdedejdefddZe
jd d! ZdS )#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                    sF   || d  d}t dkrdd  fdd|D }||S )zPSplit `value` into a sharded nparray/tf tensor based on the number of splits.
  r   axis   Nc                    s   g | ]
}t | d  qS )r   )_split).0childr   splits S/var/www/myenv/lib/python3.10/site-packages/tensorflow/dtensor/python/numpy_util.py
<listcomp>'   s    z_split.<locals>.<listcomp>)len)valuer   r   split_fnstack_fnchildrenr   r   r   r   !   s
   r   tensorreturnc                 C   s>   t | }|j rtdgS dd t | D }t||S )z8Copy `input` DTensor to an equivalent local numpy array.Nc                 S   s   g | ]}|  qS r   )numpy)r   r   r   r   r   r   1   s    zto_numpy.<locals>.<listcomp>)r   fetch_layoutmesh	is_remotenparrayunpackunpacked_to_numpy)r   r   unpackedr   r   r   to_numpy+   s
   


r(   r'   r   c                    s   t | t   krtdtj fddt jD td}t  D ]
\}}| | ||< q%t	|
 }|j| d jkrNtj|dd}|j| d jks?|S )z/Heals local Tensor components to a numpy array.z"Wrong number of component Tensors.c                       g | ]}  |qS r   
num_shardsr   ir   r   r   r   ;       z%unpacked_to_numpy.<locals>.<listcomp>)dtyper   r   )r   offset_to_shard
ValueErrorr#   ndarrayrangerankobject	enumerateblocktolistndimsqueeze)r'   r   
unravelledoffsetlocconcat_tensorr   r   r   r&   5   s   r&   tc                    sv    j s
| g jj S t|  fddt j D ||d}tg g jj }t  D ]\}}|t	| ||< q,|S )z?Slice `t` into a flattened list of tensors suitable for `pack`.c                    r)   r   r*   r,   r   r   r   r   S   r.   zunpack.<locals>.<listcomp>r   r   )
r4   r!   sizer   r3   r#   r2   r6   r0   tuple)r?   r   r   r   sharded_tensor	flattenedr<   shardr   r   r   r%   K   s   r%   Fr   make_sparsec                 C   s<   | d usJ t | |}|rtdd |D |S t||S )Nc                 S   s   g | ]}t |qS r   )r	   
from_dense)r   r?   r   r   r   r   b   r.   zpack_numpy.<locals>.<listcomp>)r%   r   pack)r   r   rF   r'   r   r   r   
pack_numpy\   s
   
rI   c                 C   s0   | d u rt dt| |tjtjd}t||S )Nz$pack requires values to be passed inr@   )r1   r%   r   splitr   stackr   rH   )r   r   r'   r   r   r   pack_tf_tensorf   s   rL   c                 C   s   t jtj| |d|dS )z4Creates uniform random tensor with the given layout.)shapeseedr   )r   relayoutr
   stateless_random_uniform)rM   rN   r   r   r   r   rP   n   s   rP   )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   rJ   rK   r   r2   r(   Layoutr&   r%   boolrI   rL   functionrP   r   r   r   r   <module>   sH   







