
    sg                         d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlZ G d	 d
e      Z G d dee      Z G d de
e      Zy)    )Basic)DictTuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray)flattenNc                   4    e Zd Zd Zd Zed        Zd Zd Zy)SparseNDimArrayc                     t        |i |S NImmutableSparseNDimArray)selfargskwargss      W/var/www/html/venv/lib/python3.12/site-packages/sympy/tensor/array/sparse_ndim_array.py__new__zSparseNDimArray.__new__   s    '888    c                 j   | j                  |      }||S | j                  |      }t        |t              rt	        d |D              r| j                  |      \  }}|D cg c];  }| j                  j                  | j                  |      t        j                        = }}t        |      D cg c]$  \  }}t        ||   t              st        |      & }}} t        |       ||      S | j                  |      }| j                  j                  |t        j                        S c c}w c c}}w )aP  
        Get an element from a sparse N-dim array.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray(range(4), (2, 2))
        >>> a
        [[0, 1], [2, 3]]
        >>> a[0, 0]
        0
        >>> a[1, 1]
        3
        >>> a[0]
        [0, 1]
        >>> a[1]
        [2, 3]

        Symbolic indexing:

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

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

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

        c              3   <   K   | ]  }t        |t                y wr   
isinstanceslice.0is     r   	<genexpr>z.SparseNDimArray.__getitem__.<locals>.<genexpr>7        +PQJq%,@+P   )_check_symbolic_index_check_index_for_getitemr   tupleany _get_slice_data_for_array_access_sparse_arrayget_parse_indexr   Zero	enumerater   lentype)	r   indexsyindex
sl_factorseindicesr   arrayelnshapes	            r   __getitem__zSparseNDimArray.__getitem__   s   @ ,,U3N--e4 eU#+P%+P(P#'#H#H#O JS[\aT''++D,=,=a,@!&&I\E\+4Z+@`%!RJuUVxY^D_c"g`F`4:eV,,%%e,E%%))%88 ]`s   !A D*1D/D/c                      | i |      S )z7
        Return a sparse N-dim array of zeros.
         )clsshapes     r   zeroszSparseNDimArray.zeros@   s    
 2u~r   c                    ddl m} | j                         dk7  rt        d      i }| j                  j                         D ]  \  }}||| j                  |      <     || j                  d   | j                  d   |      S )a  
        Converts MutableDenseNDimArray to Matrix. Can convert only 2-dim array, else will raise error.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray([1 for i in range(9)], (3, 3))
        >>> b = a.tomatrix()
        >>> b
        Matrix([
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]])
        r   )SparseMatrix   zDimensions must be of size of 2   )sympy.matricesr=   rank
ValueErrorr(   items_get_tuple_indexr:   )r   r=   
mat_sparsekeyvalues        r   tomatrixzSparseNDimArray.tomatrixG   s~      	099;!>??
,,224 	;JC5:Jt,,S12	; DJJqM4::a=*EEr   c                     t        j                  d |      }|| j                  k7  rt        d|z          t	        |       | j
                  |      S )Nc                     | |z  S r   r8   xys     r   <lambda>z)SparseNDimArray.reshape.<locals>.<lambda>b   s
    ac r   zInvalid reshape parameters )	functoolsreduce
_loop_sizerB   r.   r(   )r   newshapenew_total_sizes      r   reshapezSparseNDimArray.reshapea   sJ    "))/8DT__,:XEFFtDz$,,h77r   N)	__name__
__module____qualname__r   r6   classmethodr;   rH   rT   r8   r   r   r   r      s,    9.9`  F48r   r   c                        e Zd ZddZd Zd Zy)r   Nc                     | j                   ||fi |\  }}t        t        t        |       }| j	                  ||       |rt        j                  d |      n
t        |      }t        |t        t        f      rt        |      }n2i }t        t        |            D ]  \  }}|dk7  st        |      ||<    t        |      }t        j                  | ||fi |}	||	_        t        |      |	_        ||	_        ||	_        |	S )Nc                     | |z  S r   r8   rK   s     r   rN   z2ImmutableSparseNDimArray.__new__.<locals>.<lambda>n   s
    1 r   r   )_handle_ndarray_creation_inputsr   mapr   _check_special_boundsrO   rP   r-   r   dictr   r,   r   r   r   _shape_rankrQ   r(   )
r9   iterabler:   r   	flat_list	loop_sizesparse_arrayr   r4   r   s
             r   r   z ImmutableSparseNDimArray.__new__j   s    >3>>xYRXYys8U+,!!)U3@EI$$_e<3y>	 i$.	?LL"79#56 327&.rlLO3 L)}}S,@@Z
#)r   c                     t        d      )Nzimmutable N-dim array)	TypeError)r   r/   rG   s      r   __setitem__z$ImmutableSparseNDimArray.__setitem__   s    /00r   c                     t        |       S r   )MutableSparseNDimArrayr   s    r   
as_mutablez#ImmutableSparseNDimArray.as_mutable   s    %d++r   NN)rU   rV   rW   r   rh   rl   r8   r   r   r   r   h   s    21,r   r   c                   0    e Zd ZddZd Zd Zed        Zy)rj   Nc                     | j                   ||fi |\  }}t        j                  |       }||_        t	        |      |_        |rt        j                  d |      n
t	        |      |_        t        |t        t        f      rt        |      |_        |S i |_        t        t        |            D ]#  \  }}|dk7  st        |      |j                  |<   % |S )Nc                     | |z  S r   r8   rK   s     r   rN   z0MutableSparseNDimArray.__new__.<locals>.<lambda>   s
    qs r   r   )r\   objectr   r`   r-   ra   rO   rP   rQ   r   r_   r   r(   r,   r   r   )r9   rb   r:   r   rc   r   r   r4   s           r   r   zMutableSparseNDimArray.__new__   s    >3>>xYRXYy~~c"Z
FK)**?EBQTU^Q_ i$.!%iDKwy12 	5EArQw(0""1%	5 r   c                 6   t        |t              rt        d |D              r| j                  ||      \  }}}|D ]{  }t	        ||      D cg c]  \  }}|	||z
   }}}||   }	| j                  |      }
|	dk7  r|	| j                  |
<   R|
| j                  v sa| j                  j                  |
       } y| j                  |      }t        |      }|dk(  r*|| j                  v r| j                  j                  |       y|| j                  |<   yc c}}w )a  Allows to set items to MutableDenseNDimArray.

        Examples
        ========

        >>> from sympy import MutableSparseNDimArray
        >>> a = MutableSparseNDimArray.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    z5MutableSparseNDimArray.__setitem__.<locals>.<genexpr>   r!   r"   Nr   )	r   r%   r&   $_get_slice_data_for_array_assignmentzipr*   r(   popr   )r   r/   rG   r2   slice_offsetsr   indjother_iother_valuecomplete_indexs              r   rh   z"MutableSparseNDimArray.__setitem__   s    eU#+P%+P(P-1-V-VW\^c-d*E8] ;14Q1FXvsA!-37XX#Gn!%!2!21!5!#9DD&&~6#t'9'99&&**>:; %%e,EUOEzet'9'99""&&u-,1""5) Ys   
DDc                     t        |       S r   r   rk   s    r   as_immutablez#MutableSparseNDimArray.as_immutable   s    '--r   c                     | j                   j                         D ch c]  }|j                  D ]  }|  c}}S c c}}w r   )r(   valuesfree_symbols)r   ry   r   s      r   r   z#MutableSparseNDimArray.free_symbols   s5    --446OaO1OOOOs   <rm   )rU   rV   rW   r   rh   r~   propertyr   r8   r   r   rj   rj      s'    (2>. P Pr   rj   )sympy.core.basicr   sympy.core.containersr   r   sympy.core.singletonr   sympy.core.sympifyr   %sympy.tensor.array.mutable_ndim_arrayr   sympy.tensor.array.ndim_arrayr	   r
   sympy.utilities.iterablesr   rO   r   r   rj   r8   r   r   <module>r      sM    " / " ' B G - [8i [8z,0B ,D:P- :Pr   