U
    Š±Ë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   úG/tmp/pip-unpacked-wheel-6t8vlncq/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ƒr€t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