not-so-float 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -248,6 +248,9 @@ function complement(A: Union | Interval): Union;
248
248
  | Cosine | `nsf.cos(A)` |
249
249
  | Sine | `nsf.sin(A)` |
250
250
  | Tangent | `nsf.tan(A)` |
251
+ | Arccos | `nsf.acos(A)` |
252
+ | Arcsin | `nsf.asin(A)` |
253
+ | Arctan | `nsf.atan(A)` |
251
254
 
252
255
  </div>
253
256
 
package/dist/index.cjs CHANGED
@@ -25,7 +25,10 @@ __export(index_exports, {
25
25
  Interval: () => Interval,
26
26
  Union: () => Union,
27
27
  abs: () => abs,
28
+ acos: () => acos,
28
29
  add: () => add,
30
+ asin: () => asin,
31
+ atan: () => atan,
29
32
  bounded: () => bounded,
30
33
  complement: () => complement,
31
34
  cos: () => cos,
@@ -653,6 +656,7 @@ function ipowInt(X, n) {
653
656
  }
654
657
  if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);
655
658
  if (n === 0) return new Union([new Interval(1, 1)]);
659
+ if (n === 1) return new Union([X]);
656
660
  if (X.lo > 0 || n % 2 !== 0) {
657
661
  return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);
658
662
  } else if (X.hi < 0) {
@@ -851,6 +855,37 @@ function utan(U) {
851
855
  return udiv(usin(U), ucos(U));
852
856
  }
853
857
  var tan = makeUnaryOpEither(utan);
858
+ function iacos(X) {
859
+ typeCheckIsInterval(X);
860
+ if (X.lo > 1 || X.hi < -1) return EMPTY;
861
+ const lower = X.hi >= 1 ? 0 : prev(Math.acos(X.hi));
862
+ const upper = next(Math.acos(Math.max(-1, X.lo)));
863
+ return new Union([new Interval(lower, upper)]);
864
+ }
865
+ var uacos = makeUnaryOpUnion(iacos);
866
+ var acos = makeUnaryOpEither(uacos);
867
+ function iasin(X) {
868
+ typeCheckIsInterval(X);
869
+ if (X.lo > 1 || X.hi < -1) return EMPTY;
870
+ const [l, h] = [Math.max(-1, X.lo), Math.min(1, X.hi)];
871
+ return new Union([new Interval(prev(Math.asin(l)), next(Math.asin(h)))]);
872
+ }
873
+ var uasin = makeUnaryOpUnion(iasin);
874
+ var asin = makeUnaryOpEither(uasin);
875
+ function leftAtan(x) {
876
+ if (x === 0) return 0;
877
+ return prev(Math.atan(x));
878
+ }
879
+ function rightAtan(x) {
880
+ if (x === 0) return 0;
881
+ return next(Math.atan(x));
882
+ }
883
+ function iatan(X) {
884
+ typeCheckIsInterval(X);
885
+ return new Union([new Interval(leftAtan(X.lo), rightAtan(X.hi))]);
886
+ }
887
+ var uatan = makeUnaryOpUnion(iatan);
888
+ var atan = makeUnaryOpEither(uatan);
854
889
  // Annotate the CommonJS export names for ESM import in node:
855
890
  0 && (module.exports = {
856
891
  EMPTY,
@@ -858,7 +893,10 @@ var tan = makeUnaryOpEither(utan);
858
893
  Interval,
859
894
  Union,
860
895
  abs,
896
+ acos,
861
897
  add,
898
+ asin,
899
+ atan,
862
900
  bounded,
863
901
  complement,
864
902
  cos,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["export { prev, next } from \"./nextafter.ts\";\nexport { Interval, interval } from \"./interval.ts\";\nexport { overlap, disjoint, intersection, complement } from \"./compare.ts\";\nexport { Union, union, single, bounded, EMPTY, FULL } from \"./union.ts\";\nexport { add, sub, mul, div, neg } from \"./arithmetic.ts\";\nexport { abs, min, max, exp, log, pow, powInt, sqrt, sqinv, powIntInv } from \"./math.ts\";\nexport { cos, sin, tan } from \"./trigonometry.ts\";\n","// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public width() : number {\n return this.hi - this.lo;\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n\nexport const IFULL = new Interval(-Infinity, Infinity);","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public isFinite(): boolean {\n return (\n this.isEmpty() ||\n (this.intervals[0].lo !== -Infinity &&\n this.intervals[this.intervals.length - 1].hi !== Infinity)\n );\n }\n\n public isSingle(): boolean {\n return this.intervals.length === 1;\n }\n\n public equalsSingle(lower: number, upper: number) {\n return this.isSingle() && this.intervals[0].lo === lower && this.intervals[0].hi === upper;\n }\n\n public count(): number {\n return this.intervals.length;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public subset(other: Union): boolean {\n return this.intervals.every((thisInterval) =>\n other.intervals.some((otherInterval) => thisInterval.subset(otherInterval))\n );\n }\n\n public superset(other: Union): boolean {\n return other.intervals.every((otherInterval) =>\n this.intervals.some((thisInterval) => thisInterval.superset(otherInterval))\n );\n }\n\n public hull(): Union {\n if (this.isEmpty()) return EMPTY;\n return single(this.lower(), this.upper());\n }\n\n public width(): number {\n return this.intervals.reduce((acc, interval) => acc + interval.width(), 0);\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union from a list of intervals or unions\nexport function union(list: (Interval | Union)[]): Union {\n const intervals = list.map((e) => (e instanceof Interval ? e : e.intervals)).flat();\n return iunion(intervals);\n}\n\n// Minimum disjoint set of a list of intervals\nfunction iunion(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\n// Create a singleton: a union with a single interval\nexport function single(a: number, b?: number): Union {\n if (typeof b === \"undefined\") {\n b = a;\n }\n return union([interval(a, b)]);\n}\n\n// Create a singleton that bounds a number\nexport function bounded(x: number): Union {\n return single(prev(x), next(x));\n}\n\nexport const EMPTY = new Union([]);\nexport const FULL = new Union([new Interval(-Infinity, Infinity)]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, IFULL, interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n single,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n FULL,\n makeUnaryOpEither,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return single(0);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return FULL; // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return FULL;\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return FULL; // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const neg = makeUnaryOpEither(uneg);\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, IFULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n FULL,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n single,\n} from \"./union.ts\";\nimport { idiv, div, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// abs: absolute value\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// min / max: binary min/max\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// exp: exponential\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// log: natural logarithm\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// powInt: exponentiation with an integer exponent\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([new Interval(1, 1)]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n // X contains 0\n return new Union([new Interval(0, rightPowInt(Math.max(X.hi, -X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// pow: exponentiation with a real exponent\n\nfunction zeroPow(exponent: Interval): Union {\n if (exponent.lo === 0 && exponent.hi === 0) return single(1, 1);\n if (exponent.contains(0)) return union([single(0, 0), single(1, 1)]);\n return single(0, 0);\n}\n\nexport function ipow(base: Interval, exponent: Interval): Union {\n if (base.hi < 0) return EMPTY;\n if (base.hi === 0) return zeroPow(exponent);\n const expLog = uexp(umul(union([exponent]), ilog(base)));\n if (base.contains(0)) return union([zeroPow(exponent), expLog]);\n return expLog;\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// sqrt: square root\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// sqinv: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n\n// powIntInv: inverse of an integral power\n\nexport function upowIntInv(U: Union, n: number): Union {\n if (n === 0) {\n if (U.contains(1)) return FULL;\n else return EMPTY;\n }\n\n if (n === 1) {\n return U;\n }\n\n if (n > 0 && n % 2 === 0) {\n return upowEvenInv(U, n);\n }\n\n if (n > 0 && n % 2 !== 0) {\n return upowOddInv(U, n);\n }\n\n // n negative\n if (U.lower() === 0 && U.upper() === 0) {\n return EMPTY;\n }\n\n const one = new Union([new Interval(1, 1)]);\n return div(one, upowIntInv(U, -n));\n}\n\nexport function powIntInv(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowIntInv(toUnion(A), n);\n}\n\n// x = y^(1/n) with n odd and positive\nfunction leftPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return prev(Math.pow(y, prev(1 / n)));\n else return prev(-Math.pow(-y, next(1 / n)));\n}\n\nfunction rightPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return next(Math.pow(y, next(1 / n)));\n else return next(-Math.pow(-y, prev(1 / n)));\n}\n\n// Inverse of an odd integer power\nfunction ipowOddInv(X: Interval, n: number): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftPowOddInv(X.lo, n), rightPowOddInv(X.hi, n));\n}\n\nfunction upowOddInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map((X) => ipowOddInv(X, n)));\n}\n\n// x = y^(1/n) with n even and positive, and y positive\nfunction leftPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return prev(Math.pow(y, prev(1 / n)));\n}\n\nfunction rightPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return next(Math.pow(y, next(1 / n)));\n}\n\nexport function ipowEvenInv(Y: Interval, n: number): Union {\n if (Y.hi < 0) {\n return EMPTY;\n } else if (Y.hi === 0) {\n return new Union([new Interval(0, 0)]);\n } else {\n const principal = new Interval(\n leftPowEvenInv(Math.max(0, Y.lo), n),\n rightPowEvenInv(Y.hi, n)\n );\n return new Union([ineg(principal), principal]);\n }\n}\n\nexport function upowEvenInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((X) => ipowEvenInv(X, n).intervals).flat());\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":["interval"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["export { prev, next } from \"./nextafter.ts\";\nexport { Interval, interval } from \"./interval.ts\";\nexport { overlap, disjoint, intersection, complement } from \"./compare.ts\";\nexport { Union, union, single, bounded, EMPTY, FULL } from \"./union.ts\";\nexport { add, sub, mul, div, neg } from \"./arithmetic.ts\";\nexport { abs, min, max, exp, log, pow, powInt, sqrt, sqinv, powIntInv } from \"./math.ts\";\nexport { cos, sin, tan, acos, asin, atan } from \"./trigonometry.ts\";\n","// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public width() : number {\n return this.hi - this.lo;\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n\nexport const IFULL = new Interval(-Infinity, Infinity);","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public isFinite(): boolean {\n return (\n this.isEmpty() ||\n (this.intervals[0].lo !== -Infinity &&\n this.intervals[this.intervals.length - 1].hi !== Infinity)\n );\n }\n\n public isSingle(): boolean {\n return this.intervals.length === 1;\n }\n\n public equalsSingle(lower: number, upper: number) {\n return this.isSingle() && this.intervals[0].lo === lower && this.intervals[0].hi === upper;\n }\n\n public count(): number {\n return this.intervals.length;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public subset(other: Union): boolean {\n return this.intervals.every((thisInterval) =>\n other.intervals.some((otherInterval) => thisInterval.subset(otherInterval))\n );\n }\n\n public superset(other: Union): boolean {\n return other.intervals.every((otherInterval) =>\n this.intervals.some((thisInterval) => thisInterval.superset(otherInterval))\n );\n }\n\n public hull(): Union {\n if (this.isEmpty()) return EMPTY;\n return single(this.lower(), this.upper());\n }\n\n public width(): number {\n return this.intervals.reduce((acc, interval) => acc + interval.width(), 0);\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union from a list of intervals or unions\nexport function union(list: (Interval | Union)[]): Union {\n const intervals = list.map((e) => (e instanceof Interval ? e : e.intervals)).flat();\n return iunion(intervals);\n}\n\n// Minimum disjoint set of a list of intervals\nfunction iunion(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\n// Create a singleton: a union with a single interval\nexport function single(a: number, b?: number): Union {\n if (typeof b === \"undefined\") {\n b = a;\n }\n return union([interval(a, b)]);\n}\n\n// Create a singleton that bounds a number\nexport function bounded(x: number): Union {\n return single(prev(x), next(x));\n}\n\nexport const EMPTY = new Union([]);\nexport const FULL = new Union([new Interval(-Infinity, Infinity)]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, IFULL, interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n single,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n FULL,\n makeUnaryOpEither,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return single(0);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return FULL; // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return FULL;\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return FULL; // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const neg = makeUnaryOpEither(uneg);\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, IFULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n FULL,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n single,\n} from \"./union.ts\";\nimport { idiv, div, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// abs: absolute value\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// min / max: binary min/max\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// exp: exponential\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// log: natural logarithm\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// powInt: exponentiation with an integer exponent\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([new Interval(1, 1)]);\n if (n === 1) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n // X contains 0\n return new Union([new Interval(0, rightPowInt(Math.max(X.hi, -X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// pow: exponentiation with a real exponent\n\nfunction zeroPow(exponent: Interval): Union {\n if (exponent.lo === 0 && exponent.hi === 0) return single(1, 1);\n if (exponent.contains(0)) return union([single(0, 0), single(1, 1)]);\n return single(0, 0);\n}\n\nexport function ipow(base: Interval, exponent: Interval): Union {\n if (base.hi < 0) return EMPTY;\n if (base.hi === 0) return zeroPow(exponent);\n const expLog = uexp(umul(union([exponent]), ilog(base)));\n if (base.contains(0)) return union([zeroPow(exponent), expLog]);\n return expLog;\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// sqrt: square root\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// sqinv: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n\n// powIntInv: inverse of an integral power\n\nexport function upowIntInv(U: Union, n: number): Union {\n if (n === 0) {\n if (U.contains(1)) return FULL;\n else return EMPTY;\n }\n\n if (n === 1) {\n return U;\n }\n\n if (n > 0 && n % 2 === 0) {\n return upowEvenInv(U, n);\n }\n\n if (n > 0 && n % 2 !== 0) {\n return upowOddInv(U, n);\n }\n\n // n negative\n if (U.lower() === 0 && U.upper() === 0) {\n return EMPTY;\n }\n\n const one = new Union([new Interval(1, 1)]);\n return div(one, upowIntInv(U, -n));\n}\n\nexport function powIntInv(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowIntInv(toUnion(A), n);\n}\n\n// x = y^(1/n) with n odd and positive\nfunction leftPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return prev(Math.pow(y, prev(1 / n)));\n else return prev(-Math.pow(-y, next(1 / n)));\n}\n\nfunction rightPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return next(Math.pow(y, next(1 / n)));\n else return next(-Math.pow(-y, prev(1 / n)));\n}\n\n// Inverse of an odd integer power\nfunction ipowOddInv(X: Interval, n: number): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftPowOddInv(X.lo, n), rightPowOddInv(X.hi, n));\n}\n\nfunction upowOddInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map((X) => ipowOddInv(X, n)));\n}\n\n// x = y^(1/n) with n even and positive, and y positive\nfunction leftPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return prev(Math.pow(y, prev(1 / n)));\n}\n\nfunction rightPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return next(Math.pow(y, next(1 / n)));\n}\n\nexport function ipowEvenInv(Y: Interval, n: number): Union {\n if (Y.hi < 0) {\n return EMPTY;\n } else if (Y.hi === 0) {\n return new Union([new Interval(0, 0)]);\n } else {\n const principal = new Interval(\n leftPowEvenInv(Math.max(0, Y.lo), n),\n rightPowEvenInv(Y.hi, n)\n );\n return new Union([ineg(principal), principal]);\n }\n}\n\nexport function upowEvenInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((X) => ipowEvenInv(X, n).intervals).flat());\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n bounded,\n EMPTY,\n} from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n\n// ARCCOS\n\nexport function iacos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.lo > 1 || X.hi < -1) return EMPTY;\n const lower = X.hi >= 1 ? 0 : prev(Math.acos(X.hi));\n const upper = next(Math.acos(Math.max(-1, X.lo)));\n return new Union([new Interval(lower, upper)]);\n}\n\nexport const uacos = makeUnaryOpUnion(iacos);\nexport const acos = makeUnaryOpEither(uacos);\n\n// ARCSIN\n\nexport function iasin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.lo > 1 || X.hi < -1) return EMPTY;\n const [l, h] = [Math.max(-1, X.lo), Math.min(1, X.hi)];\n return new Union([new Interval(prev(Math.asin(l)), next(Math.asin(h)))]);\n}\n\nexport const uasin = makeUnaryOpUnion(iasin);\nexport const asin = makeUnaryOpEither(uasin);\n\n// ARCTAN\n\nfunction leftAtan(x: number): number {\n if (x === 0) return 0;\n return prev(Math.atan(x));\n}\n\nfunction rightAtan(x: number): number {\n if (x === 0) return 0;\n return next(Math.atan(x));\n}\n\nexport function iatan(X: Interval): Union {\n typeCheckIsInterval(X);\n return new Union([new Interval(leftAtan(X.lo), rightAtan(X.hi))]);\n}\n\nexport const uatan = makeUnaryOpUnion(iatan);\nexport const atan = makeUnaryOpEither(uatan);\n"],"mappings":"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","names":["interval"]}
package/dist/index.d.cts CHANGED
@@ -68,5 +68,8 @@ declare function powIntInv(A: Interval | Union, n: number): Union;
68
68
  declare const cos: (A: Interval | Union) => Union;
69
69
  declare const sin: (A: Interval | Union) => Union;
70
70
  declare const tan: (A: Interval | Union) => Union;
71
+ declare const acos: (A: Interval | Union) => Union;
72
+ declare const asin: (A: Interval | Union) => Union;
73
+ declare const atan: (A: Interval | Union) => Union;
71
74
 
72
- export { EMPTY, FULL, Interval, Union, abs, add, bounded, complement, cos, disjoint, div, exp, intersection, interval, log, max, min, mul, neg, next, overlap, pow, powInt, powIntInv, prev, sin, single, sqinv, sqrt, sub, tan, union };
75
+ export { EMPTY, FULL, Interval, Union, abs, acos, add, asin, atan, bounded, complement, cos, disjoint, div, exp, intersection, interval, log, max, min, mul, neg, next, overlap, pow, powInt, powIntInv, prev, sin, single, sqinv, sqrt, sub, tan, union };
package/dist/index.d.ts CHANGED
@@ -68,5 +68,8 @@ declare function powIntInv(A: Interval | Union, n: number): Union;
68
68
  declare const cos: (A: Interval | Union) => Union;
69
69
  declare const sin: (A: Interval | Union) => Union;
70
70
  declare const tan: (A: Interval | Union) => Union;
71
+ declare const acos: (A: Interval | Union) => Union;
72
+ declare const asin: (A: Interval | Union) => Union;
73
+ declare const atan: (A: Interval | Union) => Union;
71
74
 
72
- export { EMPTY, FULL, Interval, Union, abs, add, bounded, complement, cos, disjoint, div, exp, intersection, interval, log, max, min, mul, neg, next, overlap, pow, powInt, powIntInv, prev, sin, single, sqinv, sqrt, sub, tan, union };
75
+ export { EMPTY, FULL, Interval, Union, abs, acos, add, asin, atan, bounded, complement, cos, disjoint, div, exp, intersection, interval, log, max, min, mul, neg, next, overlap, pow, powInt, powIntInv, prev, sin, single, sqinv, sqrt, sub, tan, union };
package/dist/index.js CHANGED
@@ -596,6 +596,7 @@ function ipowInt(X, n) {
596
596
  }
597
597
  if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);
598
598
  if (n === 0) return new Union([new Interval(1, 1)]);
599
+ if (n === 1) return new Union([X]);
599
600
  if (X.lo > 0 || n % 2 !== 0) {
600
601
  return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);
601
602
  } else if (X.hi < 0) {
@@ -794,13 +795,47 @@ function utan(U) {
794
795
  return udiv(usin(U), ucos(U));
795
796
  }
796
797
  var tan = makeUnaryOpEither(utan);
798
+ function iacos(X) {
799
+ typeCheckIsInterval(X);
800
+ if (X.lo > 1 || X.hi < -1) return EMPTY;
801
+ const lower = X.hi >= 1 ? 0 : prev(Math.acos(X.hi));
802
+ const upper = next(Math.acos(Math.max(-1, X.lo)));
803
+ return new Union([new Interval(lower, upper)]);
804
+ }
805
+ var uacos = makeUnaryOpUnion(iacos);
806
+ var acos = makeUnaryOpEither(uacos);
807
+ function iasin(X) {
808
+ typeCheckIsInterval(X);
809
+ if (X.lo > 1 || X.hi < -1) return EMPTY;
810
+ const [l, h] = [Math.max(-1, X.lo), Math.min(1, X.hi)];
811
+ return new Union([new Interval(prev(Math.asin(l)), next(Math.asin(h)))]);
812
+ }
813
+ var uasin = makeUnaryOpUnion(iasin);
814
+ var asin = makeUnaryOpEither(uasin);
815
+ function leftAtan(x) {
816
+ if (x === 0) return 0;
817
+ return prev(Math.atan(x));
818
+ }
819
+ function rightAtan(x) {
820
+ if (x === 0) return 0;
821
+ return next(Math.atan(x));
822
+ }
823
+ function iatan(X) {
824
+ typeCheckIsInterval(X);
825
+ return new Union([new Interval(leftAtan(X.lo), rightAtan(X.hi))]);
826
+ }
827
+ var uatan = makeUnaryOpUnion(iatan);
828
+ var atan = makeUnaryOpEither(uatan);
797
829
  export {
798
830
  EMPTY,
799
831
  FULL,
800
832
  Interval,
801
833
  Union,
802
834
  abs,
835
+ acos,
803
836
  add,
837
+ asin,
838
+ atan,
804
839
  bounded,
805
840
  complement,
806
841
  cos,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public width() : number {\n return this.hi - this.lo;\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n\nexport const IFULL = new Interval(-Infinity, Infinity);","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public isFinite(): boolean {\n return (\n this.isEmpty() ||\n (this.intervals[0].lo !== -Infinity &&\n this.intervals[this.intervals.length - 1].hi !== Infinity)\n );\n }\n\n public isSingle(): boolean {\n return this.intervals.length === 1;\n }\n\n public equalsSingle(lower: number, upper: number) {\n return this.isSingle() && this.intervals[0].lo === lower && this.intervals[0].hi === upper;\n }\n\n public count(): number {\n return this.intervals.length;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public subset(other: Union): boolean {\n return this.intervals.every((thisInterval) =>\n other.intervals.some((otherInterval) => thisInterval.subset(otherInterval))\n );\n }\n\n public superset(other: Union): boolean {\n return other.intervals.every((otherInterval) =>\n this.intervals.some((thisInterval) => thisInterval.superset(otherInterval))\n );\n }\n\n public hull(): Union {\n if (this.isEmpty()) return EMPTY;\n return single(this.lower(), this.upper());\n }\n\n public width(): number {\n return this.intervals.reduce((acc, interval) => acc + interval.width(), 0);\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union from a list of intervals or unions\nexport function union(list: (Interval | Union)[]): Union {\n const intervals = list.map((e) => (e instanceof Interval ? e : e.intervals)).flat();\n return iunion(intervals);\n}\n\n// Minimum disjoint set of a list of intervals\nfunction iunion(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\n// Create a singleton: a union with a single interval\nexport function single(a: number, b?: number): Union {\n if (typeof b === \"undefined\") {\n b = a;\n }\n return union([interval(a, b)]);\n}\n\n// Create a singleton that bounds a number\nexport function bounded(x: number): Union {\n return single(prev(x), next(x));\n}\n\nexport const EMPTY = new Union([]);\nexport const FULL = new Union([new Interval(-Infinity, Infinity)]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, IFULL, interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n single,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n FULL,\n makeUnaryOpEither,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return single(0);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return FULL; // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return FULL;\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return FULL; // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const neg = makeUnaryOpEither(uneg);\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, IFULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n FULL,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n single,\n} from \"./union.ts\";\nimport { idiv, div, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// abs: absolute value\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// min / max: binary min/max\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// exp: exponential\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// log: natural logarithm\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// powInt: exponentiation with an integer exponent\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([new Interval(1, 1)]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n // X contains 0\n return new Union([new Interval(0, rightPowInt(Math.max(X.hi, -X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// pow: exponentiation with a real exponent\n\nfunction zeroPow(exponent: Interval): Union {\n if (exponent.lo === 0 && exponent.hi === 0) return single(1, 1);\n if (exponent.contains(0)) return union([single(0, 0), single(1, 1)]);\n return single(0, 0);\n}\n\nexport function ipow(base: Interval, exponent: Interval): Union {\n if (base.hi < 0) return EMPTY;\n if (base.hi === 0) return zeroPow(exponent);\n const expLog = uexp(umul(union([exponent]), ilog(base)));\n if (base.contains(0)) return union([zeroPow(exponent), expLog]);\n return expLog;\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// sqrt: square root\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// sqinv: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n\n// powIntInv: inverse of an integral power\n\nexport function upowIntInv(U: Union, n: number): Union {\n if (n === 0) {\n if (U.contains(1)) return FULL;\n else return EMPTY;\n }\n\n if (n === 1) {\n return U;\n }\n\n if (n > 0 && n % 2 === 0) {\n return upowEvenInv(U, n);\n }\n\n if (n > 0 && n % 2 !== 0) {\n return upowOddInv(U, n);\n }\n\n // n negative\n if (U.lower() === 0 && U.upper() === 0) {\n return EMPTY;\n }\n\n const one = new Union([new Interval(1, 1)]);\n return div(one, upowIntInv(U, -n));\n}\n\nexport function powIntInv(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowIntInv(toUnion(A), n);\n}\n\n// x = y^(1/n) with n odd and positive\nfunction leftPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return prev(Math.pow(y, prev(1 / n)));\n else return prev(-Math.pow(-y, next(1 / n)));\n}\n\nfunction rightPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return next(Math.pow(y, next(1 / n)));\n else return next(-Math.pow(-y, prev(1 / n)));\n}\n\n// Inverse of an odd integer power\nfunction ipowOddInv(X: Interval, n: number): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftPowOddInv(X.lo, n), rightPowOddInv(X.hi, n));\n}\n\nfunction upowOddInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map((X) => ipowOddInv(X, n)));\n}\n\n// x = y^(1/n) with n even and positive, and y positive\nfunction leftPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return prev(Math.pow(y, prev(1 / n)));\n}\n\nfunction rightPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return next(Math.pow(y, next(1 / n)));\n}\n\nexport function ipowEvenInv(Y: Interval, n: number): Union {\n if (Y.hi < 0) {\n return EMPTY;\n } else if (Y.hi === 0) {\n return new Union([new Interval(0, 0)]);\n } else {\n const principal = new Interval(\n leftPowEvenInv(Math.max(0, Y.lo), n),\n rightPowEvenInv(Y.hi, n)\n );\n return new Union([ineg(principal), principal]);\n }\n}\n\nexport function upowEvenInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((X) => ipowEvenInv(X, n).intervals).flat());\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport { Union, typeCheckIsUnion, makeUnaryOpUnion, makeUnaryOpEither, bounded } from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n"],"mappings":"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","names":["interval"]}
1
+ {"version":3,"sources":["../src/nextafter.ts","../src/interval.ts","../src/union.ts","../src/compare.ts","../src/arithmetic.ts","../src/math.ts","../src/trigonometry.ts"],"sourcesContent":["// Reuse a global buffer to avoid allocations\nconst buffer = new ArrayBuffer(8);\nconst floatView = new Float64Array(buffer);\nconst intView = new BigUint64Array(buffer);\n\n// Implementation of the C function nextafter(x, Infinity)\nexport function next(x: number): number {\n if (x === Infinity) return x;\n if (x === 0) return Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x > 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n\n// Implementation of the C function nextafter(x, -Infinity)\nexport function prev(x: number): number {\n if (x === -Infinity) return x;\n if (x === 0) return -Number.MIN_VALUE;\n\n floatView[0] = x;\n let bits: bigint = intView[0];\n\n if (x < 0) {\n bits += 1n;\n } else {\n bits -= 1n;\n }\n\n intView[0] = bits;\n return floatView[0];\n}\n","export const defaultNumbers = (x: number) => x.toString();\n\nexport class Interval {\n constructor(readonly lo: number, readonly hi: number) {}\n\n public isFull(): boolean {\n return this.lo === -Infinity && this.hi === Infinity;\n }\n\n public isFinite(): boolean {\n return isFinite(this.lo) && isFinite(this.hi);\n }\n\n public isDegenerate(): boolean {\n return this.lo === this.hi;\n }\n\n public contains(value: number): boolean {\n return this.lo <= value && value <= this.hi;\n }\n\n public superset(other: Interval): boolean {\n return this.contains(other.lo) && this.contains(other.hi);\n }\n\n public subset(other: Interval): boolean {\n return other.superset(this);\n }\n\n public width() : number {\n return this.hi - this.lo;\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers): string {\n return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\nfunction typeCheckIntervalBound(v: any) {\n if (typeof v !== \"number\") {\n throw TypeError(`Interval bounds must be a number, got ${typeof v}`);\n }\n if (isNaN(v)) {\n throw TypeError(`Interval bounds must not be NaN`);\n }\n}\n\n// Construct an interval\n// If two bounds are given, create [a, b]\n// If a single bound is given, create [v, v], a singleton interval [v, v] which\n// contains only one float, also sometimes called a \"degenerate\" interval\n// Bounds may be infinite but must obey a <= b\nexport function interval(a: number, b?: number): Interval {\n if (typeof b === \"undefined\") {\n b = a;\n }\n typeCheckIntervalBound(a);\n typeCheckIntervalBound(b);\n\n if (a > b) {\n throw TypeError(\"Interval bound must be such that lo <= hi\");\n }\n if (a === Infinity) {\n throw TypeError(\"Interval lower bound cannot be Infinity\");\n }\n if (b === -Infinity) {\n throw TypeError(\"Interval lower bound cannot be -Infinity\");\n }\n\n return new Interval(a, b);\n}\n\nexport function typeCheckIsInterval(x: any): x is Interval {\n if (!(x instanceof Interval)) {\n throw TypeError(`Argument must be an interval (got type ${typeof x})`);\n }\n return true;\n}\n\nexport const IFULL = new Interval(-Infinity, Infinity);","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, interval, defaultNumbers, typeCheckIsInterval } from \"./interval.ts\";\n\nexport class Union {\n constructor(readonly intervals: Interval[]) {}\n\n public isEmpty(): boolean {\n return this.intervals.length === 0;\n }\n\n public isFull(): boolean {\n return (\n this.intervals.length === 1 &&\n this.intervals[0].lo === -Infinity &&\n this.intervals[0].hi === Infinity\n );\n }\n\n public isFinite(): boolean {\n return (\n this.isEmpty() ||\n (this.intervals[0].lo !== -Infinity &&\n this.intervals[this.intervals.length - 1].hi !== Infinity)\n );\n }\n\n public isSingle(): boolean {\n return this.intervals.length === 1;\n }\n\n public equalsSingle(lower: number, upper: number) {\n return this.isSingle() && this.intervals[0].lo === lower && this.intervals[0].hi === upper;\n }\n\n public count(): number {\n return this.intervals.length;\n }\n\n public lower(): number {\n if (this.isEmpty()) return Infinity;\n return this.intervals[0].lo;\n }\n\n public upper(): number {\n if (this.isEmpty()) return -Infinity;\n return this.intervals[this.intervals.length - 1].hi;\n }\n\n public contains(value: number): boolean {\n return this.intervals.some((i) => i.contains(value));\n }\n\n public subset(other: Union): boolean {\n return this.intervals.every((thisInterval) =>\n other.intervals.some((otherInterval) => thisInterval.subset(otherInterval))\n );\n }\n\n public superset(other: Union): boolean {\n return other.intervals.every((otherInterval) =>\n this.intervals.some((thisInterval) => thisInterval.superset(otherInterval))\n );\n }\n\n public hull(): Union {\n if (this.isEmpty()) return EMPTY;\n return single(this.lower(), this.upper());\n }\n\n public width(): number {\n return this.intervals.reduce((acc, interval) => acc + interval.width(), 0);\n }\n\n public forEach(callback: (x: Interval, index: number) => void) {\n this.intervals.forEach(callback);\n }\n\n public toString(numbers: (x: number) => string = defaultNumbers) {\n if (this.intervals.length === 0) return \"{∅}\";\n return this.intervals.map((i) => i.toString(numbers)).join(\" U \");\n }\n\n public print(): void {\n console.log(this.toString());\n }\n}\n\n// Construct a union from a list of intervals or unions\nexport function union(list: (Interval | Union)[]): Union {\n const intervals = list.map((e) => (e instanceof Interval ? e : e.intervals)).flat();\n return iunion(intervals);\n}\n\n// Minimum disjoint set of a list of intervals\nfunction iunion(intervals: Interval[]): Union {\n if (intervals.length <= 1) {\n return new Union(intervals);\n }\n\n // Sort by lower bound\n intervals.sort((x, y) => x.lo - y.lo);\n\n const merged: Interval[] = [intervals[0]];\n\n for (let i = 1; i < intervals.length; i++) {\n // If current interval overlaps, merge it\n const last = merged[merged.length - 1];\n const curr = intervals[i];\n if (curr.lo <= last.hi) {\n merged[merged.length - 1] = new Interval(last.lo, Math.max(last.hi, curr.hi));\n } else {\n merged.push(curr);\n }\n }\n\n return new Union(merged);\n}\n\nexport function typeCheckIsUnion(U: any): U is Union {\n if (!(U instanceof Union)) {\n throw TypeError(`Argument must be a Union (got type ${typeof U})`);\n }\n return true;\n}\n\nexport function toUnion(x: Interval | Union): Union {\n if (x instanceof Interval) return new Union([x]);\n return x;\n}\n\ntype UnaryOpInterval = (X: Interval) => Union;\ntype UnaryOpUnion = (U: Union) => Union;\ntype UnaryOpEither = (A: Interval | Union) => Union;\n\ntype BinaryOpInterval = (X: Interval, Y: Interval) => Union;\ntype BinaryOpUnion = (U: Union, V: Union) => Union;\ntype BinaryOpEither = (A: Interval | Union, B: Interval | Union) => Union;\n\n// Generic unary union operation corresponding to a unary interval operation\nexport function makeUnaryOpUnion(op: UnaryOpInterval): UnaryOpUnion {\n return (U: Union): Union => {\n typeCheckIsUnion(U);\n\n // Apply the operator to every interval in the union\n const results: Interval[] = [];\n U.forEach((X) => {\n results.push(...op(X).intervals);\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\n// Generic binary union operation corresponding to a binary interval operation\nexport function makeBinaryOpUnion(op: BinaryOpInterval): BinaryOpUnion {\n return (U: Union, V: Union): Union => {\n typeCheckIsUnion(U);\n typeCheckIsUnion(V);\n // Apply the operator to the cartesian product of the input unions\n const results: Interval[] = [];\n U.forEach((X, i) => {\n V.forEach((Y) => {\n results.push(...op(X, Y).intervals);\n });\n });\n\n // Merge resulting intervals into a disjoint union\n return union(results);\n };\n}\n\nexport function isIntervalOrUnion(x: any): boolean {\n return x instanceof Interval || x instanceof Union;\n}\n\nexport function typeCheckIsIntervalOrUnion(x: any): boolean {\n if (!isIntervalOrUnion(x)) {\n throw TypeError(\"Argument must be of type Interval or Union\");\n }\n return true;\n}\n\nexport function makeUnaryOpEither(op: UnaryOpUnion): UnaryOpEither {\n return (A: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n return op(toUnion(A));\n };\n}\n\nexport function makeBinaryOpEither(op: BinaryOpUnion): BinaryOpEither {\n return (A: Interval | Union, B: Interval | Union) => {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return op(toUnion(A), toUnion(B));\n };\n}\n\n// Create a singleton: a union with a single interval\nexport function single(a: number, b?: number): Union {\n if (typeof b === \"undefined\") {\n b = a;\n }\n return union([interval(a, b)]);\n}\n\n// Create a singleton that bounds a number\nexport function bounded(x: number): Union {\n return single(prev(x), next(x));\n}\n\nexport const EMPTY = new Union([]);\nexport const FULL = new Union([new Interval(-Infinity, Infinity)]);\n","import { Interval } from \"./interval.ts\";\nimport { Union, typeCheckIsIntervalOrUnion, toUnion, EMPTY, union } from \"./union.ts\";\n\nexport function ioverlap(a: Interval, b: Interval): boolean {\n return a.hi >= b.lo && a.lo <= b.hi;\n}\n\nexport function idisjoint(a: Interval, b: Interval): boolean {\n return a.hi < b.lo || a.lo > b.hi;\n}\n\nexport function iuoverlap(X: Interval, U: Union): boolean {\n return U.intervals.some((Y) => ioverlap(X, Y));\n}\n\nexport function iudisjoint(X: Interval, U: Union): boolean {\n return U.intervals.every((Y) => idisjoint(X, Y));\n}\n\nexport function overlap(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.some((X) => iuoverlap(X, Bunion));\n}\n\nexport function disjoint(A: Interval | Union, B: Interval | Union): boolean {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n const Bunion = toUnion(B);\n return toUnion(A).intervals.every((X) => iudisjoint(X, Bunion));\n}\n\n// Intersection of two intervals\nexport function iintersection(a: Interval, b: Interval): Interval | null {\n if (a.hi < b.lo || a.lo > b.hi) return null;\n return new Interval(Math.max(a.lo, b.lo), Math.min(a.hi, b.hi));\n}\n\n// Intersection of two unions\nexport function uintersection(A: Union, B: Union): Union {\n if (A.isEmpty() || B.isEmpty()) return EMPTY;\n if (A.isFull()) return B;\n if (B.isFull()) return A;\n\n const result: Interval[] = [];\n let [PA, PB] = [0, 0];\n\n while (PA < A.intervals.length && PB < B.intervals.length) {\n const a = A.intervals[PA];\n const b = B.intervals[PB];\n\n // If they intersect, add it to the result\n const aintb = iintersection(a, b);\n if (aintb !== null) {\n result.push(aintb);\n }\n\n // Increment the pointer of the interval that ends first\n if (a.hi > b.hi) PB += 1;\n else PA += 1;\n }\n\n return new Union(result);\n}\n\n// Intersection of two unions or intervals\nexport function intersection(A: Interval | Union, B: Interval | Union): Union {\n typeCheckIsIntervalOrUnion(A);\n typeCheckIsIntervalOrUnion(B);\n\n return uintersection(toUnion(A), toUnion(B));\n}\n\n// Complement of a union\nexport function ucomplement(U: Union): Union {\n if (U.isEmpty()) return new Union([new Interval(-Infinity, Infinity)]);\n if (U.isFull()) return EMPTY;\n\n const result: Interval[] = [];\n\n // Add interval from -Infinity to first interval if needed\n if (U.intervals[0].lo !== -Infinity) {\n result.push(new Interval(-Infinity, U.intervals[0].lo));\n }\n\n // Add intervals between consecutive intervals in the union\n for (let i = 0; i < U.intervals.length - 1; i++) {\n result.push(new Interval(U.intervals[i].hi, U.intervals[i + 1].lo));\n }\n\n // Add interval from last interval to Infinity if needed\n if (U.intervals[U.intervals.length - 1].hi !== Infinity) {\n result.push(new Interval(U.intervals[U.intervals.length - 1].hi, Infinity));\n }\n\n // Need to call the union constructor, because some intervals might touch\n return union(result);\n}\n\n// Complement of a union or interval\nexport function complement(A: Union | Interval): Union {\n typeCheckIsIntervalOrUnion(A);\n return ucomplement(toUnion(A));\n}\n","import { Interval, IFULL, interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n single,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\n FULL,\n makeUnaryOpEither,\n} from \"./union.ts\";\nimport { prev, next } from \"./nextafter.ts\";\n\n// Addition in the context of an interval bound\nfunction leftAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return prev(a + b);\n}\n\nfunction rightAdd(a: number, b: number): number {\n if (a === 0) {\n return b;\n } else if (b === 0) {\n return a;\n }\n return next(a + b);\n}\n\n// Interval addition\nexport function iadd(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n return new Union([new Interval(leftAdd(x.lo, y.lo), rightAdd(x.hi, y.hi))]);\n}\n\nexport function ineg(x: Interval): Interval {\n typeCheckIsInterval(x);\n return new Interval(-x.hi, -x.lo);\n}\n\n// Interval subtraction\nexport function isub(x: Interval, y: Interval): Union {\n return iadd(x, ineg(y));\n}\n\n// Multiplication in the context of an interval bound\n// These two functions are needed over simply called prev(a*b) or next(a*b) for\n// two reasons:\n// 1. Multiplying by zero yields zero, even when the other term is an infinity\n// 2. Multiplying by zero yields exactly zero, not prev(0) or next(0)\nexport function leftMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return prev(a * b);\n}\n\nexport function rightMul(a: number, b: number): number {\n if (a === 0 || b === 0) {\n return 0;\n }\n return next(a * b);\n}\n\n// Interval multiplication\nexport function imul(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (b < 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, d), rightMul(a, c))]); // N1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, c))]); // N1 * P1\n } else {\n return new Union([new Interval(leftMul(a, d), rightMul(a, c))]); // N1 * (M | P0 | N0)\n }\n } else if (a > 0) {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, d))]); // P1 * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, c), rightMul(b, d))]); // P1 * P1\n } else {\n return new Union([new Interval(leftMul(b, c), rightMul(b, d))]); // P1 * (M | P0 | N0)\n }\n } else {\n if (d < 0) {\n return new Union([new Interval(leftMul(b, c), rightMul(a, c))]); // (M | P0 | N0) * N1\n } else if (c > 0) {\n return new Union([new Interval(leftMul(a, d), rightMul(b, d))]); // (M | P0 | N0) * P1\n } else {\n return new Union([\n new Interval(\n Math.min(leftMul(a, d), leftMul(b, c)),\n Math.max(rightMul(a, c), rightMul(b, d))\n ),\n ]); // (M | P0 | N0) * (M | P0 | N0)\n }\n }\n}\n\n// Division in the context of an interval bound\nfunction leftDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return prev(a / b);\n}\n\nfunction rightDiv(a: number, b: number): number {\n if (b === Infinity) {\n return Math.sign(a) * 0;\n }\n if (b === -Infinity) {\n return Math.sign(-a) * 0;\n }\n if (b === 1) return a;\n if (b === -1) return -a;\n return next(a / b);\n}\n\n// Interval types\n// N1: lo <= x < 0\n// N0: lo <= x <= 0\n// M: lo <= x <= hi, with lo < 0 and hi > 0\n// P0: 0 <= x <= hi\n// P1: 0 < x <= hi\n// Z: [0, 0]\nconst enum IType {\n P1,\n P0,\n M,\n N0,\n N1,\n Z,\n}\n\nexport function intervalType(x: Interval): IType {\n if (x.hi < 0) return IType.N1;\n if (x.lo > 0) return IType.P1;\n if (x.lo < 0 && x.hi === 0) return IType.N0;\n if (x.lo === 0 && x.hi > 0) return IType.P0;\n if (x.lo === 0 && x.hi === 0) return IType.Z;\n else return IType.M;\n}\n\n// Interval division\n// See Figure 4 from:\n// \"Hickey, T., Ju, Q. and Van Emden, M.H., 2001. Interval arithmetic: From principles to implementation.\"\nexport function idiv(x: Interval, y: Interval): Union {\n typeCheckIsInterval(x);\n typeCheckIsInterval(y);\n\n const xType = intervalType(x);\n const yType = intervalType(y);\n\n // Zero cases\n if (yType === IType.Z) {\n return EMPTY;\n }\n if (xType === IType.Z) {\n return single(0);\n }\n\n const [a, b] = [x.lo, x.hi];\n const [c, d] = [y.lo, y.hi];\n\n if (yType === IType.P1) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), rightDiv(b, c))]); // P1 / P1\n } else if (xType === IType.P0) {\n return union([new Interval(0, rightDiv(b, c))]); // P0 / P1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(a, c), rightDiv(b, c))]); // M / P1\n } else if (xType === IType.N0) {\n return union([new Interval(leftDiv(a, c), -0)]); // N0 / P1\n } else {\n return union([new Interval(leftDiv(a, c), rightDiv(b, d))]); // N1 / P1\n }\n } else if (yType === IType.P0) {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(a, d), Infinity)]); // P1 / P0\n } else if (xType === IType.P0) {\n return union([new Interval(0, Infinity)]); // P0 / P0\n } else if (xType === IType.M) {\n return FULL; // M / P0\n } else if (xType === IType.N0) {\n return union([new Interval(-Infinity, -0)]); // N0 / P0\n } else {\n return union([new Interval(-Infinity, rightDiv(b, d))]); // N1 / P0\n }\n } else if (yType === IType.M) {\n if (xType === IType.P1) {\n return union([\n new Interval(-Infinity, rightDiv(a, c)),\n new Interval(leftDiv(a, d), Infinity),\n ]); // P1 / M\n } else if (xType == IType.N1) {\n return union([\n new Interval(-Infinity, rightDiv(b, d)),\n new Interval(leftDiv(b, c), Infinity),\n ]); // N1 / M\n } else {\n // P0 / M\n // M / M\n // N0 / M\n return FULL;\n }\n } else if (yType === IType.N0) {\n if (xType === IType.P1) {\n return union([new Interval(-Infinity, rightDiv(a, c))]); // P1 / N0\n } else if (xType === IType.P0) {\n return union([new Interval(-Infinity, -0)]); // P0 / N0\n } else if (xType === IType.M) {\n return FULL; // M / N0\n } else if (xType === IType.N0) {\n return union([new Interval(0, Infinity)]); // N0 / N0\n } else {\n return union([new Interval(leftDiv(b, c), Infinity)]); // N1 / N0\n }\n } else {\n if (xType === IType.P1) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, c))]); // P1 / N1\n } else if (xType === IType.P0) {\n return union([new Interval(leftDiv(b, d), -0)]); // P0 / N1\n } else if (xType === IType.M) {\n return union([new Interval(leftDiv(b, d), rightDiv(a, d))]); // M / N1\n } else if (xType === IType.N0) {\n return union([new Interval(0, rightDiv(a, d))]); // N0 / N1\n } else {\n return union([new Interval(leftDiv(b, c), rightDiv(a, d))]); // N1 / N1\n }\n }\n}\n\nexport const uadd = makeBinaryOpUnion(iadd);\nexport const usub = makeBinaryOpUnion(isub);\nexport const umul = makeBinaryOpUnion(imul);\nexport const udiv = makeBinaryOpUnion(idiv);\n\nexport function uneg(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.slice().reverse().map(ineg));\n}\n\nexport const neg = makeUnaryOpEither(uneg);\n\nexport const add = makeBinaryOpEither(uadd);\nexport const sub = makeBinaryOpEither(usub);\nexport const mul = makeBinaryOpEither(umul);\nexport const div = makeBinaryOpEither(udiv);\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, IFULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n FULL,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n single,\n} from \"./union.ts\";\nimport { idiv, div, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// abs: absolute value\n\nexport function iabs(X: Interval): Union {\n if (X.lo >= 0) return new Union([X]);\n if (X.hi <= 0) return new Union([ineg(X)]);\n return new Union([new Interval(0, Math.max(-X.lo, X.hi))]);\n}\n\nexport const uabs = makeUnaryOpUnion(iabs);\nexport const abs = makeUnaryOpEither(uabs);\n\n// min / max: binary min/max\n\nexport function imin(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.min(X.lo, Y.lo), Math.min(X.hi, Y.hi))]);\n}\n\nexport const umin = makeBinaryOpUnion(imin);\nexport const min = makeBinaryOpEither(umin);\n\nexport function imax(X: Interval, Y: Interval): Union {\n return new Union([new Interval(Math.max(X.lo, Y.lo), Math.max(X.hi, Y.hi))]);\n}\n\nexport const umax = makeBinaryOpUnion(imax);\nexport const max = makeBinaryOpEither(umax);\n\n// exp: exponential\n\nfunction leftExp(x: number): number {\n if (x === -Infinity) return 0;\n if (x === 0) return 1;\n return prev(Math.exp(x));\n}\n\nfunction rightExp(x: number): number {\n if (x === 0) return 1;\n return next(Math.exp(x));\n}\n\nexport function iexp(X: Interval): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftExp(X.lo), rightExp(X.hi));\n}\n\nexport function uexp(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map(iexp));\n}\n\nexport const exp = makeUnaryOpEither(uexp);\n\n// log: natural logarithm\n\nfunction leftLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return prev(Math.log(x));\n}\n\nfunction rightLog(x: number): number {\n if (x === 0) return -Infinity;\n if (x === 1) return 0;\n return next(Math.log(x));\n}\n\nexport function ilog(X: Interval): Union {\n typeCheckIsInterval(X);\n if (X.hi <= 0) return new Union([]);\n if (X.lo <= 0) {\n return new Union([new Interval(-Infinity, rightLog(X.hi))]);\n } else {\n return new Union([new Interval(leftLog(Math.max(0, X.lo)), rightLog(X.hi))]);\n }\n}\n\nexport function ulog(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => ilog(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const log = makeUnaryOpEither(ulog);\n\n// powInt: exponentiation with an integer exponent\n\nfunction leftPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return prev(Math.pow(base, exponent));\n}\n\nfunction rightPowInt(base: number, exponent: number): number {\n if (base === 0) return 0;\n if (exponent === 0) return 1;\n return next(Math.pow(base, exponent));\n}\n\nexport function ipowInt(X: Interval, n: number): Union {\n typeCheckIsInterval(X);\n if (!Number.isInteger(n)) {\n throw Error(`ipowint: exponent must be an integer, got ${n}`);\n }\n\n if (n < 0) return idiv(new Interval(1, 1), ipowInt(X, -n).intervals[0]);\n if (n === 0) return new Union([new Interval(1, 1)]);\n if (n === 1) return new Union([X]);\n\n if (X.lo > 0 || n % 2 !== 0) {\n return new Union([new Interval(leftPowInt(X.lo, n), rightPowInt(X.hi, n))]);\n } else if (X.hi < 0) {\n return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);\n } else {\n // X contains 0\n return new Union([new Interval(0, rightPowInt(Math.max(X.hi, -X.lo), n))]);\n }\n}\n\nexport function upowInt(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((i) => ipowInt(i, n).intervals).flat());\n}\n\nexport function powInt(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowInt(toUnion(A), n);\n}\n\n// pow: exponentiation with a real exponent\n\nfunction zeroPow(exponent: Interval): Union {\n if (exponent.lo === 0 && exponent.hi === 0) return single(1, 1);\n if (exponent.contains(0)) return union([single(0, 0), single(1, 1)]);\n return single(0, 0);\n}\n\nexport function ipow(base: Interval, exponent: Interval): Union {\n if (base.hi < 0) return EMPTY;\n if (base.hi === 0) return zeroPow(exponent);\n const expLog = uexp(umul(union([exponent]), ilog(base)));\n if (base.contains(0)) return union([zeroPow(exponent), expLog]);\n return expLog;\n}\n\nexport const upow = makeBinaryOpUnion(ipow);\nexport const pow = makeBinaryOpEither(upow);\n\n// sqrt: square root\n\nfunction leftSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return prev(Math.sqrt(x));\n}\n\nfunction rightSqrt(x: number): number {\n if (x === 0) return 0;\n if (x === 1) return 1;\n return next(Math.sqrt(x));\n}\n\nexport function isqrt(X: Interval): Union {\n if (X.hi < 0) return EMPTY;\n return new Union([new Interval(leftSqrt(Math.max(0, X.lo)), rightSqrt(X.hi))]);\n}\n\nexport function usqrt(U: Union): Union {\n typeCheckIsUnion(U);\n return new Union(\n U.intervals\n .map((i) => isqrt(i).intervals)\n .filter((il) => il.length > 0)\n .flat()\n );\n}\n\nexport const sqrt = makeUnaryOpEither(usqrt);\n\n// sqinv: inverse of the square function\n\nexport function usqinv(U: Union): Union {\n const x = usqrt(U);\n return union(uneg(x).intervals.concat(x.intervals));\n}\n\nexport const sqinv = makeUnaryOpEither(usqinv);\n\n// powIntInv: inverse of an integral power\n\nexport function upowIntInv(U: Union, n: number): Union {\n if (n === 0) {\n if (U.contains(1)) return FULL;\n else return EMPTY;\n }\n\n if (n === 1) {\n return U;\n }\n\n if (n > 0 && n % 2 === 0) {\n return upowEvenInv(U, n);\n }\n\n if (n > 0 && n % 2 !== 0) {\n return upowOddInv(U, n);\n }\n\n // n negative\n if (U.lower() === 0 && U.upper() === 0) {\n return EMPTY;\n }\n\n const one = new Union([new Interval(1, 1)]);\n return div(one, upowIntInv(U, -n));\n}\n\nexport function powIntInv(A: Interval | Union, n: number): Union {\n typeCheckIsIntervalOrUnion(A);\n return upowIntInv(toUnion(A), n);\n}\n\n// x = y^(1/n) with n odd and positive\nfunction leftPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return prev(Math.pow(y, prev(1 / n)));\n else return prev(-Math.pow(-y, next(1 / n)));\n}\n\nfunction rightPowOddInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n if (y === -1) return -1;\n else if (y > 0) return next(Math.pow(y, next(1 / n)));\n else return next(-Math.pow(-y, prev(1 / n)));\n}\n\n// Inverse of an odd integer power\nfunction ipowOddInv(X: Interval, n: number): Interval {\n typeCheckIsInterval(X);\n return new Interval(leftPowOddInv(X.lo, n), rightPowOddInv(X.hi, n));\n}\n\nfunction upowOddInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return new Union(U.intervals.map((X) => ipowOddInv(X, n)));\n}\n\n// x = y^(1/n) with n even and positive, and y positive\nfunction leftPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return prev(Math.pow(y, prev(1 / n)));\n}\n\nfunction rightPowEvenInv(y: number, n: number): number {\n if (y === 0) return 0;\n if (y === 1) return 1;\n return next(Math.pow(y, next(1 / n)));\n}\n\nexport function ipowEvenInv(Y: Interval, n: number): Union {\n if (Y.hi < 0) {\n return EMPTY;\n } else if (Y.hi === 0) {\n return new Union([new Interval(0, 0)]);\n } else {\n const principal = new Interval(\n leftPowEvenInv(Math.max(0, Y.lo), n),\n rightPowEvenInv(Y.hi, n)\n );\n return new Union([ineg(principal), principal]);\n }\n}\n\nexport function upowEvenInv(U: Union, n: number): Union {\n typeCheckIsUnion(U);\n return union(U.intervals.map((X) => ipowEvenInv(X, n).intervals).flat());\n}\n","import { prev, next } from \"./nextafter.ts\";\nimport { Interval, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n bounded,\n EMPTY,\n} from \"./union.ts\";\nimport { udiv, usub } from \"./arithmetic.ts\";\n\nconst pi = Math.PI;\nconst halfpi = Math.PI / 2;\nconst tau = 2 * Math.PI;\nexport function wrapAngle(angle: number): number {\n return ((angle % tau) + tau) % tau;\n}\n\n// Returns the list of integers n such that n*pi is in an interval\nexport function piMultiples(X: Interval): number[] {\n const lower = Math.ceil(X.lo / Math.PI);\n const upper = Math.floor(X.hi / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// Returns the list of integers n such that (pi/2) + n*pi is in an interval\nexport function halfPiMultiples(X: Interval): number[] {\n const lower = Math.ceil((X.lo - Math.PI / 2) / Math.PI);\n const upper = Math.floor((X.hi - Math.PI / 2) / Math.PI);\n\n if (lower > upper) {\n return [];\n }\n\n const result: number[] = [];\n for (let n = lower; n <= upper; n++) {\n result.push(n);\n }\n return result;\n}\n\n// COS\n\nfunction leftCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, prev(Math.cos(x))));\n}\n\nfunction rightCos(x: number): number {\n if (x === 0) return 1;\n return Math.max(-1, Math.min(1, next(Math.cos(x))));\n}\n\nexport function icos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];\n\n const left = candidates.map(leftCos);\n const right = candidates.map(rightCos);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const ucos = makeUnaryOpUnion(icos);\nexport const cos = makeUnaryOpEither(ucos);\n\n// SIN\n\nfunction leftSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, prev(Math.sin(x))));\n}\n\nfunction rightSin(x: number): number {\n if (x === 0) return 0;\n return Math.max(-1, Math.min(1, next(Math.sin(x))));\n}\n\nexport function isin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);\n\n const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];\n\n const left = candidates.map(leftSin);\n const right = candidates.map(rightSin);\n\n return new Union([new Interval(Math.min(...left), Math.max(...right))]);\n}\n\nexport const usin = makeUnaryOpUnion(isin);\nexport const sin = makeUnaryOpEither(usin);\n\n// TAN\n\nexport function utan(U: Union): Union {\n return udiv(usin(U), ucos(U));\n}\n\nexport const tan = makeUnaryOpEither(utan);\n\n// ARCCOS\n\nexport function iacos(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.lo > 1 || X.hi < -1) return EMPTY;\n const lower = X.hi >= 1 ? 0 : prev(Math.acos(X.hi));\n const upper = next(Math.acos(Math.max(-1, X.lo)));\n return new Union([new Interval(lower, upper)]);\n}\n\nexport const uacos = makeUnaryOpUnion(iacos);\nexport const acos = makeUnaryOpEither(uacos);\n\n// ARCSIN\n\nexport function iasin(X: Interval): Union {\n typeCheckIsInterval(X);\n\n if (X.lo > 1 || X.hi < -1) return EMPTY;\n const [l, h] = [Math.max(-1, X.lo), Math.min(1, X.hi)];\n return new Union([new Interval(prev(Math.asin(l)), next(Math.asin(h)))]);\n}\n\nexport const uasin = makeUnaryOpUnion(iasin);\nexport const asin = makeUnaryOpEither(uasin);\n\n// ARCTAN\n\nfunction leftAtan(x: number): number {\n if (x === 0) return 0;\n return prev(Math.atan(x));\n}\n\nfunction rightAtan(x: number): number {\n if (x === 0) return 0;\n return next(Math.atan(x));\n}\n\nexport function iatan(X: Interval): Union {\n typeCheckIsInterval(X);\n return new Union([new Interval(leftAtan(X.lo), rightAtan(X.hi))]);\n}\n\nexport const uatan = makeUnaryOpUnion(iatan);\nexport const atan = makeUnaryOpEither(uatan);\n"],"mappings":";AACA,IAAM,SAAS,IAAI,YAAY,CAAC;AAChC,IAAM,YAAY,IAAI,aAAa,MAAM;AACzC,IAAM,UAAU,IAAI,eAAe,MAAM;AAGlC,SAAS,KAAK,GAAmB;AACpC,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,EAAG,QAAO,OAAO;AAE3B,YAAU,CAAC,IAAI;AACf,MAAI,OAAe,QAAQ,CAAC;AAE5B,MAAI,IAAI,GAAG;AACP,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ;AAAA,EACZ;AAEA,UAAQ,CAAC,IAAI;AACb,SAAO,UAAU,CAAC;AACtB;AAGO,SAAS,KAAK,GAAmB;AACpC,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO,CAAC,OAAO;AAE5B,YAAU,CAAC,IAAI;AACf,MAAI,OAAe,QAAQ,CAAC;AAE5B,MAAI,IAAI,GAAG;AACP,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ;AAAA,EACZ;AAEA,UAAQ,CAAC,IAAI;AACb,SAAO,UAAU,CAAC;AACtB;;;ACvCO,IAAM,iBAAiB,CAAC,MAAc,EAAE,SAAS;AAEjD,IAAM,WAAN,MAAe;AAAA,EAClB,YAAqB,IAAqB,IAAY;AAAjC;AAAqB;AAAA,EAAa;AAAA,EAEhD,SAAkB;AACrB,WAAO,KAAK,OAAO,aAAa,KAAK,OAAO;AAAA,EAChD;AAAA,EAEO,WAAoB;AACvB,WAAO,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,EAAE;AAAA,EAChD;AAAA,EAEO,eAAwB;AAC3B,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA,EAEO,SAAS,OAAwB;AACpC,WAAO,KAAK,MAAM,SAAS,SAAS,KAAK;AAAA,EAC7C;AAAA,EAEO,SAAS,OAA0B;AACtC,WAAO,KAAK,SAAS,MAAM,EAAE,KAAK,KAAK,SAAS,MAAM,EAAE;AAAA,EAC5D;AAAA,EAEO,OAAO,OAA0B;AACpC,WAAO,MAAM,SAAS,IAAI;AAAA,EAC9B;AAAA,EAEO,QAAiB;AACpB,WAAO,KAAK,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEO,SAAS,UAAiC,gBAAwB;AACrE,WAAO,IAAI,QAAQ,KAAK,EAAE,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,EACpD;AAAA,EAEO,QAAc;AACjB,YAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,EAC/B;AACJ;AAEA,SAAS,uBAAuB,GAAQ;AACpC,MAAI,OAAO,MAAM,UAAU;AACvB,UAAM,UAAU,yCAAyC,OAAO,CAAC,EAAE;AAAA,EACvE;AACA,MAAI,MAAM,CAAC,GAAG;AACV,UAAM,UAAU,iCAAiC;AAAA,EACrD;AACJ;AAOO,SAAS,SAAS,GAAW,GAAsB;AACtD,MAAI,OAAO,MAAM,aAAa;AAC1B,QAAI;AAAA,EACR;AACA,yBAAuB,CAAC;AACxB,yBAAuB,CAAC;AAExB,MAAI,IAAI,GAAG;AACP,UAAM,UAAU,2CAA2C;AAAA,EAC/D;AACA,MAAI,MAAM,UAAU;AAChB,UAAM,UAAU,yCAAyC;AAAA,EAC7D;AACA,MAAI,MAAM,WAAW;AACjB,UAAM,UAAU,0CAA0C;AAAA,EAC9D;AAEA,SAAO,IAAI,SAAS,GAAG,CAAC;AAC5B;AAEO,SAAS,oBAAoB,GAAuB;AACvD,MAAI,EAAE,aAAa,WAAW;AAC1B,UAAM,UAAU,0CAA0C,OAAO,CAAC,GAAG;AAAA,EACzE;AACA,SAAO;AACX;AAEO,IAAM,QAAQ,IAAI,SAAS,WAAW,QAAQ;;;AChF9C,IAAM,QAAN,MAAY;AAAA,EACf,YAAqB,WAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEtC,UAAmB;AACtB,WAAO,KAAK,UAAU,WAAW;AAAA,EACrC;AAAA,EAEO,SAAkB;AACrB,WACI,KAAK,UAAU,WAAW,KAC1B,KAAK,UAAU,CAAC,EAAE,OAAO,aACzB,KAAK,UAAU,CAAC,EAAE,OAAO;AAAA,EAEjC;AAAA,EAEO,WAAoB;AACvB,WACI,KAAK,QAAQ,KACZ,KAAK,UAAU,CAAC,EAAE,OAAO,aACtB,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE,OAAO;AAAA,EAE7D;AAAA,EAEO,WAAoB;AACvB,WAAO,KAAK,UAAU,WAAW;AAAA,EACrC;AAAA,EAEO,aAAa,OAAe,OAAe;AAC9C,WAAO,KAAK,SAAS,KAAK,KAAK,UAAU,CAAC,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC,EAAE,OAAO;AAAA,EACzF;AAAA,EAEO,QAAgB;AACnB,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAEO,QAAgB;AACnB,QAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,WAAO,KAAK,UAAU,CAAC,EAAE;AAAA,EAC7B;AAAA,EAEO,QAAgB;AACnB,QAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,WAAO,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,EACrD;AAAA,EAEO,SAAS,OAAwB;AACpC,WAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,EACvD;AAAA,EAEO,OAAO,OAAuB;AACjC,WAAO,KAAK,UAAU;AAAA,MAAM,CAAC,iBACzB,MAAM,UAAU,KAAK,CAAC,kBAAkB,aAAa,OAAO,aAAa,CAAC;AAAA,IAC9E;AAAA,EACJ;AAAA,EAEO,SAAS,OAAuB;AACnC,WAAO,MAAM,UAAU;AAAA,MAAM,CAAC,kBAC1B,KAAK,UAAU,KAAK,CAAC,iBAAiB,aAAa,SAAS,aAAa,CAAC;AAAA,IAC9E;AAAA,EACJ;AAAA,EAEO,OAAc;AACjB,QAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,WAAO,OAAO,KAAK,MAAM,GAAG,KAAK,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEO,QAAgB;AACnB,WAAO,KAAK,UAAU,OAAO,CAAC,KAAKA,cAAa,MAAMA,UAAS,MAAM,GAAG,CAAC;AAAA,EAC7E;AAAA,EAEO,QAAQ,UAAgD;AAC3D,SAAK,UAAU,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEO,SAAS,UAAiC,gBAAgB;AAC7D,QAAI,KAAK,UAAU,WAAW,EAAG,QAAO;AACxC,WAAO,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EAAE,KAAK,KAAK;AAAA,EACpE;AAAA,EAEO,QAAc;AACjB,YAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,EAC/B;AACJ;AAGO,SAAS,MAAM,MAAmC;AACrD,QAAM,YAAY,KAAK,IAAI,CAAC,MAAO,aAAa,WAAW,IAAI,EAAE,SAAU,EAAE,KAAK;AAClF,SAAO,OAAO,SAAS;AAC3B;AAGA,SAAS,OAAO,WAA8B;AAC1C,MAAI,UAAU,UAAU,GAAG;AACvB,WAAO,IAAI,MAAM,SAAS;AAAA,EAC9B;AAGA,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;AAEpC,QAAM,SAAqB,CAAC,UAAU,CAAC,CAAC;AAExC,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAEvC,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,UAAM,OAAO,UAAU,CAAC;AACxB,QAAI,KAAK,MAAM,KAAK,IAAI;AACpB,aAAO,OAAO,SAAS,CAAC,IAAI,IAAI,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,IAChF,OAAO;AACH,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ;AAEA,SAAO,IAAI,MAAM,MAAM;AAC3B;AAEO,SAAS,iBAAiB,GAAoB;AACjD,MAAI,EAAE,aAAa,QAAQ;AACvB,UAAM,UAAU,sCAAsC,OAAO,CAAC,GAAG;AAAA,EACrE;AACA,SAAO;AACX;AAEO,SAAS,QAAQ,GAA4B;AAChD,MAAI,aAAa,SAAU,QAAO,IAAI,MAAM,CAAC,CAAC,CAAC;AAC/C,SAAO;AACX;AAWO,SAAS,iBAAiB,IAAmC;AAChE,SAAO,CAAC,MAAoB;AACxB,qBAAiB,CAAC;AAGlB,UAAM,UAAsB,CAAC;AAC7B,MAAE,QAAQ,CAAC,MAAM;AACb,cAAQ,KAAK,GAAG,GAAG,CAAC,EAAE,SAAS;AAAA,IACnC,CAAC;AAGD,WAAO,MAAM,OAAO;AAAA,EACxB;AACJ;AAGO,SAAS,kBAAkB,IAAqC;AACnE,SAAO,CAAC,GAAU,MAAoB;AAClC,qBAAiB,CAAC;AAClB,qBAAiB,CAAC;AAElB,UAAM,UAAsB,CAAC;AAC7B,MAAE,QAAQ,CAAC,GAAG,MAAM;AAChB,QAAE,QAAQ,CAAC,MAAM;AACb,gBAAQ,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,SAAS;AAAA,MACtC,CAAC;AAAA,IACL,CAAC;AAGD,WAAO,MAAM,OAAO;AAAA,EACxB;AACJ;AAEO,SAAS,kBAAkB,GAAiB;AAC/C,SAAO,aAAa,YAAY,aAAa;AACjD;AAEO,SAAS,2BAA2B,GAAiB;AACxD,MAAI,CAAC,kBAAkB,CAAC,GAAG;AACvB,UAAM,UAAU,4CAA4C;AAAA,EAChE;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,IAAiC;AAC/D,SAAO,CAAC,MAAwB;AAC5B,+BAA2B,CAAC;AAC5B,WAAO,GAAG,QAAQ,CAAC,CAAC;AAAA,EACxB;AACJ;AAEO,SAAS,mBAAmB,IAAmC;AAClE,SAAO,CAAC,GAAqB,MAAwB;AACjD,+BAA2B,CAAC;AAC5B,+BAA2B,CAAC;AAE5B,WAAO,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,EACpC;AACJ;AAGO,SAAS,OAAO,GAAW,GAAmB;AACjD,MAAI,OAAO,MAAM,aAAa;AAC1B,QAAI;AAAA,EACR;AACA,SAAO,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACjC;AAGO,SAAS,QAAQ,GAAkB;AACtC,SAAO,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAClC;AAEO,IAAM,QAAQ,IAAI,MAAM,CAAC,CAAC;AAC1B,IAAM,OAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,QAAQ,CAAC,CAAC;;;AClN1D,SAAS,SAAS,GAAa,GAAsB;AACxD,SAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;AACrC;AAEO,SAAS,UAAU,GAAa,GAAsB;AACzD,SAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACnC;AAEO,SAAS,UAAU,GAAa,GAAmB;AACtD,SAAO,EAAE,UAAU,KAAK,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AACjD;AAEO,SAAS,WAAW,GAAa,GAAmB;AACvD,SAAO,EAAE,UAAU,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AACnD;AAEO,SAAS,QAAQ,GAAqB,GAA8B;AACvE,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,QAAM,SAAS,QAAQ,CAAC;AACxB,SAAO,QAAQ,CAAC,EAAE,UAAU,KAAK,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAChE;AAEO,SAAS,SAAS,GAAqB,GAA8B;AACxE,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,QAAM,SAAS,QAAQ,CAAC;AACxB,SAAO,QAAQ,CAAC,EAAE,UAAU,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAClE;AAGO,SAAS,cAAc,GAAa,GAA8B;AACrE,MAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAI,QAAO;AACvC,SAAO,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAClE;AAGO,SAAS,cAAc,GAAU,GAAiB;AACrD,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,EAAG,QAAO;AACvC,MAAI,EAAE,OAAO,EAAG,QAAO;AACvB,MAAI,EAAE,OAAO,EAAG,QAAO;AAEvB,QAAM,SAAqB,CAAC;AAC5B,MAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAEpB,SAAO,KAAK,EAAE,UAAU,UAAU,KAAK,EAAE,UAAU,QAAQ;AACvD,UAAM,IAAI,EAAE,UAAU,EAAE;AACxB,UAAM,IAAI,EAAE,UAAU,EAAE;AAGxB,UAAM,QAAQ,cAAc,GAAG,CAAC;AAChC,QAAI,UAAU,MAAM;AAChB,aAAO,KAAK,KAAK;AAAA,IACrB;AAGA,QAAI,EAAE,KAAK,EAAE,GAAI,OAAM;AAAA,QAClB,OAAM;AAAA,EACf;AAEA,SAAO,IAAI,MAAM,MAAM;AAC3B;AAGO,SAAS,aAAa,GAAqB,GAA4B;AAC1E,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,SAAO,cAAc,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC/C;AAGO,SAAS,YAAY,GAAiB;AACzC,MAAI,EAAE,QAAQ,EAAG,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,QAAQ,CAAC,CAAC;AACrE,MAAI,EAAE,OAAO,EAAG,QAAO;AAEvB,QAAM,SAAqB,CAAC;AAG5B,MAAI,EAAE,UAAU,CAAC,EAAE,OAAO,WAAW;AACjC,WAAO,KAAK,IAAI,SAAS,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AAAA,EAC1D;AAGA,WAAS,IAAI,GAAG,IAAI,EAAE,UAAU,SAAS,GAAG,KAAK;AAC7C,WAAO,KAAK,IAAI,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;AAAA,EACtE;AAGA,MAAI,EAAE,UAAU,EAAE,UAAU,SAAS,CAAC,EAAE,OAAO,UAAU;AACrD,WAAO,KAAK,IAAI,SAAS,EAAE,UAAU,EAAE,UAAU,SAAS,CAAC,EAAE,IAAI,QAAQ,CAAC;AAAA,EAC9E;AAGA,SAAO,MAAM,MAAM;AACvB;AAGO,SAAS,WAAW,GAA4B;AACnD,6BAA2B,CAAC;AAC5B,SAAO,YAAY,QAAQ,CAAC,CAAC;AACjC;;;AC3FA,SAAS,QAAQ,GAAW,GAAmB;AAC3C,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX,WAAW,MAAM,GAAG;AAChB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC5C,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX,WAAW,MAAM,GAAG;AAChB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AACrB,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9E;AAEO,SAAS,KAAK,GAAuB;AACxC,sBAAoB,CAAC;AACrB,SAAO,IAAI,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;AACpC;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,KAAK,GAAG,KAAK,CAAC,CAAC;AAC1B;AAOO,SAAS,QAAQ,GAAW,GAAmB;AAClD,MAAI,MAAM,KAAK,MAAM,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAEO,SAAS,SAAS,GAAW,GAAmB;AACnD,MAAI,MAAM,KAAK,MAAM,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AAErB,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAC1B,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAE1B,MAAI,IAAI,GAAG;AACP,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE;AAAA,EACJ,WAAW,IAAI,GAAG;AACd,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE;AAAA,EACJ,OAAO;AACH,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM;AAAA,QACb,IAAI;AAAA,UACA,KAAK,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;AAAA,UACrC,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;AAAA,QAC3C;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAGA,SAAS,QAAQ,GAAW,GAAmB;AAC3C,MAAI,MAAM,UAAU;AAChB,WAAO,KAAK,KAAK,CAAC,IAAI;AAAA,EAC1B;AACA,MAAI,MAAM,WAAW;AACjB,WAAO,KAAK,KAAK,CAAC,CAAC,IAAI;AAAA,EAC3B;AACA,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,GAAI,QAAO,CAAC;AACtB,SAAO,KAAK,IAAI,CAAC;AACrB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC5C,MAAI,MAAM,UAAU;AAChB,WAAO,KAAK,KAAK,CAAC,IAAI;AAAA,EAC1B;AACA,MAAI,MAAM,WAAW;AACjB,WAAO,KAAK,KAAK,CAAC,CAAC,IAAI;AAAA,EAC3B;AACA,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,GAAI,QAAO,CAAC;AACtB,SAAO,KAAK,IAAI,CAAC;AACrB;AAkBO,SAAS,aAAa,GAAoB;AAC7C,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,MAAI,EAAE,KAAK,KAAK,EAAE,OAAO,EAAG,QAAO;AACnC,MAAI,EAAE,OAAO,KAAK,EAAE,KAAK,EAAG,QAAO;AACnC,MAAI,EAAE,OAAO,KAAK,EAAE,OAAO,EAAG,QAAO;AAAA,MAChC,QAAO;AAChB;AAKO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AAErB,QAAM,QAAQ,aAAa,CAAC;AAC5B,QAAM,QAAQ,aAAa,CAAC;AAG5B,MAAI,UAAU,WAAS;AACnB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,WAAS;AACnB,WAAO,OAAO,CAAC;AAAA,EACnB;AAEA,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAC1B,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAE1B,MAAI,UAAU,YAAU;AACpB,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClD,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IAClD,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D;AAAA,EACJ,WAAW,UAAU,YAAU;AAC3B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,IACxD,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC5C,WAAW,UAAU,WAAS;AAC1B,aAAO;AAAA,IACX,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,CAAC,CAAC;AAAA,IAC9C,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC1D;AAAA,EACJ,WAAW,UAAU,WAAS;AAC1B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM;AAAA,QACT,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC;AAAA,QACtC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ;AAAA,MACxC,CAAC;AAAA,IACL,WAAW,SAAS,YAAU;AAC1B,aAAO,MAAM;AAAA,QACT,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC;AAAA,QACtC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ;AAAA,MACxC,CAAC;AAAA,IACL,OAAO;AAIH,aAAO;AAAA,IACX;AAAA,EACJ,WAAW,UAAU,YAAU;AAC3B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC1D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,CAAC,CAAC;AAAA,IAC9C,WAAW,UAAU,WAAS;AAC1B,aAAO;AAAA,IACX,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC5C,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,IACxD;AAAA,EACJ,OAAO;AACH,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IAClD,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClD,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D;AAAA,EACJ;AACJ;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AAEnC,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI,MAAM,EAAE,UAAU,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;AAC5D;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAElC,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;;;ACnPnC,SAAS,KAAK,GAAoB;AACrC,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC,CAAC;AACnC,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIlC,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/E;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAEnC,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/E;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAI1C,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEO,SAAS,KAAK,GAAuB;AACxC,sBAAoB,CAAC;AACrB,SAAO,IAAI,SAAS,QAAQ,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC;AACrD;AAEO,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC;AAC1C;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AACrB,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC;AAClC,MAAI,EAAE,MAAM,GAAG;AACX,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,EAC9D,OAAO;AACH,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,EAC/E;AACJ;AAEO,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI;AAAA,IACP,EAAE,UACG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,EAC5B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,EAC5B,KAAK;AAAA,EACd;AACJ;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,WAAW,MAAc,UAA0B;AACxD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxC;AAEA,SAAS,YAAY,MAAc,UAA0B;AACzD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxC;AAEO,SAAS,QAAQ,GAAa,GAAkB;AACnD,sBAAoB,CAAC;AACrB,MAAI,CAAC,OAAO,UAAU,CAAC,GAAG;AACtB,UAAM,MAAM,6CAA6C,CAAC,EAAE;AAAA,EAChE;AAEA,MAAI,IAAI,EAAG,QAAO,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtE,MAAI,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAClD,MAAI,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC,CAAC;AAEjC,MAAI,EAAE,KAAK,KAAK,IAAI,MAAM,GAAG;AACzB,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,IAAI,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,EAC9E,WAAW,EAAE,KAAK,GAAG;AACjB,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,IAAI,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,EAC9E,OAAO;AAEH,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,YAAY,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,EAC7E;AACJ;AAEO,SAAS,QAAQ,GAAU,GAAkB;AAChD,mBAAiB,CAAC;AAClB,SAAO,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC;AACvE;AAEO,SAAS,OAAO,GAAqB,GAAkB;AAC1D,6BAA2B,CAAC;AAC5B,SAAO,QAAQ,QAAQ,CAAC,GAAG,CAAC;AAChC;AAIA,SAAS,QAAQ,UAA2B;AACxC,MAAI,SAAS,OAAO,KAAK,SAAS,OAAO,EAAG,QAAO,OAAO,GAAG,CAAC;AAC9D,MAAI,SAAS,SAAS,CAAC,EAAG,QAAO,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;AACnE,SAAO,OAAO,GAAG,CAAC;AACtB;AAEO,SAAS,KAAK,MAAgB,UAA2B;AAC5D,MAAI,KAAK,KAAK,EAAG,QAAO;AACxB,MAAI,KAAK,OAAO,EAAG,QAAO,QAAQ,QAAQ;AAC1C,QAAM,SAAS,KAAK,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AACvD,MAAI,KAAK,SAAS,CAAC,EAAG,QAAO,MAAM,CAAC,QAAQ,QAAQ,GAAG,MAAM,CAAC;AAC9D,SAAO;AACX;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAI1C,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEA,SAAS,UAAU,GAAmB;AAClC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEO,SAAS,MAAM,GAAoB;AACtC,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AACjF;AAEO,SAAS,MAAM,GAAiB;AACnC,mBAAiB,CAAC;AAClB,SAAO,IAAI;AAAA,IACP,EAAE,UACG,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,SAAS,EAC7B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,EAC5B,KAAK;AAAA,EACd;AACJ;AAEO,IAAM,OAAO,kBAAkB,KAAK;AAIpC,SAAS,OAAO,GAAiB;AACpC,QAAM,IAAI,MAAM,CAAC;AACjB,SAAO,MAAM,KAAK,CAAC,EAAE,UAAU,OAAO,EAAE,SAAS,CAAC;AACtD;AAEO,IAAM,QAAQ,kBAAkB,MAAM;AAItC,SAAS,WAAW,GAAU,GAAkB;AACnD,MAAI,MAAM,GAAG;AACT,QAAI,EAAE,SAAS,CAAC,EAAG,QAAO;AAAA,QACrB,QAAO;AAAA,EAChB;AAEA,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AAEA,MAAI,IAAI,KAAK,IAAI,MAAM,GAAG;AACtB,WAAO,YAAY,GAAG,CAAC;AAAA,EAC3B;AAEA,MAAI,IAAI,KAAK,IAAI,MAAM,GAAG;AACtB,WAAO,WAAW,GAAG,CAAC;AAAA,EAC1B;AAGA,MAAI,EAAE,MAAM,MAAM,KAAK,EAAE,MAAM,MAAM,GAAG;AACpC,WAAO;AAAA,EACX;AAEA,QAAM,MAAM,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAC1C,SAAO,IAAI,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC;AACrC;AAEO,SAAS,UAAU,GAAqB,GAAkB;AAC7D,6BAA2B,CAAC;AAC5B,SAAO,WAAW,QAAQ,CAAC,GAAG,CAAC;AACnC;AAGA,SAAS,cAAc,GAAW,GAAmB;AACjD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,GAAI,QAAO;AAAA,WACZ,IAAI,EAAG,QAAO,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,MAC/C,QAAO,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AAC/C;AAEA,SAAS,eAAe,GAAW,GAAmB;AAClD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,GAAI,QAAO;AAAA,WACZ,IAAI,EAAG,QAAO,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,MAC/C,QAAO,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AAC/C;AAGA,SAAS,WAAW,GAAa,GAAqB;AAClD,sBAAoB,CAAC;AACrB,SAAO,IAAI,SAAS,cAAc,EAAE,IAAI,CAAC,GAAG,eAAe,EAAE,IAAI,CAAC,CAAC;AACvE;AAEA,SAAS,WAAW,GAAU,GAAkB;AAC5C,mBAAiB,CAAC;AAClB,SAAO,IAAI,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC;AAC7D;AAGA,SAAS,eAAe,GAAW,GAAmB;AAClD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AACxC;AAEA,SAAS,gBAAgB,GAAW,GAAmB;AACnD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AACxC;AAEO,SAAS,YAAY,GAAa,GAAkB;AACvD,MAAI,EAAE,KAAK,GAAG;AACV,WAAO;AAAA,EACX,WAAW,EAAE,OAAO,GAAG;AACnB,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,EACzC,OAAO;AACH,UAAM,YAAY,IAAI;AAAA,MAClB,eAAe,KAAK,IAAI,GAAG,EAAE,EAAE,GAAG,CAAC;AAAA,MACnC,gBAAgB,EAAE,IAAI,CAAC;AAAA,IAC3B;AACA,WAAO,IAAI,MAAM,CAAC,KAAK,SAAS,GAAG,SAAS,CAAC;AAAA,EACjD;AACJ;AAEO,SAAS,YAAY,GAAU,GAAkB;AACpD,mBAAiB,CAAC;AAClB,SAAO,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC;AAC3E;;;ACjSA,IAAM,KAAK,KAAK;AAChB,IAAM,SAAS,KAAK,KAAK;AACzB,IAAM,MAAM,IAAI,KAAK;AAMd,SAAS,YAAY,GAAuB;AAC/C,QAAM,QAAQ,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE;AACtC,QAAM,QAAQ,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE;AAEvC,MAAI,QAAQ,OAAO;AACf,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,OAAO,KAAK,OAAO,KAAK;AACjC,WAAO,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACX;AAGO,SAAS,gBAAgB,GAAuB;AACnD,QAAM,QAAQ,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACtD,QAAM,QAAQ,KAAK,OAAO,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEvD,MAAI,QAAQ,OAAO;AACf,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,OAAO,KAAK,OAAO,KAAK;AACjC,WAAO,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACX;AAIA,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AAErB,MAAI,EAAE,MAAM,KAAK,IAAI,KAAK,GAAI,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAEpE,QAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AAEpE,QAAM,OAAO,WAAW,IAAI,OAAO;AACnC,QAAM,QAAQ,WAAW,IAAI,QAAQ;AAErC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AAErB,MAAI,EAAE,MAAM,KAAK,IAAI,KAAK,GAAI,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAEpE,QAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,IAAI,EAAE,CAAC;AAEjF,QAAM,OAAO,WAAW,IAAI,OAAO;AACnC,QAAM,QAAQ,WAAW,IAAI,QAAQ;AAErC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIlC,SAAS,KAAK,GAAiB;AAClC,SAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAChC;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAIlC,SAAS,MAAM,GAAoB;AACtC,sBAAoB,CAAC;AAErB,MAAI,EAAE,KAAK,KAAK,EAAE,KAAK,GAAI,QAAO;AAClC,QAAM,QAAQ,EAAE,MAAM,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,EAAE,CAAC;AAClD,QAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AAChD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,OAAO,KAAK,CAAC,CAAC;AACjD;AAEO,IAAM,QAAQ,iBAAiB,KAAK;AACpC,IAAM,OAAO,kBAAkB,KAAK;AAIpC,SAAS,MAAM,GAAoB;AACtC,sBAAoB,CAAC;AAErB,MAAI,EAAE,KAAK,KAAK,EAAE,KAAK,GAAI,QAAO;AAClC,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E;AAEO,IAAM,QAAQ,iBAAiB,KAAK;AACpC,IAAM,OAAO,kBAAkB,KAAK;AAI3C,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEA,SAAS,UAAU,GAAmB;AAClC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEO,SAAS,MAAM,GAAoB;AACtC,sBAAoB,CAAC;AACrB,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE;AAEO,IAAM,QAAQ,iBAAiB,KAAK;AACpC,IAAM,OAAO,kBAAkB,KAAK;","names":["interval"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "not-so-float",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",