@rian8337/osu-base 2.0.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/dist/index.js +752 -32
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/typings/index.d.ts +288 -11
package/dist/index.js
CHANGED
|
@@ -253,6 +253,15 @@ class APIRequestBuilder {
|
|
|
253
253
|
*/
|
|
254
254
|
params = new Map();
|
|
255
255
|
fetchAttempts = 0;
|
|
256
|
+
/**
|
|
257
|
+
* Sets the API endpoint.
|
|
258
|
+
*
|
|
259
|
+
* @param endpoint The endpoint to set.
|
|
260
|
+
*/
|
|
261
|
+
setEndpoint(endpoint) {
|
|
262
|
+
this.endpoint = endpoint;
|
|
263
|
+
return this;
|
|
264
|
+
}
|
|
256
265
|
/**
|
|
257
266
|
* Sets if this builder includes the API key in the request URL.
|
|
258
267
|
*
|
|
@@ -344,12 +353,19 @@ class APIRequestBuilder {
|
|
|
344
353
|
*/
|
|
345
354
|
class DroidAPIRequestBuilder extends APIRequestBuilder {
|
|
346
355
|
host = "https://osudroid.moe/api/";
|
|
347
|
-
APIkey = process.env
|
|
348
|
-
.DROID_API_KEY;
|
|
356
|
+
APIkey = process.env.DROID_API_KEY;
|
|
349
357
|
APIkeyParam = `apiKey=${this.APIkey}&`;
|
|
350
358
|
setEndpoint(endpoint) {
|
|
351
|
-
|
|
352
|
-
|
|
359
|
+
// Compatibility with old API. Can be removed in v3.0.
|
|
360
|
+
switch (endpoint) {
|
|
361
|
+
case "banscore.php":
|
|
362
|
+
endpoint = "single_score_wipe.php";
|
|
363
|
+
break;
|
|
364
|
+
case "rename.php":
|
|
365
|
+
endpoint = "user_rename.php";
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
return super.setEndpoint(endpoint);
|
|
353
369
|
}
|
|
354
370
|
}
|
|
355
371
|
/**
|
|
@@ -357,13 +373,8 @@ class DroidAPIRequestBuilder extends APIRequestBuilder {
|
|
|
357
373
|
*/
|
|
358
374
|
class OsuAPIRequestBuilder extends APIRequestBuilder {
|
|
359
375
|
host = "https://osu.ppy.sh/api/";
|
|
360
|
-
APIkey = process.env
|
|
361
|
-
.OSU_API_KEY;
|
|
376
|
+
APIkey = process.env.OSU_API_KEY;
|
|
362
377
|
APIkeyParam = `k=${this.APIkey}&`;
|
|
363
|
-
setEndpoint(endpoint) {
|
|
364
|
-
this.endpoint = endpoint;
|
|
365
|
-
return this;
|
|
366
|
-
}
|
|
367
378
|
}
|
|
368
379
|
|
|
369
380
|
/**
|
|
@@ -1602,7 +1613,7 @@ class BeatmapHitObjects {
|
|
|
1602
1613
|
findInsertionIndex(startTime) {
|
|
1603
1614
|
for (let i = 0; i < this.objects.length; ++i) {
|
|
1604
1615
|
if (this.objects[i].startTime > startTime) {
|
|
1605
|
-
return i
|
|
1616
|
+
return i;
|
|
1606
1617
|
}
|
|
1607
1618
|
}
|
|
1608
1619
|
return this.objects.length;
|
|
@@ -2365,9 +2376,8 @@ class ModUtil {
|
|
|
2365
2376
|
/**
|
|
2366
2377
|
* Checks for mods that are incompatible with each other.
|
|
2367
2378
|
*
|
|
2368
|
-
* This will modify the original array.
|
|
2369
|
-
*
|
|
2370
2379
|
* @param mods The mods to check for.
|
|
2380
|
+
* @returns Mods that have been filtered.
|
|
2371
2381
|
*/
|
|
2372
2382
|
static checkIncompatibleMods(mods) {
|
|
2373
2383
|
for (const incompatibleMod of this.incompatibleMods) {
|
|
@@ -2380,6 +2390,7 @@ class ModUtil {
|
|
|
2380
2390
|
mods.push(fulfilledMods[0]);
|
|
2381
2391
|
}
|
|
2382
2392
|
}
|
|
2393
|
+
return mods;
|
|
2383
2394
|
}
|
|
2384
2395
|
/**
|
|
2385
2396
|
* Processes parsing options.
|
|
@@ -2393,7 +2404,7 @@ class ModUtil {
|
|
|
2393
2404
|
mods = this.checkDuplicateMods(mods);
|
|
2394
2405
|
}
|
|
2395
2406
|
if (options?.checkIncompatible !== false) {
|
|
2396
|
-
this.checkIncompatibleMods(mods);
|
|
2407
|
+
mods = this.checkIncompatibleMods(mods);
|
|
2397
2408
|
}
|
|
2398
2409
|
return mods;
|
|
2399
2410
|
}
|
|
@@ -2582,8 +2593,6 @@ class MapStats {
|
|
|
2582
2593
|
this.od = MapStats.modifyOD(this.od, this.speedMultiplier, statisticsMultiplier);
|
|
2583
2594
|
}
|
|
2584
2595
|
break;
|
|
2585
|
-
default:
|
|
2586
|
-
throw new TypeError("Mode not supported");
|
|
2587
2596
|
}
|
|
2588
2597
|
return this;
|
|
2589
2598
|
}
|
|
@@ -2777,9 +2786,7 @@ class PathApproximator {
|
|
|
2777
2786
|
for (let i = 0; i < controlPoints.length - 1; ++i) {
|
|
2778
2787
|
const v1 = i > 0 ? controlPoints[i - 1] : controlPoints[i];
|
|
2779
2788
|
const v2 = controlPoints[i];
|
|
2780
|
-
const v3 = i
|
|
2781
|
-
? controlPoints[i + 1]
|
|
2782
|
-
: v2.add(v2).subtract(v1);
|
|
2789
|
+
const v3 = controlPoints[i + 1];
|
|
2783
2790
|
const v4 = i < controlPoints.length - 2
|
|
2784
2791
|
? controlPoints[i + 2]
|
|
2785
2792
|
: v3.add(v3).subtract(v2);
|
|
@@ -2804,7 +2811,7 @@ class PathApproximator {
|
|
|
2804
2811
|
// If we have a degenerate triangle where a side-length is almost zero, then give up and fall
|
|
2805
2812
|
// back to a more numerically stable method.
|
|
2806
2813
|
if (Precision.almostEqualsNumber(0, (b.y - a.y) * (c.x - a.x) - (b.x - a.x) * (c.y - a.y))) {
|
|
2807
|
-
return
|
|
2814
|
+
return this.approximateBezier(controlPoints);
|
|
2808
2815
|
}
|
|
2809
2816
|
// See: https://en.wikipedia.org/wiki/Circumscribed_circle#Cartesian_coordinates_2
|
|
2810
2817
|
const d = 2 *
|
|
@@ -3042,17 +3049,11 @@ class SliderPath {
|
|
|
3042
3049
|
switch (this.pathType) {
|
|
3043
3050
|
case exports.PathType.Linear:
|
|
3044
3051
|
return PathApproximator.approximateLinear(subControlPoints);
|
|
3045
|
-
case exports.PathType.PerfectCurve:
|
|
3052
|
+
case exports.PathType.PerfectCurve:
|
|
3046
3053
|
if (subControlPoints.length !== 3) {
|
|
3047
3054
|
break;
|
|
3048
3055
|
}
|
|
3049
|
-
|
|
3050
|
-
// If for some reason a circular arc could not be fit to the 3 given points, fall back to a numerically stable bezier approximation.
|
|
3051
|
-
if (subPath.length === 0) {
|
|
3052
|
-
break;
|
|
3053
|
-
}
|
|
3054
|
-
return subPath;
|
|
3055
|
-
}
|
|
3056
|
+
return PathApproximator.approximateCircularArc(subControlPoints);
|
|
3056
3057
|
case exports.PathType.Catmull:
|
|
3057
3058
|
return PathApproximator.approximateCatmull(subControlPoints);
|
|
3058
3059
|
}
|
|
@@ -4035,6 +4036,8 @@ class BeatmapEventsDecoder extends SectionDecoder {
|
|
|
4035
4036
|
case "Break":
|
|
4036
4037
|
this.parseBreak(s);
|
|
4037
4038
|
break;
|
|
4039
|
+
default:
|
|
4040
|
+
this.storyboardLines.push(line);
|
|
4038
4041
|
}
|
|
4039
4042
|
}
|
|
4040
4043
|
parseBackground(s) {
|
|
@@ -4787,9 +4790,6 @@ class StoryboardSprite extends StoryboardElement {
|
|
|
4787
4790
|
earliestStartTime = Math.min(earliestStartTime, l.loopStartTime + loopEarliestDisplayTime);
|
|
4788
4791
|
}
|
|
4789
4792
|
}
|
|
4790
|
-
if (earliestStartTime !== Number.POSITIVE_INFINITY) {
|
|
4791
|
-
return earliestStartTime;
|
|
4792
|
-
}
|
|
4793
4793
|
return earliestStartTime !== Number.POSITIVE_INFINITY
|
|
4794
4794
|
? earliestStartTime
|
|
4795
4795
|
: Math.min(this.timelineGroup.startTime, ...this._loops.map((l) => l.startTime));
|
|
@@ -5220,7 +5220,7 @@ class Storyboard {
|
|
|
5220
5220
|
layer = new StoryboardLayer(type, --this.minimumLayerDepth);
|
|
5221
5221
|
this.layers[type] = layer;
|
|
5222
5222
|
}
|
|
5223
|
-
return layer;
|
|
5223
|
+
return layer ?? null;
|
|
5224
5224
|
}
|
|
5225
5225
|
}
|
|
5226
5226
|
|
|
@@ -6086,6 +6086,724 @@ exports.Easing = void 0;
|
|
|
6086
6086
|
Easing[Easing["outPow10"] = 35] = "outPow10";
|
|
6087
6087
|
})(exports.Easing || (exports.Easing = {}));
|
|
6088
6088
|
|
|
6089
|
+
/**
|
|
6090
|
+
* A single-variable polynomial with real-valued coefficients and non-negative exponents.
|
|
6091
|
+
*
|
|
6092
|
+
* This class shares the same implementation as {@link https://numerics.mathdotnet.com/ Math.NET Numerics}.
|
|
6093
|
+
*/
|
|
6094
|
+
class Polynomial {
|
|
6095
|
+
/**
|
|
6096
|
+
* Evaluates a polynomial at point z.
|
|
6097
|
+
*
|
|
6098
|
+
* Coefficients are ordered ascending by power with power k at index k.
|
|
6099
|
+
* For example, coefficients `[3, -1, 2]` represent `y = 2x^2 - x + 3`.
|
|
6100
|
+
*
|
|
6101
|
+
* @param z The location where to evaluate the polynomial at.
|
|
6102
|
+
* @param coefficients The coefficients of the polynomial, coefficient for power k at index k.
|
|
6103
|
+
* @returns The polynomial at z.
|
|
6104
|
+
*/
|
|
6105
|
+
static evaluate(z, coefficients) {
|
|
6106
|
+
// Zero polynomials need explicit handling, otherwise we
|
|
6107
|
+
// will attempt to peek coefficients at negative indices.
|
|
6108
|
+
if (coefficients.length === 0) {
|
|
6109
|
+
return 0;
|
|
6110
|
+
}
|
|
6111
|
+
let sum = coefficients.at(-1);
|
|
6112
|
+
for (let i = coefficients.length - 2; i >= 0; --i) {
|
|
6113
|
+
sum *= z;
|
|
6114
|
+
sum += coefficients[i];
|
|
6115
|
+
}
|
|
6116
|
+
return sum;
|
|
6117
|
+
}
|
|
6118
|
+
}
|
|
6119
|
+
|
|
6120
|
+
/**
|
|
6121
|
+
* A Math utility class containing all methods related to the error function.
|
|
6122
|
+
*
|
|
6123
|
+
* This class shares the same implementation as {@link https://numerics.mathdotnet.com/ Math.NET Numerics}.
|
|
6124
|
+
*/
|
|
6125
|
+
class ErrorFunction {
|
|
6126
|
+
//#region Coefficients for erfImp
|
|
6127
|
+
/**
|
|
6128
|
+
* Polynomial coefficients for a numerator of erfImp
|
|
6129
|
+
* calculation for erf(x) in the interval [1e-10, 0.5].
|
|
6130
|
+
*/
|
|
6131
|
+
static erfImpAn = [
|
|
6132
|
+
0.003379167095512574, -0.0007369565304816795, -0.37473233739291961,
|
|
6133
|
+
0.0817442448733587, -0.04210893199365486, 0.007016570951209576,
|
|
6134
|
+
-0.004950912559824351, 0.0008716465990379225,
|
|
6135
|
+
];
|
|
6136
|
+
/**
|
|
6137
|
+
* Polynomial coefficients for a denominator of erfImp
|
|
6138
|
+
* calculation for erf(x) in the interval [1e-10, 0.5].
|
|
6139
|
+
*/
|
|
6140
|
+
static erfImpAd = [
|
|
6141
|
+
1, -0.2180882180879246, 0.4125429727254421, -0.08418911478731068,
|
|
6142
|
+
0.0655338856400242, -0.01200196044549418, 0.00408165558926174,
|
|
6143
|
+
-0.0006159007215577697,
|
|
6144
|
+
];
|
|
6145
|
+
/**
|
|
6146
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6147
|
+
* calculationfor erfc(x) in the interval [0.5, 0.75].
|
|
6148
|
+
*/
|
|
6149
|
+
static erfImpBn = [
|
|
6150
|
+
-0.03617903907182625, 0.29225188344488268, 0.2814470417976045,
|
|
6151
|
+
0.12561020886276694, 0.02741350282689305, 0.002508396721680658,
|
|
6152
|
+
];
|
|
6153
|
+
/**
|
|
6154
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6155
|
+
* calculation for Erfc(x) in the interval [0.5, 0.75].
|
|
6156
|
+
*/
|
|
6157
|
+
static erfImpBd = [
|
|
6158
|
+
1, 1.8545005897903486, 1.43575803037831418, 0.58282765875303655,
|
|
6159
|
+
0.1248104769329497, 0.011372417654635328,
|
|
6160
|
+
];
|
|
6161
|
+
/**
|
|
6162
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6163
|
+
* calculation for erfc(x) in the interval [0.75, 1.25].
|
|
6164
|
+
*/
|
|
6165
|
+
static erfImpCn = [
|
|
6166
|
+
-0.03978768926111369, 0.15316521246787829, 0.19126029560093624,
|
|
6167
|
+
0.10276327061989304, 0.029637090615738836, 0.004609348678027549,
|
|
6168
|
+
0.0003076078203486802,
|
|
6169
|
+
];
|
|
6170
|
+
/**
|
|
6171
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6172
|
+
* calculation for erfc(x) in the interval [0.75, 1.25].
|
|
6173
|
+
*/
|
|
6174
|
+
static erfImpCd = [
|
|
6175
|
+
1, 1.955200729876277, 1.6476231719938486, 0.7682386070221263,
|
|
6176
|
+
0.20979318593650978, 0.03195693168999134, 0.0021336316089578537,
|
|
6177
|
+
];
|
|
6178
|
+
/**
|
|
6179
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6180
|
+
* calculation for erfc(x) in the interval [1.25, 2.25].
|
|
6181
|
+
*/
|
|
6182
|
+
static erfImpDn = [
|
|
6183
|
+
-0.030083856055794972, 0.05385788298444545, 0.07262115416519142,
|
|
6184
|
+
0.03676284698880493, 0.009646290155725275, 0.0013345348007529107,
|
|
6185
|
+
0.778087599782504e-4,
|
|
6186
|
+
];
|
|
6187
|
+
/**
|
|
6188
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6189
|
+
* calculation for erfc(x) in the interval [1.25, 2.25].
|
|
6190
|
+
*/
|
|
6191
|
+
static erfImpDd = [
|
|
6192
|
+
1, 1.7596709814716753, 1.3288357143796112, 0.5525285965087576,
|
|
6193
|
+
0.1337930569413329, 0.017950964517628076, 0.001047124400199374,
|
|
6194
|
+
-0.10664038182035734e-7,
|
|
6195
|
+
];
|
|
6196
|
+
/**
|
|
6197
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6198
|
+
* calculation for erfc(x) in the interval [2.25, 3.5].
|
|
6199
|
+
*/
|
|
6200
|
+
static erfImpEn = [
|
|
6201
|
+
-0.011790757013722784, 0.01426213209053881, 0.02022344359029608,
|
|
6202
|
+
0.00930668299990432, 0.0021335780242206599, 0.000250229873864601,
|
|
6203
|
+
0.1205349122195882e-4,
|
|
6204
|
+
];
|
|
6205
|
+
/**
|
|
6206
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6207
|
+
* calculation for erfc(x) in the interval [2.25, 3.5].
|
|
6208
|
+
*/
|
|
6209
|
+
static erfImpEd = [
|
|
6210
|
+
1, 1.5037622520362048, 0.9653977862044629, 0.3392652304767967,
|
|
6211
|
+
0.068974064954157, 0.0077106026249176831, 0.0003714211015310693,
|
|
6212
|
+
];
|
|
6213
|
+
/**
|
|
6214
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6215
|
+
* calculation for erfc(x) in the interval [3.5, 5.25].
|
|
6216
|
+
*/
|
|
6217
|
+
static erfImpFn = [
|
|
6218
|
+
-0.005469547955387293, 0.004041902787317071, 0.0054963369553161171,
|
|
6219
|
+
0.002126164726039454, 0.0003949840144950839, 0.36556547706444238e-4,
|
|
6220
|
+
0.13548589710993232e-5,
|
|
6221
|
+
];
|
|
6222
|
+
/**
|
|
6223
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6224
|
+
* calculation for erfc(x) in the interval [3.5, 5.25].
|
|
6225
|
+
*/
|
|
6226
|
+
static erfImpFd = [
|
|
6227
|
+
1, 1.210196977736308, 0.6209146682211439, 0.1730384306611428,
|
|
6228
|
+
0.0276550813773432, 0.002406259744243097, 0.8918118172513366e-4,
|
|
6229
|
+
-0.4655288362833827e-11,
|
|
6230
|
+
];
|
|
6231
|
+
/**
|
|
6232
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6233
|
+
* calculation for erfc(x) in the interval [5.25, 8].
|
|
6234
|
+
*/
|
|
6235
|
+
static erfImpGn = [
|
|
6236
|
+
-0.002707225359057783, 0.00131875634250294, 0.0011992593326100233,
|
|
6237
|
+
0.00027849619811344664, 0.2678229882183318e-4, 0.9230436723150282e-6,
|
|
6238
|
+
];
|
|
6239
|
+
/**
|
|
6240
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6241
|
+
* calculation for erfc(x) in the interval [5.25, 8].
|
|
6242
|
+
*/
|
|
6243
|
+
static erfImpGd = [
|
|
6244
|
+
1, 0.8146328085431416, 0.26890166585629954, 0.04498772161030411,
|
|
6245
|
+
0.003817596633202485, 0.0001315718978885969, 0.4048153596757641e-11,
|
|
6246
|
+
];
|
|
6247
|
+
/**
|
|
6248
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6249
|
+
* calculation for erfc(x) in the interval [8, 11.5].
|
|
6250
|
+
*/
|
|
6251
|
+
static erfImpHn = [
|
|
6252
|
+
-0.001099467206917422, 0.00040642544275042267, 0.0002744994894169007,
|
|
6253
|
+
0.4652937706466594e-4, 0.320955425395767463e-5, 0.778286018145021e-7,
|
|
6254
|
+
];
|
|
6255
|
+
/**
|
|
6256
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6257
|
+
* calculation for erfc(x) in the interval [8, 11.5].
|
|
6258
|
+
*/
|
|
6259
|
+
static erfImpHd = [
|
|
6260
|
+
1, 0.588173710611846, 0.13936333128940975, 0.016632934041708368,
|
|
6261
|
+
0.0010002392131023491, 0.2425483752158723e-4,
|
|
6262
|
+
];
|
|
6263
|
+
/**
|
|
6264
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6265
|
+
* calculation for erfc(x) in the interval [11.5, 17].
|
|
6266
|
+
*/
|
|
6267
|
+
static erfImpIn = [
|
|
6268
|
+
-0.0005690799360109496, 0.0001694985403737623, 0.5184723545811009e-4,
|
|
6269
|
+
0.38281931223192885e-5, 0.8249899312818944e-7,
|
|
6270
|
+
];
|
|
6271
|
+
/**
|
|
6272
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6273
|
+
* calculation for erfc(x) in the interval [11.5, 17].
|
|
6274
|
+
*/
|
|
6275
|
+
static erfImpId = [
|
|
6276
|
+
1, 0.3396372500511393, 0.04347264787031066, 0.002485493352246371,
|
|
6277
|
+
0.5356333053371529e-4, -0.11749094440545958e-12,
|
|
6278
|
+
];
|
|
6279
|
+
/**
|
|
6280
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6281
|
+
* calculation for erfc(x) in the interval [17, 24].
|
|
6282
|
+
*/
|
|
6283
|
+
static erfImpJn = [
|
|
6284
|
+
-0.000241313599483991337, 0.5742249752025015e-4, 0.11599896292738377e-4,
|
|
6285
|
+
0.581762134402594e-6, 0.8539715550856736e-8,
|
|
6286
|
+
];
|
|
6287
|
+
/**
|
|
6288
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6289
|
+
* calculation for erfc(x) in the interval [17, 24].
|
|
6290
|
+
*/
|
|
6291
|
+
static erfImpJd = [
|
|
6292
|
+
1, 0.23304413829968784, 0.02041869405464403, 0.0007971856475643983,
|
|
6293
|
+
0.11701928167017232e-4,
|
|
6294
|
+
];
|
|
6295
|
+
/**
|
|
6296
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6297
|
+
* calculation for erfc(x) in the interval [24, 38].
|
|
6298
|
+
*/
|
|
6299
|
+
static erfImpKn = [
|
|
6300
|
+
-0.00014667469927776036, 0.1626665521122805e-4, 0.26911624850916523e-5,
|
|
6301
|
+
0.979584479468092e-7, 0.10199464762572346e-8,
|
|
6302
|
+
];
|
|
6303
|
+
/**
|
|
6304
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6305
|
+
* calculation for erfc(x) in the interval [24, 38].
|
|
6306
|
+
*/
|
|
6307
|
+
static erfImpKd = [
|
|
6308
|
+
1, 0.16590781294484722, 0.010336171619150588, 0.0002865930263738684,
|
|
6309
|
+
0.29840157084090034e-5,
|
|
6310
|
+
];
|
|
6311
|
+
/**
|
|
6312
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6313
|
+
* calculation for erfc(x) in the interval [38, 60].
|
|
6314
|
+
*/
|
|
6315
|
+
static erfImpLn = [
|
|
6316
|
+
-0.5839057976297718e-4, 0.4125103251054962e-5, 0.43179092242025094e-6,
|
|
6317
|
+
0.9933651555900132e-8, 0.653480510020105e-10,
|
|
6318
|
+
];
|
|
6319
|
+
/**
|
|
6320
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6321
|
+
* calculation for erfc(x) in the interval [38, 60].
|
|
6322
|
+
*/
|
|
6323
|
+
static erfImpLd = [
|
|
6324
|
+
1, 0.1050770860720399, 0.004142784286754756, 0.726338754644524e-4,
|
|
6325
|
+
0.477818471047398785e-6,
|
|
6326
|
+
];
|
|
6327
|
+
/**
|
|
6328
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6329
|
+
* calculation for erfc(x) in the interval [60, 85].
|
|
6330
|
+
*/
|
|
6331
|
+
static erfImpMn = [
|
|
6332
|
+
-0.196457797609229579e-4, 0.1572438876668007e-5, 0.5439025111927009e-7,
|
|
6333
|
+
0.3174724923691177e-9,
|
|
6334
|
+
];
|
|
6335
|
+
/**
|
|
6336
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6337
|
+
* calculation for erfc(x) in the interval [60, 85].
|
|
6338
|
+
*/
|
|
6339
|
+
static erfImpMd = [
|
|
6340
|
+
1, 0.05280398924095763, 0.0009268760691517533, 0.5410117232266303e-5,
|
|
6341
|
+
0.5350938458036424e-15,
|
|
6342
|
+
];
|
|
6343
|
+
/**
|
|
6344
|
+
* Polynomial coefficients for a numerator in erfImp
|
|
6345
|
+
* calculation for erfc(x) in the interval [85, 110].
|
|
6346
|
+
*/
|
|
6347
|
+
static erfImpNn = [
|
|
6348
|
+
-0.789224703978723e-5, 0.622088451660987e-6, 0.1457284456768824e-7,
|
|
6349
|
+
0.603715505542715e-10,
|
|
6350
|
+
];
|
|
6351
|
+
/**
|
|
6352
|
+
* Polynomial coefficients for a denominator in erfImp
|
|
6353
|
+
* calculation for erfc(x) in the interval [85, 110].
|
|
6354
|
+
*/
|
|
6355
|
+
static erfImpNd = [
|
|
6356
|
+
1, 0.037532884635629371, 0.0004679195359746253, 0.19384703927584565e-5,
|
|
6357
|
+
];
|
|
6358
|
+
//#endregion
|
|
6359
|
+
//#region Coefficients for erfInvImp
|
|
6360
|
+
/**
|
|
6361
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6362
|
+
* calculation for erf^-1(z) in the interval [0, 0.5].
|
|
6363
|
+
*/
|
|
6364
|
+
static ervInvImpAn = [
|
|
6365
|
+
-0.0005087819496582806, -0.0083687481974173677, 0.033480662540974461,
|
|
6366
|
+
-0.012692614766297402, -0.03656379714117627, 0.02198786811111689,
|
|
6367
|
+
0.008226878746769157, -0.005387729650712429,
|
|
6368
|
+
];
|
|
6369
|
+
/**
|
|
6370
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6371
|
+
* calculation for erf^-1(z) in the interval [0, 0.5].
|
|
6372
|
+
*/
|
|
6373
|
+
static ervInvImpAd = [
|
|
6374
|
+
1, -0.9700050433032906, -1.565745582341758, 1.5622155839842302,
|
|
6375
|
+
0.662328840472003, -0.7122890234154285, -0.05273963823400997,
|
|
6376
|
+
0.079528368734157168, -0.0023339375937419, 0.0008862163904564247,
|
|
6377
|
+
];
|
|
6378
|
+
/**
|
|
6379
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6380
|
+
* calculation for erf^-1(z) in the interval [0.5, 0.75].
|
|
6381
|
+
*/
|
|
6382
|
+
static ervInvImpBn = [
|
|
6383
|
+
-0.2024335083559388, 0.10526468069939171, 8.3705032834312,
|
|
6384
|
+
17.6447298408374, -18.85106480587143, -44.6382324441787,
|
|
6385
|
+
17.445385985570866, 21.12946554483405, -3.671922547077293,
|
|
6386
|
+
];
|
|
6387
|
+
/**
|
|
6388
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6389
|
+
* calculation for erf^-1(z) in the interval [0.5, 0.75].
|
|
6390
|
+
*/
|
|
6391
|
+
static ervInvImpBd = [
|
|
6392
|
+
1, 6.24264124854247537, 3.9713437953343869, -28.66081804998,
|
|
6393
|
+
-20.14326346804852, 48.56092131087399, 10.82686673554602,
|
|
6394
|
+
-22.64369334131397, 1.7211476576120028,
|
|
6395
|
+
];
|
|
6396
|
+
/**
|
|
6397
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6398
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x less than 3.
|
|
6399
|
+
*/
|
|
6400
|
+
static ervInvImpCn = [
|
|
6401
|
+
-0.1311027816799519, -0.1637940471933171, 0.11703015634199525,
|
|
6402
|
+
0.387079738972604337, 0.3377855389120359, 0.1428695344081572,
|
|
6403
|
+
0.029015791000532906, 0.002145589953888053, -0.6794655751811264e-6,
|
|
6404
|
+
0.2852253317822171e-7, -0.681149956853777e-9,
|
|
6405
|
+
];
|
|
6406
|
+
/**
|
|
6407
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6408
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x less than 3.
|
|
6409
|
+
*/
|
|
6410
|
+
static ervInvImpCd = [
|
|
6411
|
+
1, 3.466254072425672, 5.381683457070069, 4.778465929458438,
|
|
6412
|
+
2.5930192162362027, 0.848854343457902, 0.1522643382953318,
|
|
6413
|
+
0.01105924229346489,
|
|
6414
|
+
];
|
|
6415
|
+
/**
|
|
6416
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6417
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 3 and 6.
|
|
6418
|
+
*/
|
|
6419
|
+
static ervInvImpDn = [
|
|
6420
|
+
-0.0350353787183178, -0.002224265292134479, 0.018557330651423107,
|
|
6421
|
+
0.009508047013259196, 0.001871234928195592, 0.00015754461742496055,
|
|
6422
|
+
0.460469890584318e-5, -0.2304047769118826e-9, 0.266339227425782e-11,
|
|
6423
|
+
];
|
|
6424
|
+
/**
|
|
6425
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6426
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 3 and 6.
|
|
6427
|
+
*/
|
|
6428
|
+
static ervInvImpDd = [
|
|
6429
|
+
1, 1.365334981755406, 0.7620591645536234, 0.22009110576413124,
|
|
6430
|
+
0.03415891436709477, 0.00263861676657016, 0.7646752923027944e-4,
|
|
6431
|
+
];
|
|
6432
|
+
/**
|
|
6433
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6434
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 6 and 18.
|
|
6435
|
+
*/
|
|
6436
|
+
static ervInvImpEn = [
|
|
6437
|
+
-0.016743100507663373, -0.001129514387455803, 0.001056288621524929,
|
|
6438
|
+
0.0002093863174875881, 0.14962478375834237e-4, 0.4496967899277065e-6,
|
|
6439
|
+
0.4625961635228786e-8, -0.281128735628831791e-13,
|
|
6440
|
+
0.9905570997331033e-16,
|
|
6441
|
+
];
|
|
6442
|
+
/**
|
|
6443
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6444
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 6 and 18.
|
|
6445
|
+
*/
|
|
6446
|
+
static ervInvImpEd = [
|
|
6447
|
+
1, 0.5914293448864175, 0.1381518657490833, 0.01607460870936765,
|
|
6448
|
+
0.0009640118070051655, 0.275335474764726e-4, 0.282243172016108e-6,
|
|
6449
|
+
];
|
|
6450
|
+
/**
|
|
6451
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6452
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 18 and 44.
|
|
6453
|
+
*/
|
|
6454
|
+
static ervInvImpFn = [
|
|
6455
|
+
-0.0024978212791898131, -0.779190719229054e-5, 0.2547230374130275e-4,
|
|
6456
|
+
0.1623977773425109e-5, 0.3963410113048011685e-7, 0.4116328311909442e-9,
|
|
6457
|
+
0.145596286718675e-11, -0.11676501239718427e-17,
|
|
6458
|
+
];
|
|
6459
|
+
/**
|
|
6460
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6461
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x between 18 and 44.
|
|
6462
|
+
*/
|
|
6463
|
+
static ervInvImpFd = [
|
|
6464
|
+
1, 0.20712311221442251, 0.01694108381209759, 0.0006905382656226846,
|
|
6465
|
+
0.14500735981823264e-4, 0.14443775662814415e-6, 0.5097612765997785e-9,
|
|
6466
|
+
];
|
|
6467
|
+
/**
|
|
6468
|
+
* Polynomial coefficients for a numerator of erfInvImp
|
|
6469
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x greater than 44.
|
|
6470
|
+
*/
|
|
6471
|
+
static ervInvImpGn = [
|
|
6472
|
+
-0.0005390429110190786, -0.2839875900472772e-6, 0.8994651148922914e-6,
|
|
6473
|
+
0.2293458592659209e-7, 0.2255614448635001e-9, 0.9478466275030226e-12,
|
|
6474
|
+
0.13588013010892486e-14, -0.3488903933999489e-21,
|
|
6475
|
+
];
|
|
6476
|
+
/**
|
|
6477
|
+
* Polynomial coefficients for a denominator of erfInvImp
|
|
6478
|
+
* calculation for erf^-1(z) in the interval [0.75, 1] with x greater than 44.
|
|
6479
|
+
*/
|
|
6480
|
+
static ervInvImpGd = [
|
|
6481
|
+
1, 0.08457462340018994, 0.002820929847262647, 0.4682929219408942e-4,
|
|
6482
|
+
0.3999688121938621e-6, 0.1618092908879045e-8, 0.2315586083102596e-11,
|
|
6483
|
+
];
|
|
6484
|
+
//#endregion
|
|
6485
|
+
//#region Evaluations
|
|
6486
|
+
/**
|
|
6487
|
+
* Calculates the error function.
|
|
6488
|
+
*
|
|
6489
|
+
* @param x The value to evaluate.
|
|
6490
|
+
* @returns The error function evaluated at x, or:
|
|
6491
|
+
* - 1 if `x == Number.POSITIVE_INFINITY`;
|
|
6492
|
+
* - -1 if `x == Number.NEGATIVE_INFINITY`.
|
|
6493
|
+
*/
|
|
6494
|
+
static erf(x) {
|
|
6495
|
+
if (x === 0) {
|
|
6496
|
+
return 0;
|
|
6497
|
+
}
|
|
6498
|
+
if (x === Number.POSITIVE_INFINITY) {
|
|
6499
|
+
return 1;
|
|
6500
|
+
}
|
|
6501
|
+
if (x === Number.NEGATIVE_INFINITY) {
|
|
6502
|
+
return -1;
|
|
6503
|
+
}
|
|
6504
|
+
if (Number.isNaN(x)) {
|
|
6505
|
+
return Number.NaN;
|
|
6506
|
+
}
|
|
6507
|
+
return this.erfImp(x, false);
|
|
6508
|
+
}
|
|
6509
|
+
/**
|
|
6510
|
+
* Calculates the inverse error function evaluated at z.
|
|
6511
|
+
*
|
|
6512
|
+
* @param z The value to evaluate.
|
|
6513
|
+
* @returns The inverse error function evaluated at z, or:
|
|
6514
|
+
* - `Number.POSITIVE_INFINITY` if `z >= 1`;
|
|
6515
|
+
* - `Number.NEGATIVE_INFINITY` if `z <= -1`.
|
|
6516
|
+
*/
|
|
6517
|
+
static erfInv(z) {
|
|
6518
|
+
if (z === 0) {
|
|
6519
|
+
return 0;
|
|
6520
|
+
}
|
|
6521
|
+
if (z >= 1) {
|
|
6522
|
+
return Number.POSITIVE_INFINITY;
|
|
6523
|
+
}
|
|
6524
|
+
if (z <= -1) {
|
|
6525
|
+
return Number.NEGATIVE_INFINITY;
|
|
6526
|
+
}
|
|
6527
|
+
if (Number.isNaN(z)) {
|
|
6528
|
+
return Number.NaN;
|
|
6529
|
+
}
|
|
6530
|
+
let p;
|
|
6531
|
+
let q;
|
|
6532
|
+
let s;
|
|
6533
|
+
if (z < 0) {
|
|
6534
|
+
p = -z;
|
|
6535
|
+
q = 1 - p;
|
|
6536
|
+
s = -1;
|
|
6537
|
+
}
|
|
6538
|
+
else {
|
|
6539
|
+
p = z;
|
|
6540
|
+
q = 1 - z;
|
|
6541
|
+
s = 1;
|
|
6542
|
+
}
|
|
6543
|
+
return this.erfInvImp(p, q, s);
|
|
6544
|
+
}
|
|
6545
|
+
/**
|
|
6546
|
+
* The implementation of the error function.
|
|
6547
|
+
*
|
|
6548
|
+
* @param z Where to evaluate the error function.
|
|
6549
|
+
* @param invert Whether to compute 1 - the error function.
|
|
6550
|
+
* @returns The error function.
|
|
6551
|
+
*/
|
|
6552
|
+
static erfImp(z, invert) {
|
|
6553
|
+
if (z < 0) {
|
|
6554
|
+
if (!invert) {
|
|
6555
|
+
return -this.erfImp(-z, false);
|
|
6556
|
+
}
|
|
6557
|
+
if (z < -0.5) {
|
|
6558
|
+
return 2 - this.erfImp(-z, true);
|
|
6559
|
+
}
|
|
6560
|
+
return 1 + this.erfImp(-z, false);
|
|
6561
|
+
}
|
|
6562
|
+
let result;
|
|
6563
|
+
// Big bunch of selection statements now to pick which
|
|
6564
|
+
// implementation to use, try to put most likely options
|
|
6565
|
+
// first:
|
|
6566
|
+
if (z < 0.5) {
|
|
6567
|
+
// We're going to calculate erf:
|
|
6568
|
+
if (z < 1e-10) {
|
|
6569
|
+
result = z * 1.125 + z * 0.003379167095512574;
|
|
6570
|
+
}
|
|
6571
|
+
else {
|
|
6572
|
+
// Worst case absolute error found: 6.688618532e-21
|
|
6573
|
+
result =
|
|
6574
|
+
z * 1.125 +
|
|
6575
|
+
(z * Polynomial.evaluate(z, this.erfImpAn)) /
|
|
6576
|
+
Polynomial.evaluate(z, this.erfImpAd);
|
|
6577
|
+
}
|
|
6578
|
+
}
|
|
6579
|
+
else if (z < 110) {
|
|
6580
|
+
// We'll be calculating erfc:
|
|
6581
|
+
invert = !invert;
|
|
6582
|
+
let r;
|
|
6583
|
+
let b;
|
|
6584
|
+
switch (true) {
|
|
6585
|
+
case z < 0.75:
|
|
6586
|
+
// Worst case absolute error found: 5.582813374e-21
|
|
6587
|
+
r =
|
|
6588
|
+
Polynomial.evaluate(z - 0.5, this.erfImpBn) /
|
|
6589
|
+
Polynomial.evaluate(z - 0.5, this.erfImpBd);
|
|
6590
|
+
b = 0.3440242112;
|
|
6591
|
+
break;
|
|
6592
|
+
case z < 1.25:
|
|
6593
|
+
// Worst case absolute error found: 4.01854729e-21
|
|
6594
|
+
r =
|
|
6595
|
+
Polynomial.evaluate(z - 1.25, this.erfImpDn) /
|
|
6596
|
+
Polynomial.evaluate(z - 1.25, this.erfImpDd);
|
|
6597
|
+
b = 0.4898625016;
|
|
6598
|
+
break;
|
|
6599
|
+
case z < 2.25:
|
|
6600
|
+
// Worst case absolute error found: 2.866005373e-21
|
|
6601
|
+
r =
|
|
6602
|
+
Polynomial.evaluate(z - 1.25, this.erfImpDn) /
|
|
6603
|
+
Polynomial.evaluate(z - 1.25, this.erfImpDd);
|
|
6604
|
+
b = 0.4898625016;
|
|
6605
|
+
break;
|
|
6606
|
+
case z < 3.5:
|
|
6607
|
+
// Worst case absolute error found: 1.045355789e-21
|
|
6608
|
+
r =
|
|
6609
|
+
Polynomial.evaluate(z - 2.25, this.erfImpEn) /
|
|
6610
|
+
Polynomial.evaluate(z - 2.25, this.erfImpEd);
|
|
6611
|
+
b = 0.5317370892;
|
|
6612
|
+
break;
|
|
6613
|
+
case z < 5.25:
|
|
6614
|
+
// Worst case absolute error found: 8.300028706e-22
|
|
6615
|
+
r =
|
|
6616
|
+
Polynomial.evaluate(z - 3.5, this.erfImpFn) /
|
|
6617
|
+
Polynomial.evaluate(z - 3.5, this.erfImpFd);
|
|
6618
|
+
b = 0.5489973426;
|
|
6619
|
+
break;
|
|
6620
|
+
case z < 8:
|
|
6621
|
+
// Worst case absolute error found: 1.700157534e-21
|
|
6622
|
+
r =
|
|
6623
|
+
Polynomial.evaluate(z - 5.25, this.erfImpGn) /
|
|
6624
|
+
Polynomial.evaluate(z - 5.25, this.erfImpGd);
|
|
6625
|
+
b = 0.5571740866;
|
|
6626
|
+
break;
|
|
6627
|
+
case z < 11.5:
|
|
6628
|
+
// Worst case absolute error found: 3.002278011e-22
|
|
6629
|
+
r =
|
|
6630
|
+
Polynomial.evaluate(z - 8, this.erfImpHn) /
|
|
6631
|
+
Polynomial.evaluate(z - 8, this.erfImpHd);
|
|
6632
|
+
b = 0.5609807968;
|
|
6633
|
+
break;
|
|
6634
|
+
case z < 17:
|
|
6635
|
+
// Worst case absolute error found: 6.741114695e-21
|
|
6636
|
+
r =
|
|
6637
|
+
Polynomial.evaluate(z - 11.5, this.erfImpIn) /
|
|
6638
|
+
Polynomial.evaluate(z - 11.5, this.erfImpId);
|
|
6639
|
+
b = 0.5626493692;
|
|
6640
|
+
break;
|
|
6641
|
+
case z < 24:
|
|
6642
|
+
// Worst case absolute error found: 7.802346984e-22
|
|
6643
|
+
r =
|
|
6644
|
+
Polynomial.evaluate(z - 17, this.erfImpJn) /
|
|
6645
|
+
Polynomial.evaluate(z - 17, this.erfImpJd);
|
|
6646
|
+
b = 0.5634598136;
|
|
6647
|
+
break;
|
|
6648
|
+
case z < 38:
|
|
6649
|
+
// Worst case absolute error found: 2.414228989e-22
|
|
6650
|
+
r =
|
|
6651
|
+
Polynomial.evaluate(z - 24, this.erfImpKn) /
|
|
6652
|
+
Polynomial.evaluate(z - 24, this.erfImpKd);
|
|
6653
|
+
b = 0.5638477802;
|
|
6654
|
+
break;
|
|
6655
|
+
case z < 60:
|
|
6656
|
+
// Worst case absolute error found: 5.896543869e-24
|
|
6657
|
+
r =
|
|
6658
|
+
Polynomial.evaluate(z - 38, this.erfImpLn) /
|
|
6659
|
+
Polynomial.evaluate(z - 38, this.erfImpLd);
|
|
6660
|
+
b = 0.5640528202;
|
|
6661
|
+
break;
|
|
6662
|
+
case z < 85:
|
|
6663
|
+
// Worst case absolute error found: 3.080612264e-21
|
|
6664
|
+
r =
|
|
6665
|
+
Polynomial.evaluate(z - 60, this.erfImpMn) /
|
|
6666
|
+
Polynomial.evaluate(z - 60, this.erfImpMd);
|
|
6667
|
+
b = 0.5641309023;
|
|
6668
|
+
break;
|
|
6669
|
+
default:
|
|
6670
|
+
// Worst case absolute error found: 8.094633491e-22
|
|
6671
|
+
r =
|
|
6672
|
+
Polynomial.evaluate(z - 85, this.erfImpNn) /
|
|
6673
|
+
Polynomial.evaluate(z - 85, this.erfImpNd);
|
|
6674
|
+
b = 0.5641584396;
|
|
6675
|
+
}
|
|
6676
|
+
const g = Math.exp(-z * z) / z;
|
|
6677
|
+
result = g * (b + r);
|
|
6678
|
+
}
|
|
6679
|
+
else {
|
|
6680
|
+
// Any value of z larger than 28 will underflow to zero:
|
|
6681
|
+
result = 0;
|
|
6682
|
+
invert = !invert;
|
|
6683
|
+
}
|
|
6684
|
+
if (invert) {
|
|
6685
|
+
result = 1 - result;
|
|
6686
|
+
}
|
|
6687
|
+
return result;
|
|
6688
|
+
}
|
|
6689
|
+
/**
|
|
6690
|
+
* The implementation of the inverse error function.
|
|
6691
|
+
*
|
|
6692
|
+
* @param p The first intermediate parameter.
|
|
6693
|
+
* @param q The second intermediate parameter.
|
|
6694
|
+
* @param s The third intermediate parameter.
|
|
6695
|
+
* @returns The inverse error function.
|
|
6696
|
+
*/
|
|
6697
|
+
static erfInvImp(p, q, s) {
|
|
6698
|
+
let result;
|
|
6699
|
+
if (p <= 0.5) {
|
|
6700
|
+
// Evaluate inverse erf using the rational approximation:
|
|
6701
|
+
//
|
|
6702
|
+
// x = p(p+10)(Y+R(p))
|
|
6703
|
+
//
|
|
6704
|
+
// Where Y is a constant, and R(p) is optimized for a low
|
|
6705
|
+
// absolute error compared to |Y|.
|
|
6706
|
+
//
|
|
6707
|
+
// double: Max error found: 2.001849e-18
|
|
6708
|
+
// long double: Max error found: 1.017064e-20
|
|
6709
|
+
// Maximum Deviation Found (actual error term at infinite precision) 8.030e-21
|
|
6710
|
+
const y = 0.0891314744949340820313;
|
|
6711
|
+
const g = p * (p + 10);
|
|
6712
|
+
const r = Polynomial.evaluate(p, this.ervInvImpAn) /
|
|
6713
|
+
Polynomial.evaluate(p, this.ervInvImpAd);
|
|
6714
|
+
result = g * (y + r);
|
|
6715
|
+
}
|
|
6716
|
+
else if (q >= 0.25) {
|
|
6717
|
+
// Rational approximation for 0.5 > q >= 0.25
|
|
6718
|
+
//
|
|
6719
|
+
// x = sqrt(-2*log(q)) / (Y + R(q))
|
|
6720
|
+
//
|
|
6721
|
+
// Where Y is a constant, and R(q) is optimized for a low
|
|
6722
|
+
// absolute error compared to Y.
|
|
6723
|
+
//
|
|
6724
|
+
// double : Max error found: 7.403372e-17
|
|
6725
|
+
// long double : Max error found: 6.084616e-20
|
|
6726
|
+
// Maximum Deviation Found (error term) 4.811e-20
|
|
6727
|
+
const y = 2.249481201171875;
|
|
6728
|
+
const g = Math.sqrt(-2 * Math.log(q));
|
|
6729
|
+
const xs = q - 0.25;
|
|
6730
|
+
const r = Polynomial.evaluate(xs, this.ervInvImpBn) /
|
|
6731
|
+
Polynomial.evaluate(xs, this.ervInvImpBd);
|
|
6732
|
+
result = g / (y + r);
|
|
6733
|
+
}
|
|
6734
|
+
else {
|
|
6735
|
+
// For q < 0.25 we have a series of rational approximations all
|
|
6736
|
+
// of the general form:
|
|
6737
|
+
//
|
|
6738
|
+
// let: x = sqrt(-log(q))
|
|
6739
|
+
//
|
|
6740
|
+
// Then the result is given by:
|
|
6741
|
+
//
|
|
6742
|
+
// x(Y+R(x-B))
|
|
6743
|
+
//
|
|
6744
|
+
// where Y is a constant, B is the lowest value of x for which
|
|
6745
|
+
// the approximation is valid, and R(x-B) is optimized for a low
|
|
6746
|
+
// absolute error compared to Y.
|
|
6747
|
+
//
|
|
6748
|
+
// Note that almost all code will really go through the first
|
|
6749
|
+
// or maybe second approximation. After than we're dealing with very
|
|
6750
|
+
// small input values indeed: 80 and 128 bit long double's go all the
|
|
6751
|
+
// way down to ~ 1e-5000 so the "tail" is rather long...
|
|
6752
|
+
const x = Math.sqrt(-Math.log(q));
|
|
6753
|
+
let y;
|
|
6754
|
+
let r;
|
|
6755
|
+
switch (true) {
|
|
6756
|
+
case x < 3: {
|
|
6757
|
+
// Max error found: 1.089051e-20
|
|
6758
|
+
y = 0.807220458984375;
|
|
6759
|
+
const xs = x - 1.125;
|
|
6760
|
+
r =
|
|
6761
|
+
Polynomial.evaluate(xs, this.ervInvImpCn) /
|
|
6762
|
+
Polynomial.evaluate(xs, this.ervInvImpCd);
|
|
6763
|
+
break;
|
|
6764
|
+
}
|
|
6765
|
+
case x < 6: {
|
|
6766
|
+
// Max error found: 8.389174e-21
|
|
6767
|
+
y = 0.93995571136474609375;
|
|
6768
|
+
const xs = x - 3;
|
|
6769
|
+
r =
|
|
6770
|
+
Polynomial.evaluate(xs, this.ervInvImpDn) /
|
|
6771
|
+
Polynomial.evaluate(xs, this.ervInvImpDd);
|
|
6772
|
+
break;
|
|
6773
|
+
}
|
|
6774
|
+
case x < 18: {
|
|
6775
|
+
// Max error found: 1.481312e-19
|
|
6776
|
+
y = 0.98362827301025390625;
|
|
6777
|
+
const xs = x - 6;
|
|
6778
|
+
r =
|
|
6779
|
+
Polynomial.evaluate(xs, this.ervInvImpEn) /
|
|
6780
|
+
Polynomial.evaluate(xs, this.ervInvImpEd);
|
|
6781
|
+
break;
|
|
6782
|
+
}
|
|
6783
|
+
case x < 44: {
|
|
6784
|
+
// Max error found: 5.697761e-20
|
|
6785
|
+
y = 0.99714565277099609375;
|
|
6786
|
+
const xs = x - 18;
|
|
6787
|
+
r =
|
|
6788
|
+
Polynomial.evaluate(xs, this.ervInvImpFn) /
|
|
6789
|
+
Polynomial.evaluate(xs, this.ervInvImpFd);
|
|
6790
|
+
break;
|
|
6791
|
+
}
|
|
6792
|
+
default: {
|
|
6793
|
+
// Max error found: 1.279746e-20
|
|
6794
|
+
y = 0.99941349029541015625;
|
|
6795
|
+
const xs = x - 44;
|
|
6796
|
+
r =
|
|
6797
|
+
Polynomial.evaluate(xs, this.ervInvImpGn) /
|
|
6798
|
+
Polynomial.evaluate(xs, this.ervInvImpGd);
|
|
6799
|
+
}
|
|
6800
|
+
}
|
|
6801
|
+
result = x * (y + r);
|
|
6802
|
+
}
|
|
6803
|
+
return s * result;
|
|
6804
|
+
}
|
|
6805
|
+
}
|
|
6806
|
+
|
|
6089
6807
|
class Interpolation {
|
|
6090
6808
|
static lerp(start, final, amount) {
|
|
6091
6809
|
return start + (final - start) * amount;
|
|
@@ -6662,6 +7380,7 @@ exports.DroidAPIRequestBuilder = DroidAPIRequestBuilder;
|
|
|
6662
7380
|
exports.DroidHitWindow = DroidHitWindow;
|
|
6663
7381
|
exports.EffectControlPoint = EffectControlPoint;
|
|
6664
7382
|
exports.EffectControlPointManager = EffectControlPointManager;
|
|
7383
|
+
exports.ErrorFunction = ErrorFunction;
|
|
6665
7384
|
exports.HitObject = HitObject;
|
|
6666
7385
|
exports.HitSampleInfo = HitSampleInfo;
|
|
6667
7386
|
exports.Interpolation = Interpolation;
|
|
@@ -6692,6 +7411,7 @@ exports.ModUtil = ModUtil;
|
|
|
6692
7411
|
exports.OsuAPIRequestBuilder = OsuAPIRequestBuilder;
|
|
6693
7412
|
exports.OsuHitWindow = OsuHitWindow;
|
|
6694
7413
|
exports.PathApproximator = PathApproximator;
|
|
7414
|
+
exports.Polynomial = Polynomial;
|
|
6695
7415
|
exports.Precision = Precision;
|
|
6696
7416
|
exports.RGBColor = RGBColor;
|
|
6697
7417
|
exports.SampleBankInfo = SampleBankInfo;
|