o
    ?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 e/home/www/facesmatcher.com/pyenv/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   Zfetch_layoutmeshZ	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   Z
num_shardsr   ir   r   r   r   ;       z%unpacked_to_numpy.<locals>.<listcomp>)Zdtyper   r   )r   offset_to_shard
ValueErrorr!   ndarrayrangerankobject	enumerateblocktolistndimZsqueeze)r%   r   Z
unravelledoffsetlocZ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   )
r0   r    sizer   r/   r!   r.   r2   r,   tuple)r8   r   r   r   Zsharded_tensorZ	flattenedr6   Z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	   Z
from_dense)r   r8   r   r   r   r   b   r+   zpack_numpy.<locals>.<listcomp>)r#   r   pack)r   r   r<   r%   r   r   r   
pack_numpy\   s
   
r>   c                 C   s0   | d u rt dt| |tjtjd}t||S )Nz$pack requires values to be passed inr9   )r-   r#   r   splitr   stackr   r=   )r   r   r%   r   r   r   pack_tf_tensorf   s   rA   c                 C   s   t jtj| |d|dS )z4Creates uniform random tensor with the given layout.)shapeseedr   )r   Zrelayoutr
   stateless_random_uniform)rB   rC   r   r   r   r   rD   n   s   rD   )F) __doc__typingr   r   r!   Ztensorflow.dtensor.pythonr   r   Z
layout_libZ,tensorflow.python.eager.polymorphic_functionr   Ztensorflow.python.opsr   r   r	   r
   Ztensorflow.python.types.corer   r   r?   r@   r   r.   r&   ZLayoutr$   r#   boolr>   rA   functionrD   r   r   r   r   <module>   sH   


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