o
    Ti	                     @   s    d Z ddlZG dd deZdS )zv
Implementation of a compressed sparse tensor. Similar in
functionality to TensorFlow's IndexedSlices implementation.
    Nc                   @   sV   e Zd ZdZdddZdd Zedd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )SparseTensorz Compressed Sparse Tensor Nc                 C   s   || _ | j j| _|j| _|d urA|jr$| }|  | _| | _ntj|dd}|	  | _|| j | _t
| | _d S d | _d | _d | _d S )N   dim)orig_dense_tensordtype	is_sparsecoalesceindicesflattenvaluestorchsumnonzerolistsize
dense_size)selfdense_tensorresult r   S/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/runtime/sparse_tensor.py__init__   s   

zSparseTensor.__init__c                 C   s   t | jd| j| jS )Nr   )r   sparse_coo_tensorr
   	unsqueezer   r   r   r   r   r   to_coo_tensor#   s   zSparseTensor.to_coo_tensorc                   C   s   dS )Nzdeepspeed.SparseTensorr   r   r   r   r   type&   s   zSparseTensor.typec                    sL   | j d tj fddt| jd D dd}| j| jd|| jS )Nr   c                    s   g | ]} qS r   r   ).0_itr   r   
<listcomp>,   s    z)SparseTensor.to_dense.<locals>.<listcomp>r   r   )	r
   r   r   catranger   r   	new_zerosscatter_add_)r   full_indicesr   r    r   to_dense*   s   &zSparseTensor.to_densec                 C   sT   t | j }|d }t | j }|d |d  }| jd | jd  }|| |fS )Nr   r   )r   r
   r   r   r   )r   
index_size
value_sizer   r   r   r   sparse_size/   s   zSparseTensor.sparse_sizec                 C   s<   | j |j ksJ t| j|jg| _t| j|jg| _d S N)r   r   r#   r
   r   )r   br   r   r   add7   s   zSparseTensor.addc                 C   s6   |   \}}d| j | j | j| j || S )NzfDeepSpeed.SparseTensor(indices_size={}, values_size={}, dense_size={}, device={}, reduction_factor={}))r+   formatr
   r   r   r   
get_device)r   r+   r   r   r   r   __str__<   s   zSparseTensor.__str__c                 C   s   |   S r,   )r1   r   r   r   r   __repr__D   s   zSparseTensor.__repr__r,   )__name__
__module____qualname____doc__r   r   staticmethodr   r(   r+   r.   r1   r2   r   r   r   r   r      s    

r   )r6   r   objectr   r   r   r   r   <module>   s   