§
    PŠtjæ/  ã                   ó¤   — 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dS )é    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dS )Ú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}|                     |                      ||¦  «        ¦  «         t          j        | g|¢R i |¤Ž}|j        dd …         |_        |  	                    |j        ¦  «        |_
        t          |j
        ¦  «        |_        |                      |j
        ¦  «        |_        |S )Nc              3   ó@   K  — | ]}t          |¦  «        d k    pdV — ŒdS ©é   N©Úlen©Ú.0Úls     úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/tensor/array/array_comprehension.pyú	<genexpr>z-ArrayComprehension.__new__.<locals>.<genexpr>%   ó1   è è € Ð4Ð4 q�s�1‰vŒv˜Š{Ð"˜dÐ4Ð4Ð4Ð4Ð4Ð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Ð4¨GÐ4Ñ4Ô4Ñ4Ô4ð 	5Ýð 4ñ 5ô 5ð 5å˜8Ñ$Ô$Ð%ˆØ�Š�s×1Ò1°(¸GÑDÔDÑEÔEÐEÝŒm˜CÐ9 'Ð9Ð9Ð9¨[Ð9Ð9ˆØ”i   ”mˆŒØ×5Ò5°c´kÑBÔBˆŒ
Ý˜œ
‘O”OˆŒ	Ø×1Ò1°#´*Ñ=Ô=ˆŒØˆ
r   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˜!Œ}Ð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"   r0   s    r   ÚlimitszArrayComprehension.limitsA   s   € ð Œ|Ðr   c                 óÌ   — | j         j        }| j        D ]O\  }}}|                     |¦  «         |j                             |j        ¦  «        }|                     |¦  «        }ŒP|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)r1   Úexpr_free_symÚvarÚinfÚsupÚcurr_free_symss         r   r6   zArrayComprehension.free_symbolsR   so   € ð( œÔ2ˆØ!œ\ð 	@ð 	@‰MˆC��cØ×!Ò! #Ñ&Ô&Ð&Ø Ô-×3Ò3°CÔ4DÑEÔEˆNØ)×/Ò/°Ñ?Ô?ˆMˆMØÐr   c                 ó$   — d„ | j         D ¦   «         S )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]
        c                 ó   — g | ]
}|d          ‘ŒS )r   © r   s     r   ú
<listcomp>z0ArrayComprehension.variables.<locals>.<listcomp>{   s   € Ð+Ð+Ð+˜��!”Ð+Ð+Ð+r   r3   r0   s    r   Ú	variableszArrayComprehension.variablesm   s   € ð ,Ð+˜dœlÐ+Ñ+Ô+Ð+r   c                 ó$   — d„ | j         D ¦   «         S )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.
        c                 óD   — g | ]}t          |¦  «        d k    ¯|d         ‘ŒS )r   r   r   r   s     r   rA   z4ArrayComprehension.bound_symbols.<locals>.<listcomp>‡   s'   € Ð:Ð:Ð:˜­c°!©f¬f¸ªk¨k��!”¨k¨k¨kr   r3   r0   s    r   Úbound_symbolsz ArrayComprehension.bound_symbols}   s   € ð ;Ð:˜dœlÐ:Ñ:Ô:Ð:r   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$   r0   s    r   ÚshapezArrayComprehension.shape‰   s   € ð0 Œ{Ðr   c                 óx   — | j         D ]1\  }}}t          ||¦  «                             t          ¦  «        r dS Œ2dS )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	   )r1   Ú_r;   r<   s       r   Úis_shape_numericz#ArrayComprehension.is_shape_numeric£   sJ   € ð&  œ<ð 	ð 	‰KˆAˆs�CÝ�S˜#‰Œ×$Ò$¥VÑ,Ô,ð Ø�u�uðàˆtr   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%   r0   s    r   ÚrankzArrayComprehension.rank»   s   € ð ŒzÐr   c                 óF   — | 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'   r6   r   r0   s    r   Ú__len__zArrayComprehension.__len__Ê   s)   € ð( Œ?Ô'ð 	AÝÐ?Ñ@Ô@Ð@ØŒÐr   c                 óÄ  — g }|D ]Ú\  }}}t          |¦  «        }t          |¦  «        }t          |t          ¦  «        r
t          |Ž }nt          |¦  «        }|                     t          |||¦  «        ¦  «         t          d„ ||fD ¦   «         ¦  «        rt          d¦  «        ‚||k    dk    rt          d¦  «        ‚||j        v s	||j        v rt          d¦  «        ‚ŒÛ|S )Nc              3   ó®   K  — | ]P}t          |t          ¦  «         p5|                     t          t          ¦  «        |                     ¦   «         k    V — ŒQd S ©N)Ú
isinstancer   rI   r	   r
   )r   Úis     r   r   z<ArrayComprehension._check_limits_validity.<locals>.<genexpr>ð   sk   è è € ð Uð UØDEõ # 1¥dÑ+Ô+Ð+ÐU°·²½ÅÑ0HÔ0HÈAÏGÊGÉIÌIÒ0Uð Uð Uð Uð Uð Uð Ur   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   rS   Úlistr   Úappendr   Ú	TypeErrorr   r6   )r)   r*   r4   Ú
new_limitsr:   r;   r<   s          r   r   z)ArrayComprehension._check_limits_validityâ   s  € ð ˆ
Ø#ð 	Nð 	N‰MˆC��cÝ˜3‘-”-ˆCÝ˜3‘-”-ˆCõ ˜#�tÑ$Ô$ð $Ý˜S�k��å˜s‘m”m�Ø×Ò�e C¨¨cÑ2Ô2Ñ3Ô3Ð3Ýð Uð UØJMÈsÈðUñ Uô Uñ Uô Uð eåÐ cÑdÔdÐdØ�c’	˜dÒ"Ð"Ý Ð!PÑQÔQÐQØ�cÔ&Ð&Ð&¨#°Ô1AÐ*AÐ*AÝ Ð!LÑMÔMÐMð +BàÐr   c                 ó4   — t          d„ |D ¦   «         ¦  «        S )Nc                 ó&   — g | ]\  }}}||z
  d z   ‘ŒS ©r   r@   )r   rJ   r;   r<   s       r   rA   zCArrayComprehension._calculate_shape_from_limits.<locals>.<listcomp>û   s&   € Ð>Ð>Ð>©¨¨3°�c˜C‘i !‘mÐ>Ð>Ð>r   )Útuple)r)   r4   s     r   r#   z/ArrayComprehension._calculate_shape_from_limitsù   s   € åÐ>Ð>°vÐ>Ñ>Ô>Ñ?Ô?Ð?r   c                 ó&   — |sdS d}|D ]}||z  }Œ|S )Nr   r   r@   )r)   rG   Ú	loop_sizer   s       r   r&   z'ArrayComprehension._calculate_loop_sizeý   s4   € àð 	Ø�1Øˆ	Øð 	&ð 	&ˆAØ! A™ˆIˆIàÐr   c                 ó<   — | j         s| S |                      ¦   «         S rR   )rK   Ú_expand_array)r1   Úhintss     r   ÚdoitzArrayComprehension.doit  s$   € ØÔ$ð 	ØˆKà×!Ò!Ñ#Ô#Ð#r   c                 óÀ   — g }t          j        d„ | j        D ¦   «         Ž D ]*}|                     |                      |¦  «        ¦  «         Œ+t          || j        ¦  «        S )Nc                 ó<   — g | ]\  }}}t          ||d z   ¦  «        ‘ŒS r[   )Úrange)r   r:   r;   r<   s       r   rA   z4ArrayComprehension._expand_array.<locals>.<listcomp>  s<   € ð *9ð *9ð *9Ù,9¨C°°cõ +0°°S¸±UÑ*;Ô*;ð *9ð *9ð *9r   )Ú	itertoolsÚproductr"   rV   Ú_get_elementr   rG   )r1   ÚresÚvaluess      r   r`   z ArrayComprehension._expand_array  ss   € ØˆÝÔ'ð *9ð *9à+/¬<ð*9ñ *9ô *9ð :ð 	2ð 	2ˆFð �JŠJ�t×(Ò(¨Ñ0Ô0Ñ1Ô1Ð1Ð1å& s¨D¬JÑ7Ô7Ð7r   c                 óv   — | j         }t          | j        |¦  «        D ]\  }}|                     ||¦  «        }Œ|S rR   )r*   ÚziprB   Úsubs)r1   rj   Útempr:   Úvals        r   rh   zArrayComprehension._get_element  sB   € ØŒ}ˆÝ˜DœN¨FÑ3Ô3ð 	'ð 	'‰HˆC�Ø—9’9˜S #Ñ&Ô&ˆDˆDØˆr   c                 óz   — | j         r&|                      ¦   «                              ¦   «         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)rK   r`   Útolistr   r0   s    r   rq   zArrayComprehension.tolist  s<   € ð$ Ô ð 	1Ø×%Ò%Ñ'Ô'×.Ò.Ñ0Ô0Ð0åÐHÑIÔIÐIr   c                 óÌ   — ddl m} | j        st          d¦  «        ‚| j        dk    rt          d¦  «        ‚ ||                      ¦   «                              ¦   «         ¦  «        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.matricesrs   rK   r   r%   r`   Útomatrix)r1   rs   s     r   rv   zArrayComprehension.tomatrix3  ss   € ð. 	*Ð)Ð)Ð)Ð)Ð)àÔ$ð 	PÝÐNÑOÔOÐOØŒ:˜Š?ˆ?ÝÐ>Ñ?Ô?Ð?àˆv�d×(Ò(Ñ*Ô*×3Ò3Ñ5Ô5Ñ6Ô6Ð6r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Úpropertyr*   r4   r6   rB   rE   rG   rK   rM   rO   Úclassmethodr   r#   r&   rb   r`   rh   rq   rv   r@   r   r   r   r   
   sª  € € € € € ðð ð2ð ð ð ðð ñ „Xðð ðð ñ „Xðð  ðð ñ „Xðð4 ð,ð ,ñ „Xð,ð ð	;ð 	;ñ „Xð	;ð ðð ñ „Xðð2 ðð ñ „Xðð.ð ð ðð ð ð0 ðð ñ „[ðð, ð@ð @ñ „[ð@ð ðð ñ „[ðð$ð $ð $ð8ð 8ð 8ðð ð ðJð Jð Jð.7ð 7ð 7ð 7ð 7r   r   c                 ób   — d„ }t          | t          |¦  «        ¦  «        o| j        |j        k    S )Nc                  ó   — dS )Nr   r@   r@   r   r   ú<lambda>zisLambda.<locals>.<lambda>U  s   € �Q€ r   )rS   Útyperw   )ÚvÚLAMBDAs     r   ÚisLambdarƒ   T  s-   € ØˆY€FÝ�a�˜f™œÑ&Ô&ÐH¨1¬:¸¼Ò+HÐHr   c                   ó4   — e Zd ZdZd„ Zed„ ¦   «         Zd„ ZdS )Ú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¦  «        ‚|                      ||¦  «        }t	          j        | g|¢R i |¤Ž}|j        |_        |                      |j        ¦  «        |_	        t          |j	        ¦  «        |_        |                      |j	        ¦  «        |_        ||_        |S )Nc              3   ó@   K  — | ]}t          |¦  «        d k    pdV — ŒdS 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Ð4¨GÐ4Ñ4Ô4Ñ4Ô4ð 	5Ýð 4ñ 5ô 5ð 5õ ˜Ñ!Ô!ð 	8ÝÐ6Ñ7Ô7Ð7à×,Ò,¨X°wÑ?Ô?ˆÝŒm˜CÐ9 'Ð9Ð9Ð9¨[Ð9Ð9ˆØ”iˆŒØ×5Ò5°c´kÑBÔBˆŒ
Ý˜œ
‘O”OˆŒ	Ø×1Ò1°#´*Ñ=Ô=ˆŒØˆŒØˆ
r   c                 ó2   ‡ —  G ˆ fd„dt           ¦  «        }|S )Nc                   ó   •— e Zd Zˆ fd„ZdS )ú%ArrayComprehensionMap.func.<locals>._c                 ó.   •— t          ‰j        g|¢R i |¤ŽS rR   )r…   rˆ   )r)   ÚargsÚkwargsr1   s      €r   r    z-ArrayComprehensionMap.func.<locals>._.__new__…  s#   ø€ Ý,¨T¬\ÐK¸DÐKÐKÐKÀFÐKÐKÐKr   N)rw   rx   ry   r    r0   s   €r   rJ   r‹   „  s5   ø€ € € € € ðLð Lð Lð Lð Lð Lð Lr   rJ   )r…   )r1   rJ   s   ` r   ÚfunczArrayComprehensionMap.func‚  sI   ø€ ð	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	LÕ%ñ 	Lô 	Lð 	Lð ˆr   c                 ó¼   — | j         }| j         j        j        dk    r |¦   «         }n4| j         j        j        dk    r |t          j        d„ |¦  «        ¦  «        }|S )Nr   r   c                 ó   — | |z  S rR   r@   )ÚaÚbs     r   r   z4ArrayComprehensionMap._get_element.<locals>.<lambda>Ž  s
   € °a¸±c€ r   )rˆ   Ú__code__Úco_argcountÚ	functoolsÚreduce)r1   rj   rn   s      r   rh   z"ArrayComprehensionMap._get_element‰  sa   € ØŒ|ˆØŒ<Ô Ô,°Ò1Ð1Ø�4‘6”6ˆDˆDØŒ\Ô"Ô.°!Ò3Ð3Ø�4�	Ô(Ð)9Ð)9¸6ÑBÔBÑCÔCˆDØˆr   N)rw   rx   ry   rz   r    r{   r�   rh   r@   r   r   r…   r…   X  sW   € € € € € ðð ð0ð ð ð" ðð ñ „Xððð ð ð ð r   r…   )r–   rf   Ú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Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø  Ð  Ð  Ð  Ð  Ð  Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø $Ð $Ð $Ð $Ð $Ð $Ø &Ð &Ð &Ð &Ð &Ð &ðG7ð G7ð G7ð G7ð G7˜ñ G7ô G7ð G7ðT
Ið Ið Ið7ð 7ð 7ð 7ð 7Ð.ñ 7ô 7ð 7ð 7ð 7r   