K i$ddlmZddlmZddlmZmZmZmZm Z m Z ddl m Z ddl mZddlmZmZmZmZddlmZdZd Zd ZGd d ZeZe d Zej9edZej9edZej=edZej9edZej=edZej=edZej=edZej=edZej=edZej9edZej>dej@dejBdejDdejFdejHdejJdejLdejNd ejPd!i Z)ej9ee e d"Zy#)$) defaultdict)Q)AddMulPowNumber NumberSymbolSymbol) ImaginaryUnit)Abs) EquivalentAndOrImplies)MatMulc lt|jDcgc]}|j||c}Scc}w)a Apply all arguments of the expression to the fact structure. Parameters ========== symbol : Symbol A placeholder symbol. fact : Boolean Resulting ``Boolean`` expression. expr : Expr Examples ======== >>> from sympy import Q >>> from sympy.assumptions.sathandlers import allargs >>> from sympy.abc import x, y >>> allargs(x, Q.negative(x) | Q.positive(x), x*y) (Q.negative(x) | Q.positive(x)) & (Q.negative(y) | Q.positive(y)) )rargssubssymbolfactexprargs c/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/assumptions/sathandlers.pyallargsrs,2 499=C63'= >>=1c lt|jDcgc]}|j||c}Scc}w)a Apply any argument of the expression to the fact structure. Parameters ========== symbol : Symbol A placeholder symbol. fact : Boolean Resulting ``Boolean`` expression. expr : Expr Examples ======== >>> from sympy import Q >>> from sympy.assumptions.sathandlers import anyarg >>> from sympy.abc import x, y >>> anyarg(x, Q.negative(x) & Q.positive(x), x*y) (Q.negative(x) & Q.positive(x)) | (Q.negative(y) & Q.positive(y)) )rrrrs ranyargr+s,2 $))<3 &#&< ==>> from sympy import Q >>> from sympy.assumptions.sathandlers import exactlyonearg >>> from sympy.abc import x, y >>> exactlyonearg(x, Q.positive(x), x*y) (Q.positive(x) & ~Q.positive(y)) | (Q.positive(y) & ~Q.positive(x)) N)rrrrangelenr)rrrr pred_argsilitress r exactlyoneargr'Gs24899=C63'=I= #(Y#8:9Q<9Ra=!A#$4#CC4#: ;C J>#:sA>B % B/B B c.eZdZdZdZdZdZdZdZy)ClassFactRegistrya Register handlers against classes. Explanation =========== ``register`` method registers the handler function for a class. Here, handler function should return a single fact. ``multiregister`` method registers the handler function for multiple classes. Here, handler function should return a container of multiple facts. ``registry(expr)`` returns a set of facts for *expr*. Examples ======== Here, we register the facts for ``Abs``. >>> from sympy import Abs, Equivalent, Q >>> from sympy.assumptions.sathandlers import ClassFactRegistry >>> reg = ClassFactRegistry() >>> @reg.register(Abs) ... def f1(expr): ... return Q.nonnegative(expr) >>> @reg.register(Abs) ... def f2(expr): ... arg = expr.args[0] ... return Equivalent(~Q.zero(arg), ~Q.zero(expr)) Calling the registry with expression returns the defined facts for the expression. >>> from sympy.abc import x >>> reg(Abs(x)) {Q.nonnegative(Abs(x)), Equivalent(~Q.zero(x), ~Q.zero(Abs(x)))} Multiple facts can be registered at once by ``multiregister`` method. >>> reg2 = ClassFactRegistry() >>> @reg2.multiregister(Abs) ... def _(expr): ... arg = expr.args[0] ... return [Q.even(arg) >> Q.even(expr), Q.odd(arg) >> Q.odd(expr)] >>> reg2(Abs(x)) {Implies(Q.even(x), Q.even(Abs(x))), Implies(Q.odd(x), Q.odd(Abs(x)))} cTtt|_tt|_yN)r frozenset singlefacts multifacts)selfs r__init__zClassFactRegistry.__init__s&y1%i0cfd}|S)Nc8jxx|hzcc<|Sr+)r-)funcclsr/s r_z%ClassFactRegistry.register.._s   S !dV + !Kr1)r/r5r6s`` rregisterzClassFactRegistry.registers r1cfd}|S)NcFD]}j|xx|hzcc<|Sr+)r.)r4r5classesr/s rr6z*ClassFactRegistry.multiregister.._s- /$.$ /Kr1r7)r/r;r6s`` r multiregisterzClassFactRegistry.multiregisters r1c|j|}|jD]!}t||s||j|z}#|j|}|jD]!}t||s||j|z}#||fSr+)r- issubclassr.)r/keyret1kret2s r __getitem__zClassFactRegistry.__getitem__s$!! ,A#q!((++ ,s# +A#q!** +Tzr1ct}|t\}}|jfd|D|D]}|j||S)Nc3.K|] }|ywr+r7).0hrs r z-ClassFactRegistry.__call__..s.q1T7.s)settypeupdate)r/rret handlers1 handlers2rGs ` r__call__zClassFactRegistry.__call__sSe#DJ/ 9 .I.. A JJqw   r1N) __name__ __module__ __qualname____doc__r0r8r<rCrOr7r1rr)r)hs!.^1  r1r)xc|jd}tj|ttj|tj|tj |tj |z tj |tj |z tj|tj|z gS)Nr)rr nonnegativer zeroevenoddinteger)rrs rr6r6s ))A,C MM$  s |affTl] 3 FF3K166$< ' EE#J!%%+ % IIcNaiio -  r1c tttjt|tj|z tttjt|tj|z tttj t|tj |z tttj t|tj |z tttjt|tj|z tttjt|tj|z gSr+) rrTrpositivenegativerealrationalrZr'rs rr6r6s Aqzz!}d +qzz$/? ? Aqzz!}d +qzz$/? ? Aqvvay$ '166$< 7 Aqzz!}d +qzz$/? ? Aqyy|T *aiio = !aiil]D 1aiio5E E  r1c tttjt|}t ttj t|}t |t |tj |Sr+rrTrr^r' irrationalrr allargs_realonearg_irrationals rr6r6M1affQi.L%aa$? <):ALL:all4.@BT#U VVr1c |j|j}}tj|tj|ztj |ztj |z tj |tj |ztj |ztj |z tj|tj |ztj |ztj|z ttj|tj|tj|zgSr+) baseexprr^rXrVrY nonpositiver rWr\)rr{r|s rr6r6 s 488#D s #ammC&8 8Q]]4=PP t quuSz )AMM#,> >1==QUCVV t quuSz )AMM#,> >1==QUCVV166$< 3!?@  r1c|jSr+) is_positiveos rr. !--r1c|jSr+)is_zerors rrr/ aiir1c|jSr+) is_negativers rrr0rr1c|jSr+) is_rationalrs rrr1rr1c|jSr+) is_irrationalrs rrr2s AOOr1c|jSr+)is_evenrs rrr3rr1c|jSr+)is_oddrs rrr4s QXXr1c|jSr+) is_imaginaryrs rrr5 1>>r1c|jSr+)is_primers rrr6s qzzr1c|jSr+) is_compositers rrr7rr1cg}tjD]3\}}||}||}||jt||5|Sr+)_old_assump_gettersitemsappendr )rrLpgetterpredprops rr6r6:sU C(..0/ 6wd|   JJz$- . / Jr1N)* collectionsrsympy.assumptions.askr sympy.corerrrrr r sympy.core.numbersr $sympy.functions.elementary.complexesr sympy.logic.boolalgr rrrsympy.matrices.expressionsrrrr'r)class_fact_registryrTr<r6r8r\rWr]r_rcrXrYrnrk compositerr7r1rrs%##DD,4>>-?8>8BVVp()  3K""3'(""3'(c"Q#Q""3'(c"2#2c"W#W c"Q#Q c"K#Kf%W&W""3'(JJ'FF JJ'JJ'LL+FF EE KK)GG !KK) ""6<GHr1