o
    GZh!                     @   s   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mZmZ d d	lmZ G d
d deZG dd deeZG dd deeZdS )    N)List)Basic)Tuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray	ArrayKind)flattenc                   @   sX   e Zd ZU ee ed< dd ZedefddZ	dd Z
ed	d
 Zdd Zdd ZdS )DenseNDimArray_arrayc                 O   s   t |i |S NImmutableDenseNDimArray)selfargskwargs r   R/var/www/auris/lib/python3.10/site-packages/sympy/tensor/array/dense_ndim_array.py__new__   s   zDenseNDimArray.__new__returnc                 C   s   t | jS r   )r
   Z_unionr   r   r   r   r   kind   s   zDenseNDimArray.kindc                    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	  S )aL  
        Allows to get items from N-dim array.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray([0, 1, 2, 3], (2, 2))
        >>> a
        [[0, 1], [2, 3]]
        >>> a[0, 0]
        0
        >>> a[1, 1]
        3
        >>> a[0]
        [0, 1]
        >>> a[1]
        [2, 3]


        Symbolic index:

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

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

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

        Nc                 s       | ]}t |tV  qd S r   
isinstanceslice.0ir   r   r   	<genexpr>?       z-DenseNDimArray.__getitem__.<locals>.<genexpr>c                    s   g | ]
} j  | qS r   )r   _parse_indexr   r   r   r   
<listcomp>A       z.DenseNDimArray.__getitem__.<locals>.<listcomp>c                    s&   g | ]\}}t  | trt|qS r   )r   r   len)r   r    el)indexr   r   r$   B   s   & )
Z_check_symbolic_indexZ_check_index_for_getitemr   tupleanyZ _get_slice_data_for_array_access	enumeratetyper#   r   )r   r(   ZsyindexZ
sl_factorseindicesarrayZnshaper   )r(   r   r   __getitem__   s   
!


zDenseNDimArray.__getitem__c                 G   s(   t dd |tj}| dg| f|S )Nc                 S      | | S r   r   xyr   r   r   <lambda>J       z&DenseNDimArray.zeros.<locals>.<lambda>r   )	functoolsreducer   ZOne_new)clsshapeZlist_lengthr   r   r   zerosH   s   zDenseNDimArray.zerosc                 C   s:   ddl m} |  dkrtd|| jd | jd | jS )a  
        Converts MutableDenseNDimArray to Matrix. Can convert only 2-dim array, else will raise error.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray([1 for i in range(9)], (3, 3))
        >>> b = a.tomatrix()
        >>> b
        Matrix([
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]])

        r   )Matrix   zDimensions must be of size of 2   )Zsympy.matricesr<   Zrank
ValueErrorr:   r   )r   r<   r   r   r   tomatrixM   s   zDenseNDimArray.tomatrixc                 G   sB   t dd |}|| jkrtd| jt||f t| | j|S )a  
        Returns MutableDenseNDimArray instance with new shape. Elements number
        must be        suitable to new shape. The only argument of method sets
        new shape.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray([1, 2, 3, 4, 5, 6], (2, 3))
        >>> a.shape
        (2, 3)
        >>> a
        [[1, 2, 3], [4, 5, 6]]
        >>> b = a.reshape(3, 2)
        >>> b.shape
        (3, 2)
        >>> b
        [[1, 2], [3, 4], [5, 6]]

        c                 S   r0   r   r   r1   r   r   r   r4   {   r5   z(DenseNDimArray.reshape.<locals>.<lambda>z2Expecting reshape size to %d but got prod(%s) = %d)r6   r7   
_loop_sizer?   strr,   r   )r   ZnewshapeZnew_total_sizer   r   r   reshapee   s   
zDenseNDimArray.reshapeN)__name__
__module____qualname__r   r   __annotations__r   propertyr
   r   r/   classmethodr;   r@   rC   r   r   r   r   r      s   
 0
r   c                   @   s:   e Zd ZdddZedd Zdd Zdd	 Zd
d ZdS )r   Nc                 K      | j ||fi |S r   r8   r9   iterabler:   r   r   r   r   r         zImmutableDenseNDimArray.__new__c                 K   s   | j ||fi |\}}ttt| }| || t|}t| }tj| ||fi |}||_t	||_
t||_tdd |d|_|S )Nc                 S   r0   r   r   r1   r   r   r   r4      r5   z.ImmutableDenseNDimArray._new.<locals>.<lambda>r>   )_handle_ndarray_creation_inputsr   mapr   Z_check_special_boundsr   r   r   _shapelistr   r&   _rankr6   r7   rA   r9   rM   r:   r   Z	flat_listr   r   r   r   r8      s   

zImmutableDenseNDimArray._newc                 C   s   t d)Nzimmutable N-dim array)	TypeError)r   r(   valuer   r   r   __setitem__      z#ImmutableDenseNDimArray.__setitem__c                 C      t | S r   )MutableDenseNDimArrayr   r   r   r   
as_mutable   rX   z"ImmutableDenseNDimArray.as_mutablec                 K   s   ddl m} | |S )Nr   )simplify)Zsympy.simplify.simplifyr\   Z	applyfunc)r   r   r\   r   r   r   _eval_simplify   s   
z&ImmutableDenseNDimArray._eval_simplifyr   )	rD   rE   rF   r   rI   r8   rW   r[   r]   r   r   r   r   r      s    

r   c                   @   s>   e Zd ZdddZedd Zdd Zdd	 Zed
d Z	dS )rZ   Nc                 K   rJ   r   rK   rL   r   r   r   r      rN   zMutableDenseNDimArray.__new__c                 K   sl   | j ||fi |\}}t|}t| }||_t||_t||_|r/t	
dd ||_|S t||_|S )Nc                 S   r0   r   r   r1   r   r   r   r4      r5   z,MutableDenseNDimArray._new.<locals>.<lambda>)rO   r   objectr   rQ   rR   r   r&   rS   r6   r7   rA   rT   r   r   r   r8      s   



zMutableDenseNDimArray._newc                 C   s   t |tr2tdd |D r2| ||\}}}|D ]}dd t||D }|| | j| |< qdS | |}| | t|}|| j|< dS )a  Allows to set items to MutableDenseNDimArray.

        Examples
        ========

        >>> from sympy import MutableDenseNDimArray
        >>> a = MutableDenseNDimArray.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"   z4MutableDenseNDimArray.__setitem__.<locals>.<genexpr>c                 S   s    g | ]\}}|d ur|| qS r   r   )r   indjr   r   r   r$      s     z5MutableDenseNDimArray.__setitem__.<locals>.<listcomp>N)	r   r)   r*   Z$_get_slice_data_for_array_assignmentzipr   r#   Z_setter_iterable_checkr   )r   r(   rV   r-   Zslice_offsetsr    Zother_ir   r   r   rW      s   

z!MutableDenseNDimArray.__setitem__c                 C   rY   r   r   r   r   r   r   as_immutable   rX   z"MutableDenseNDimArray.as_immutablec                 C   s   dd | j D S )Nc                 S   s   h | ]
}|j D ]}|qqS r   )free_symbols)r   r`   r    r   r   r   	<setcomp>   r%   z5MutableDenseNDimArray.free_symbols.<locals>.<setcomp>)r   r   r   r   r   rc      s   z"MutableDenseNDimArray.free_symbols)NN)
rD   rE   rF   r   rI   r8   rW   rb   rH   rc   r   r   r   r   rZ      s    


rZ   )r6   typingr   Zsympy.core.basicr   Zsympy.core.containersr   Zsympy.core.singletonr   Zsympy.core.sympifyr   Z%sympy.tensor.array.mutable_ndim_arrayr   Zsympy.tensor.array.ndim_arrayr   r	   r
   Zsympy.utilities.iterablesr   r   r   rZ   r   r   r   r   <module>   s    w