(dom: Json)
| 84 | * absent or not recognized. |
| 85 | */ |
| 86 | export function poolForDomain(dom: Json): Json[] { |
| 87 | if (dom === undefined || dom === null) return POOLS.complex; |
| 88 | if (typeof dom === 'string') { |
| 89 | switch (dom) { |
| 90 | case 'Integers': |
| 91 | return POOLS.integer; |
| 92 | case 'NonNegativeIntegers': |
| 93 | return POOLS.nonnegativeInteger; |
| 94 | case 'PositiveIntegers': |
| 95 | return POOLS.positiveInteger; |
| 96 | case 'NonPositiveIntegers': |
| 97 | return POOLS.nonpositiveInteger; |
| 98 | case 'NegativeIntegers': |
| 99 | return POOLS.negativeInteger; |
| 100 | case 'Primes': |
| 101 | return POOLS.prime; |
| 102 | case 'RationalNumbers': |
| 103 | return POOLS.rational; |
| 104 | case 'RealNumbers': |
| 105 | return POOLS.real; |
| 106 | case 'HH': |
| 107 | return POOLS.upperHalfPlane; |
| 108 | default: |
| 109 | return POOLS.complex; |
| 110 | } |
| 111 | } |
| 112 | if (Array.isArray(dom)) { |
| 113 | const h = dom[0]; |
| 114 | if (h === 'Range') { |
| 115 | const lo = typeof dom[1] === 'number' ? dom[1] : undefined; |
| 116 | const hi = typeof dom[2] === 'number' ? dom[2] : undefined; |
| 117 | if (lo !== undefined && hi !== undefined) { |
| 118 | const out: Json[] = []; |
| 119 | for (let k = lo; k <= Math.min(hi, lo + 9); k++) out.push(k); |
| 120 | return out; |
| 121 | } |
| 122 | if (lo !== undefined) return [lo, lo + 1, lo + 2, lo + 3, lo + 5]; |
| 123 | if (hi !== undefined) return [hi, hi - 1, hi - 2, hi - 3]; |
| 124 | return POOLS.integer; |
| 125 | } |
| 126 | if (h === 'Interval') { |
| 127 | // Sample exact rationals strictly inside the interval when the |
| 128 | // endpoints are simple literals; otherwise fall back to the real pool |
| 129 | // (the assumption filter rejects out-of-domain picks when CE can |
| 130 | // decide membership). |
| 131 | const num = (x: Json): number | undefined => { |
| 132 | let v = x; |
| 133 | if (Array.isArray(v) && v[0] === 'Open') v = v[1]; |
| 134 | if (typeof v === 'number') return v; |
| 135 | if (v === 'PositiveInfinity') return Infinity; |
| 136 | if (v === 'NegativeInfinity') return -Infinity; |
| 137 | if (v === 'Pi') return Math.PI; |
| 138 | if (Array.isArray(v) && v[0] === 'Negate') { |
| 139 | const inner = num(v[1]); |
| 140 | return inner === undefined ? undefined : -inner; |
| 141 | } |
| 142 | return undefined; |
| 143 | }; |
no test coverage detected