
    sg!                         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e      Z G d dee      Z G d dee      Zy)    N)List)Basic)Tuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray	ArrayKind)flattenc                   \    e Zd ZU ee   ed<   d Zedefd       Z	d Z
ed        Zd Zd Zy	)
DenseNDimArray_arrayc                     t        |i |S NImmutableDenseNDimArray)selfargskwargss      V/var/www/html/venv/lib/python3.12/site-packages/sympy/tensor/array/dense_ndim_array.py__new__zDenseNDimArray.__new__   s    &777    returnc                 @    t        j                  | j                        S r   )r   _unionr   r   s    r   kindzDenseNDimArray.kind   s    ,,r   c                    | j                  |      }||S | j                  |      }t        |t              rt	        d |D              r| j                  |      \  }}|D cg c]   }| j                  | j                  |         " }}t        |      D cg c]$  \  }}t        ||   t              st        |      & }}} t        |       ||      S | j                  |      }| j                  |   S c c}w c c}}w )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

        c              3   <   K   | ]  }t        |t                y wr   
isinstanceslice.0is     r   	<genexpr>z-DenseNDimArray.__getitem__.<locals>.<genexpr>?        +PQJq%,@+P   )_check_symbolic_index_check_index_for_getitemr"   tupleany _get_slice_data_for_array_accessr   _parse_index	enumerater#   lentype)	r   indexsyindex
sl_factorseindicesr&   arrayelnshapes	            r   __getitem__zDenseNDimArray.__getitem__   s    B ,,U3N--e4eU#+P%+P(P#'#H#H#O J@HI1T[[!2!21!56IEI+4Z+@`%!RJuUVxY^D_c"g`F`4:eV,,%%e,E;;u%% J`s   !%C4C92C9c                 |    t        j                  d |t        j                        }| j	                  dg|z  f|      S )Nc                     | |z  S r    xys     r   <lambda>z&DenseNDimArray.zeros.<locals>.<lambda>J   s
    AaC r   r   )	functoolsreducer   One_new)clsshapelist_lengths      r   zeroszDenseNDimArray.zerosH   s5    &&'7Fxx![*E22r   c                     ddl m} | j                         dk7  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.matricesrK   rank
ValueErrorrG   r   )r   rK   s     r   tomatrixzDenseNDimArray.tomatrixM   sD    " 	*99;!>??djjmTZZ]DKK@@r   c                     t        j                  d |      }|| j                  k7  r$t        d| j                  t	        |      |fz         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                     | |z  S r   r=   r>   s     r   rA   z(DenseNDimArray.reshape.<locals>.<lambda>{   s
    ac r   z2Expecting reshape size to %d but got prod(%s) = %d)rB   rC   
_loop_sizerP   strr2   r   )r   newshapenew_total_sizes      r   reshapezDenseNDimArray.reshapee   si    , #))/8DT__,QXU@ @ A A tDz$++x00r   N)__name__
__module____qualname__r   r   __annotations__r   propertyr   r   r:   classmethodrI   rQ   rX   r=   r   r   r   r      sQ    K8 -i - -.&` 3 3A01r   r   c                   6    e Zd ZddZed        Zd Zd Zd Zy)r   Nc                 *     | j                   ||fi |S r   rE   rF   iterablerG   r   s       r   r   zImmutableDenseNDimArray.__new__       sxx%2622r   c                 b    | j                   ||fi |\  }}t        t        t        |       }| j	                  ||       t        |      }t        | }t        j                  | ||fi |}||_        t        |      |_
        t        |      |_        t        j                  d |d      |_        |S )Nc                     | |z  S r   r=   r>   s     r   rA   z.ImmutableDenseNDimArray._new.<locals>.<lambda>   
    qs r   rM   )_handle_ndarray_creation_inputsr   mapr   _check_special_boundsr   r   r   _shapelistr   r1   _rankrB   rC   rT   rF   rc   rG   r   	flat_listr   s         r   rE   zImmutableDenseNDimArray._new   s    >3>>xYRXYys8U+,!!)U3I&	9%	}}S)U=f=9oZ
#**?E1Er   c                     t        d      )Nzimmutable N-dim array)	TypeError)r   r3   values      r   __setitem__z#ImmutableDenseNDimArray.__setitem__   s    /00r   c                     t        |       S r   )MutableDenseNDimArrayr   s    r   
as_mutablez"ImmutableDenseNDimArray.as_mutable   s    $T**r   c                 0    ddl m} | j                  |      S )Nr   )simplify)sympy.simplify.simplifyrx   	applyfunc)r   r   rx   s      r   _eval_simplifyz&ImmutableDenseNDimArray._eval_simplify   s    4~~h''r   r   )	rY   rZ   r[   r   r^   rE   rs   rv   r{   r=   r   r   r   r      s*    3  1+(r   r   c                   @    e Zd ZddZed        Zd Zd Zed        Z	y)ru   Nc                 *     | j                   ||fi |S r   ra   rb   s       r   r   zMutableDenseNDimArray.__new__   rd   r   c                 "    | j                   ||fi |\  }}t        |      }t        j                  |       }||_        t        |      |_        t        |      |_        |rt        j                  d |      |_        |S t        |      |_        |S )Nc                     | |z  S r   r=   r>   s     r   rA   z,MutableDenseNDimArray._new.<locals>.<lambda>   rg   r   )rh   r   objectr   rk   rl   r   r1   rm   rB   rC   rT   rn   s         r   rE   zMutableDenseNDimArray._new   s    >3>>xYRXYyI&	~~c"9oZ
FK)**?EB RUU^Q_r   c                    t        |t              rut        d |D              rc| j                  ||      \  }}}|D ]G  }t	        ||      D cg c]  \  }}|	||z
   }}}||   | j
                  | j                  |      <   I y| j                  |      }| j                  |       t        |      }|| j
                  |<   yc c}}w )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              3   <   K   | ]  }t        |t                y wr   r!   r$   s     r   r'   z4MutableDenseNDimArray.__setitem__.<locals>.<genexpr>   r(   r)   N)	r"   r,   r-   $_get_slice_data_for_array_assignmentzipr   r/   _setter_iterable_checkr   )	r   r3   rr   r6   slice_offsetsr&   indjother_is	            r   rs   z!MutableDenseNDimArray.__setitem__   s     eU#+P%+P(P-1-V-VW\^c-d*E8] C14Q1FXvsA!-37XX49'ND--a01C %%e,E''.UOE!&DKK Ys   
CCc                     t        |       S r   r   r   s    r   as_immutablez"MutableDenseNDimArray.as_immutable   s    &t,,r   c                 h    | j                   D ch c]  }|j                  D ]  }|  c}}S c c}}w r   )r   free_symbols)r   r   r&   s      r   r   z"MutableDenseNDimArray.free_symbols   s*    ;;?a?1????s   .)NN)
rY   rZ   r[   r   r^   rE   rs   r   r]   r   r=   r   r   ru   ru      s;    3  '2- @ @r   ru   )rB   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   ru   r=   r   r   <module>r      sR      " ' " ' B R R -t1Y t1n(n.@ (8.@N,< .@r   