U
    L?h!                     @   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edddZ	dd Z
ed	d
 Zdd Zdd ZdS )DenseNDimArray_arrayc                 O   s
   t ||S NImmutableDenseNDimArray)selfargskwargs r   U/var/www/html/venv/lib/python3.8/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k	r|S   t trtdd  D r \}}fdd|D } fddt|D }t||S   j	  S d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   s   | ]}t |tV  qd S r   
isinstanceslice.0ir   r   r   	<genexpr>?   s     z-DenseNDimArray.__getitem__.<locals>.<genexpr>c                    s   g | ]} j  | qS r   )r   _parse_indexr   r   r   r   
<listcomp>A   s     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   | | 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.matricesr8   Zrank
ValueErrorr6   r   )r   r8   r   r   r   tomatrixM   s    zDenseNDimArray.tomatrixc                 G   sB   t dd |}|| jkr2t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   s   | | S r   r   r-   r   r   r   r0   {   r1   z(DenseNDimArray.reshape.<locals>.<lambda>z2Expecting reshape size to %d but got prod(%s) = %d)r2   r3   
_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,   classmethodr7   r<   r?   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   s   | j ||f|S r   r4   r5   iterabler6   r   r   r   r   r      s    zImmutableDenseNDimArray.__new__c                 K   s   | j ||f|\}}ttt| }| || t|}t| }tj| ||f|}||_t	||_
t||_tdd |d|_|S )Nc                 S   s   | | S r   r   r-   r   r   r   r0      r1   z.ImmutableDenseNDimArray._new.<locals>.<lambda>r:   )_handle_ndarray_creation_inputsr   mapr   Z_check_special_boundsr   r   r   _shapelistr   r#   _rankr2   r3   r=   r5   rH   r6   r   Z	flat_listr   r   r   r   r4      s    

zImmutableDenseNDimArray._newc                 C   s   t dd S )Nzimmutable N-dim array)	TypeError)r   r%   valuer   r   r   __setitem__   s    z#ImmutableDenseNDimArray.__setitem__c                 C   s   t | S r   )MutableDenseNDimArrayr   r   r   r   
as_mutable   s    z"ImmutableDenseNDimArray.as_mutablec                 K   s   ddl m} | |S )Nr   )simplify)Zsympy.simplify.simplifyrT   Z	applyfunc)r   r   rT   r   r   r   _eval_simplify   s    z&ImmutableDenseNDimArray._eval_simplify)N)	r@   rA   rB   r   rE   r4   rQ   rS   rU   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 )rR   Nc                 K   s   | j ||f|S r   rF   rG   r   r   r   r      s    zMutableDenseNDimArray.__new__c                 K   sb   | j ||f|\}}t|}t| }||_t||_t||_|rTt	
dd |nt||_|S )Nc                 S   s   | | S r   r   r-   r   r   r   r0      r1   z,MutableDenseNDimArray._new.<locals>.<lambda>)rI   r   objectr   rK   rL   r   r#   rM   r2   r3   r=   rN   r   r   r   r4      s    


zMutableDenseNDimArray._newc                 C   s   t |trbtdd |D rb| ||\}}}|D ],}dd t||D }|| | j| |< q2n&| |}| | 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   s   | ]}t |tV  qd S r   r   r   r   r   r   r       s     z4MutableDenseNDimArray.__setitem__.<locals>.<genexpr>c                 S   s    g | ]\}}|d k	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%   rP   r*   Zslice_offsetsr   Zother_ir   r   r   rQ      s    

z!MutableDenseNDimArray.__setitem__c                 C   s   t | S r   r   r   r   r   r   as_immutable   s    z"MutableDenseNDimArray.as_immutablec                 C   s   dd | j D S )Nc                 S   s   h | ]}|j D ]}|qqS r   )free_symbols)r   rX   r   r   r   r   	<setcomp>   s       z5MutableDenseNDimArray.free_symbols.<locals>.<setcomp>)r   r   r   r   r   r[      s    z"MutableDenseNDimArray.free_symbols)NN)
r@   rA   rB   r   rE   r4   rQ   rZ   rD   r[   r   r   r   r   rR      s   


rR   )r2   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   rR   r   r   r   r   <module>   s   w