Repository navigation
Membership and divisibility compile - #2223
Conversation
x in S and a divides b were refused by both compilers. Each now compiles to the truth value evaluation gives: 1, 0 or NaN in FastExpression, and true, false or null in the LINQ compiler. The set is fixed when the expression is compiled, so only the element is computed. CompiledMembership rewrites a membership, before either compiler sees it, into the statement it makes about its element: - a union, an intersection and a difference become Kleene's or, and, and and-not of the memberships in their sides, as evaluation decides them since #2221; - an interval becomes the element's imaginary part being 0 and the two comparisons with its ends, since a number that is not real is in no interval, and i in [0; 1] is False rather than undecided; - a finite set becomes an equality with one of its members; - a conditional set becomes its predicate of the element. A membership in RR, CC, ZZ, ZZ+, ZZ* or PP is left for each compiler, which calls NumberStatements.In: a new FastExpression instruction, CALL_MEMBER, whose reference names the set, and a method call in LINQ. It has no truth value at NaN. An infinity is in RR and CC, as evaluation holds it until #2220 is decided, and in none of the sets of whole numbers. Primality comes from Primes.IsPrime, the interpreter's trial division, and is left open past 2^63, where the interpreter leaves it. QQ stays refused, because every finite double is a rational while pi in QQ is False. BB stays refused too. So does any set with one of those inside it. Divisibility is NumberStatements.Divides, through CALL_DIVIDES in FastExpression. Between whole numbers it is whether the remainder is 0, with 0 dividing only 0, and a double's remainder is exact however large. It has no truth value anywhere else, as evaluation gives NaN for 2 divides 5/2. MembershipCompilationTest compares both compilers with evaluation: - 21 sets at 20 points, among them i, 1 + i, 2i, +oo and -oo; - divisibility on a 10 by 9 grid, with 10^20, 5/2, 2i and +oo; - memberships inside an Iverson bracket, a piecewise and connectives; - the refusals. Infinities are left out of the piecewise case, since a compiled -x at +oo has a NaN imaginary part. That is #2222, and it predates this change. Part of #2195. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #2223 +/- ##
==========================================
+ Coverage 86.65% 86.67% +0.01%
==========================================
Files 306 308 +2
Lines 67550 67639 +89
Branches 19588 19610 +22
==========================================
+ Hits 58538 58623 +85
Misses 4897 4897
- Partials 4115 4119 +4
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
|
The chain's CrashCheck changed from 2296 returned and 154 declined to 2294 and 156. The two cases that moved are 🤖 Generated with Claude Code |
Over System.Numerics.Complex, in FastExpression and in the LINQ compiler, a product's imaginary part is a.Re b.Im + a.Im b.Re. With a real infinity that is inf * 0, which is NaN. So -x at +oo was (-inf, NaN), and so were 2 * x, x / 2 and x * x. That is a value with no imaginary part at all, so a comparison of it had no truth value and a piecewise passed over it. Evaluation gives -oo, and so does the compiler over double. RealProducts.Product and Quotient take two numbers whose imaginary parts are both 0 as reals, and anything else as before. FastExpression's CALL_MUL and CALL_DIV call them, and so does the LINQ compiler's Multiply and Divide over Complex. A division by 0 is left to Complex, whose NaN is evaluation's. A real Quotient would have made 1/x at 0 +inf, where evaluation has no value for 1/0. MembershipCompilationTest's piecewise case, which #2223 kept away from the infinities for this, now runs at +oo and -oo as well. RealProductCompilationTest: 8 expressions at +oo or -oo, all failing on master, and 6 elsewhere that keep their values: a division by 0, and complex products and quotients. A power at a real infinity is NaN in both parts, which is a different mechanism, Complex.Pow. It is #2225. Fixes #2222. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Part of #2195, item 3: the last of its statements.
x in Sanda divides bwere refused by both compilers. Each now compiles to the truth value evaluation gives:1,0orNaNin FastExpression, andtrue,falseornullin the LINQ compiler.Membership. The set is fixed when the expression is compiled, so only the element is computed. Before either compiler sees a membership,
CompiledMembershiprewrites it into the statement it makes about its element:or,and, andand notof the sides' memberships, as evaluation decides them since #2221Im(x) = 0and the two comparisons with the ends; a number that is not real is in no interval, soi in [0; 1]isFalseRR,CC,ZZ,ZZ+,ZZ*,PPNumberStatements.In, through a new FastExpression instructionCALL_MEMBERwhose reference names the set, and a method call in LINQNumberStatements.Inhas no truth value atNaN. An infinity is inRRandCC, as evaluation holds it until #2220 is decided, and in none of the sets of whole numbers. Primality is the interpreter's trial division, and is left open past2^63, where the interpreter leaves it.QQstays refused: every finite double is a rational, whilepi in QQisFalse.BBstays refused too, and so does any set with one of those inside it.Divisibility is
NumberStatements.Divides, throughCALL_DIVIDESin FastExpression. Between whole numbers it is whether the remainder is0, with0dividing only0. A double's remainder is exact however large the numbers are. Anywhere else it has no truth value, as evaluation givesNaNfor2 divides 5/2."x in [0; 1]".ToEntity().Compile("x").Call(0.5)UncompilableNodeException(1, 0)"x in PP".ToEntity().Compile<Complex, bool?>("x")(7)UncompilableNodeExceptiontrue"3 divides x".ToEntity().Compile("x").Call(6)UncompilableNodeException(1, 0)"3 divides x".ToEntity().Compile<double, bool?>("x")(2.5)UncompilableNodeExceptionnullTests.
MembershipCompilationTestcompares both compilers with evaluation:i,1 + i,2i,+ooand-oo;10^20,5/2,2iand+oo;piecewiseand connectives;The
piecewisecase leaves out infinities, because a compiled-xat+oohas aNaNimaginary part. That is #2222, which predates this PR. Full suite 18011/0, interactive trio, AOT smoke 73/0 with a membership case, all frameworks build.🤖 Generated with Claude Code