
    sh                         S SK Jr  S SKJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJrJr  S SKJr  S SKr " S	 S
\5      r " S S\\5      r " S S\
\5      rg)    )Basic)DictTuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray)flattenNc                   <    \ rS rSrS rS r\S 5       rS rS r	Sr
g)	SparseNDimArray   c                     [        U0 UD6$ NImmutableSparseNDimArray)selfargskwargss      x/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/sympy/tensor/array/sparse_ndim_array.py__new__SparseNDimArray.__new__   s    '888    c                    U R                  U5      nUb  U$ U R                  U5      n[        U[        5      (       a  [	        S U 5       5      (       a  U R                  U5      u  p4U Vs/ s H;  oPR                  R                  U R                  U5      [        R                  5      PM=     nn[        U5       VVs/ s H)  u  pW[        X   [        5      (       d  M  [        U5      PM+     nnn[        U 5      " Xh5      $ U R                  U5      nU R                  R                  U[        R                  5      $ s  snf s  snnf )a  
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   B   #    U  H  n[        U[        5      v   M     g 7fr   
isinstanceslice.0is     r   	<genexpr>.SparseNDimArray.__getitem__.<locals>.<genexpr>7        +P%QJq%,@,@%   )_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__SparseNDimArray.__getitem__   s   @ ,,U3N--e4 eU##+P%+P(P(P#'#H#H#O JS[\S[a''++D,=,=a,@!&&IS[E\+4Z+@`+@%!JuxY^D_gc"g+@F`:e,,%%e,E%%))%88 ]`s   +AD<=EEc                     U " 0 U5      $ )z'
Return a sparse N-dim array of zeros.
 )clsshapes     r   zerosSparseNDimArray.zeros@   s    
 2u~r   c                    SSK Jn  U R                  5       S:w  a  [        S5      e0 nU R                  R                  5        H  u  p4XBU R                  U5      '   M     U" U R                  S   U R                  S   U5      $ )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.matricesrB   rank
ValueErrorr+   items_get_tuple_indexr>   )r   rB   
mat_sparsekeyvalues        r   tomatrixSparseNDimArray.tomatrixG   su      	099;!>??
,,224JC5:t,,S12 5 DJJqM4::a=*EEr   c                     [         R                  " S U5      nX R                  :w  a  [        SU-   5      e[	        U 5      " U R
                  U5      $ )Nc                 
    X-  $ r   r<   xys     r   <lambda>)SparseNDimArray.reshape.<locals>.<lambda>b   s    acr   zInvalid reshape parameters )	functoolsreduce
_loop_sizerG   r1   r+   )r   newshapenew_total_sizes      r   reshapeSparseNDimArray.reshapea   sF    "))/8D__,:XEFFDz$,,h77r   r<   N)__name__
__module____qualname____firstlineno__r   r9   classmethodr?   rM   r[   __static_attributes__r<   r   r   r   r      s,    9.9`  F48r   r   c                   *    \ rS rSrSS jrS rS rSrg)r   h   Nc                    U R                   " X40 UD6u  p$[        [        [        U5      6 nU R	                  XB5        U(       a  [
        R                  " S U5      O
[        U5      n[        U[        [        45      (       a  [        U5      nO40 n[        [        U5      5       H  u  pxUS:w  d  M  [        U5      Xg'   M     [        U5      n[        R                  " XU40 UD6n	X)l        [        U5      U	l        XYl        Xil        U	$ )Nc                 
    X-  $ r   r<   rQ   s     r   rT   2ImmutableSparseNDimArray.__new__.<locals>.<lambda>n   s    r   r   )_handle_ndarray_creation_inputsr   mapr   _check_special_boundsrV   rW   r0   r   dictr   r/   r   r   r   _shape_rankrX   r+   )
r=   iterabler>   r   	flat_list	loop_sizesparse_arrayr!   r7   r   s
             r   r    ImmutableSparseNDimArray.__new__j   s    >>xYRXYs8U+,!!)3@EI$$_e<3y>	 i$..	?LL"79#567&.rlLO 7 L)}}S@@Z
#)r   c                     [        S5      e)Nzimmutable N-dim array)	TypeError)r   r2   rL   s      r   __setitem__$ImmutableSparseNDimArray.__setitem__   s    /00r   c                     [        U 5      $ r   )MutableSparseNDimArrayr   s    r   
as_mutable#ImmutableSparseNDimArray.as_mutable   s    %d++r   rX   rm   rl   r+   NN)r]   r^   r_   r`   r   ru   rz   rb   r<   r   r   r   r   h   s    21,r   r   c                   :    \ rS rSrSS jrS rS r\S 5       rSr	g)	rx      Nc                    U R                   " X40 UD6u  p$[        R                  U 5      nX%l        [	        U5      Ul        U(       a  [        R                  " S U5      O
[	        U5      Ul        [        U[        [        45      (       a  [        U5      Ul        U$ 0 Ul        [        [        U5      5       H%  u  pgUS:w  d  M  [        U5      UR                  U'   M'     U$ )Nc                 
    X-  $ r   r<   rQ   s     r   rT   0MutableSparseNDimArray.__new__.<locals>.<lambda>   s    qsr   r   )rh   objectr   rl   r0   rm   rV   rW   rX   r   rk   r   r+   r/   r   r   )r=   rn   r>   r   ro   r   r!   r7   s           r   r   MutableSparseNDimArray.__new__   s    >>xYRXY~~c"Z
FK)**?EBQTU^Q_ i$..!%iDKwy12EAQw(0""1% 3 r   c                 T   [        U[        5      (       a  [        S U 5       5      (       a  U R                  X5      u  p#nU H  n[	        XT5       VVs/ s H  u  pgUc  M
  Xg-
  PM     nnnX(   n	U R                  U5      n
U	S:w  a  XR                  U
'   MT  XR                  ;   d  Me  U R                  R                  U
5        M     gU R                  U5      n[        U5      nUS:X  a+  XR                  ;   a  U R                  R                  U5        gX R                  U'   gs  snnf )zAllows 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   B   #    U  H  n[        U[        5      v   M     g 7fr   r   r   s     r   r"   5MutableSparseNDimArray.__setitem__.<locals>.<genexpr>   r$   r%   Nr   )	r   r(   r)   $_get_slice_data_for_array_assignmentzipr-   r+   popr   )r   r2   rL   r5   slice_offsetsr!   indjother_iother_valuecomplete_indexs              r   ru   "MutableSparseNDimArray.__setitem__   s    eU##+P%+P(P(P-1-V-VW\-d*E]14Q1FX1Fvs!7371FX#n!%!2!21!5!#9D&&~6#'9'99&&**>:  %%e,EUOEze'9'99""&&u-,1""5) Ys   	D$!D$c                     [        U 5      $ r   r   ry   s    r   as_immutable#MutableSparseNDimArray.as_immutable   s    '--r   c                     U R                   R                  5        VVs1 s H  oR                    H  o"iM     M     snn$ s  snnf r   )r+   valuesfree_symbols)r   r   r!   s      r   r   #MutableSparseNDimArray.free_symbols   s5    --446O6a16OOOs   A r|   r}   )
r]   r^   r_   r`   r   ru   r   propertyr   rb   r<   r   r   rx   rx      s'    (2>. P Pr   rx   )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   rV   r   r   rx   r<   r   r   <module>r      sM    " / " ' B G - [8i [8z,0B ,D:P- :Pr   