
    `i              	           d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	 d dlm
Z
 d dlZd dlmZ d dlmc mZ d dlmc mZ d dlmc 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$ 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)  G d dej*        j+        j,                  Z- G d dej*        j+        j.                  Z/d Z0d Z1 G d de          Z2e'j3        fde	de4e5ef         de'j6        de2fdZ7dS )     )chain)AnyCallableIterableOptionalN)	ArrayLike)	DTypeLike)ndarrayDevice)Stream)get_current_stream)_chunk)_Chunk)_data_transfer)_Communicator)_elementwise)_index_arith)_modes)
_reduction)_linalgc                       e Zd ZdS )_MultiDeviceDummyMemoryN)__name__
__module____qualname__     r/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupyx/distributed/array/_array.pyr   r      s        Dr   r   c                   *    e Zd Zedefd            ZdS )_MultiDeviceDummyPointerreturnc                      t          d          S )Nr   selfs    r   devicez_MultiDeviceDummyPointer.device!   s     bzzr   N)r   r   r   propertyr   r'   r   r   r   r!   r!       s9            X  r   r!   c           	         t          |           }|j        5  t          j        |          }t	          j        ||                                |          }d d d            n# 1 swxY w Y   t          |          5  t                      }t	          j        ||          ||||         ||          }t          |j
        |j        ||          cd d d            S # 1 swxY w Y   d S N)
prevent_gc)r   r'   _creation_from_dataascontiguousarrayr   
_AsyncDatarecordr   	_transferr   arrayready)	src_devdst_devidx	src_arraycomms
src_streamsrc_data
dst_streamcopieds	            r   _make_chunk_asyncr<   (   s   #G,,J		 B B'9)DD	!,z((**yB B BB B B B B B B B B B B B B B B 
 + +'))
)'NJ'NJ1 1 flFL#!)+ + ++ + + + + + + + + + + + + + + + + +s$   >A!!A%(A%;ACCCc                     t          |          5  t                      }t          j        |          }t	          ||                                ||          cd d d            S # 1 swxY w Y   d S r*   )r   r   r,   r1   r   r/   )r3   r4   r5   r6   r7   streamr;   s          r   _make_chunk_syncr?   7   s    	 J J#%%$*955ffmmoosyIIIJ J J J J J J J J J J J J J J J J Js   AA$$A(+A(c                   X    e Zd ZU dZeeee         f         ed<   e	j
        ed<   eeef         ed<   eeef         ed<   e	j        dfdeedf         d	ed
eeee         f         de	j
        deeeef                  dd f fdZdk fdZd Zede	j
        fd            Zedee         fd            Zedeeeeedf                  f         fd            Zdeeee         f         fdZdee         ddfdZd ZdefdZd Z d Z!deeee         f         fdZ"de	j#        deeee         f         fdZ$de	j
        dd fdZ%de	j
        dd fdZ&d eeef         dd fd!Z'	 dlde(j        fd$Z)d% Z*d& Z+d' Z,d( Z-d) Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBdmd?ZCd@ ZDdmdAZEdB ZFdC ZGdndDZHdE ZIdF ZJdG ZKdH ZLdI ZMdJ ZNdK ZOdL ZPdM ZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWdodTZXdU ZYdV ZZdW Z[dX Z\dY Z]dZ Z^d[ Z_d\ Z`d] Zad^ Zbed_             Zced`             Zdeda             Zeedb             Zfedc             Zgedd             Zhede             Ziedf             Zjedg             Zke fdh            Zleljm        di             Zledj             Zn xZoS )pDistributedArraya  
    __init__(self, shape, dtype, chunks_map, mode=REPLICA, comms=None)

    Multi-dimensional array distributed across multiple CUDA devices.

    This class implements some elementary operations that :class:`cupy.ndarray`
    provides. The array content is split into chunks, contiguous arrays
    corresponding to slices of the original array. Note that one device can
    hold multiple chunks.

    This direct constructor is designed for internal calls. Users should create
    distributed arrays using :func:`distributed_array`.

    Args:
        shape (tuple of ints): Shape of created array.
        dtype (dtype_like): Any object that can be interpreted as a numpy data
            type.
        chunks_map (dict from int to list of chunks): Lists of chunk objects
            associated with each device.
        mode (mode object, optional): Mode that determines how overlaps
            of the chunks are interpreted. Defaults to
            ``cupyx.distributed.array.REPLICA``.
        comms (optional): Communicator objects which a distributed array
            hold internally. Sharing them with other distributed arrays can
            save time because their initialization is a costly operation.

    .. seealso::
            :attr:`DistributedArray.mode` for details about modes.
    _chunks_map_mode_streams_commsNshape.dtype
chunks_mapmoder7   r"   c                     t          d          }t          |d          }t                                          | |||          }||_        ||_        i |_        ||ni |_        |S )Nr   )memptr)r   r!   super__new__rB   rC   rD   rE   )
clsrF   rG   rH   rI   r7   memrK   obj	__class__s
            r   rM   zDistributedArray.__new__b   sh     &a(()#q11ggooc5%o??$	#/UUR

r   c                 :     t                      j        |i | d S N)rL   __init__)r&   argskwargsrQ   s      r   rT   zDistributedArray.__init__t   s%    $)&)))))r   c                 (    |t          d          d S )NzIDistributed array can only be instantiated by an explicitconstructor call)RuntimeError)r&   rP   s     r   __array_finalize__z#DistributedArray.__array_finalize__w   s%    ?#$ $ $ ?r   c                     | j         S )a	  Describe how overlaps of the chunks are interpreted.

        In the replica mode, chunks are guaranteed to have identical values on
        their overlapping segments. In other modes, they are not necessarily
        identical and represent the original data as their max, sum, etc.

        :class:`DistributedArray` currently supports
        ``cupyx.distributed.array.REPLICA``, ``cupyx.distributed.array.MIN``,
        ``cupyx.distributed.array.MAX``, ``cupyx.distributed.array.SUM``,
        ``cupyx.distributed.array.PROD`` modes.

        Many operations on distributed arrays including :class:`cupy.ufunc`
        and :func:`~cupyx.distributed.array.matmul` involve changing their mode
        beforehand. These mode conversions are done automatically, so in most
        cases users do not have to manage modes manually.

        Example:
            >>> A = distributed_array(
            ...     cupy.arange(6).reshape(2, 3),
            ...     make_2d_index_map([0, 2], [0, 1, 3],
            ...                       [[{0}, {1, 2}]]))
            >>> B = distributed_array(
            ...     cupy.arange(12).reshape(3, 4),
            ...     make_2d_index_map([0, 1, 3], [0, 2, 4],
            ...                       [[{0}, {0}],
            ...                        [{1}, {2}]]))
            >>> C = A @ B
            >>> C
            array([[20, 23, 26, 29],
                   [56, 68, 80, 92]])
            >>> C.mode
            'sum'
            >>> C.all_chunks()
            {0: [array([[0, 0],
                        [0, 3]]),     # left half
                 array([[0, 0],
                        [6, 9]])],    # right half
             1: [array([[20, 23],
                        [56, 65]])],  # left half
             2: [array([[26, 29],
                        [74, 83]])]}  # right half
            >>> C_replica = C.change_mode('replica')
            >>> C_replica.mode
            'replica'
            >>> C_replica.all_chunks()
            {0: [array([[20, 23],
                        [56, 68]]),   # left half
                 array([[26, 29],
                        [80, 92]])],  # right half
             1: [array([[20, 23],
                        [56, 68]])],  # left half
             2: [array([[26, 29],
                        [80, 92]])]}  # right half
        )rC   r%   s    r   rI   zDistributedArray.mode}   s    p zr   c                 4    | j                                         S )z4A collection of device IDs holding part of the data.)rB   keysr%   s    r   deviceszDistributedArray.devices   s     $$&&&r   c                 H    d | j                                         D             S )z<Indices for the chunks that devices with designated IDs own.c                 .    i | ]\  }}|d  |D             S )c                     g | ]	}|j         
S r   )index.0chunks     r   
<listcomp>z9DistributedArray.index_map.<locals>.<dictcomp>.<listcomp>   s    666eek666r   r   )rc   devchunkss      r   
<dictcomp>z.DistributedArray.index_map.<locals>.<dictcomp>   s=     = = =C 66v666 = = =r   )rB   itemsr%   s    r   	index_mapzDistributedArray.index_map   s2    = =#'#3#9#9#;#;= = = 	=r   c                     i }| j                                         D ]I\  }}g ||<   |D ]<}|                    | j                   ||                             |j                   =J|S )zReturn the chunks with all buffered data flushed.

        Buffered data are created in situations such as resharding and mode
        changing.
        )rB   ri   flushrC   appendr1   )r&   rH   rf   rg   rd   s        r   
all_chunkszDistributedArray.all_chunks   s     02
+1133 	4 	4KC JsO 4 4DJ'''3&&u{33334 r   r]   c                    | j                                         |z  }|                    | j                                                  st	          j        |          | _        || j                                        z
  D ]?}t          |          5  t                      | j        |<   d d d            n# 1 swxY w Y   @d S rS   )	rB   r\   issubsetrE   r   _create_communicatorsrD   r   r   )r&   r]   rf   s      r   _prepare_comms_and_streamsz+DistributedArray._prepare_comms_and_streams   s     "''))G3 0 0 2 233 	H(>wGGDKT]//111 	. 	.C . .%+XXc". . . . . . . . . . . . . . .	. 	.s   B22B6	9B6	c                 .    t          j        |||          S rS   )r   _execute)r&   kernelrU   rV   s       r   $__cupy_override_elementwise_kernel__z5DistributedArray.__cupy_override_elementwise_kernel__   s     $VT6:::r   c                     |t          d          |t          d          |rt          d          t          j        | |||          S )Nzaxis must be specifiedzArgument `out` is not supportedz$Argument `keepdims` is not supported)rX   r   rt   )r&   ru   axisrG   outkeepdimss         r   "__cupy_override_reduction_kernel__z3DistributedArray.__cupy_override_reduction_kernel__   s[    
 <7888?@AAA 	GEFFF"4u===r   c                 T    |j         dk    r|dk    rt          j        |i |S t          S )Nmatmul__call__)r   r   r}   NotImplemented)r&   ufuncmethodinputsrV   s        r   __array_ufunc__z DistributedArray.__array_ufunc__   s4    >X%%&J*>*>>64V444r   c                 d    t          |t                    rt          j        | |          S t          S rS   )
isinstancerA   r   r}   r   )xys     r   
__matmul__zDistributedArray.__matmul__   s-    a)** 	">!Q'''!!r   c                 <   i }| j                                         D ]\  }}d |D             ||<   | j        t          j        urX|                     | j                                                    t          j        | j        | j	        || j
        | j                   |S )Nc                 6    g | ]}|                                 S r   )copyrb   s     r   re   zEDistributedArray._copy_chunks_map_in_replica_mode.<locals>.<listcomp>   s     @@@uzz||@@@r   )rB   ri   rC   r   REPLICArr   r\   r   _all_reduce_intersectionsrF   rE   rD   )r&   rH   rf   rg   s       r    _copy_chunks_map_in_replica_modez1DistributedArray._copy_chunks_map_in_replica_mode   s    
+1133 	A 	AKC@@@@@JsOO:V^++++D,<,A,A,C,CDDD,
DJ
DKP P P r   op_modec                 >   |                                  }t          j        |                                          D ]!}|                    t
          j                   "t          t          j        |                                                    }|                    | j	                  }t          t          |                    D ]V}||         }t          |dz   t          |                    D ]+}||         }	|                    |	j        | j        |           ,W|S )N   )r   r   from_iterablevaluesrl   r   r   listidentity_ofrG   rangelenset_identity_on_intersectionra   rF   )
r&   r   rH   rd   chunks_listidentityia_chunkjb_chunks
             r   _copy_chunks_map_in_op_modez,DistributedArray._copy_chunks_map_in_op_mode  s    ::<<
():):)<)<== 	( 	(EKK''''5.z/@/@/B/BCCDD&&tz22 s;''(( 	9 	9A!!nG1q5#k"2"233 9 9%a.44M4:x9 9 9 99
 r   c                    | j         |u r| S t          | j                  dk    ru| j                                        \  }t          |          dk    rG|d                             | j                    t          | j        | j        | j        || j                  S |t          j
        u r|                                 }n|J |                     |          }t          | j        | j        ||| j                  S )Nr   r   )rC   r   rB   r   rl   rA   rF   rG   rE   r   r   r   r   )r&   r   rg   rH   s       r   _to_op_modezDistributedArray._to_op_mode  s    :  Kt  A%%&--//GF6{{aq	
+++'J
D,<T[* * * fn$$>>@@JJ&&&99'BBJJ
JF F 	Fr   c                 ,    |                      |          S )zReturn a view or a copy in the given mode.

        Args:
            mode (mode Object): How overlaps of
                the chunks are interpreted.

        .. seealso::
                :attr:`DistributedArray.mode` for details about modes.
        )r   )r&   rI   s     r   change_modezDistributedArray.change_mode3  s     %%%r   rj   c           	         t          j        | j        |          }|| j        k    r| S | j        }i }|                                D ]\  }}g ||<   |D ]t}t          |          5  t          j        | j        |          }t          j	        |||          }	||         
                    |	           ddd           n# 1 swxY w Y   u|                     |                                           t          j        |                                          D ]}
|
                    | j                   | j        t$          j        ur|
                                }
t          j        |                                          D ]/}|
                    || j        | j        | j        | j                   0t1          | j        | j        || j        | j                  S )a"  Return a view or a copy having the given index_map.

        Data transfers across devices are done on separate streams created
        internally. To make them asynchronous, transferred data is buffered and
        reflected to the chunks when necessary.

        Args:
            index_map (dict from int to array indices): Indices for the chunks
                that devices with designated IDs own. The current index_map of
                a distributed array can be obtained from
                :attr:`DistributedArray.index_map`.
        N)r   _normalize_index_maprF   rj   rB   ri   r   _shape_after_indexingr   create_placeholderrm   rr   r\   r   r   r   rl   rC   r   r   r   apply_torE   rD   rA   rG   )r&   rj   new_index_mapold_chunks_mapnew_chunks_maprf   idxsr5   	dst_shape	new_chunk	src_chunk	dst_chunks               r   reshardzDistributedArray.reshard?  s#    %9J	# #DN**K)24 ',,.. 	: 	:IC"$N3 : :C[[ : : , B
C!) !)I & 9)S# N NI"3'..y999	: : : : : : : : : : : : : : :: 	''	(8(8999 ,^-B-B-D-DEE 		0 		0IOODJ'''z//%NN,,	"01F1F1H1HII 0 0	""tz4:K0 0 0 00
  J
NDJM M 	Ms   "AB::B>B>CTc                    |t          d          |dk    rt          d          |t          d          t          j        | j                                                  D ]}|                    | j                   | j        t          j        u r!t          j
        | j        | j                  }n?| j                            | j                  }t          j        | j        || j                  }t          j        |          }t          j        | j                                                  D ]}|j                                         |j        }| j        t          j        u rt'          j        |j                  ||<   R| j                            ||         t'          j        |j                  ||                    |                    | j                  S )z.Return a copy of the array on the host memory.NzArgument `stream` not supportedr   zArgument `order` not supportedzArgument `out` not supported)rG   )rX   r   r   rB   r   rl   rC   r   r   numpyemptyrF   rG   r   full
atleast_1dr2   synchronizera   cupyasnumpyr1   
numpy_funcreshape)	r&   r>   orderry   blockingrd   np_arrayr   r5   s	            r   getzDistributedArray.getx  s    @AAAC<<?@@@?=>>>()9)@)@)B)BCC 	$ 	$EKK
####:''{4:TZ@@@HHz--dj99Hz$*h
CCH #H--()9)@)@)B)BCC 	M 	MEK##%%%+CzV^++ $U[ 9 9
%%SM4<#<#<hsmM M M M 
+++r   c                      t          d          )Not supported.z8DistributedArray currently does not support __getitem__.NotImplementedErrorr&   rU   rV   s      r   __getitem__zDistributedArray.__getitem__      !FH H 	Hr   c                      t          d          )r   z8DistributedArray currently does not support __setitem__.r   r   s      r   __setitem__zDistributedArray.__setitem__  r   r   c                      t          d          )r   z4DistributedArray currently does not support __len__.r   r   s      r   __len__zDistributedArray.__len__      !BD D 	Dr   c                      t          d          )r   z5DistributedArray currently does not support __iter__.r   r   s      r   __iter__zDistributedArray.__iter__      !CE E 	Er   c                      t          d          )r   z5DistributedArray currently does not support __copy__.r   r   s      r   __copy__zDistributedArray.__copy__  r   r   c                      t          d          )r   z0DistributedArray currently does not support all.r   r   s      r   allzDistributedArray.all      !>@ @ 	@r   c                      t          d          )r   z0DistributedArray currently does not support any.r   r   s      r   anyzDistributedArray.any  r   r   c                      t          d          )r   z3DistributedArray currently does not support argmax.r   r   s      r   argmaxzDistributedArray.argmax      !AC C 	Cr   c                      t          d          )r   z3DistributedArray currently does not support argmin.r   r   s      r   argminzDistributedArray.argmin  r   r   c                      t          d          )r   z9DistributedArray currently does not support argpartition.r   r   s      r   argpartitionzDistributedArray.argpartition      !GI I 	Ir   c                      t          d          )r   z4DistributedArray currently does not support argsort.r   r   s      r   argsortzDistributedArray.argsort  r   r   c                      t          d          )r   z3DistributedArray currently does not support astype.r   r   s      r   astypezDistributedArray.astype  r   r   c                      t          d          )r   z3DistributedArray currently does not support choose.r   r   s      r   choosezDistributedArray.choose  r   r   c                      t          d          )r   z1DistributedArray currently does not support clip.r   r   s      r   clipzDistributedArray.clip      !?A A 	Ar   c                      t          d          )r   z5DistributedArray currently does not support compress.r   r   s      r   compresszDistributedArray.compress  r   r   c                      t          d          )r   z1DistributedArray currently does not support copy.r   r   s      r   r   zDistributedArray.copy  r   r   c                      t          d          )r   z4DistributedArray currently does not support cumprod.r   r   s      r   cumprodzDistributedArray.cumprod  r   r   c                      t          d          )r   z3DistributedArray currently does not support cumsum.r   r   s      r   cumsumzDistributedArray.cumsum  r   r   c                      t          d          )r   z5DistributedArray currently does not support diagonal.r   r   s      r   diagonalzDistributedArray.diagonal  r   r   c                      t          d          )r   z0DistributedArray currently does not support dot.r   r   s      r   dotzDistributedArray.dot  r   r   c                      t          d          )r   z1DistributedArray currently does not support dump.r   r   s      r   dumpzDistributedArray.dump  r   r   c                      t          d          )r   z2DistributedArray currently does not support dumps.r   r   s      r   dumpszDistributedArray.dumps      !@B B 	Br   c                      t          d          )r   z1DistributedArray currently does not support fill.r   r   s      r   fillzDistributedArray.fill  r   r   c                      t          d          )r   z4DistributedArray currently does not support flatten.r   r   s      r   flattenzDistributedArray.flatten  r   r   c                      t          d          )r   z1DistributedArray currently does not support item.r   r   s      r   itemzDistributedArray.item  r   r   Fc                 H    |                      t          j        |d||          S )a"  Return the maximum along a given axis.

        .. note::

            Currently, it only supports non-``None`` values for ``axis`` and
            the default values for ``out`` and ``keepdims``.

        .. seealso::
           :meth:`cupy.ndarray.max`, :meth:`numpy.ndarray.max`
        N)r{   _statisticsamaxr&   rx   ry   rz   s       r   maxzDistributedArray.max  *     66dD#x9 9 	9r   c                      t          d          )r   z1DistributedArray currently does not support mean.r   r   s      r   meanzDistributedArray.mean*  r   r   c                 H    |                      t          j        |d||          S )a"  Return the minimum along a given axis.

        .. note::

            Currently, it only supports non-``None`` values for ``axis`` and
            the default values for ``out`` and ``keepdims``.

        .. seealso::
           :meth:`cupy.ndarray.min`, :meth:`numpy.ndarray.min`
        N)r{   r   aminr  s       r   minzDistributedArray.min/  r  r   c                      t          d          )r   z4DistributedArray currently does not support nonzero.r   r   s      r   nonzerozDistributedArray.nonzero=  r   r   c                      t          d          )r   z6DistributedArray currently does not support partition.r   r   s      r   	partitionzDistributedArray.partitionB      !DF F 	Fr   c                     |#|                      t          j        ||||          S |                      t          j        ||||          S )a$  Return the minimum along a given axis.

        .. note::

            Currently, it only supports non-``None`` values for ``axis`` and
            the default values for ``out`` and ``keepdims``.

        .. seealso::
           :meth:`cupy.ndarray.prod`, :meth:`numpy.ndarray.prod`
        )r{   _mathprod_auto_dtypeprod_keep_dtyper&   rx   rG   ry   rz   s        r   prodzDistributedArray.prodG  s]     =::%tUCC C C ::%tUCC C Cr   c                      t          d          )r   z0DistributedArray currently does not support ptp.r   r   s      r   ptpzDistributedArray.ptpY  r   r   c                      t          d          )r   z0DistributedArray currently does not support put.r   r   s      r   putzDistributedArray.put^  r   r   c                      t          d          )r   z2DistributedArray currently does not support ravel.r   r   s      r   ravelzDistributedArray.ravelc  r   r   c                      t          d          )r   z9DistributedArray currently does not support reduced_view.r   r   s      r   reduced_viewzDistributedArray.reduced_viewh  r   r   c                      t          d          )r   z3DistributedArray currently does not support repeat.r   r   s      r   repeatzDistributedArray.repeatm  r   r   c                      t          d          )r   z4DistributedArray currently does not support reshape.r   r   s      r   r   zDistributedArray.reshaper  r   r   c                      t          d          )r   z2DistributedArray currently does not support round.r   r   s      r   roundzDistributedArray.roundw  r   r   c                      t          d          )r   z8DistributedArray currently does not support scatter_add.r   r   s      r   scatter_addzDistributedArray.scatter_add|  r   r   c                      t          d          )r   z8DistributedArray currently does not support scatter_max.r   r   s      r   scatter_maxzDistributedArray.scatter_max  r   r   c                      t          d          )r   z8DistributedArray currently does not support scatter_min.r   r   s      r   scatter_minzDistributedArray.scatter_min  r   r   c                      t          d          )r   z9DistributedArray currently does not support searchsorted.r   r   s      r   searchsortedzDistributedArray.searchsorted  r   r   c                      t          d          )r   z0DistributedArray currently does not support set.r   r   s      r   setzDistributedArray.set  r   r   c                      t          d          )r   z1DistributedArray currently does not support sort.r   r   s      r   sortzDistributedArray.sort  r   r   c                      t          d          )r   z4DistributedArray currently does not support squeeze.r   r   s      r   squeezezDistributedArray.squeeze  r   r   c                      t          d          )r   z0DistributedArray currently does not support std.r   r   s      r   stdzDistributedArray.std  r   r   c                     |#|                      t          j        ||||          S |                      t          j        ||||          S )a"  Return the minimum along a given axis.

        .. note::

            Currently, it only supports non-``None`` values for ``axis`` and
            the default values for ``out`` and ``keepdims``.

        .. seealso::
           :meth:`cupy.ndarray.sum`, :meth:`numpy.ndarray.sum`
        )r{   r  sum_auto_dtypesum_keep_dtyper  s        r   sumzDistributedArray.sum  s]     =::$dE3B B B ::$dE3B B Br   c                      t          d          )r   z5DistributedArray currently does not support swapaxes.r   r   s      r   swapaxeszDistributedArray.swapaxes  r   r   c                      t          d          )r   z1DistributedArray currently does not support take.r   r   s      r   takezDistributedArray.take  r   r   c                      t          d          )r   z5DistributedArray currently does not support toDlpack.r   r   s      r   toDlpackzDistributedArray.toDlpack  r   r   c                      t          d          )r   z4DistributedArray currently does not support tobytes.r   r   s      r   tobyteszDistributedArray.tobytes  r   r   c                      t          d          )r   z3DistributedArray currently does not support tofile.r   r   s      r   tofilezDistributedArray.tofile  r   r   c                      t          d          )r   z3DistributedArray currently does not support tolist.r   r   s      r   tolistzDistributedArray.tolist  r   r   c                      t          d          )r   z2DistributedArray currently does not support trace.r   r   s      r   tracezDistributedArray.trace  r   r   c                      t          d          )r   z6DistributedArray currently does not support transpose.r   r   s      r   	transposezDistributedArray.transpose  r  r   c                      t          d          )r   z0DistributedArray currently does not support var.r   r   s      r   varzDistributedArray.var  r   r   c                      t          d          )r   z1DistributedArray currently does not support view.r   r   s      r   viewzDistributedArray.view  r   r   c                      t          d          )r   z.DistributedArray currently does not support T.r   r%   s    r   TzDistributedArray.T  s     "<> > 	>r   c                      t          d          )r   z1DistributedArray currently does not support base.r   r%   s    r   basezDistributedArray.base       "?A A 	Ar   c                      t          d          )r   z4DistributedArray currently does not support cstruct.r   r%   s    r   cstructzDistributedArray.cstruct       "BD D 	Dr   c                      t          d          )r   z1DistributedArray currently does not support data.r   r%   s    r   datazDistributedArray.data  rM  r   c                      t          d          )r   z3DistributedArray currently does not support device.r   r%   s    r   r'   zDistributedArray.device   s     "AC C 	Cr   c                      t          d          )r   z2DistributedArray currently does not support flags.r   r%   s    r   flagszDistributedArray.flags  s     "@B B 	Br   c                      t          d          )r   z1DistributedArray currently does not support flat.r   r%   s    r   flatzDistributedArray.flat  rM  r   c                      t          d          )r   z1DistributedArray currently does not support imag.r   r%   s    r   imagzDistributedArray.imag  rM  r   c                      t          d          )r   z1DistributedArray currently does not support real.r   r%   s    r   realzDistributedArray.real  rM  r   c                 *    t                      j        S )zTuple of array dimensions.

        Assignment to this property is currently not supported.

        .. seealso: :attr:`cupy.ndarray.shape`, :attr:`numpy.ndarray.shape`

        )rL   rF   )r&   rQ   s    r   rF   zDistributedArray.shape  s     ww}r   c                      t          d          )Nz@DistributedArray currently does not support assignment to shape.r   )r&   newshapes     r   rF   zDistributedArray.shape)  s    !NP P 	Pr   c                      t          d          )r   z4DistributedArray currently does not support strides.r   r%   s    r   strideszDistributedArray.strides.  rP  r   )r"   N)Nr   NT)NNF)NNNN)NNNF)pr   r   r   __doc__dictintr   r   __annotations__r   Moder   r   r   tupler	   r   rM   rT   rY   r(   rI   r   r]   slicerj   r
   rn   rr   rv   r   r{   r   r   r   _OpModer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r  r  r  r   r   r"  r$  r&  r(  r*  r,  r.  r0  r4  r6  r8  r:  r<  r>  r@  rB  rD  rF  rH  rJ  rL  rO  rR  r'   rU  rW  rY  r[  rF   setterr`  __classcell__)rQ   s   @r   rA   rA   >   s         < c4<'((((;3;m#$$$$
 #N48	 #s(O,5d6l*+ k S-/01	
 
     $* * * * * *$ $ $ 7fk 7 7 7 X7r '# ' ' ' X' =4T%s
*;%< <= = = = X=
Dd7m!34    
.(3- 
.D 
. 
. 
. 
.; ; ;
>9<> > > >  
" " "$sDL7H2I    !>.23V3D.E   0F6; F3E F F F F(
& 
&0B 
& 
& 
& 
&7Mc3h 7M4F 7M 7M 7M 7Mt :>!, !,	!, !, !, !,NH H H
H H H
D D D
E E E
E E E
@ @ @
@ @ @
C C C
C C C
I I I
D D D
C C C
C C C
A A A
E E E
A A A
D D D
C C C
E E E
@ @ @
A A A
B B B
A A A
D D D
A A A
9 9 9 9A A A
9 9 9 9D D D
F F F
C C C C$@ @ @
@ @ @
B B B
I I I
C C C
D D D
B B B
H H H
H H H
H H H
I I I
@ @ @
A A A
D D D
@ @ @
B B B B$E E E
A A A
E E E
D D D
C C C
C C C
B B B
F F F
@ @ @
A A A
 > > X>
 A A XA
 D D XD
 A A XA
 C C XC
 B B XB
 A A XA
 A A XA
 A A XA
     X \P P \P D D XD D D D Dr   rA   r1   rj   rI   r"   c           	         t          | t                    rl| j        |k    r|                     |          } | j        |k    r|                     |          } t          | j        | j        | j        | j	        | j
                  S t          | t          j        t          f          r%|t          j        k    r|                                 } nt          j        |           } t#          j        | j        |          }d}t          | t                    rJ| j        j        }|                                | j        j        hz  }t-          j        |          }t0          }n	d}t2          }i }|                                D ]s\  }}	g ||<   |	D ]f}
| |
         } ||||
||          }||                             |           |t          j        ur$|j        s|                    | j                  | |
<   gtt          | j        | j        |||          S )al  Creates a distributed array from the given data.

    This function does not check if all elements of the given array are stored
    in some of the chunks.

    Args:
        array (array_like): :class:`DistributedArray` object,
            :class:`cupy.ndarray` object or any other object that can be passed
            to :func:`numpy.array`.
        index_map (dict from int to array indices): Indices for the chunks
            that devices with designated IDs own. One device can have multiple
            chunks, which can be specified as a list of array indices.
        mode (mode object, optional): Mode that determines how overlaps
            of the chunks are interpreted. Defaults to
            ``cupyx.distributed.array.REPLICA``.

    .. seealso::
            :attr:`DistributedArray.mode` for details about modes.

    Example:
        >>> array = cupy.arange(9).reshape(3, 3)
        >>> A = distributed_array(
        ...     array,
        ...     {0: [(slice(2), slice(2)),  # array[:2, :2]
        ...          slice(None, None, 2)], # array[::2]
        ...      1:  (slice(1, None), 2)})  # array[1:, 2]
    Nr$   )r   rA   rI   r   rj   r   rF   rG   rB   rC   rE   r   r
   r   r   r   r1   r   r   r'   idr\   r   rq   r<   r?   ri   rm   
idempotentr   )r1   rj   rI   r7   r3   r]   
make_chunkrH   rf   r   r5   chunk_arrayrd   s                r   distributed_arrayrp  5  s   @ %)** :%%d++E?i''MM),,EKe&7L  	 %%-122 #6>!!JJLLEE""1%+yIIIE %!! &,/..""elo%664W==&

%
*,J__&& 	; 	;	T
3 	; 	;C*KJwS+uEEEsO""5)))FN** O +!--ek::c
	; U[*dE; ; ;r   )8	itertoolsr   typingr   r   r   r   r   numpy.typingr   r	   r   cupy._core.corer
   cupy._creation.from_data	_creation	from_datar,   cupy._core._routines_math_core_routines_mathr  cupy._core._routines_statistics_routines_statisticsr   cupy.cuda.devicer   cupy.cuda.streamr   r   cupyx.distributed.arrayr   cupyx.distributed.array._chunkr   r   &cupyx.distributed.array._data_transferr   r   r   r   r   r   cudamemoryMemoryr   MemoryPointerr!   r<   r?   rA   r   rb  rc  re  rp  r   r   r   <module>r     s         4 4 4 4 4 4 4 4 4 4 4 4  " " " " " " " " " " " "  # # # # # # 6 6 6 6 6 6 6 6 6 ) ) ) ) ) ) ) ) ) 5 5 5 5 5 5 5 5 5 # # # # # # # # # # # # / / / / / / * * * * * * 1 1 1 1 1 1 2 2 2 2 2 2 @ @ @ @ @ @ 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * . . . . . . + + + + + +	 	 	 	 	di.5 	 	 	    ty/=   + + +J J JtD tD tD tD tDw tD tD tDt N; N;N;CH~N; +N; 	N; N; N; N; N; N;r   