ó
    ‹*£hæ/  ã                   ó–   • S SK r S SKrS SKJrJr  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	\5      rS
 r " S S\5      rg)é    N)Ú_sympifyÚsympify)ÚExpr)ÚBasicÚTuple)ÚImmutableDenseNDimArray)ÚSymbol)ÚIntegerc                   óè   • \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       rS rS r\S 5       r\S 5       r\S 5       rS rS rS rS rS rSrg)ÚArrayComprehensioné
   aÏ  
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                 ó²  • [        S U 5       5      (       a  [        S5      e[        U5      /nUR                  U R	                  X5      5        [
        R                  " U /UQ70 UD6nUR                  SS  Ul        U R                  UR                  5      Ul
        [        UR                  5      Ul        U R                  UR                  5      Ul        U$ )Nc              3   óP   #   • U  H  n[        U5      S :g  =(       d    Sv •  M     g7f©é   N©Úlen©Ú.0Úls     Úc/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/tensor/array/array_comprehension.pyÚ	<genexpr>Ú-ArrayComprehension.__new__.<locals>.<genexpr>%   ó    é € Ð4ªG qŒs�1‹v˜‰{×"˜dÔ"ªGùó   ‚$&ú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"   ÚArrayComprehension.__new__$   s²   € ÜÑ4©GÓ4×4Ñ4Üð 4ó 5ð 5ä˜8Ó$Ð%ˆØ�‰�s×1Ñ1°(ÓDÔEÜ�mŠm˜CÐ9 'Ò9¨[Ñ9ˆØ—i‘i  �mˆŒØ×5Ñ5°c·k±kÓBˆŒ
Ü˜Ÿ
™
“OˆŒ	Ø×1Ñ1°#·*±*Ó=ˆŒØˆ
ó    c                 ó    • U R                   S   $ )zù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,   ÚArrayComprehension.function1   s   € ð �z‰z˜!‰}Ðr2   c                 ó   • U R                   $ )a%  
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$   r4   s    r   ÚlimitsÚArrayComprehension.limitsA   s   € ð �|‰|Ðr2   c                 óì   • U R                   R                  nU R                   HM  u  p#nUR                  U5        UR                  R	                  UR                  5      nUR	                  U5      nMO     U$ )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)r5   Úexpr_free_symÚvarÚinfÚsupÚcurr_free_symss         r   r<   ÚArrayComprehension.free_symbolsR   sg   € ð( Ÿ™×2Ñ2ˆØ!Ÿ\œ\‰MˆC�cØ×!Ñ! #Ô&Ø ×-Ñ-×3Ñ3°C×4DÑ4DÓEˆNØ)×/Ñ/°Ó?ŠMñ *ð Ðr2   c                 óJ   • U R                    Vs/ s H  oS   PM	     sn$ s  snf )a  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   r8   ©r5   r   s     r   Ú	variablesÚArrayComprehension.variablesm   s"   € ð #ŸlšlÓ+šl˜�!”™lÑ+Ð+ùÒ+s   � c                 ón   • U R                    Vs/ s H  n[        U5      S:w  d  M  US   PM     sn$ s  snf )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   rF   s     r   Úbound_symbolsÚ ArrayComprehension.bound_symbols}   s0   € ð #ŸlšlÓ:šl˜¬c°!«f¸©k“��!”™lÑ:Ð:ùÒ:s   �2¦	2c                 ó   • U R                   $ )a½  
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&   r4   s    r   ÚshapeÚArrayComprehension.shape‰   s   € ð0 �{‰{Ðr2   c                 óz   • U R                    H+  u  pn[        X#5      R                  [        5      (       d  M+    g   g)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	   )r5   Ú_rA   rB   s       r   Úis_shape_numericÚ#ArrayComprehension.is_shape_numeric£   s3   € ð&  Ÿ<œ<‰KˆA�CÜ�S‹×$Ñ$¤V×,Ó,Ùñ (ð r2   c                 ó   • U R                   $ )zñ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'   r4   s    r   ÚrankÚArrayComprehension.rank»   s   € ð �z‰zÐr2   c                 óf   • U R                   R                  (       a  [        S5      eU R                   $ )ad  
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)   r<   r   r4   s    r   Ú__len__ÚArrayComprehension.__len__Ê   s'   € ð( �?‰?×'×'ÜÐ?Ó@Ð@Ø�‰Ðr2   c                 ó”  • / nU H¿  u  pEn[        U5      n[        U5      n[        U[        5      (       a	  [        U6 nO[        U5      nUR	                  [        XEU5      5        [        S XV4 5       5      (       a  [        S5      eXV:„  S:X  a  [        S5      eXER                  ;   d  XFR                  ;   d  M¶  [        S5      e   U$ )Nc              3   ó°   #   • U  HL  n[        U[        5      (       + =(       d+    UR                  [        [        5      UR                  5       :g  v •  MN     g 7f©N)Ú
isinstancer   rP   r	   r
   )r   Úis     r   r   Ú<ArrayComprehension._check_limits_validity.<locals>.<genexpr>ð   s@   é € ð UÚISÀAô # 1¤dÓ+Ô+×U°·±¼ÄÓ0HÈAÏGÉGËIÑ0UÔUÚISù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   r]   Úlistr   Úappendr   Ú	TypeErrorr   r<   )r+   r,   r9   Ú
new_limitsr@   rA   rB   s          r   r!   Ú)ArrayComprehension._check_limits_validityâ   sÌ   € ð ˆ
Û#‰MˆC�cÜ˜3“-ˆCÜ˜3“-ˆCô ˜#œt×$Ñ$Ü˜S�k‘ä˜s“m�Ø×Ñœe C¨cÓ2Ô3Üñ UØJMÉóU÷ Uñ UäÐ cÓdÐdØ‘	˜dÓ"Ü Ð!PÓQÐQØ×&Ñ&Ó&¨#×1AÑ1AÕ*AÜ Ð!LÓMÐMñ! $ð" Ðr2   c           
      ó`   • [        U VVVs/ s H  u  p#oDU-
  S-   PM     snnn5      $ s  snnnf ©Nr   )Útuple)r+   r9   rQ   rA   rB   s        r   r%   Ú/ArrayComprehension._calculate_shape_from_limitsù   s)   € ä±vÕ>²v©¨°˜C‘i !”m±vÓ>Ó?Ð?ùÔ>s   Œ)c                 ó4   • U(       d  gSnU H  nX#-  nM	     U$ )Nr   r   © )r+   rM   Ú	loop_sizer   s       r   r(   Ú'ArrayComprehension._calculate_loop_sizeý   s&   € æØØˆ	ÛˆAØ!™ŠIñ ð Ðr2   c                 óH   • U R                   (       d  U $ U R                  5       $ r\   )rR   Ú_expand_array)r5   Úhintss     r   ÚdoitÚArrayComprehension.doit  s   € Ø×$×$ØˆKà×!Ñ!Ó#Ð#r2   c                 ó  • / n[         R                  " U R                   VVVs/ s H  u  p#n[        X4S-   5      PM     snnn6  H#  nUR	                  U R                  U5      5        M%     [        XR                  5      $ s  snnnf rf   )Ú	itertoolsÚproductr$   Úrangera   Ú_get_elementr   rM   )r5   Úresr@   rA   rB   Úvaluess         r   rn   Ú ArrayComprehension._expand_array  sz   € ØˆÜ×'Ò'à+/¯<ª<õ*9â+7ñ -:¨C°cô +0°¸±UÖ*;á+7ó*9ó :ˆFð �J‰J�t×(Ñ(¨Ó0Ö1ñ:ô
 ' s¯J©JÓ7Ð7ùô*9s   £B c                 ó~   • U R                   n[        U R                  U5       H  u  p4UR                  X45      nM     U$ r\   )r,   ÚziprG   Úsubs)r5   rx   Útempr@   Úvals        r   rv   ÚArrayComprehension._get_element  s5   € Ø�}‰}ˆÜ˜DŸN™N¨FÖ3‰HˆCØ—9‘9˜SÓ&ŠDñ 4àˆr2   c                 óv   • U R                   (       a  U R                  5       R                  5       $ [        S5      e)am  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)rR   rn   Útolistr   r4   s    r   r�   ÚArrayComprehension.tolist  s1   € ð$ × × Ø×%Ñ%Ó'×.Ñ.Ó0Ð0äÐHÓIÐIr2   c                 óÄ   • SSK Jn  U R                  (       d  [        S5      eU R                  S:w  a  [        S5      eU" U R                  5       R                  5       5      $ )a½  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.matricesr„   rR   r   r'   rn   Útomatrix)r5   r„   s     r   r‡   ÚArrayComprehension.tomatrix3  sP   € õ. 	*à×$×$ÜÐNÓOÐOØ�:‰:˜‹?ÜÐ>Ó?Ð?á�d×(Ñ(Ó*×3Ñ3Ó5Ó6Ð6r2   rj   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r"   Úpropertyr,   r9   r<   rG   rJ   rM   rR   rU   rX   Úclassmethodr!   r%   r(   rp   rn   rv   r�   r‡   Ú__static_attributes__rj   r2   r   r   r   
   sú   † ñò2ð ñó ðð ñó ðð  ñó ðð4 ñ,ó ð,ð ñ	;ó ð	;ð ñó ðð2 ñó ðò.òð0 ñó ðð, ñ@ó ð@ð ñó ðò$ò8òòJõ.7r2   r   c                 ór   • S n[        U [        U5      5      =(       a    U R                  UR                  :H  $ )Nc                  ó   • g)Nr   rj   rj   r2   r   Ú<lambda>ÚisLambda.<locals>.<lambda>U  s   € �Qr2   )r]   Útyper‰   )ÚvÚLAMBDAs     r   ÚisLambdar˜   T  s*   € Ù€FÜ�aœ˜f›Ó&×H¨1¯:©:¸¿¹Ñ+HÐHr2   c                   ó4   • \ rS rSrSrS r\S 5       rS rSr	g)ÚArrayComprehensionMapiX  a  
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                 ó¸  • [        S U 5       5      (       a  [        S5      e[        U5      (       d  [        S5      eU R                  X5      n[        R
                  " U /UQ70 UD6nUR                  Ul        U R                  UR                  5      Ul	        [        UR                  5      Ul        U R                  UR                  5      Ul        Xl        U$ )Nc              3   óP   #   • U  H  n[        U5      S :g  =(       d    Sv •  M     g7fr   r   r   s     r   r   Ú0ArrayComprehensionMap.__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"   ÚArrayComprehensionMap.__new__q  s¶   € ÜÑ4©GÓ4×4Ñ4Üð 4ó 5ð 5ô ˜×!Ñ!ÜÐ6Ó7Ð7à×,Ñ,¨XÓ?ˆÜ�mŠm˜CÐ9 'Ò9¨[Ñ9ˆØ—i‘iˆŒØ×5Ñ5°c·k±kÓBˆŒ
Ü˜Ÿ
™
“OˆŒ	Ø×1Ñ1°#·*±*Ó=ˆŒØŒØˆ
r2   c                 ó,   ^ •  " U 4S jS[         5      nU$ )Nc                   ó"   >• \ rS rSrU 4S jrSrg)Ú%ArrayComprehensionMap.func.<locals>._i„  c                 ó6   >• [        TR                  /UQ70 UD6$ r\   )rš   rž   )r+   ÚargsÚkwargsr5   s      €r   r"   Ú-ArrayComprehensionMap.func.<locals>._.__new__…  s   ø€ Ü,¨T¯\©\ÐK¸DÒKÀFÑKÐKr2   rj   N)r‰   rŠ   r‹   rŒ   r"   r�   r4   s   €r   rQ   r¢   „  s   ø† ÷Lð Lr2   rQ   )rš   )r5   rQ   s   ` r   ÚfuncÚArrayComprehensionMap.func‚  s   ø€ ÷	LÔ%ô 	Lð ˆr2   c                 óü   • U R                   nU R                   R                  R                  S:X  a	  U" 5       nU$ U R                   R                  R                  S:X  a  U" [        R                  " S U5      5      nU$ )Nr   r   c                 ó
   • X-  $ r\   rj   )ÚaÚbs     r   r“   Ú4ArrayComprehensionMap._get_element.<locals>.<lambda>Ž  s   € °a²cr2   )rž   Ú__code__Úco_argcountÚ	functoolsÚreduce)r5   rx   r}   s      r   rv   Ú"ArrayComprehensionMap._get_element‰  sh   € Ø�|‰|ˆØ�<‰<× Ñ ×,Ñ,°Ó1Ù“6ˆDð ˆð �\‰\×"Ñ"×.Ñ.°!Ó3Ùœ	×(Ò(Ñ)9¸6ÓBÓCˆDØˆr2   rj   N)
r‰   rŠ   r‹   rŒ   r�   r"   rŽ   r§   rv   r�   rj   r2   r   rš   rš   X  s%   † ñò0ð" ñó ðõr2   rš   )r°   rs   Úsympy.core.sympifyr   r   Úsympy.core.exprr   Ú
sympy.corer   r   Úsympy.tensor.arrayr   Úsympy.core.symbolr	   Úsympy.core.numbersr
   r   r˜   rš   rj   r2   r   Ú<module>r¹      s<   ðß ß 0Ý  ß #Ý 6Ý $Ý &ôG7˜ô G7òT
Iô7Ð.õ 7r2   