not-so-float 1.2.1 → 2.1.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 +18 -8
- package/dist/index.cjs +114 -127
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -72
- package/dist/index.d.ts +8 -72
- package/dist/index.js +110 -70
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -86,14 +86,13 @@ function interval(a, b) {
|
|
|
86
86
|
}
|
|
87
87
|
return new Interval(a, b);
|
|
88
88
|
}
|
|
89
|
-
var inter = interval;
|
|
90
|
-
var FULL = new Interval(-Infinity, Infinity);
|
|
91
89
|
function typeCheckIsInterval(x) {
|
|
92
90
|
if (!(x instanceof Interval)) {
|
|
93
91
|
throw TypeError(`Argument must be an interval (got type ${typeof x})`);
|
|
94
92
|
}
|
|
95
93
|
return true;
|
|
96
94
|
}
|
|
95
|
+
var IFULL = new Interval(-Infinity, Infinity);
|
|
97
96
|
|
|
98
97
|
// src/union.ts
|
|
99
98
|
var Union = class {
|
|
@@ -117,6 +116,20 @@ var Union = class {
|
|
|
117
116
|
contains(value) {
|
|
118
117
|
return this.intervals.some((i) => i.contains(value));
|
|
119
118
|
}
|
|
119
|
+
subset(other) {
|
|
120
|
+
return this.intervals.every(
|
|
121
|
+
(thisInterval) => other.intervals.some((otherInterval) => thisInterval.subset(otherInterval))
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
superset(other) {
|
|
125
|
+
return other.intervals.every(
|
|
126
|
+
(otherInterval) => this.intervals.some((thisInterval) => thisInterval.superset(otherInterval))
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
hull() {
|
|
130
|
+
if (this.isEmpty()) return EMPTY;
|
|
131
|
+
return single(this.lower(), this.upper());
|
|
132
|
+
}
|
|
120
133
|
forEach(callback) {
|
|
121
134
|
this.intervals.forEach(callback);
|
|
122
135
|
}
|
|
@@ -200,10 +213,17 @@ function makeBinaryOpEither(op) {
|
|
|
200
213
|
return op(toUnion(A), toUnion(B));
|
|
201
214
|
};
|
|
202
215
|
}
|
|
216
|
+
function single(a, b) {
|
|
217
|
+
if (typeof b === "undefined") {
|
|
218
|
+
b = a;
|
|
219
|
+
}
|
|
220
|
+
return union([interval(a, b)]);
|
|
221
|
+
}
|
|
203
222
|
function bounded(x) {
|
|
204
|
-
return
|
|
223
|
+
return single(prev(x), next(x));
|
|
205
224
|
}
|
|
206
225
|
var EMPTY = new Union([]);
|
|
226
|
+
var FULL = new Union([new Interval(-Infinity, Infinity)]);
|
|
207
227
|
|
|
208
228
|
// src/compare.ts
|
|
209
229
|
function ioverlap(a, b) {
|
|
@@ -361,6 +381,8 @@ function leftDiv(a, b) {
|
|
|
361
381
|
if (b === -Infinity) {
|
|
362
382
|
return Math.sign(-a) * 0;
|
|
363
383
|
}
|
|
384
|
+
if (b === 1) return a;
|
|
385
|
+
if (b === -1) return -a;
|
|
364
386
|
return prev(a / b);
|
|
365
387
|
}
|
|
366
388
|
function rightDiv(a, b) {
|
|
@@ -370,6 +392,8 @@ function rightDiv(a, b) {
|
|
|
370
392
|
if (b === -Infinity) {
|
|
371
393
|
return Math.sign(-a) * 0;
|
|
372
394
|
}
|
|
395
|
+
if (b === 1) return a;
|
|
396
|
+
if (b === -1) return -a;
|
|
373
397
|
return next(a / b);
|
|
374
398
|
}
|
|
375
399
|
function intervalType(x) {
|
|
@@ -389,7 +413,7 @@ function idiv(x, y) {
|
|
|
389
413
|
return EMPTY;
|
|
390
414
|
}
|
|
391
415
|
if (xType === 5 /* Z */) {
|
|
392
|
-
return
|
|
416
|
+
return single(0);
|
|
393
417
|
}
|
|
394
418
|
const [a, b] = [x.lo, x.hi];
|
|
395
419
|
const [c, d] = [y.lo, y.hi];
|
|
@@ -411,7 +435,7 @@ function idiv(x, y) {
|
|
|
411
435
|
} else if (xType === 1 /* P0 */) {
|
|
412
436
|
return union([new Interval(0, Infinity)]);
|
|
413
437
|
} else if (xType === 2 /* M */) {
|
|
414
|
-
return
|
|
438
|
+
return FULL;
|
|
415
439
|
} else if (xType === 3 /* N0 */) {
|
|
416
440
|
return union([new Interval(-Infinity, -0)]);
|
|
417
441
|
} else {
|
|
@@ -429,7 +453,7 @@ function idiv(x, y) {
|
|
|
429
453
|
new Interval(leftDiv(b, c), Infinity)
|
|
430
454
|
]);
|
|
431
455
|
} else {
|
|
432
|
-
return
|
|
456
|
+
return FULL;
|
|
433
457
|
}
|
|
434
458
|
} else if (yType === 3 /* N0 */) {
|
|
435
459
|
if (xType === 0 /* P1 */) {
|
|
@@ -437,7 +461,7 @@ function idiv(x, y) {
|
|
|
437
461
|
} else if (xType === 1 /* P0 */) {
|
|
438
462
|
return union([new Interval(-Infinity, -0)]);
|
|
439
463
|
} else if (xType === 2 /* M */) {
|
|
440
|
-
return
|
|
464
|
+
return FULL;
|
|
441
465
|
} else if (xType === 3 /* N0 */) {
|
|
442
466
|
return union([new Interval(0, Infinity)]);
|
|
443
467
|
} else {
|
|
@@ -465,6 +489,7 @@ function uneg(U) {
|
|
|
465
489
|
typeCheckIsUnion(U);
|
|
466
490
|
return new Union(U.intervals.slice().reverse().map(ineg));
|
|
467
491
|
}
|
|
492
|
+
var neg = makeUnaryOpEither(uneg);
|
|
468
493
|
var add = makeBinaryOpEither(uadd);
|
|
469
494
|
var sub = makeBinaryOpEither(usub);
|
|
470
495
|
var mul = makeBinaryOpEither(umul);
|
|
@@ -554,9 +579,7 @@ function ipowInt(X, n) {
|
|
|
554
579
|
} else if (X.hi < 0) {
|
|
555
580
|
return new Union([new Interval(leftPowInt(X.hi, n), rightPowInt(X.lo, n))]);
|
|
556
581
|
} else {
|
|
557
|
-
return new Union([
|
|
558
|
-
new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n))
|
|
559
|
-
]);
|
|
582
|
+
return new Union([new Interval(0, rightPowInt(Math.max(X.hi, -X.lo), n))]);
|
|
560
583
|
}
|
|
561
584
|
}
|
|
562
585
|
function upowInt(U, n) {
|
|
@@ -599,14 +622,84 @@ function usqinv(U) {
|
|
|
599
622
|
return union(uneg(x).intervals.concat(x.intervals));
|
|
600
623
|
}
|
|
601
624
|
var sqinv = makeUnaryOpEither(usqinv);
|
|
625
|
+
function upowIntInv(U, n) {
|
|
626
|
+
if (n === 0) {
|
|
627
|
+
if (U.contains(1)) return FULL;
|
|
628
|
+
else return EMPTY;
|
|
629
|
+
}
|
|
630
|
+
if (n === 1) {
|
|
631
|
+
return U;
|
|
632
|
+
}
|
|
633
|
+
if (n > 0 && n % 2 === 0) {
|
|
634
|
+
return upowEvenInv(U, n);
|
|
635
|
+
}
|
|
636
|
+
if (n > 0 && n % 2 !== 0) {
|
|
637
|
+
return upowOddInv(U, n);
|
|
638
|
+
}
|
|
639
|
+
if (U.lower() === 0 && U.upper() === 0) {
|
|
640
|
+
return EMPTY;
|
|
641
|
+
}
|
|
642
|
+
const one = new Union([new Interval(1, 1)]);
|
|
643
|
+
return div(one, upowIntInv(U, -n));
|
|
644
|
+
}
|
|
645
|
+
function powIntInv(A, n) {
|
|
646
|
+
typeCheckIsIntervalOrUnion(A);
|
|
647
|
+
return upowIntInv(toUnion(A), n);
|
|
648
|
+
}
|
|
649
|
+
function leftPowOddInv(y, n) {
|
|
650
|
+
if (y === 0) return 0;
|
|
651
|
+
if (y === 1) return 1;
|
|
652
|
+
if (y === -1) return -1;
|
|
653
|
+
else if (y > 0) return prev(Math.pow(y, prev(1 / n)));
|
|
654
|
+
else return prev(-Math.pow(-y, next(1 / n)));
|
|
655
|
+
}
|
|
656
|
+
function rightPowOddInv(y, n) {
|
|
657
|
+
if (y === 0) return 0;
|
|
658
|
+
if (y === 1) return 1;
|
|
659
|
+
if (y === -1) return -1;
|
|
660
|
+
else if (y > 0) return next(Math.pow(y, next(1 / n)));
|
|
661
|
+
else return next(-Math.pow(-y, prev(1 / n)));
|
|
662
|
+
}
|
|
663
|
+
function ipowOddInv(X, n) {
|
|
664
|
+
typeCheckIsInterval(X);
|
|
665
|
+
return new Interval(leftPowOddInv(X.lo, n), rightPowOddInv(X.hi, n));
|
|
666
|
+
}
|
|
667
|
+
function upowOddInv(U, n) {
|
|
668
|
+
typeCheckIsUnion(U);
|
|
669
|
+
return new Union(U.intervals.map((X) => ipowOddInv(X, n)));
|
|
670
|
+
}
|
|
671
|
+
function leftPowEvenInv(y, n) {
|
|
672
|
+
if (y === 0) return 0;
|
|
673
|
+
if (y === 1) return 1;
|
|
674
|
+
return prev(Math.pow(y, prev(1 / n)));
|
|
675
|
+
}
|
|
676
|
+
function rightPowEvenInv(y, n) {
|
|
677
|
+
if (y === 0) return 0;
|
|
678
|
+
if (y === 1) return 1;
|
|
679
|
+
return next(Math.pow(y, next(1 / n)));
|
|
680
|
+
}
|
|
681
|
+
function ipowEvenInv(Y, n) {
|
|
682
|
+
if (Y.hi < 0) {
|
|
683
|
+
return EMPTY;
|
|
684
|
+
} else if (Y.hi === 0) {
|
|
685
|
+
return new Union([new Interval(0, 0)]);
|
|
686
|
+
} else {
|
|
687
|
+
const principal = new Interval(
|
|
688
|
+
leftPowEvenInv(Math.max(0, Y.lo), n),
|
|
689
|
+
rightPowEvenInv(Y.hi, n)
|
|
690
|
+
);
|
|
691
|
+
return new Union([ineg(principal), principal]);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
function upowEvenInv(U, n) {
|
|
695
|
+
typeCheckIsUnion(U);
|
|
696
|
+
return union(U.intervals.map((X) => ipowEvenInv(X, n).intervals).flat());
|
|
697
|
+
}
|
|
602
698
|
|
|
603
699
|
// src/trigonometry.ts
|
|
604
700
|
var pi = Math.PI;
|
|
605
701
|
var halfpi = Math.PI / 2;
|
|
606
702
|
var tau = 2 * Math.PI;
|
|
607
|
-
function wrapAngle(angle) {
|
|
608
|
-
return (angle % tau + tau) % tau;
|
|
609
|
-
}
|
|
610
703
|
function piMultiples(X) {
|
|
611
704
|
const lower = Math.ceil(X.lo / Math.PI);
|
|
612
705
|
const upper = Math.floor(X.hi / Math.PI);
|
|
@@ -683,81 +776,28 @@ export {
|
|
|
683
776
|
bounded,
|
|
684
777
|
complement,
|
|
685
778
|
cos,
|
|
686
|
-
defaultNumbers,
|
|
687
779
|
disjoint,
|
|
688
780
|
div,
|
|
689
781
|
exp,
|
|
690
|
-
halfPiMultiples,
|
|
691
|
-
iabs,
|
|
692
|
-
iadd,
|
|
693
|
-
icos,
|
|
694
|
-
idisjoint,
|
|
695
|
-
idiv,
|
|
696
|
-
iexp,
|
|
697
|
-
iintersection,
|
|
698
|
-
ilog,
|
|
699
|
-
imax,
|
|
700
|
-
imin,
|
|
701
|
-
imul,
|
|
702
|
-
ineg,
|
|
703
|
-
inter,
|
|
704
782
|
intersection,
|
|
705
783
|
interval,
|
|
706
|
-
intervalType,
|
|
707
|
-
ioverlap,
|
|
708
|
-
ipow,
|
|
709
|
-
ipowInt,
|
|
710
|
-
isIntervalOrUnion,
|
|
711
|
-
isin,
|
|
712
|
-
isqrt,
|
|
713
|
-
isub,
|
|
714
|
-
iudisjoint,
|
|
715
|
-
iuoverlap,
|
|
716
|
-
leftMul,
|
|
717
784
|
log,
|
|
718
|
-
makeBinaryOpEither,
|
|
719
|
-
makeBinaryOpUnion,
|
|
720
|
-
makeUnaryOpEither,
|
|
721
|
-
makeUnaryOpUnion,
|
|
722
785
|
max,
|
|
723
786
|
min,
|
|
724
787
|
mul,
|
|
788
|
+
neg,
|
|
725
789
|
next,
|
|
726
790
|
overlap,
|
|
727
|
-
piMultiples,
|
|
728
791
|
pow,
|
|
729
792
|
powInt,
|
|
793
|
+
powIntInv,
|
|
730
794
|
prev,
|
|
731
|
-
rightMul,
|
|
732
795
|
sin,
|
|
796
|
+
single,
|
|
733
797
|
sqinv,
|
|
734
798
|
sqrt,
|
|
735
799
|
sub,
|
|
736
800
|
tan,
|
|
737
|
-
|
|
738
|
-
typeCheckIsInterval,
|
|
739
|
-
typeCheckIsIntervalOrUnion,
|
|
740
|
-
typeCheckIsUnion,
|
|
741
|
-
uabs,
|
|
742
|
-
uadd,
|
|
743
|
-
ucomplement,
|
|
744
|
-
ucos,
|
|
745
|
-
udiv,
|
|
746
|
-
uexp,
|
|
747
|
-
uintersection,
|
|
748
|
-
ulog,
|
|
749
|
-
umax,
|
|
750
|
-
umin,
|
|
751
|
-
umul,
|
|
752
|
-
uneg,
|
|
753
|
-
union,
|
|
754
|
-
upow,
|
|
755
|
-
upowInt,
|
|
756
|
-
usin,
|
|
757
|
-
usqinv,
|
|
758
|
-
usqrt,
|
|
759
|
-
usub,
|
|
760
|
-
utan,
|
|
761
|
-
wrapAngle
|
|
801
|
+
union
|
|
762
802
|
};
|
|
763
803
|
//# sourceMappingURL=index.js.map
|
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 const inter = interval; // alias\n\n// The full interval [-∞, ∞]\n// All non NaN IEEE floating point numbers are inside the full interval, including infinities\nexport const FULL: Interval = new Interval(-Infinity, Infinity);\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","import { prev, next } from \"./nextafter.ts\";\nimport { 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 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\nexport function bounded(x: number): Union {\n return new Union([new Interval(prev(x), next(x))]);\n}\n\nexport const EMPTY = new Union([]);\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, FULL, inter, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n typeCheckIsUnion,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n EMPTY,\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 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 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 union([inter(0, 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 union([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 union([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 union([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 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, FULL, typeCheckIsInterval } from \"./interval.ts\";\nimport {\n Union,\n union,\n EMPTY,\n toUnion,\n typeCheckIsIntervalOrUnion,\n typeCheckIsUnion,\n makeUnaryOpUnion,\n makeUnaryOpEither,\n makeBinaryOpUnion,\n makeBinaryOpEither,\n} from \"./union.ts\";\nimport { idiv, umul, ineg, uneg } from \"./arithmetic.ts\";\n\n// ABS\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\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// 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// 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// POW (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 return new Union([\n new Interval(0, rightPowInt(Math.max(Math.abs(X.hi), Math.abs(X.lo)), n)),\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 (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\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","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":";AACA,IAAM,SAAS,IAAI,YAAY,CAAC;AAChC,IAAM,YAAY,IAAI,aAAa,MAAM;AACzC,IAAM,UAAU,IAAI,eAAe,MAAM;AAGlC,SAAS,KAAK,GAAmB;AACpC,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,EAAG,QAAO,OAAO;AAE3B,YAAU,CAAC,IAAI;AACf,MAAI,OAAe,QAAQ,CAAC;AAE5B,MAAI,IAAI,GAAG;AACP,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ;AAAA,EACZ;AAEA,UAAQ,CAAC,IAAI;AACb,SAAO,UAAU,CAAC;AACtB;AAGO,SAAS,KAAK,GAAmB;AACpC,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO,CAAC,OAAO;AAE5B,YAAU,CAAC,IAAI;AACf,MAAI,OAAe,QAAQ,CAAC;AAE5B,MAAI,IAAI,GAAG;AACP,YAAQ;AAAA,EACZ,OAAO;AACH,YAAQ;AAAA,EACZ;AAEA,UAAQ,CAAC,IAAI;AACb,SAAO,UAAU,CAAC;AACtB;;;ACvCO,IAAM,iBAAiB,CAAC,MAAc,EAAE,SAAS;AAEjD,IAAM,WAAN,MAAe;AAAA,EAClB,YAAqB,IAAqB,IAAY;AAAjC;AAAqB;AAAA,EAAa;AAAA,EAEhD,SAAkB;AACrB,WAAO,KAAK,OAAO,aAAa,KAAK,OAAO;AAAA,EAChD;AAAA,EAEO,WAAoB;AACvB,WAAO,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,EAAE;AAAA,EAChD;AAAA,EAEO,eAAwB;AAC3B,WAAO,KAAK,OAAO,KAAK;AAAA,EAC5B;AAAA,EAEO,SAAS,OAAwB;AACpC,WAAO,KAAK,MAAM,SAAS,SAAS,KAAK;AAAA,EAC7C;AAAA,EAEO,SAAS,OAA0B;AACtC,WAAO,KAAK,SAAS,MAAM,EAAE,KAAK,KAAK,SAAS,MAAM,EAAE;AAAA,EAC5D;AAAA,EAEO,OAAO,OAA0B;AACpC,WAAO,MAAM,SAAS,IAAI;AAAA,EAC9B;AAAA,EAEO,SAAS,UAAiC,gBAAwB;AACrE,WAAO,IAAI,QAAQ,KAAK,EAAE,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,EACpD;AAAA,EAEO,QAAc;AACjB,YAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,EAC/B;AACJ;AAEA,SAAS,uBAAuB,GAAQ;AACpC,MAAI,OAAO,MAAM,UAAU;AACvB,UAAM,UAAU,yCAAyC,OAAO,CAAC,EAAE;AAAA,EACvE;AACA,MAAI,MAAM,CAAC,GAAG;AACV,UAAM,UAAU,iCAAiC;AAAA,EACrD;AACJ;AAOO,SAAS,SAAS,GAAW,GAAsB;AACtD,MAAI,OAAO,MAAM,aAAa;AAC1B,QAAI;AAAA,EACR;AACA,yBAAuB,CAAC;AACxB,yBAAuB,CAAC;AAExB,MAAI,IAAI,GAAG;AACP,UAAM,UAAU,2CAA2C;AAAA,EAC/D;AACA,MAAI,MAAM,UAAU;AAChB,UAAM,UAAU,yCAAyC;AAAA,EAC7D;AACA,MAAI,MAAM,WAAW;AACjB,UAAM,UAAU,0CAA0C;AAAA,EAC9D;AAEA,SAAO,IAAI,SAAS,GAAG,CAAC;AAC5B;AAEO,IAAM,QAAQ;AAId,IAAM,OAAiB,IAAI,SAAS,WAAW,QAAQ;AAEvD,SAAS,oBAAoB,GAAuB;AACvD,MAAI,EAAE,aAAa,WAAW;AAC1B,UAAM,UAAU,0CAA0C,OAAO,CAAC,GAAG;AAAA,EACzE;AACA,SAAO;AACX;;;AChFO,IAAM,QAAN,MAAY;AAAA,EACf,YAAqB,WAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEtC,UAAmB;AACtB,WAAO,KAAK,UAAU,WAAW;AAAA,EACrC;AAAA,EAEO,SAAkB;AACrB,WACI,KAAK,UAAU,WAAW,KAC1B,KAAK,UAAU,CAAC,EAAE,OAAO,aACzB,KAAK,UAAU,CAAC,EAAE,OAAO;AAAA,EAEjC;AAAA,EAEO,QAAgB;AACnB,QAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,WAAO,KAAK,UAAU,CAAC,EAAE;AAAA,EAC7B;AAAA,EAEO,QAAgB;AACnB,QAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,WAAO,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,EACrD;AAAA,EAEO,SAAS,OAAwB;AACpC,WAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,EACvD;AAAA,EAEO,QAAQ,UAAgD;AAC3D,SAAK,UAAU,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEO,SAAS,UAAiC,gBAAgB;AAC7D,QAAI,KAAK,UAAU,WAAW,EAAG,QAAO;AACxC,WAAO,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EAAE,KAAK,KAAK;AAAA,EACpE;AAAA,EAEO,QAAc;AACjB,YAAQ,IAAI,KAAK,SAAS,CAAC;AAAA,EAC/B;AACJ;AAIO,SAAS,MAAM,WAA8B;AAChD,MAAI,UAAU,UAAU,GAAG;AACvB,WAAO,IAAI,MAAM,SAAS;AAAA,EAC9B;AAGA,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;AAEpC,QAAM,SAAqB,CAAC,UAAU,CAAC,CAAC;AAExC,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAEvC,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,UAAM,OAAO,UAAU,CAAC;AACxB,QAAI,KAAK,MAAM,KAAK,IAAI;AACpB,aAAO,OAAO,SAAS,CAAC,IAAI,IAAI,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,IAChF,OAAO;AACH,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ;AAEA,SAAO,IAAI,MAAM,MAAM;AAC3B;AAEO,SAAS,iBAAiB,GAAoB;AACjD,MAAI,EAAE,aAAa,QAAQ;AACvB,UAAM,UAAU,sCAAsC,OAAO,CAAC,GAAG;AAAA,EACrE;AACA,SAAO;AACX;AAEO,SAAS,QAAQ,GAA4B;AAChD,MAAI,aAAa,SAAU,QAAO,IAAI,MAAM,CAAC,CAAC,CAAC;AAC/C,SAAO;AACX;AAWO,SAAS,iBAAiB,IAAmC;AAChE,SAAO,CAAC,MAAoB;AACxB,qBAAiB,CAAC;AAGlB,UAAM,UAAsB,CAAC;AAC7B,MAAE,QAAQ,CAAC,MAAM;AACb,cAAQ,KAAK,GAAG,GAAG,CAAC,EAAE,SAAS;AAAA,IACnC,CAAC;AAGD,WAAO,MAAM,OAAO;AAAA,EACxB;AACJ;AAGO,SAAS,kBAAkB,IAAqC;AACnE,SAAO,CAAC,GAAU,MAAoB;AAClC,qBAAiB,CAAC;AAClB,qBAAiB,CAAC;AAElB,UAAM,UAAsB,CAAC;AAC7B,MAAE,QAAQ,CAAC,GAAG,MAAM;AAChB,QAAE,QAAQ,CAAC,MAAM;AACb,gBAAQ,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,SAAS;AAAA,MACtC,CAAC;AAAA,IACL,CAAC;AAGD,WAAO,MAAM,OAAO;AAAA,EACxB;AACJ;AAEO,SAAS,kBAAkB,GAAiB;AAC/C,SAAO,aAAa,YAAY,aAAa;AACjD;AAEO,SAAS,2BAA2B,GAAiB;AACxD,MAAI,CAAC,kBAAkB,CAAC,GAAG;AACvB,UAAM,UAAU,4CAA4C;AAAA,EAChE;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,IAAiC;AAC/D,SAAO,CAAC,MAAwB;AAC5B,+BAA2B,CAAC;AAC5B,WAAO,GAAG,QAAQ,CAAC,CAAC;AAAA,EACxB;AACJ;AAEO,SAAS,mBAAmB,IAAmC;AAClE,SAAO,CAAC,GAAqB,MAAwB;AACjD,+BAA2B,CAAC;AAC5B,+BAA2B,CAAC;AAE5B,WAAO,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,EACpC;AACJ;AAEO,SAAS,QAAQ,GAAkB;AACtC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD;AAEO,IAAM,QAAQ,IAAI,MAAM,CAAC,CAAC;;;AC1J1B,SAAS,SAAS,GAAa,GAAsB;AACxD,SAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;AACrC;AAEO,SAAS,UAAU,GAAa,GAAsB;AACzD,SAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACnC;AAEO,SAAS,UAAU,GAAa,GAAmB;AACtD,SAAO,EAAE,UAAU,KAAK,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AACjD;AAEO,SAAS,WAAW,GAAa,GAAmB;AACvD,SAAO,EAAE,UAAU,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AACnD;AAEO,SAAS,QAAQ,GAAqB,GAA8B;AACvE,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,QAAM,SAAS,QAAQ,CAAC;AACxB,SAAO,QAAQ,CAAC,EAAE,UAAU,KAAK,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAChE;AAEO,SAAS,SAAS,GAAqB,GAA8B;AACxE,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,QAAM,SAAS,QAAQ,CAAC;AACxB,SAAO,QAAQ,CAAC,EAAE,UAAU,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAClE;AAGO,SAAS,cAAc,GAAa,GAA8B;AACrE,MAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAI,QAAO;AACvC,SAAO,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAClE;AAGO,SAAS,cAAc,GAAU,GAAiB;AACrD,MAAI,EAAE,QAAQ,KAAK,EAAE,QAAQ,EAAG,QAAO;AACvC,MAAI,EAAE,OAAO,EAAG,QAAO;AACvB,MAAI,EAAE,OAAO,EAAG,QAAO;AAEvB,QAAM,SAAqB,CAAC;AAC5B,MAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAEpB,SAAO,KAAK,EAAE,UAAU,UAAU,KAAK,EAAE,UAAU,QAAQ;AACvD,UAAM,IAAI,EAAE,UAAU,EAAE;AACxB,UAAM,IAAI,EAAE,UAAU,EAAE;AAGxB,UAAM,QAAQ,cAAc,GAAG,CAAC;AAChC,QAAI,UAAU,MAAM;AAChB,aAAO,KAAK,KAAK;AAAA,IACrB;AAGA,QAAI,EAAE,KAAK,EAAE,GAAI,OAAM;AAAA,QAClB,OAAM;AAAA,EACf;AAEA,SAAO,IAAI,MAAM,MAAM;AAC3B;AAGO,SAAS,aAAa,GAAqB,GAA4B;AAC1E,6BAA2B,CAAC;AAC5B,6BAA2B,CAAC;AAE5B,SAAO,cAAc,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC/C;AAGO,SAAS,YAAY,GAAiB;AACzC,MAAI,EAAE,QAAQ,EAAG,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,QAAQ,CAAC,CAAC;AACrE,MAAI,EAAE,OAAO,EAAG,QAAO;AAEvB,QAAM,SAAqB,CAAC;AAG5B,MAAI,EAAE,UAAU,CAAC,EAAE,OAAO,WAAW;AACjC,WAAO,KAAK,IAAI,SAAS,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AAAA,EAC1D;AAGA,WAAS,IAAI,GAAG,IAAI,EAAE,UAAU,SAAS,GAAG,KAAK;AAC7C,WAAO,KAAK,IAAI,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC;AAAA,EACtE;AAGA,MAAI,EAAE,UAAU,EAAE,UAAU,SAAS,CAAC,EAAE,OAAO,UAAU;AACrD,WAAO,KAAK,IAAI,SAAS,EAAE,UAAU,EAAE,UAAU,SAAS,CAAC,EAAE,IAAI,QAAQ,CAAC;AAAA,EAC9E;AAGA,SAAO,MAAM,MAAM;AACvB;AAGO,SAAS,WAAW,GAA4B;AACnD,6BAA2B,CAAC;AAC5B,SAAO,YAAY,QAAQ,CAAC,CAAC;AACjC;;;AC9FA,SAAS,QAAQ,GAAW,GAAmB;AAC3C,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX,WAAW,MAAM,GAAG;AAChB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC5C,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX,WAAW,MAAM,GAAG;AAChB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AACrB,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9E;AAEO,SAAS,KAAK,GAAuB;AACxC,sBAAoB,CAAC;AACrB,SAAO,IAAI,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;AACpC;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,KAAK,GAAG,KAAK,CAAC,CAAC;AAC1B;AAOO,SAAS,QAAQ,GAAW,GAAmB;AAClD,MAAI,MAAM,KAAK,MAAM,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAEO,SAAS,SAAS,GAAW,GAAmB;AACnD,MAAI,MAAM,KAAK,MAAM,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAGO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AAErB,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAC1B,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAE1B,MAAI,IAAI,GAAG;AACP,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE;AAAA,EACJ,WAAW,IAAI,GAAG;AACd,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE;AAAA,EACJ,OAAO;AACH,QAAI,IAAI,GAAG;AACP,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,WAAW,IAAI,GAAG;AACd,aAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClE,OAAO;AACH,aAAO,IAAI,MAAM;AAAA,QACb,IAAI;AAAA,UACA,KAAK,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;AAAA,UACrC,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;AAAA,QAC3C;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAGA,SAAS,QAAQ,GAAW,GAAmB;AAC3C,MAAI,MAAM,UAAU;AAChB,WAAO,KAAK,KAAK,CAAC,IAAI;AAAA,EAC1B;AACA,MAAI,MAAM,WAAW;AACjB,WAAO,KAAK,KAAK,CAAC,CAAC,IAAI;AAAA,EAC3B;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC5C,MAAI,MAAM,UAAU;AAChB,WAAO,KAAK,KAAK,CAAC,IAAI;AAAA,EAC1B;AACA,MAAI,MAAM,WAAW;AACjB,WAAO,KAAK,KAAK,CAAC,CAAC,IAAI;AAAA,EAC3B;AACA,SAAO,KAAK,IAAI,CAAC;AACrB;AAkBO,SAAS,aAAa,GAAoB;AAC7C,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,MAAI,EAAE,KAAK,KAAK,EAAE,OAAO,EAAG,QAAO;AACnC,MAAI,EAAE,OAAO,KAAK,EAAE,KAAK,EAAG,QAAO;AACnC,MAAI,EAAE,OAAO,KAAK,EAAE,OAAO,EAAG,QAAO;AAAA,MAChC,QAAO;AAChB;AAKO,SAAS,KAAK,GAAa,GAAoB;AAClD,sBAAoB,CAAC;AACrB,sBAAoB,CAAC;AAErB,QAAM,QAAQ,aAAa,CAAC;AAC5B,QAAM,QAAQ,aAAa,CAAC;AAG5B,MAAI,UAAU,WAAS;AACnB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,WAAS;AACnB,WAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAAA,EAC9B;AAEA,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAC1B,QAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AAE1B,MAAI,UAAU,YAAU;AACpB,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClD,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IAClD,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D;AAAA,EACJ,WAAW,UAAU,YAAU;AAC3B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,IACxD,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC5C,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,CAAC;AAAA,IACvB,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,CAAC,CAAC;AAAA,IAC9C,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC1D;AAAA,EACJ,WAAW,UAAU,WAAS;AAC1B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM;AAAA,QACT,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC;AAAA,QACtC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ;AAAA,MACxC,CAAC;AAAA,IACL,WAAW,SAAS,YAAU;AAC1B,aAAO,MAAM;AAAA,QACT,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC;AAAA,QACtC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ;AAAA,MACxC,CAAC;AAAA,IACL,OAAO;AAIH,aAAO,MAAM,CAAC,IAAI,CAAC;AAAA,IACvB;AAAA,EACJ,WAAW,UAAU,YAAU;AAC3B,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC1D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,CAAC,CAAC;AAAA,IAC9C,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,CAAC;AAAA,IACvB,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC5C,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,IACxD;AAAA,EACJ,OAAO;AACH,QAAI,UAAU,YAAU;AACpB,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IAClD,WAAW,UAAU,WAAS;AAC1B,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,UAAU,YAAU;AAC3B,aAAO,MAAM,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAClD,OAAO;AACH,aAAO,MAAM,CAAC,IAAI,SAAS,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,IAC9D;AAAA,EACJ;AACJ;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,OAAO,kBAAkB,IAAI;AAEnC,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI,MAAM,EAAE,UAAU,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;AAC5D;AAEO,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;;;AC5OnC,SAAS,KAAK,GAAoB;AACrC,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC,CAAC;AACnC,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIlC,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/E;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAEnC,SAAS,KAAK,GAAa,GAAoB;AAClD,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/E;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAI1C,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,UAAW,QAAO;AAC5B,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEO,SAAS,KAAK,GAAuB;AACxC,sBAAoB,CAAC;AACrB,SAAO,IAAI,SAAS,QAAQ,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC;AACrD;AAEO,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC;AAC1C;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAC3B;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AACrB,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC;AAClC,MAAI,EAAE,MAAM,GAAG;AACX,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,EAC9D,OAAO;AACH,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,QAAQ,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,EAC/E;AACJ;AAEO,SAAS,KAAK,GAAiB;AAClC,mBAAiB,CAAC;AAClB,SAAO,IAAI;AAAA,IACP,EAAE,UACG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,EAC5B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,EAC5B,KAAK;AAAA,EACd;AACJ;AAEO,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,WAAW,MAAc,UAA0B;AACxD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxC;AAEA,SAAS,YAAY,MAAc,UAA0B;AACzD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxC;AAEO,SAAS,QAAQ,GAAa,GAAkB;AACnD,sBAAoB,CAAC;AACrB,MAAI,CAAC,OAAO,UAAU,CAAC,GAAG;AACtB,UAAM,MAAM,6CAA6C,CAAC,EAAE;AAAA,EAChE;AAEA,MAAI,IAAI,EAAG,QAAO,KAAK,IAAI,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtE,MAAI,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAElD,MAAI,EAAE,KAAK,KAAK,IAAI,MAAM,GAAG;AACzB,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,IAAI,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,EAC9E,WAAW,EAAE,KAAK,GAAG;AACjB,WAAO,IAAI,MAAM,CAAC,IAAI,SAAS,WAAW,EAAE,IAAI,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,EAC9E,OAAO;AACH,WAAO,IAAI,MAAM;AAAA,MACb,IAAI,SAAS,GAAG,YAAY,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AAAA,IAC5E,CAAC;AAAA,EACL;AACJ;AAEO,SAAS,QAAQ,GAAU,GAAkB;AAChD,mBAAiB,CAAC;AAClB,SAAO,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC;AACvE;AAEO,SAAS,OAAO,GAAqB,GAAkB;AAC1D,6BAA2B,CAAC;AAC5B,SAAO,QAAQ,QAAQ,CAAC,GAAG,CAAC;AAChC;AAIO,SAAS,KAAK,GAAa,GAAoB;AAClD,MAAI,EAAE,MAAM,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC;AAClC,SAAO,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAC7C;AAEO,IAAM,OAAO,kBAAkB,IAAI;AACnC,IAAM,MAAM,mBAAmB,IAAI;AAI1C,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEA,SAAS,UAAU,GAAmB;AAClC,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5B;AAEO,SAAS,MAAM,GAAoB;AACtC,MAAI,EAAE,KAAK,EAAG,QAAO;AACrB,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AACjF;AAEO,SAAS,MAAM,GAAiB;AACnC,mBAAiB,CAAC;AAClB,SAAO,IAAI;AAAA,IACP,EAAE,UACG,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,SAAS,EAC7B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,EAC5B,KAAK;AAAA,EACd;AACJ;AAEO,IAAM,OAAO,kBAAkB,KAAK;AAIpC,SAAS,OAAO,GAAiB;AACpC,QAAM,IAAI,MAAM,CAAC;AACjB,SAAO,MAAM,KAAK,CAAC,EAAE,UAAU,OAAO,EAAE,SAAS,CAAC;AACtD;AAEO,IAAM,QAAQ,kBAAkB,MAAM;;;AC/L7C,IAAM,KAAK,KAAK;AAChB,IAAM,SAAS,KAAK,KAAK;AACzB,IAAM,MAAM,IAAI,KAAK;AACd,SAAS,UAAU,OAAuB;AAC7C,UAAS,QAAQ,MAAO,OAAO;AACnC;AAGO,SAAS,YAAY,GAAuB;AAC/C,QAAM,QAAQ,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE;AACtC,QAAM,QAAQ,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE;AAEvC,MAAI,QAAQ,OAAO;AACf,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,OAAO,KAAK,OAAO,KAAK;AACjC,WAAO,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACX;AAGO,SAAS,gBAAgB,GAAuB;AACnD,QAAM,QAAQ,KAAK,MAAM,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACtD,QAAM,QAAQ,KAAK,OAAO,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEvD,MAAI,QAAQ,OAAO;AACf,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,OAAO,KAAK,OAAO,KAAK;AACjC,WAAO,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACX;AAIA,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AAErB,QAAM,QAAQ,EAAE,KAAK,EAAE;AACvB,MAAI,SAAS,IAAI,KAAK,GAAI,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAEhE,QAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AAEpE,QAAM,OAAO,WAAW,IAAI,OAAO;AACnC,QAAM,QAAQ,WAAW,IAAI,QAAQ;AAErC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIzC,SAAS,QAAQ,GAAmB;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEA,SAAS,SAAS,GAAmB;AACjC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD;AAEO,SAAS,KAAK,GAAoB;AACrC,sBAAoB,CAAC;AAErB,QAAM,QAAQ,EAAE,KAAK,EAAE;AACvB,MAAI,SAAS,IAAI,KAAK,GAAI,QAAO,IAAI,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAEhE,QAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,IAAI,EAAE,CAAC;AAEjF,QAAM,OAAO,WAAW,IAAI,OAAO;AACnC,QAAM,QAAQ,WAAW,IAAI,QAAQ;AAErC,SAAO,IAAI,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,OAAO,iBAAiB,IAAI;AAClC,IAAM,MAAM,kBAAkB,IAAI;AAIlC,SAAS,KAAK,GAAiB;AAClC,SAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAChC;AAEO,IAAM,MAAM,kBAAkB,IAAI;","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 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":[]}
|