
    wg.                     
   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* dd	l+m,Z,m-Z-m.Z.m/Z/m0Z0 dd
l1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZG  ed      ZHddgiZIeHrddlHmJZJmKZKmLZLmMZM ddlNmOZOmPZPmQZQ  eJj                  eC        eJj                  e:        eMj                  e:        eJj                  e2        eMj                  e2        eKj                  e2        eLj                  e2        eJj                  e8        eMj                  e8        eKj                  e8        eLj                  e8        eJj                  e<        eKj                  e<        eJj                  e=        eKj                  e=        eJj                  eA        eJj                  e        eJj                  e        eJj                  e        eJj                  e-        eJj                  e,        eJj                  e        eJj                  e0        eJj                  e.        eJj                  e/        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e         eJj                  e!        eJj                  e#        eJj                  e"        eJj                  e'        eJj                  e)        eJj                  e%        eJj                  e(        eJj                  e&        eJj                  e*        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eJj                  e        eOj                  eC      d        ZS eOj                  e4      d        ZS eQj                  eC      d        ZS eQj                  e4      d        ZS ePj                  e4      d0d       ZTeHrddlHmUZU n
 G d d       ZU eGd!"       G d# d$eUe?             ZV eGd!"       G d% d&eV             ZW eGd!"       G d' d(eV             ZX eGd!"       G d) d*eV             ZYd+ ZZ G d, d-e      Z[ eGd!"       G d. d/             Z\y)1zj
The objects in this module allow the usage of the MatchPy pattern matching
library on SymPy expressions.
    N)ListCallable
NamedTupleAnyDict)_sympify)import_module)
logsincostancotcscsecerfgamma
uppergamma)acoshasinhatanhacothacschasechcoshsinhtanhcothsechcsch)atanacscasinacotacosasec)fresnelcfresnelserfcerfiEi)Add)Basic)Expr)Mul)Pow)Equality
Unequality)Symbol)exp)Integral)srepr)doctest_depends_onmatchpy)*)	OperationCommutativeOperationAssociativeOperationOneIdentityOperation)op_itercreate_operation_expressionop_lenc                 T    t        | j                  d   f| j                  d   z         S )Nr      iter_args	operations    f/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/utilities/matchpy_connector.py_rH   [   s'    Y__Q')IOOA,>>??    c                 ,    t        | j                        S NrB   rE   s    rG   rH   rH   _   s    IOO$$rI   c                 8    dt        | j                  d         z   S )NrA   lenrD   rE   s    rG   rH   rH   c   s    3yq)***rI   c                 ,    t        | j                        S rK   rM   rE   s    rG   rH   rH   g   s    9??##rI   c                      t        |       | S rK   )type)old_operationnew_operandsvariable_names      rG   sympy_op_factoryrU   k   s    "tM"L11rI   )Wildcardc                       e Zd Zd Zy)rV   c                 <    || _         || _        || _        || _        y rK   )	min_count
fixed_sizerT   optional)self
min_lengthrZ   rT   r[   s        rG   __init__zWildcard.__init__t   s    'DN(DO!.D$DMrI   N)__name__
__module____qualname__r^    rI   rG   rV   rV   s   s    	%rI   rV   )r7   )modulesc                   v     e Zd ZU eed<   eed<   ddZd ZddZd Z	e
dd       Z fdZdd	Zd
 Zd Z xZS )_WildAbstractr]   rZ   c                     | j                   }| j                  }|t        |      }t        j                  | ||t        |      |       y rK   )r]   rZ   r   rV   r^   str)r\   rT   r[   assumptionsr]   rZ   s         rG   r^   z_WildAbstract.__init__   s?    __
__
)H$
JM8JHUrI   c                 v    | j                   | j                  | j                  | j                  | j                  dS )Nr]   rZ   rY   rT   r[   rj   r\   s    rG   __getstate__z_WildAbstract.__getstate__   s1    ////!//
 	
rI   c                 V    | j                  ||        t        j                  | ||fi |S rK   )	_sanitizere   __xnew__)clsrT   r[   rh   s       rG   __new__z_WildAbstract.__new__   s*    k3'%%c=(RkRRrI   c                 2    | j                   | j                  fS rK   rT   r[   rk   s    rG   __getnewargs__z_WildAbstract.__getnewargs__   s    !!4==00rI   c                 4    t        j                  | |fi |}|S rK   )r2   ro   )rp   rT   r[   rh   objs        rG   ro   z_WildAbstract.__xnew__   s    ooc=@K@
rI   c                     | j                   r=t        | 	         | j                  | j                  | j
                  | j                   fz   S t        | 	         | j                  | j                  | j
                  fz   S rK   )r[   super_hashable_contentrY   rZ   rT   )r\   	__class__s    rG   ry   z_WildAbstract._hashable_content   se    ==7,.$..$//SWSeSegkgtgt1uuu7,.$..$//SWSeSe1fffrI   c                 P     t        |       | j                  | j                        S )Nrs   )rQ   rT   r[   rk   s    rG   __copy__z_WildAbstract.__copy__   s    tDz(:(:T]]SSrI   c                     t        |       S rK   )rg   rk   s    rG   __repr__z_WildAbstract.__repr__   s    4yrI   c                     | j                   S rK   namerk   s    rG   __str__z_WildAbstract.__str__   s    yyrI   )NN)returnre   )r_   r`   ra   int__annotations__boolr^   rl   rq   rt   staticmethodro   ry   r|   r~   r   __classcell__)rz   s   @rG   re   re   {   sN    OV
S1  gTrI   re   c                       e Zd ZdZdZy)WildDotrA   TNr_   r`   ra   r]   rZ   rb   rI   rG   r   r      s    JJrI   r   c                       e Zd ZdZdZy)WildPlusrA   FNr   rb   rI   rG   r   r          JJrI   r   c                       e Zd ZdZdZy)WildStarr   FNr   rb   rI   rG   r   r      r   rI   r   c                     t        |       }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }|S )NzWildDot\('(\w+)'\)z\1zWildPlus\('(\w+)'\)z*\1zWildStar\('(\w+)'\))r5   resub)exprss     rG   
_get_sreprr      sI    dA
$eQ/A
%vq1A
%vq1AHrI   c                   "    e Zd ZU eed<   eed<   y)ReplacementInforeplacementinfoN)r_   r`   ra   r   r   rb   rI   rG   r   r      s    
IrI   r   c                       e Zd ZdZg ddfdededefdZdeded	e	f   fd
Z
de	deded	e	f   fdZde	ded	e	f   fdZde	ded	e	f   fdZg g dfde	dee	   dee	   deddf
dZddefdZy)Replacera  
    Replacer object to perform multiple pattern matching and subexpression
    replacements in SymPy expressions.

    Examples
    ========

    Example to construct a simple first degree equation solver:

    >>> from sympy.utilities.matchpy_connector import WildDot, Replacer
    >>> from sympy import Equality, Symbol
    >>> x = Symbol("x")
    >>> a_ = WildDot("a_", optional=1)
    >>> b_ = WildDot("b_", optional=0)

    The lines above have defined two wildcards, ``a_`` and ``b_``, the
    coefficients of the equation `a x + b = 0`. The optional values specified
    indicate which expression to return in case no match is found, they are
    necessary in equations like `a x = 0` and `x + b = 0`.

    Create two constraints to make sure that ``a_`` and ``b_`` will not match
    any expression containing ``x``:

    >>> from matchpy import CustomConstraint
    >>> free_x_a = CustomConstraint(lambda a_: not a_.has(x))
    >>> free_x_b = CustomConstraint(lambda b_: not b_.has(x))

    Now create the rule replacer with the constraints:

    >>> replacer = Replacer(common_constraints=[free_x_a, free_x_b])

    Add the matching rule:

    >>> replacer.add(Equality(a_*x + b_, 0), -b_/a_)

    Let's try it:

    >>> replacer.replace(Equality(3*x + 4, 0))
    -4/3

    Notice that it will not match equations expressed with other patterns:

    >>> eq = Equality(3*x, 4)
    >>> replacer.replace(eq)
    Eq(3*x, 4)

    In order to extend the matching patterns, define another one (we also need
    to clear the cache, because the previous result has already been memorized
    and the pattern matcher will not iterate again if given the same expression)

    >>> replacer.add(Equality(a_*x, b_), b_/a_)
    >>> replacer._matcher.clear()
    >>> replacer.replace(eq)
    4/3
    Fcommon_constraintslambdifyr   c                 n    t         j                         | _        || _        || _        || _        i | _        y rK   )r7   ManyToOneMatcher_matcher_common_constraint	_lambdify_info
_wildcards)r\   r   r   r   s       rG   r^   zReplacer.__init__  s/    002"4!
/1rI   
lambda_strr   .c                 @    t        d       t        |t                     S )Nzfrom sympy import *)execevallocals)r\   r   s     rG   _get_lambdazReplacer._get_lambda  s    "#J))rI   constraint_exprcondition_templatec           	         |j                  t              D cg c]  }|j                   }}dj                  |      }t	        |      }|j                  |      }t        j                  | j                  d| d| d            S c c}w )N, lambda z: ())	atomsre   r   joinr   formatr7   CustomConstraintr   )r\   r   r   xwilds
lambdaargsfullexpr	conditions           rG   _get_custom_constraintzReplacer._get_custom_constraint  s    !0!6!6}!EFAFFYYu%
o.&--h7	''wzl#i[BCE 	E	 Gs   Bc                 &    | j                  |d      S )Nz({}) != Falser   r\   r   s     rG   _get_custom_constraint_nonfalsez(Replacer._get_custom_constraint_nonfalse  s    **?OLLrI   c                 &    | j                  |d      S )Nz({}) == Truer   r   s     rG   _get_custom_constraint_truez$Replacer._get_custom_constraint_true  s    **?NKKrI   Nr   conditions_trueconditions_nonfalsec                    t        |      }t        |      }| j                  d d  }|D cg c]  }| j                  |       }}|D cg c]  }| j                  |       }	}|j	                  |       |j	                  |	       t        j                  |g| }
| j                  rNddj                  d |j                  t              D               dt        |       }| j                  |      }|}nF| j                  j                  |j                  t              D ci c]  }t!        |      | c}       | j"                  rt%        ||      }| j&                  j)                  |
|       y c c}w c c}w c c}w )Nr   r   c              3   4   K   | ]  }|j                     y wrK   r   ).0r   s     rG   	<genexpr>zReplacer.add.<locals>.<genexpr>+  s     -Xaff-Xs   z: )r   r   r   r   extendr7   Patternr   r   r   re   r   r   r   updaterV   rg   r   r   r   add)r\   r   r   r   r   r   constraintscondconstraint_conditions_trueconstraint_conditions_nonfalsepatternr   lambda_expris                 rG   r   zReplacer.add  sc   ~{+--a0?N&P7;D,,T2&P" &P DW*X;?D006*X& *X569://$55>>"499-Xdjj>W-X#Y"ZZ\]ghs]t\uvJ**:6K%KOO""tzz(7K#L!CFAI#LM::)+t<K';/&P*X $Ms   E/E4 E9	max_countc           	         g }d}d}|r|dk  s||k  rd}t         j                  |      D ]  \  }}	 t        t        | j                  j                  |                  \  }}	| j                  r(|j                  }
|j                  |j                         n|}
| j                  r	 |
di |	}n@|
j                  |	j                         D ci c]  \  }}| j                  |   | c}}      }t         j                  j                  |||      }d} n |dz  }|r|dk  r||k  r| j                  r||fS |S c c}}w # t         $ r Y !w xY w)NTr   FrA   rb   )r7   preorder_iter_with_positionnextrC   r   matchr   r   appendr   r   xreplaceitemsr   	functionsreplaceStopIteration)r\   
expressionr   infosreplacedreplace_countsubexprposreplacement_datasubstr   resultkvs                 rG   r   zReplacer.replace4  s[    IM]Y-FH ' C CJ O .248K8KG8T3U.V+$ezz&6&B&B%5%:%:;&6~~!,!5u!5!,!5!5Y^YdYdYf6gQUQRTUtq7I17L6g!h!(!2!2!:!::sF!SJ#H!& QM+ IM]Y-F, ::u$$ 7h
 % s$   BED;&+E;E	EE))r_   r`   ra   __doc__listr   r^   rg   r   r-   r   r   r   r   r   r   r   r   r   rb   rI   rG   r   r      s   6p 35u[` 24 2 2TX 2*c *hsDy.A *Ed EPS EX`adfjajXk EMt MQTVZQZH[ ML4 LHSRVYDW L JL.0d0 0DJ 0!%d08;0GK0, S  rI   r   )T)]r   r   typingr   r   r   r   r   sympy.core.sympifyr   sympy.externalr	   sympy.functionsr
   r   r   r   r   r   r   r   r   r   %sympy.functions.elementary.hyperbolicr   r   r   r   r   r   r   r   r   r   r   r   (sympy.functions.elementary.trigonometricr    r!   r"   r#   r$   r%   'sympy.functions.special.error_functionsr&   r'   r(   r)   r*   sympy.core.addr+   sympy.core.basicr,   sympy.core.exprr-   sympy.core.mulr.   sympy.core.powerr/   sympy.core.relationalr0   r1   sympy.core.symbolr2   &sympy.functions.elementary.exponentialr3   sympy.integrals.integralsr4   sympy.printing.reprr5   sympy.utilities.decoratorr6   r7   __doctest_requires__r9   r:   r;   r<   matchpy.expressions.functionsr=   r>   r?   registerrH   rU   rV   re   r   r   r   r   r   r   rb   rI   rG   <module>r     s   
 8 8 ' ( W W W ~ ~ ~ ~ W W V V  "      8 $ 6 . % 8 	
" ,  ccZZIx Is!!!#&Is!!!#&!!!#&!!!#&Is!!!#&!!!#&!!!#&Ix !!!(+Iz"!!!*-IsIsIuIz"Ix Ix IsIrItItIsIsIsIsIsIsItItItItItItItItItItItItIuIuIuIuIuIuWh@  @ We% % V__X+ + V__U$ $ * ))%02 12  % % L)-Hf - *-` L)m  *
 L)}  *
 L)}  *
j 
 L)H H *HrI   