§
    PŠtj4  ã                   ó^   — d Z ddlmZ ddlmZ efd„Zd„ Zefd„Zd„ Zd	„ Z	d
„ Z
efd„Zd„ ZdS )zP Generic Rules for SymPy

This file assumes knowledge of Basic and little else.
é    )Úsifté   )Únewc                 ó   ‡ ‡— ˆ ˆfd„}|S )aÄ   Create a rule to remove identities.

    isid - fn :: x -> Bool  --- whether or not this element is an identity.

    Examples
    ========

    >>> from sympy.strategies import rm_id
    >>> from sympy import Basic, S
    >>> remove_zeros = rm_id(lambda x: x==0)
    >>> remove_zeros(Basic(S(1), S(0), S(2)))
    Basic(1, 2)
    >>> remove_zeros(Basic(S(0), S(0))) # If only identities then we keep one
    Basic(0)

    See Also:
        unpack
    c                 ó@  •— t          t          ‰| j        ¦  «        ¦  «        }t          |¦  «        dk    r| S t          |¦  «        t	          |¦  «        k    r+ ‰| j        gd„ t          | j        |¦  «        D ¦   «         ¢R Ž S  ‰| j        | j        d         ¦  «        S )z Remove identities r   c                 ó   — g | ]	\  }}|°|‘Œ
S © r	   )Ú.0ÚargÚxs      úQ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/strategies/rl.pyú
<listcomp>z/rm_id.<locals>.ident_remove.<locals>.<listcomp>$   s!   € ÐHÐHÐH¡  aÀaÐH˜ÐHÐHÐHó    )ÚlistÚmapÚargsÚsumÚlenÚ	__class__Úzip)ÚexprÚidsÚisidr   s     €€r   Úident_removezrm_id.<locals>.ident_remove   s§   ø€ å•3�t˜TœYÑ'Ô'Ñ(Ô(ˆÝˆs‰8Œ8�qŠ=ˆ=ØˆKÝ�‰XŒX�˜S™œÒ!Ð!Ø�3�t”~ð JØHÐH­3¨t¬y¸#Ñ+>Ô+>ÐHÑHÔHðJð Jð Jð Jð �3�t”~ t¤y°¤|Ñ4Ô4Ð4r   r	   )r   r   r   s   `` r   Úrm_idr   
   s*   øø€ ð&	5ð 	5ð 	5ð 	5ð 	5ð 	5ð Ðr   c                 ó   ‡ ‡‡— ˆˆˆ fd„}|S )a6   Create a rule to conglomerate identical args.

    Examples
    ========

    >>> from sympy.strategies import glom
    >>> from sympy import Add
    >>> from sympy.abc import x

    >>> key     = lambda x: x.as_coeff_Mul()[1]
    >>> count   = lambda x: x.as_coeff_Mul()[0]
    >>> combine = lambda cnt, arg: cnt * arg
    >>> rl = glom(key, count, combine)

    >>> rl(Add(x, -x, 3*x, 2, 3, evaluate=False))
    3*x + 5

    Wait, how are key, count and combine supposed to work?

    >>> key(2*x)
    x
    >>> count(2*x)
    2
    >>> combine(2, x)
    2*x
    c                 ó0  •— t          | j        ‰¦  «        }ˆfd„|                     ¦   «         D ¦   «         }ˆfd„|                     ¦   «         D ¦   «         }t          |¦  «        t          | j        ¦  «        k    rt	          t          | ¦  «        g|¢R Ž S | S )z2 Conglomerate together identical args x + x -> 2x c           	      óR   •— i | ]#\  }}|t          t          ‰|¦  «        ¦  «        “Œ$S r	   )r   r   )r
   Úkr   Úcounts      €r   ú
<dictcomp>z.glom.<locals>.conglomerate.<locals>.<dictcomp>I   s1   ø€ ÐIÐIÐI©w¨q°$�!•S�˜U DÑ)Ô)Ñ*Ô*ÐIÐIÐIr   c                 ó.   •— g | ]\  }} ‰||¦  «        ‘ŒS r	   r	   )r
   ÚmatÚcntÚcombines      €r   r   z.glom.<locals>.conglomerate.<locals>.<listcomp>J   s)   ø€ ÐDÐDÐD©¨¨c�7�7˜3 Ñ$Ô$ÐDÐDÐDr   )r   r   ÚitemsÚsetr   Útype)r   ÚgroupsÚcountsÚnewargsr%   r    Úkeys       €€€r   Úconglomeratezglom.<locals>.conglomerateF   s�   ø€ å�d”i Ñ%Ô%ˆØIÐIÐIÐI¸&¿,º,¹.¼.ÐIÑIÔIˆØDÐDÐDÐD°V·\²\±^´^ÐDÑDÔDˆÝˆw‰<Œ<�3˜tœy™>œ>Ò)Ð)Ý•t˜D‘z”zÐ, GÐ,Ð,Ð,Ð,àˆKr   r	   )r,   r    r%   r-   s   ``` r   Úglomr.   +   s0   øøø€ ð6ð ð ð ð ð ð ð Ðr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )zï Create a rule to sort by a key function.

    Examples
    ========

    >>> from sympy.strategies import sort
    >>> from sympy import Basic, S
    >>> sort_rl = sort(str)
    >>> sort_rl(Basic(S(3), S(1), S(2)))
    Basic(1, 2, 3)
    c                 óH   •—  ‰| j         gt          | j        ‰¬¦  «        ¢R Ž S )N)r,   )r   Úsortedr   )r   r,   r   s    €€r   Úsort_rlzsort.<locals>.sort_rl`   s,   ø€ Øˆs�4”>Ð?¥F¨4¬9¸#Ð$>Ñ$>Ô$>Ð?Ð?Ð?Ð?r   r	   )r,   r   r2   s   `` r   Úsortr3   S   s-   øø€ ð@ð @ð @ð @ð @ð @à€Nr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )aW   Turns an A containing Bs into a B of As

    where A, B are container types

    >>> from sympy.strategies import distribute
    >>> from sympy import Add, Mul, symbols
    >>> x, y = symbols('x,y')
    >>> dist = distribute(Mul, Add)
    >>> expr = Mul(2, x+y, evaluate=False)
    >>> expr
    2*(x + y)
    >>> dist(expr)
    2*x + 2*y
    c                 óò   •‡‡— t          | j        ¦  «        D ]^\  }}t          |‰¦  «        rI| j        d |…         | j        |         | j        |dz   d …         cŠ}Š ‰ˆˆˆfd„|j        D ¦   «         Ž c S Œ_| S )Nr   c                 ó(   •— g | ]} ‰‰|fz   ‰z   Ž ‘ŒS r	   r	   )r
   r   ÚAÚfirstÚtails     €€€r   r   z5distribute.<locals>.distribute_rl.<locals>.<listcomp>y   s+   ø€ ÐIÐIÐI¸3˜1˜1˜u¨ v™~°Ñ4Ð6ÐIÐIÐIr   )Ú	enumerater   Ú
isinstance)r   Úir   Úbr8   r9   r7   ÚBs       @@€€r   Údistribute_rlz!distribute.<locals>.distribute_rlu   s¢   øøø€ Ý ¤	Ñ*Ô*ð 	Kð 	K‰FˆAˆsÝ˜#˜qÑ!Ô!ð KØ!%¤¨2¨A¨2¤°´	¸!´¸d¼iÈÈAÉÈÈÔ>O���q˜$Ø�qÐIÐIÐIÐIÐIÐIÀ!Ä&ÐIÑIÔIÐJÐJÐJÐJðKð ˆr   r	   )r7   r>   r?   s   `` r   Ú
distributer@   e   s*   øø€ ð ð ð ð ð ð ð Ðr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )z Replace expressions exactly c                 ó   •— | ‰k    r‰S | S )Nr	   )r   Úar=   s    €€r   Úsubs_rlzsubs.<locals>.subs_rl€   s   ø€ Ø�1Š9ˆ9ØˆHàˆKr   r	   )rC   r=   rD   s   `` r   ÚsubsrE   ~   s)   øø€ ðð ð ð ð ð ð
 €Nr   c                 óP   — t          | j        ¦  «        dk    r| j        d         S | S )z• Rule to unpack singleton args

    >>> from sympy.strategies import unpack
    >>> from sympy import Basic, S
    >>> unpack(Basic(S(2)))
    2
    r   r   )r   r   ©r   s    r   ÚunpackrH   ‰   s(   € õ ˆ4Œ9�~„~˜ÒÐØŒy˜Œ|Ðàˆr   c                 óº   — | j         }g }| j        D ]=}|j         |k    r|                     |j        ¦  «         Œ(|                     |¦  «         Œ> || j         g|¢R Ž S )z9 Flatten T(a, b, T(c, d), T2(e)) to T(a, b, c, d, T2(e)) )r   r   ÚextendÚappend)r   r   Úclsr   r   s        r   ÚflattenrM   —   sr   € à
Œ.€CØ€DØŒyð ð ˆØŒ=˜CÒÐØ�KŠK˜œÑ!Ô!Ð!Ð!à�KŠK˜ÑÔÐÐØˆ3ˆtŒ~Ð% Ð%Ð%Ð%Ð%r   c                 ór   — | j         r| S  | j        t          t          t          | j        ¦  «        ¦  «        Ž S )zç Rebuild a SymPy tree.

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

    This function recursively calls constructors in the expression tree.
    This forces canonicalization and removes ugliness introduced by the use of
    Basic.__new__
    )Úis_AtomÚfuncr   r   Úrebuildr   rG   s    r   rQ   rQ   £   s6   € ð „|ð 9ØˆàˆtŒy�$�s¥7¨D¬IÑ6Ô6Ñ7Ô7Ð8Ð8r   N)Ú__doc__Úsympy.utilities.iterablesr   Úutilr   r   r.   r3   r@   rE   rH   rM   rQ   r	   r   r   ú<module>rU      s×   ððð ð +Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð ð ð ð ð ð ðB%ð %ð %ðP ð ð ð ð ð$ð ð ð2ð ð ðð ð ð ð 	&ð 	&ð 	&ð 	&ð9ð 9ð 9ð 9ð 9r   