
    Qi                         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dS )    )Basic)DictTuple)S)_sympify)MutableNDimArray)	NDimArrayImmutableNDimArray)flattenNc                   <    e Zd Zd Zd Zed             Zd Zd ZdS )SparseNDimArrayc                     t          |i |S NImmutableSparseNDimArray)selfargskwargss      |/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/sympy/tensor/array/sparse_ndim_array.py__new__zSparseNDimArray.__new__   s    '8888    c                                                     }||S                                t          t                    rst	          d D                       rZ                               \  }} fd|D             }fdt          |          D             } t                     ||          S                                 j	        
                    t          j                  S )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

        Nc              3   @   K   | ]}t          |t                    V  d S r   
isinstanceslice.0is     r   	<genexpr>z.SparseNDimArray.__getitem__.<locals>.<genexpr>7   ,      +P+PQJq%,@,@+P+P+P+P+P+Pr   c                     g | ]:}j                                                 |          t          j                  ;S  )_sparse_arrayget_parse_indexr   Zero)r   r   r   s     r   
<listcomp>z/SparseNDimArray.__getitem__.<locals>.<listcomp>9   s<    \\\aT'++D,=,=a,@,@!&II\\\r   c                 j    g | ]/\  }}t          |         t                     t          |          0S r#   )r   r   len)r   r   elindexs      r   r(   z/SparseNDimArray.__getitem__.<locals>.<listcomp>:   s8    ```%!RJuUVxY^D_D_`c"gg```r   )_check_symbolic_index_check_index_for_getitemr   tupleany _get_slice_data_for_array_access	enumeratetyper&   r$   r%   r   r'   )r   r,   syindex
sl_factorseindicesarraynshapes   ``     r   __getitem__zSparseNDimArray.__getitem__   s   @ ,,U33N--e44 eU## 	9+P+P%+P+P+P(P(P 	9#'#H#H#O#O J\\\\S[\\\E````9Z+@+@```F4::eV,,,%%e,,E%))%888r   c                      | i |          S )z7
        Return a sparse N-dim array of zeros.
        r#   )clsshapes     r   zeroszSparseNDimArray.zeros@   s    
 s2u~~r   c                    ddl m} |                                 dk    rt          d          i }| j                                        D ]\  }}|||                     |          <    || 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4 	; 	;JC5:Jt,,S1122|DJqM4:a=*EEEr   c                     t          j        d |          }|| j        k    rt          d|z              t	          |           | j        |          S )Nc                     | |z  S r   r#   xys     r   <lambda>z)SparseNDimArray.reshape.<locals>.<lambda>b   s
    ac r   zInvalid reshape parameters )	functoolsreduce
_loop_sizerD   r3   r$   )r   newshapenew_total_sizes      r   reshapezSparseNDimArray.reshapea   sR    ")//8DDT_,,:XEFFFtDzz$,h777r   N)	__name__
__module____qualname__r   r9   classmethodr=   rJ   rV   r#   r   r   r   r      so        9 9 9.9 .9 .9`   [F F F48 8 8 8 8r   r   c                   "    e Zd ZddZd Zd ZdS )r   Nc                 D    | j         ||fi |\  }}t          t          t          |           }|                     ||           |rt          j        d |          nt          |          }t          |t          t          f          rt          |          }n<i }t          t          |                    D ]\  }}|dk    rt          |          ||<   t          |          }t          j        | ||fi |}	||	_        t          |          |	_        ||	_        ||	_        |	S )Nc                     | |z  S r   r#   rM   s     r   rP   z2ImmutableSparseNDimArray.__new__.<locals>.<lambda>n   s
    1 r   r   )_handle_ndarray_creation_inputsr   mapr   _check_special_boundsrQ   rR   r*   r   dictr   r2   r   r   r   _shape_rankrS   r$   )
r;   iterabler<   r   	flat_list	loop_sizesparse_arrayr   r+   r   s
             r   r   z ImmutableSparseNDimArray.__new__j   s(   >3>xYYRXYYys8U++,!!)U333@EYI$__e<<<3y>>	 i$.. 	3	??LLL"79#5#566 3 3277&.rllLOL))}S,@@@@ZZ
#)r   c                      t          d          )Nzimmutable N-dim array)	TypeError)r   r,   rI   s      r   __setitem__z$ImmutableSparseNDimArray.__setitem__   s    /000r   c                      t          |           S r   )MutableSparseNDimArrayr   s    r   
as_mutablez#ImmutableSparseNDimArray.as_mutable   s    %d+++r   NN)rW   rX   rY   r   rj   rn   r#   r   r   r   r   h   sF           21 1 1, , , , ,r   r   c                   8    e Zd ZddZd Zd Zed             ZdS )rl   Nc                     | j         ||fi |\  }}t                              |           }||_        t	          |          |_        |rt          j        d |          nt	          |          |_        t          |t          t          f          rt          |          |_        |S i |_        t          t          |                    D ]"\  }}|dk    rt          |          |j        |<   #|S )Nc                     | |z  S r   r#   rM   s     r   rP   z0MutableSparseNDimArray.__new__.<locals>.<lambda>   s
    qs r   r   )r^   objectr   rb   r*   rc   rQ   rR   rS   r   ra   r   r$   r2   r   r   )r;   rd   r<   r   re   r   r   r+   s           r   r   zMutableSparseNDimArray.__new__   s    >3>xYYRXYYy~~c""ZZ
FK_)*??EBBBQTU^Q_Q_ i$.. 	!%iDKwy1122 	5 	5EArQww(0"1%r   c                 ,   t          |t                    rt          d |D                       r|                     ||          \  }}}|D ]m}d t	          ||          D             }||         }|                     |          }|dk    r|| j        |<   J|| j        v r| j                            |           ndS |                     |          }t          |          }|dk    r%|| j        v r| j                            |           dS || j        |<   dS )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                    V  d S r   r   r   s     r   r    z5MutableSparseNDimArray.__setitem__.<locals>.<genexpr>   r!   r   c                 "    g | ]\  }}|||z
  S r   r#   )r   indjs      r   r(   z6MutableSparseNDimArray.__setitem__.<locals>.<listcomp>   s!    XXXvsA!-37---r   r   N)	r   r/   r0   $_get_slice_data_for_array_assignmentzipr&   r$   popr   )	r   r,   rI   r6   slice_offsetsr   other_iother_valuecomplete_indexs	            r   rj   z"MutableSparseNDimArray.__setitem__   sK    eU## 	2+P+P%+P+P+P(P(P 	2-1-V-VW\^c-d-d*E8] ; ;XXQ1F1FXXX#Gn!%!2!21!5!5!##9DD&~66#t'999&**>:::; ; %%e,,EUOOEzzet'999"&&u-----,1"5)))r   c                      t          |           S r   r   rm   s    r   as_immutablez#MutableSparseNDimArray.as_immutable   s    '---r   c                 H    d | j                                         D             S )Nc                 &    h | ]}|j         D ]}|S r#   )free_symbols)r   rx   r   s      r   	<setcomp>z6MutableSparseNDimArray.free_symbols.<locals>.<setcomp>   s'    OOOaOO1OOOOr   )r$   valuesrm   s    r   r   z#MutableSparseNDimArray.free_symbols   s%    OO4-4466OOOOr   ro   )rW   rX   rY   r   rj   r   propertyr   r#   r   r   rl   rl      sf           (2 2 2>. . . P P XP P Pr   rl   )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   rQ   r   r   rl   r#   r   r   <module>r      s=   " " " " " " / / / / / / / / " " " " " " ' ' ' ' ' ' B B B B B B G G G G G G G G - - - - - -    [8 [8 [8 [8 [8i [8 [8 [8z, , , , ,0B , , ,D:P :P :P :P :P- :P :P :P :P :Pr   