o
    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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   W/var/www/vscode/kcb/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
   _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   & )
_check_symbolic_index_check_index_for_getitemr   tupleany _get_slice_data_for_array_access	enumeratetyper$   r   )r   r)   syindex
sl_factorseindicesarray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   One_new)clsshape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   )sympy.matricesrE   rank
ValueErrorrB   r   )r   rE   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   r7   r   r   r8   r   r   r   r;   {   r<   z(DenseNDimArray.reshape.<locals>.<lambda>z2Expecting reshape size to %d but got prod(%s) = %d)r=   r>   
_loop_sizerJ   strr0   r   )r   newshapenew_total_sizer   r   r   reshapee   s   
zDenseNDimArray.reshapeN)__name__
__module____qualname__r   r   __annotations__r   propertyr
   r   r6   classmethodrD   rK   rP   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   r@   rA   iterablerB   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   r7   r   r   r8   r   r   r   r;      r<   z.ImmutableDenseNDimArray._new.<locals>.<lambda>rG   )_handle_ndarray_creation_inputsr   mapr   _check_special_boundsr   r   r   _shapelistr   r'   _rankr=   r>   rL   rA   rZ   rB   r   	flat_listr   r   r   r   r@      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   rg   z"ImmutableDenseNDimArray.as_mutablec                 K   s   ddl m} | |S )Nr   )simplify)sympy.simplify.simplifyrk   	applyfunc)r   r   rk   r   r   r   _eval_simplify   s   
z&ImmutableDenseNDimArray._eval_simplifyr   )	rQ   rR   rS   r   rV   r@   rf   rj   rn   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 )ri   Nc                 K   rW   r   rX   rY   r   r   r   r      r[   zMutableDenseNDimArray.__new__c                 K   sl   | j ||fi |\}}t|}t| }||_t||_t||_|r/t	
dd ||_|S t||_|S )Nc                 S   r7   r   r   r8   r   r   r   r;      r<   z,MutableDenseNDimArray._new.<locals>.<lambda>)r\   r   objectr   r_   r`   r   r'   ra   r=   r>   rL   rb   r   r   r   r@      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-   $_get_slice_data_for_array_assignmentzipr   r$   _setter_iterable_checkr   )r   r)   re   r3   slice_offsetsr!   other_ir   r   r   rf      s   

z!MutableDenseNDimArray.__setitem__c                 C   rh   r   r   r   r   r   r   as_immutable   rg   z"MutableDenseNDimArray.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>   r&   z5MutableDenseNDimArray.free_symbols.<locals>.<setcomp>)r   r   r   r   r   rx      s   z"MutableDenseNDimArray.free_symbols)NN)
rQ   rR   rS   r   rV   r@   rf   rw   rU   rx   r   r   r   r   ri      s    


ri   )r=   typingr   sympy.core.basicr   sympy.core.containersr   sympy.core.singletonr   sympy.core.sympifyr   %sympy.tensor.array.mutable_ndim_arrayr   sympy.tensor.array.ndim_arrayr   r	   r
   sympy.utilities.iterablesr   r   r   ri   r   r   r   r   <module>   s    w