o
    GZh                     @   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 |i |S NImmutableSparseNDimArray)selfargskwargs r   S/var/www/auris/lib/python3.10/site-packages/sympy/tensor/array/sparse_ndim_array.py__new__   s   zSparseNDimArray.__new__c                    s     }|dur|S   t tr@tdd  D r@ \}}fdd|D } fddt|D }t||S   j	
 tj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       | ]}t |tV  qd S r   
isinstanceslice.0ir   r   r   	<genexpr>7       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.matricesr1   Zrank
ValueErrorr   itemsZ_get_tuple_indexr/   )r   r1   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 r   r   xyr   r   r   <lambda>b       z)SparseNDimArray.reshape.<locals>.<lambda>zInvalid reshape parameters )	functoolsreduce
_loop_sizer4   r*   r   )r   ZnewshapeZnew_total_sizer   r   r   reshapea   s   
zSparseNDimArray.reshapeN)	__name__
__module____qualname__r   r-   classmethodr0   r8   rB   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i |\}}ttt| }| || |r#tdd |nt|}t|t	t
fr3t
|}ni }tt|D ]\}}|dkrIt|||< q;t
|}tj| ||fi |}	||	_t||	_||	_||	_|	S )Nc                 S   r9   r   r   r:   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_rankrA   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)Nzimmutable N-dim array)	TypeError)r   r&   r7   r   r   r   __setitem__      z$ImmutableSparseNDimArray.__setitem__c                 C      t | S r   )MutableSparseNDimArrayr"   r   r   r   
as_mutable   rP   z#ImmutableSparseNDimArray.as_mutableNN)rC   rD   rE   r   rO   rS   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 )rR   Nc                 K   s   | j ||fi |\}}t| }||_t||_|r#tdd |nt||_t	|t
tfr6t
||_|S i |_tt|D ]\}}|dkrNt||j|< q?|S )Nc                 S   r9   r   r   r:   r   r   r   r=      r>   z0MutableSparseNDimArray.__new__.<locals>.<lambda>r   )rG   objectr   rJ   r$   rK   r?   r@   rA   r   rI   r   r   r)   r
   r   )r.   rL   r/   r   rM   r   r   r%   r   r   r   r      s   


zMutableSparseNDimArray.__new__c           	      C   s   t |trFtdd |D rF| ||\}}}|D ]*}dd t||D }|| }| |}|dkr8|| j|< q|| jv rC| j| qdS | |}t|}|dkr`|| jv r`| j| dS || 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   r   r   r   r   r   r   r   r      r   z5MutableSparseNDimArray.__setitem__.<locals>.<genexpr>c                 S   s    g | ]\}}|d u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&   r7   r+   Zslice_offsetsr   Zother_iZother_valueZcomplete_indexr   r   r   rO      s"   


	z"MutableSparseNDimArray.__setitem__c                 C   rQ   r   r   r"   r   r   r   as_immutable   rP   z#MutableSparseNDimArray.as_immutablec                 C   s   dd | j  D S )Nc                 S   s   h | ]
}|j D ]}|qqS r   )free_symbols)r   rW   r   r   r   r   	<setcomp>   s    z6MutableSparseNDimArray.free_symbols.<locals>.<setcomp>)r   valuesr"   r   r   r   r[      s   z#MutableSparseNDimArray.free_symbolsrT   )rC   rD   rE   r   rO   rZ   propertyr[   r   r   r   r   rR      s    
rR   )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   rR   r   r   r   r   <module>   s    ]"