ts-fsrs 5.2.1 → 5.2.3
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.cjs +48 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +48 -20
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +49 -21
- package/dist/index.umd.js.map +1 -1
- package/package.json +10 -9
package/dist/index.cjs
CHANGED
|
@@ -54,8 +54,9 @@ class TypeConvert {
|
|
|
54
54
|
throw new Error(`Invalid state:[${value}]`);
|
|
55
55
|
}
|
|
56
56
|
static time(value) {
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
const date = new Date(value);
|
|
58
|
+
if (typeof value === "object" && value !== null && !Number.isNaN(Date.parse(value) || +date)) {
|
|
59
|
+
return date;
|
|
59
60
|
} else if (typeof value === "string") {
|
|
60
61
|
const timestamp = Date.parse(value);
|
|
61
62
|
if (!Number.isNaN(timestamp)) {
|
|
@@ -468,7 +469,7 @@ function alea(seed) {
|
|
|
468
469
|
return prng;
|
|
469
470
|
}
|
|
470
471
|
|
|
471
|
-
const version="5.2.
|
|
472
|
+
const version="5.2.3";
|
|
472
473
|
|
|
473
474
|
const default_request_retention = 0.9;
|
|
474
475
|
const default_maximum_interval = 36500;
|
|
@@ -511,7 +512,7 @@ const default_w = Object.freeze([
|
|
|
511
512
|
FSRS6_DEFAULT_DECAY
|
|
512
513
|
]);
|
|
513
514
|
const W17_W18_Ceiling = 2;
|
|
514
|
-
const CLAMP_PARAMETERS = (w17_w18_ceiling) => [
|
|
515
|
+
const CLAMP_PARAMETERS = (w17_w18_ceiling, enable_short_term = default_enable_short_term) => [
|
|
515
516
|
[S_MIN, INIT_S_MAX],
|
|
516
517
|
[S_MIN, INIT_S_MAX],
|
|
517
518
|
[S_MIN, INIT_S_MAX],
|
|
@@ -531,18 +532,26 @@ const CLAMP_PARAMETERS = (w17_w18_ceiling) => [
|
|
|
531
532
|
[1, 6],
|
|
532
533
|
[0, w17_w18_ceiling],
|
|
533
534
|
[0, w17_w18_ceiling],
|
|
534
|
-
[
|
|
535
|
+
[
|
|
536
|
+
enable_short_term ? 0.01 : 0,
|
|
537
|
+
0.8
|
|
538
|
+
],
|
|
535
539
|
[0.1, 0.8]
|
|
536
540
|
];
|
|
537
541
|
|
|
538
|
-
const clipParameters = (parameters, numRelearningSteps) => {
|
|
542
|
+
const clipParameters = (parameters, numRelearningSteps, enableShortTerm = default_enable_short_term) => {
|
|
539
543
|
let w17_w18_ceiling = W17_W18_Ceiling;
|
|
540
544
|
if (Math.max(0, numRelearningSteps) > 1) {
|
|
541
545
|
const value = -(Math.log(parameters[11]) + Math.log(Math.pow(2, parameters[13]) - 1) + parameters[14] * 0.3) / numRelearningSteps;
|
|
542
546
|
w17_w18_ceiling = clamp(+value.toFixed(8), 0.01, 2);
|
|
543
547
|
}
|
|
544
|
-
const clip = CLAMP_PARAMETERS(w17_w18_ceiling)
|
|
545
|
-
|
|
548
|
+
const clip = CLAMP_PARAMETERS(w17_w18_ceiling, enableShortTerm).slice(
|
|
549
|
+
0,
|
|
550
|
+
parameters.length
|
|
551
|
+
);
|
|
552
|
+
return clip.map(
|
|
553
|
+
([min, max], index) => clamp(parameters[index] || 0, min, max)
|
|
554
|
+
);
|
|
546
555
|
};
|
|
547
556
|
const checkParameters = (parameters) => {
|
|
548
557
|
const invalid = parameters.find(
|
|
@@ -557,18 +566,30 @@ const checkParameters = (parameters) => {
|
|
|
557
566
|
}
|
|
558
567
|
return parameters;
|
|
559
568
|
};
|
|
560
|
-
const migrateParameters = (parameters) => {
|
|
569
|
+
const migrateParameters = (parameters, numRelearningSteps = 0, enableShortTerm = default_enable_short_term) => {
|
|
561
570
|
if (parameters === void 0) {
|
|
562
571
|
return [...default_w];
|
|
563
572
|
}
|
|
564
573
|
switch (parameters.length) {
|
|
565
574
|
case 21:
|
|
566
|
-
return
|
|
575
|
+
return clipParameters(
|
|
576
|
+
Array.from(parameters),
|
|
577
|
+
numRelearningSteps,
|
|
578
|
+
enableShortTerm
|
|
579
|
+
);
|
|
567
580
|
case 19:
|
|
568
581
|
console.debug("[FSRS-6]auto fill w from 19 to 21 length");
|
|
569
|
-
return
|
|
582
|
+
return clipParameters(
|
|
583
|
+
Array.from(parameters),
|
|
584
|
+
numRelearningSteps,
|
|
585
|
+
enableShortTerm
|
|
586
|
+
).concat([0, FSRS5_DEFAULT_DECAY]);
|
|
570
587
|
case 17: {
|
|
571
|
-
const w =
|
|
588
|
+
const w = clipParameters(
|
|
589
|
+
Array.from(parameters),
|
|
590
|
+
numRelearningSteps,
|
|
591
|
+
enableShortTerm
|
|
592
|
+
);
|
|
572
593
|
w[4] = +(w[5] * 2 + w[4]).toFixed(8);
|
|
573
594
|
w[5] = +(Math.log(w[5] * 3 + 1) / 3).toFixed(8);
|
|
574
595
|
w[6] = +(w[6] + 0.5).toFixed(8);
|
|
@@ -583,13 +604,18 @@ const migrateParameters = (parameters) => {
|
|
|
583
604
|
const generatorParameters = (props) => {
|
|
584
605
|
const learning_steps = Array.isArray(props?.learning_steps) ? props.learning_steps : default_learning_steps;
|
|
585
606
|
const relearning_steps = Array.isArray(props?.relearning_steps) ? props.relearning_steps : default_relearning_steps;
|
|
586
|
-
const
|
|
607
|
+
const enable_short_term = props?.enable_short_term ?? default_enable_short_term;
|
|
608
|
+
const w = migrateParameters(
|
|
609
|
+
props?.w,
|
|
610
|
+
relearning_steps.length,
|
|
611
|
+
enable_short_term
|
|
612
|
+
);
|
|
587
613
|
return {
|
|
588
614
|
request_retention: props?.request_retention || default_request_retention,
|
|
589
615
|
maximum_interval: props?.maximum_interval || default_maximum_interval,
|
|
590
616
|
w,
|
|
591
617
|
enable_fuzz: props?.enable_fuzz ?? default_enable_fuzz,
|
|
592
|
-
enable_short_term
|
|
618
|
+
enable_short_term,
|
|
593
619
|
learning_steps,
|
|
594
620
|
relearning_steps
|
|
595
621
|
};
|
|
@@ -679,9 +705,10 @@ class FSRSAlgorithm {
|
|
|
679
705
|
Number(value)
|
|
680
706
|
);
|
|
681
707
|
} else if (prop === "w") {
|
|
682
|
-
value =
|
|
683
|
-
|
|
684
|
-
target.relearning_steps.length
|
|
708
|
+
value = migrateParameters(
|
|
709
|
+
value,
|
|
710
|
+
target.relearning_steps.length,
|
|
711
|
+
target.enable_short_term
|
|
685
712
|
);
|
|
686
713
|
_this.forgetting_curve = forgetting_curve.bind(this, value);
|
|
687
714
|
_this.intervalModifier = _this.calculate_interval_modifier(
|
|
@@ -1494,9 +1521,10 @@ class FSRS extends FSRSAlgorithm {
|
|
|
1494
1521
|
} else if (prop === "enable_short_term") {
|
|
1495
1522
|
_this.Scheduler = value === true ? BasicScheduler : LongTermScheduler;
|
|
1496
1523
|
} else if (prop === "w") {
|
|
1497
|
-
value =
|
|
1498
|
-
|
|
1499
|
-
target.relearning_steps.length
|
|
1524
|
+
value = migrateParameters(
|
|
1525
|
+
value,
|
|
1526
|
+
target.relearning_steps.length,
|
|
1527
|
+
target.enable_short_term
|
|
1500
1528
|
);
|
|
1501
1529
|
_this.forgetting_curve = forgetting_curve.bind(this, value);
|
|
1502
1530
|
_this.intervalModifier = _this.calculate_interval_modifier(
|