U
    L?h                     @   s   d dl mZ d dlmZ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 dlmZ d dlZG d	d
 d
eZG dd deeZG dd de
eZdS )    )Basic)DictTuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray)flattenNc                   @   s8   e Zd Zdd Zdd Zedd Zdd Zd	d
 ZdS )SparseNDimArrayc                 O   s
   t ||S NImmutableSparseNDimArray)selfargskwargs r   V/var/www/html/venv/lib/python3.8/site-packages/sympy/tensor/array/sparse_ndim_array.py__new__   s    zSparseNDimArray.__new__c                    s     }|dk	r|S   t trtdd  D r \}}fdd|D } fddt|D }t||S   j	
 tjS dS )aP  
        Get an element from a sparse N-dim array.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray(range(4), (2, 2))
        >>> a
        [[0, 1], [2, 3]]
        >>> a[0, 0]
        0
        >>> a[1, 1]
        3
        >>> a[0]
        [0, 1]
        >>> a[1]
        [2, 3]

        Symbolic indexing:

        >>> from sympy.abc import i, j
        >>> a[i, j]
        [[0, 1], [2, 3]][i, j]

        Replace `i` and `j` to get element `(0, 0)`:

        >>> a[i, j].subs({i: 0, j: 0})
        0

        Nc                 s   s   | ]}t |tV  qd S r   
isinstanceslice.0ir   r   r   	<genexpr>7   s     z.SparseNDimArray.__getitem__.<locals>.<genexpr>c                    s"   g | ]} j  |tjqS r   )_sparse_arrayget_parse_indexr   Zeror   r   r   r   
<listcomp>9   s     z/SparseNDimArray.__getitem__.<locals>.<listcomp>c                    s&   g | ]\}}t  | trt|qS r   )r   r   len)r   r   el)indexr   r   r!   :   s      )Z_check_symbolic_indexZ_check_index_for_getitemr   tupleanyZ _get_slice_data_for_array_access	enumeratetyper   r   r   r   r   )r   r$   ZsyindexZ
sl_factorseindicesarrayZnshaper   )r$   r   r   __getitem__   s     


zSparseNDimArray.__getitem__c                 G   s
   | i |S )z7
        Return a sparse N-dim array of zeros.
        r   )clsshaper   r   r   zeros@   s    zSparseNDimArray.zerosc                 C   s^   ddl m} |  dkr tdi }| j D ]\}}||| |< q.|| jd | jd |S )a  
        Converts MutableDenseNDimArray to Matrix. Can convert only 2-dim array, else will raise error.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray([1 for i in range(9)], (3, 3))
        >>> b = a.tomatrix()
        >>> b
        Matrix([
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]])
        r   )SparseMatrix   zDimensions must be of size of 2   )Zsympy.matricesr/   Zrank
ValueErrorr   itemsZ_get_tuple_indexr-   )r   r/   Z
mat_sparsekeyvaluer   r   r   tomatrixG   s    zSparseNDimArray.tomatrixc                 G   s6   t dd |}|| jkr&td| t| | j|S )Nc                 S   s   | | S r   r   xyr   r   r   <lambda>b       z)SparseNDimArray.reshape.<locals>.<lambda>zInvalid reshape parameters )	functoolsreduce
_loop_sizer2   r(   r   )r   ZnewshapeZnew_total_sizer   r   r   reshapea   s    
zSparseNDimArray.reshapeN)	__name__
__module____qualname__r   r+   classmethodr.   r6   r?   r   r   r   r   r      s   0
r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	r   Nc           
      K   s   | j ||f|\}}ttt| }| || |rBtdd |nt|}t|t	t
frbt
|}n.i }tt|D ]\}}|dkrrt|||< qrt
|}tj| ||f|}	||	_t||	_||	_||	_|	S )Nc                 S   s   | | S r   r   r7   r   r   r   r:   n   r;   z2ImmutableSparseNDimArray.__new__.<locals>.<lambda>r   )_handle_ndarray_creation_inputsr   mapr   Z_check_special_boundsr<   r=   r"   r   dictr   r'   r
   r   r   _shape_rankr>   r   )
r,   iterabler-   r   	flat_listZ	loop_sizeZsparse_arrayr   r#   r   r   r   r   r   j   s"    

z ImmutableSparseNDimArray.__new__c                 C   s   t dd S )Nzimmutable N-dim array)	TypeError)r   r$   r5   r   r   r   __setitem__   s    z$ImmutableSparseNDimArray.__setitem__c                 C   s   t | S r   )MutableSparseNDimArrayr    r   r   r   
as_mutable   s    z#ImmutableSparseNDimArray.as_mutable)NN)r@   rA   rB   r   rL   rN   r   r   r   r   r   h   s   
r   c                   @   s2   e Zd Zd
ddZdd Zdd Zedd	 ZdS )rM   Nc                 K   s   | j ||f|\}}t| }||_t||_|rBtdd |nt||_t	|t
tfrht
||_|S i |_tt|D ]\}}|dkrzt||j|< qz|S )Nc                 S   s   | | S r   r   r7   r   r   r   r:      r;   z0MutableSparseNDimArray.__new__.<locals>.<lambda>r   )rD   objectr   rG   r"   rH   r<   r=   r>   r   rF   r   r   r'   r
   r   )r,   rI   r-   r   rJ   r   r   r#   r   r   r   r      s    


zMutableSparseNDimArray.__new__c           	      C   s   t |trtdd |D r| ||\}}}|D ]T}dd t||D }|| }| |}|dkrp|| j|< q2|| jkr2| j| q2n<| |}t|}|dkr|| jkr| j| n
|| j|< dS )a  Allows to set items to MutableDenseNDimArray.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray.zeros(2, 2)
        >>> a[0, 0] = 1
        >>> a[1, 1] = 1
        >>> a
        [[1, 0], [0, 1]]
        c                 s   s   | ]}t |tV  qd S r   r   r   r   r   r   r      s     z5MutableSparseNDimArray.__setitem__.<locals>.<genexpr>c                 S   s    g | ]\}}|d k	r|| qS r   r   )r   indjr   r   r   r!      s      z6MutableSparseNDimArray.__setitem__.<locals>.<listcomp>r   N)	r   r%   r&   Z$_get_slice_data_for_array_assignmentzipr   r   popr   )	r   r$   r5   r)   Zslice_offsetsr   Zother_iZother_valueZcomplete_indexr   r   r   rL      s    


z"MutableSparseNDimArray.__setitem__c                 C   s   t | S r   r   r    r   r   r   as_immutable   s    z#MutableSparseNDimArray.as_immutablec                 C   s   dd | j  D S )Nc                 S   s   h | ]}|j D ]}|qqS r   )free_symbols)r   rQ   r   r   r   r   	<setcomp>   s       z6MutableSparseNDimArray.free_symbols.<locals>.<setcomp>)r   valuesr    r   r   r   rU      s    z#MutableSparseNDimArray.free_symbols)NN)r@   rA   rB   r   rL   rT   propertyrU   r   r   r   r   rM      s
   
rM   )Zsympy.core.basicr   Zsympy.core.containersr   r   Zsympy.core.singletonr   Zsympy.core.sympifyr   Z%sympy.tensor.array.mutable_ndim_arrayr   Zsympy.tensor.array.ndim_arrayr   r	   Zsympy.utilities.iterablesr
   r<   r   r   rM   r   r   r   r   <module>   s   ]"