not-so-float 2.1.0 → 2.3.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
@@ -136,6 +136,7 @@ class Interval {
136
136
  hull(): Union;
137
137
  superset(other: Interval): boolean;
138
138
  subset(other: Interval): boolean;
139
+ width(): number;
139
140
  toString(numbers?: (x: number) => string): string;
140
141
  print(): void;
141
142
  }
@@ -161,9 +162,14 @@ Union class member functions:
161
162
  class Union {
162
163
  isEmpty(): boolean;
163
164
  isFull(): boolean;
165
+ isFinite(): boolean;
164
166
  lower(): number;
165
167
  upper(): number;
166
168
  contains(value: number): boolean;
169
+ subset(other: Union): boolean;
170
+ superset(other: Union): boolean;
171
+ hull(): Union;
172
+ width(): number;
167
173
  forEach(callback: (x: Interval, index: number) => void): void;
168
174
  toString(numbers?: (x: number) => string): string;
169
175
  print(): void;
package/dist/index.cjs CHANGED
@@ -111,6 +111,9 @@ var Interval = class {
111
111
  subset(other) {
112
112
  return other.superset(this);
113
113
  }
114
+ width() {
115
+ return this.hi - this.lo;
116
+ }
114
117
  toString(numbers = defaultNumbers) {
115
118
  return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;
116
119
  }
@@ -162,6 +165,9 @@ var Union = class {
162
165
  isFull() {
163
166
  return this.intervals.length === 1 && this.intervals[0].lo === -Infinity && this.intervals[0].hi === Infinity;
164
167
  }
168
+ isFinite() {
169
+ return this.isEmpty() || this.intervals[0].lo !== -Infinity && this.intervals[this.intervals.length - 1].hi !== Infinity;
170
+ }
165
171
  lower() {
166
172
  if (this.isEmpty()) return Infinity;
167
173
  return this.intervals[0].lo;
@@ -187,6 +193,9 @@ var Union = class {
187
193
  if (this.isEmpty()) return EMPTY;
188
194
  return single(this.lower(), this.upper());
189
195
  }
196
+ width() {
197
+ return this.intervals.reduce((acc, interval3) => acc + interval3.width(), 0);
198
+ }
190
199
  forEach(callback) {
191
200
  this.intervals.forEach(callback);
192
201
  }
@@ -198,7 +207,11 @@ var Union = class {
198
207
  console.log(this.toString());
199
208
  }
200
209
  };
201
- function union(intervals) {
210
+ function union(list) {
211
+ const intervals = list.map((e) => e instanceof Interval ? e : e.intervals).flat();
212
+ return iunion(intervals);
213
+ }
214
+ function iunion(intervals) {
202
215
  if (intervals.length <= 1) {
203
216
  return new Union(intervals);
204
217
  }
@@ -791,8 +804,7 @@ function rightCos(x) {
791
804
  }
792
805
  function icos(X) {
793
806
  typeCheckIsInterval(X);
794
- const width = X.hi - X.lo;
795
- if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
807
+ if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
796
808
  const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];
797
809
  const left = candidates.map(leftCos);
798
810
  const right = candidates.map(rightCos);
@@ -810,8 +822,7 @@ function rightSin(x) {
810
822
  }
811
823
  function isin(X) {
812
824
  typeCheckIsInterval(X);
813
- const width = X.hi - X.lo;
814
- if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
825
+ if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
815
826
  const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];
816
827
  const left = candidates.map(leftSin);
817
828
  const right = candidates.map(rightSin);
@@ -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 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 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 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\n// Minimum disjoint set of a list of intervals\nexport function union(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} 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\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\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 const width = X.hi - X.lo;\n if (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 const width = X.hi - X.lo;\n if (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":[]}
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 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} 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\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\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"]}
package/dist/index.d.cts CHANGED
@@ -11,6 +11,7 @@ declare class Interval {
11
11
  contains(value: number): boolean;
12
12
  superset(other: Interval): boolean;
13
13
  subset(other: Interval): boolean;
14
+ width(): number;
14
15
  toString(numbers?: (x: number) => string): string;
15
16
  print(): void;
16
17
  }
@@ -21,17 +22,19 @@ declare class Union {
21
22
  constructor(intervals: Interval[]);
22
23
  isEmpty(): boolean;
23
24
  isFull(): boolean;
25
+ isFinite(): boolean;
24
26
  lower(): number;
25
27
  upper(): number;
26
28
  contains(value: number): boolean;
27
29
  subset(other: Union): boolean;
28
30
  superset(other: Union): boolean;
29
31
  hull(): Union;
32
+ width(): number;
30
33
  forEach(callback: (x: Interval, index: number) => void): void;
31
34
  toString(numbers?: (x: number) => string): string;
32
35
  print(): void;
33
36
  }
34
- declare function union(intervals: Interval[]): Union;
37
+ declare function union(list: (Interval | Union)[]): Union;
35
38
  declare function single(a: number, b?: number): Union;
36
39
  declare function bounded(x: number): Union;
37
40
  declare const EMPTY: Union;
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ declare class Interval {
11
11
  contains(value: number): boolean;
12
12
  superset(other: Interval): boolean;
13
13
  subset(other: Interval): boolean;
14
+ width(): number;
14
15
  toString(numbers?: (x: number) => string): string;
15
16
  print(): void;
16
17
  }
@@ -21,17 +22,19 @@ declare class Union {
21
22
  constructor(intervals: Interval[]);
22
23
  isEmpty(): boolean;
23
24
  isFull(): boolean;
25
+ isFinite(): boolean;
24
26
  lower(): number;
25
27
  upper(): number;
26
28
  contains(value: number): boolean;
27
29
  subset(other: Union): boolean;
28
30
  superset(other: Union): boolean;
29
31
  hull(): Union;
32
+ width(): number;
30
33
  forEach(callback: (x: Interval, index: number) => void): void;
31
34
  toString(numbers?: (x: number) => string): string;
32
35
  print(): void;
33
36
  }
34
- declare function union(intervals: Interval[]): Union;
37
+ declare function union(list: (Interval | Union)[]): Union;
35
38
  declare function single(a: number, b?: number): Union;
36
39
  declare function bounded(x: number): Union;
37
40
  declare const EMPTY: Union;
package/dist/index.js CHANGED
@@ -54,6 +54,9 @@ var Interval = class {
54
54
  subset(other) {
55
55
  return other.superset(this);
56
56
  }
57
+ width() {
58
+ return this.hi - this.lo;
59
+ }
57
60
  toString(numbers = defaultNumbers) {
58
61
  return `[${numbers(this.lo)}, ${numbers(this.hi)}]`;
59
62
  }
@@ -105,6 +108,9 @@ var Union = class {
105
108
  isFull() {
106
109
  return this.intervals.length === 1 && this.intervals[0].lo === -Infinity && this.intervals[0].hi === Infinity;
107
110
  }
111
+ isFinite() {
112
+ return this.isEmpty() || this.intervals[0].lo !== -Infinity && this.intervals[this.intervals.length - 1].hi !== Infinity;
113
+ }
108
114
  lower() {
109
115
  if (this.isEmpty()) return Infinity;
110
116
  return this.intervals[0].lo;
@@ -130,6 +136,9 @@ var Union = class {
130
136
  if (this.isEmpty()) return EMPTY;
131
137
  return single(this.lower(), this.upper());
132
138
  }
139
+ width() {
140
+ return this.intervals.reduce((acc, interval3) => acc + interval3.width(), 0);
141
+ }
133
142
  forEach(callback) {
134
143
  this.intervals.forEach(callback);
135
144
  }
@@ -141,7 +150,11 @@ var Union = class {
141
150
  console.log(this.toString());
142
151
  }
143
152
  };
144
- function union(intervals) {
153
+ function union(list) {
154
+ const intervals = list.map((e) => e instanceof Interval ? e : e.intervals).flat();
155
+ return iunion(intervals);
156
+ }
157
+ function iunion(intervals) {
145
158
  if (intervals.length <= 1) {
146
159
  return new Union(intervals);
147
160
  }
@@ -734,8 +747,7 @@ function rightCos(x) {
734
747
  }
735
748
  function icos(X) {
736
749
  typeCheckIsInterval(X);
737
- const width = X.hi - X.lo;
738
- if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
750
+ if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
739
751
  const candidates = [X.lo, X.hi, ...piMultiples(X).map((x) => x * pi)];
740
752
  const left = candidates.map(leftCos);
741
753
  const right = candidates.map(rightCos);
@@ -753,8 +765,7 @@ function rightSin(x) {
753
765
  }
754
766
  function isin(X) {
755
767
  typeCheckIsInterval(X);
756
- const width = X.hi - X.lo;
757
- if (width >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
768
+ if (X.width() >= 2 * Math.PI) return new Union([new Interval(-1, 1)]);
758
769
  const candidates = [X.lo, X.hi, ...halfPiMultiples(X).map((x) => halfpi + x * pi)];
759
770
  const left = candidates.map(leftSin);
760
771
  const right = candidates.map(rightSin);
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 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 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 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\n// Minimum disjoint set of a list of intervals\nexport function union(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} 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\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\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 const width = X.hi - X.lo;\n if (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 const width = X.hi - X.lo;\n if (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":[]}
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 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} 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\nexport function ipow(X: Interval, Y: Interval): Union {\n if (X.hi <= 0) return new Union([]);\n return uexp(umul(new Union([Y]), ilog(X)));\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "not-so-float",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",