Ë
    7^(hæ/  ã                   ó–   — d dl Z d dlZd dlmZmZ 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  G d„ d	e«      Zd
„ Z G d„ de«      Zy)é    N)Ú_sympifyÚsympify)ÚExpr)ÚBasicÚTuple)ÚImmutableDenseNDimArray)ÚSymbol)ÚIntegerc                   óà   — e Zd ZdZd„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z	ed„ «       Z
ed„ «       Zed	„ «       Zd
„ Zd„ Zed„ «       Zed„ «       Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚArrayComprehensiona  
    Generate a list comprehension.

    Explanation
    ===========

    If there is a symbolic dimension, for example, say [i for i in range(1, N)] where
    N is a Symbol, then the expression will not be expanded to an array. Otherwise,
    calling the doit() function will launch the expansion.

    Examples
    ========

    >>> from sympy.tensor.array import ArrayComprehension
    >>> from sympy import symbols
    >>> i, j, k = symbols('i j k')
    >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
    >>> a
    ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
    >>> a.doit()
    [[11, 12, 13], [21, 22, 23], [31, 32, 33], [41, 42, 43]]
    >>> b = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, k))
    >>> b.doit()
    ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, k))
    c                 ó¨  — t        d„ |D «       «      rt        d«      ‚t        |«      g}|j                  | j	                  ||«      «       t        j                  | g|¢­i |¤Ž}|j                  dd  |_        | j                  |j                  «      |_
        t        |j                  «      |_        | j                  |j                  «      |_        |S )Nc              3   ó@   K  — | ]  }t        |«      d k7  xs d–— Œ y­w©é   N©Úlen©Ú.0Úls     úd/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/tensor/array/array_comprehension.pyú	<genexpr>z-ArrayComprehension.__new__.<locals>.<genexpr>%   ó    è ø€ Ò4 qŒs�1‹v˜‰{Ò"˜dÓ"Ñ4ùó   ‚úKArrayComprehension requires values lower and upper bound for the expressioné   )ÚanyÚ
ValueErrorr   ÚextendÚ_check_limits_validityr   Ú__new__Ú_argsÚ_limitsÚ_calculate_shape_from_limitsÚ_shaper   Ú_rankÚ_calculate_loop_sizeÚ
_loop_size©ÚclsÚfunctionÚsymbolsÚassumptionsÚarglistÚobjs         r   r    zArrayComprehension.__new__$   s±   € ÜÑ4¨GÔ4Ô4Üð 4ó 5ð 5ä˜8Ó$Ð%ˆØ�‰�s×1Ñ1°(¸GÓDÔEÜ�m‰m˜CÐ9 'Ò9¨[Ñ9ˆØ—i‘i  �mˆŒØ×5Ñ5°c·k±kÓBˆŒ
Ü˜Ÿ
™
“OˆŒ	Ø×1Ñ1°#·*±*Ó=ˆŒØˆ
ó    c                 ó    — | j                   d   S )aA  The function applied across limits.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j = symbols('i j')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.function
        10*i + j
        r   )r!   ©Úselfs    r   r*   zArrayComprehension.function1   s   € ð �z‰z˜!‰}Ðr/   c                 ó   — | j                   S )au  
        The list of limits that will be applied while expanding the array.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j = symbols('i j')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.limits
        ((i, 1, 4), (j, 1, 3))
        ©r"   r1   s    r   ÚlimitszArrayComprehension.limitsA   s   € ð �|‰|Ðr/   c                 óê   — | j                   j                  }| j                  D ]M  \  }}}|j                  |«       |j                  j	                  |j                  «      }|j	                  |«      }ŒO |S )a)  
        The set of the free_symbols in the array.
        Variables appeared in the bounds are supposed to be excluded
        from the free symbol set.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j, k = symbols('i j k')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.free_symbols
        set()
        >>> b = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, k+3))
        >>> b.free_symbols
        {k}
        )r*   Úfree_symbolsr"   ÚdiscardÚunion)r2   Úexpr_free_symÚvarÚinfÚsupÚcurr_free_symss         r   r7   zArrayComprehension.free_symbolsR   sp   € ð( Ÿ™×2Ñ2ˆØ!Ÿ\™\ò 	@‰MˆC��cØ×!Ñ! #Ô&Ø ×-Ñ-×3Ñ3°C×4DÑ4DÓEˆNØ)×/Ñ/°Ó?‰Mð	@ð Ðr/   c                 óF   — | j                   D �cg c]  }|d   ‘Œ	 c}S c c}w )aL  The tuples of the variables in the limits.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j, k = symbols('i j k')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.variables
        [i, j]
        r   r4   ©r2   r   s     r   Ú	variableszArrayComprehension.variablesm   s    € ð #Ÿl™lÖ+˜��!“Ò+Ð+ùÒ+s   �c                 ód   — | j                   D �cg c]  }t        |«      dk7  sŒ|d   ‘Œ c}S c c}w )z¿The list of dummy variables.

        Note
        ====

        Note that all variables are dummy variables since a limit without
        lower bound or upper bound is not accepted.
        r   r   )r"   r   r@   s     r   Úbound_symbolsz ArrayComprehension.bound_symbols}   s*   € ð #Ÿl™lÖ:˜¬c°!«f¸«k��!“Ò:Ð:ùÒ:s   �-£-c                 ó   — | j                   S )aE  
        The shape of the expanded array, which may have symbols.

        Note
        ====

        Both the lower and the upper bounds are included while
        calculating the shape.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j, k = symbols('i j k')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.shape
        (4, 3)
        >>> b = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, k+3))
        >>> b.shape
        (4, k + 3)
        )r$   r1   s    r   ÚshapezArrayComprehension.shape‰   s   € ð0 �{‰{Ðr/   c                 óp   — | j                   D ]'  \  }}}t        ||«      j                  t        «      sŒ' y y)aø  
        Test if the array is shape-numeric which means there is no symbolic
        dimension.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j, k = symbols('i j k')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.is_shape_numeric
        True
        >>> b = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, k+3))
        >>> b.is_shape_numeric
        False
        FT)r"   r   Úatomsr	   )r2   Ú_r<   r=   s       r   Úis_shape_numericz#ArrayComprehension.is_shape_numeric£   s9   € ð&  Ÿ<™<ò 	‰KˆAˆs�CÜ�S˜#‹×$Ñ$¤VÕ,Ùð	ð r/   c                 ó   — | j                   S )a9  The rank of the expanded array.

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j, k = symbols('i j k')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.rank()
        2
        )r%   r1   s    r   ÚrankzArrayComprehension.rank»   s   € ð �z‰zÐr/   c                 ó\   — | j                   j                  rt        d«      ‚| j                   S )aÔ  
        The length of the expanded array which means the number
        of elements in the array.

        Raises
        ======

        ValueError : When the length of the array is symbolic

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j = symbols('i j')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> len(a)
        12
        z Symbolic length is not supported)r'   r7   r   r1   s    r   Ú__len__zArrayComprehension.__len__Ê   s'   € ð( �?‰?×'Ò'ÜÐ?Ó@Ð@Ø�‰Ðr/   c                 ó~  — g }|D ]µ  \  }}}t        |«      }t        |«      }t        |t        «      r	t        |Ž }nt        |«      }|j	                  t        |||«      «       t        d„ ||fD «       «      rt        d«      ‚||kD  dk(  rt        d«      ‚||j                  v s||j                  v sŒ¬t        d«      ‚ |S )Nc              3   ó˜   K  — | ]B  }t        |t        «       xs+ |j                  t        t        «      |j                  «       k7  –— ŒD y ­w©N)Ú
isinstancer   rG   r	   r
   )r   Úis     r   r   z<ArrayComprehension._check_limits_validity.<locals>.<genexpr>ð   sB   è ø€ ò UØDEô # 1¤dÓ+Ð+ÒU°·±¼ÄÓ0HÈAÏGÉGËIÑ0UÓUñ Uùs   ‚AA
zABounds should be an Expression(combination of Integer and Symbol)Tz-Lower bound should be inferior to upper boundz)Variable should not be part of its bounds)	r   rQ   Úlistr   Úappendr   Ú	TypeErrorr   r7   )r)   r*   r5   Ú
new_limitsr;   r<   r=   s          r   r   z)ArrayComprehension._check_limits_validityâ   sÖ   € ð ˆ
Ø#ò 	N‰MˆC��cÜ˜3“-ˆCÜ˜3“-ˆCô ˜#œtÔ$Ü˜S�k‘ä˜s“m�Ø×Ñœe C¨¨cÓ2Ô3Üñ UØJMÈsÈôUô UäÐ cÓdÐdØ�c‘	˜dÒ"Ü Ð!PÓQÐQØ�c×&Ñ&Ñ&¨#°×1AÑ1AÒ*AÜ Ð!LÓMÐMð!	Nð" Ðr/   c           
      ó^   — t        |D ���cg c]  \  }}}||z
  dz   ‘Œ c}}}«      S c c}}}w ©Nr   )Útuple)r)   r5   rH   r<   r=   s        r   r#   z/ArrayComprehension._calculate_shape_from_limitsù   s,   € ä°v×>Ð>©¨¨3°�c˜C‘i !“mÔ>Ó?Ð?ùÔ>s   Œ(c                 ó(   — |syd}|D ]  }||z  }Œ	 |S )Nr   r   © )r)   rE   Ú	loop_sizer   s       r   r&   z'ArrayComprehension._calculate_loop_sizeý   s-   € áØØˆ	Øò 	&ˆAØ! A™‰Ið	&ð Ðr/   c                 ó>   — | j                   s| S | j                  «       S rP   )rI   Ú_expand_array)r2   Úhintss     r   ÚdoitzArrayComprehension.doit  s   € Ø×$Ò$ØˆKà×!Ñ!Ó#Ð#r/   c                 ó  — g }t        j                  | j                  D ���cg c]  \  }}}t        ||dz   «      ‘Œ c}}}Ž D ]"  }|j	                  | j                  |«      «       Œ$ t        || j                  «      S c c}}}w rX   )Ú	itertoolsÚproductr"   ÚrangerT   Ú_get_elementr   rE   )r2   Úresr;   r<   r=   Úvaluess         r   r^   z ArrayComprehension._expand_array  s‚   € ØˆÜ×'Ñ'à+/¯<©<÷*9ð *9Ù,9¨C°°cô +0°°S¸±UÕ*;ô *9ð :ò 	2ˆFð �J‰J�t×(Ñ(¨Ó0Õ1ð	2ô
 ' s¨D¯J©JÓ7Ð7ùô*9s   ¢A=c                 ó~   — | j                   }t        | j                  |«      D ]  \  }}|j                  ||«      }Œ |S rP   )r*   ÚziprA   Úsubs)r2   rg   Útempr;   Úvals        r   re   zArrayComprehension._get_element  s>   € Ø�}‰}ˆÜ˜DŸN™N¨FÓ3ò 	'‰HˆC�Ø—9‘9˜S #Ó&‰Dð	'àˆr/   c                 ól   — | j                   r| j                  «       j                  «       S t        d«      ‚)aÍ  Transform the expanded array to a list.

        Raises
        ======

        ValueError : When there is a symbolic dimension

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j = symbols('i j')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.tolist()
        [[11, 12, 13], [21, 22, 23], [31, 32, 33], [41, 42, 43]]
        z-A symbolic array cannot be expanded to a list)rI   r^   Útolistr   r1   s    r   rn   zArrayComprehension.tolist  s1   € ð$ × Ò Ø×%Ñ%Ó'×.Ñ.Ó0Ð0äÐHÓIÐIr/   c                 ó¸   — ddl m} | j                  st        d«      ‚| j                  dk7  rt        d«      ‚ || j                  «       j                  «       «      S )aE  Transform the expanded array to a matrix.

        Raises
        ======

        ValueError : When there is a symbolic dimension
        ValueError : When the rank of the expanded array is not equal to 2

        Examples
        ========

        >>> from sympy.tensor.array import ArrayComprehension
        >>> from sympy import symbols
        >>> i, j = symbols('i j')
        >>> a = ArrayComprehension(10*i + j, (i, 1, 4), (j, 1, 3))
        >>> a.tomatrix()
        Matrix([
        [11, 12, 13],
        [21, 22, 23],
        [31, 32, 33],
        [41, 42, 43]])
        r   )ÚMatrixz/A symbolic array cannot be expanded to a matrixé   zDimensions must be of size of 2)Úsympy.matricesrp   rI   r   r%   r^   Útomatrix)r2   rp   s     r   rs   zArrayComprehension.tomatrix3  sP   € õ. 	*à×$Ò$ÜÐNÓOÐOØ�:‰:˜Š?ÜÐ>Ó?Ð?á�d×(Ñ(Ó*×3Ñ3Ó5Ó6Ð6r/   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Úpropertyr*   r5   r7   rA   rC   rE   rI   rK   rM   Úclassmethodr   r#   r&   r`   r^   re   rn   rs   r[   r/   r   r   r   
   sú   „ ñò2ð ñó ðð ñó ðð  ñó ðð4 ñ,ó ð,ð ñ	;ó ð	;ð ñó ðð2 ñó ðò.òð0 ñó ðð, ñ@ó ð@ð ñó ðò$ò8òòJó.7r/   r   c                 óh   — d„ }t        | t        |«      «      xr | j                  |j                  k(  S )Nc                   ó   — y)Nr   r[   r[   r/   r   ú<lambda>zisLambda.<locals>.<lambda>U  s   � r/   )rQ   Útypert   )ÚvÚLAMBDAs     r   ÚisLambdar€   T  s*   € Ù€FÜ�aœ˜f›Ó&ÒH¨1¯:©:¸¿¹Ñ+HÐHr/   c                   ó,   — e Zd ZdZd„ Zed„ «       Zd„ Zy)ÚArrayComprehensionMapa[  
    A subclass of ArrayComprehension dedicated to map external function lambda.

    Notes
    =====

    Only the lambda function is considered.
    At most one argument in lambda function is accepted in order to avoid ambiguity
    in value assignment.

    Examples
    ========

    >>> from sympy.tensor.array import ArrayComprehensionMap
    >>> from sympy import symbols
    >>> i, j, k = symbols('i j k')
    >>> a = ArrayComprehensionMap(lambda: 1, (i, 1, 4))
    >>> a.doit()
    [1, 1, 1, 1]
    >>> b = ArrayComprehensionMap(lambda a: a+1, (j, 1, 4))
    >>> b.doit()
    [2, 3, 4, 5]

    c                 ó¦  — t        d„ |D «       «      rt        d«      ‚t        |«      st        d«      ‚| j                  ||«      }t	        j
                  | g|¢­i |¤Ž}|j                  |_        | j                  |j                  «      |_	        t        |j                  «      |_        | j                  |j                  «      |_        ||_        |S )Nc              3   ó@   K  — | ]  }t        |«      d k7  xs d–— Œ y­wr   r   r   s     r   r   z0ArrayComprehensionMap.__new__.<locals>.<genexpr>r  r   r   r   zData type not supported)r   r   r€   r   r   r    r!   r"   r#   r$   r   r%   r&   r'   Ú_lambdar(   s         r   r    zArrayComprehensionMap.__new__q  s´   € ÜÑ4¨GÔ4Ô4Üð 4ó 5ð 5ô ˜Ô!ÜÐ6Ó7Ð7à×,Ñ,¨X°wÓ?ˆÜ�m‰m˜CÐ9 'Ò9¨[Ñ9ˆØ—i‘iˆŒØ×5Ñ5°c·k±kÓBˆŒ
Ü˜Ÿ
™
“OˆŒ	Ø×1Ñ1°#·*±*Ó=ˆŒØˆŒØˆ
r/   c                 ó*   ‡ —  G ˆ fd„dt         «      }|S )Nc                   ó   •— e Zd Zˆ fd„Zy)ú%ArrayComprehensionMap.func.<locals>._c                 ó6   •— t        ‰j                  g|¢­i |¤ŽS rP   )r‚   r…   )r)   ÚargsÚkwargsr2   s      €r   r    z-ArrayComprehensionMap.func.<locals>._.__new__…  s   ø€ Ü,¨T¯\©\ÐK¸DÒKÀFÑKÐKr/   N)rt   ru   rv   r    r1   s   €r   rH   rˆ   „  s	   ø„ õLr/   rH   )r‚   )r2   rH   s   ` r   ÚfunczArrayComprehensionMap.func‚  s   ø€ ö	LÔ%ô 	Lð ˆr/   c                 óö   — | j                   }| j                   j                  j                  dk(  r	 |«       }|S | j                   j                  j                  dk(  r |t        j                  d„ |«      «      }|S )Nr   r   c                 ó   — | |z  S rP   r[   )ÚaÚbs     r   r|   z4ArrayComprehensionMap._get_element.<locals>.<lambda>Ž  s
   € °a¸±c€ r/   )r…   Ú__code__Úco_argcountÚ	functoolsÚreduce)r2   rg   rk   s      r   re   z"ArrayComprehensionMap._get_element‰  sh   € Ø�|‰|ˆØ�<‰<× Ñ ×,Ñ,°Ò1Ù“6ˆDð ˆð �\‰\×"Ñ"×.Ñ.°!Ò3Ùœ	×(Ñ(Ñ)9¸6ÓBÓCˆDØˆr/   N)rt   ru   rv   rw   r    rx   rŒ   re   r[   r/   r   r‚   r‚   X  s%   „ ñò0ð" ñó ðór/   r‚   )r“   rb   Úsympy.core.sympifyr   r   Úsympy.core.exprr   Ú
sympy.corer   r   Úsympy.tensor.arrayr   Úsympy.core.symbolr	   Úsympy.core.numbersr
   r   r€   r‚   r[   r/   r   ú<module>r›      s<   ðß ß 0Ý  ß #Ý 6Ý $Ý &ôG7˜ô G7òT
Iô7Ð.õ 7r/   