ts-fsrs 5.2.1 → 5.2.2
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 +45 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.mjs +45 -18
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +46 -19
- package/dist/index.umd.js.map +1 -1
- package/package.json +5 -4
package/dist/index.d.ts
CHANGED
|
@@ -387,7 +387,7 @@ declare const FSRS5_DEFAULT_DECAY = 0.5;
|
|
|
387
387
|
declare const FSRS6_DEFAULT_DECAY = 0.1542;
|
|
388
388
|
declare const default_w: readonly number[];
|
|
389
389
|
declare const W17_W18_Ceiling = 2;
|
|
390
|
-
declare const CLAMP_PARAMETERS: (w17_w18_ceiling: number) => number[][];
|
|
390
|
+
declare const CLAMP_PARAMETERS: (w17_w18_ceiling: number, enable_short_term?: boolean) => number[][];
|
|
391
391
|
|
|
392
392
|
declare class TypeConvert {
|
|
393
393
|
static card<T extends Card | CardInput>(card: T): Card;
|
|
@@ -397,7 +397,7 @@ declare class TypeConvert {
|
|
|
397
397
|
static review_log(log: ReviewLogInput | ReviewLog): ReviewLog;
|
|
398
398
|
}
|
|
399
399
|
|
|
400
|
-
declare const clipParameters: (parameters: number[], numRelearningSteps: number) => number[];
|
|
400
|
+
declare const clipParameters: (parameters: number[], numRelearningSteps: number, enableShortTerm?: boolean) => number[];
|
|
401
401
|
/**
|
|
402
402
|
* @returns The input if the parameters are valid, throws if they are invalid
|
|
403
403
|
* @example
|
|
@@ -409,8 +409,8 @@ declare const clipParameters: (parameters: number[], numRelearningSteps: number)
|
|
|
409
409
|
* alert(e);
|
|
410
410
|
* }
|
|
411
411
|
*/
|
|
412
|
-
declare const checkParameters: (parameters: number[] | readonly number[]) => number[] |
|
|
413
|
-
declare const migrateParameters: (parameters?: number[] | readonly number[]) => number[];
|
|
412
|
+
declare const checkParameters: (parameters: number[] | readonly number[]) => readonly number[] | number[];
|
|
413
|
+
declare const migrateParameters: (parameters?: number[] | readonly number[], numRelearningSteps?: number, enableShortTerm?: boolean) => number[];
|
|
414
414
|
declare const generatorParameters: (props?: Partial<FSRSParameters>) => FSRSParameters;
|
|
415
415
|
/**
|
|
416
416
|
* Create an empty card
|
package/dist/index.mjs
CHANGED
|
@@ -466,7 +466,7 @@ function alea(seed) {
|
|
|
466
466
|
return prng;
|
|
467
467
|
}
|
|
468
468
|
|
|
469
|
-
const version="5.2.
|
|
469
|
+
const version="5.2.2";
|
|
470
470
|
|
|
471
471
|
const default_request_retention = 0.9;
|
|
472
472
|
const default_maximum_interval = 36500;
|
|
@@ -509,7 +509,7 @@ const default_w = Object.freeze([
|
|
|
509
509
|
FSRS6_DEFAULT_DECAY
|
|
510
510
|
]);
|
|
511
511
|
const W17_W18_Ceiling = 2;
|
|
512
|
-
const CLAMP_PARAMETERS = (w17_w18_ceiling) => [
|
|
512
|
+
const CLAMP_PARAMETERS = (w17_w18_ceiling, enable_short_term = default_enable_short_term) => [
|
|
513
513
|
[S_MIN, INIT_S_MAX],
|
|
514
514
|
[S_MIN, INIT_S_MAX],
|
|
515
515
|
[S_MIN, INIT_S_MAX],
|
|
@@ -529,18 +529,26 @@ const CLAMP_PARAMETERS = (w17_w18_ceiling) => [
|
|
|
529
529
|
[1, 6],
|
|
530
530
|
[0, w17_w18_ceiling],
|
|
531
531
|
[0, w17_w18_ceiling],
|
|
532
|
-
[
|
|
532
|
+
[
|
|
533
|
+
enable_short_term ? 0.01 : 0,
|
|
534
|
+
0.8
|
|
535
|
+
],
|
|
533
536
|
[0.1, 0.8]
|
|
534
537
|
];
|
|
535
538
|
|
|
536
|
-
const clipParameters = (parameters, numRelearningSteps) => {
|
|
539
|
+
const clipParameters = (parameters, numRelearningSteps, enableShortTerm = default_enable_short_term) => {
|
|
537
540
|
let w17_w18_ceiling = W17_W18_Ceiling;
|
|
538
541
|
if (Math.max(0, numRelearningSteps) > 1) {
|
|
539
542
|
const value = -(Math.log(parameters[11]) + Math.log(Math.pow(2, parameters[13]) - 1) + parameters[14] * 0.3) / numRelearningSteps;
|
|
540
543
|
w17_w18_ceiling = clamp(+value.toFixed(8), 0.01, 2);
|
|
541
544
|
}
|
|
542
|
-
const clip = CLAMP_PARAMETERS(w17_w18_ceiling)
|
|
543
|
-
|
|
545
|
+
const clip = CLAMP_PARAMETERS(w17_w18_ceiling, enableShortTerm).slice(
|
|
546
|
+
0,
|
|
547
|
+
parameters.length
|
|
548
|
+
);
|
|
549
|
+
return clip.map(
|
|
550
|
+
([min, max], index) => clamp(parameters[index] || 0, min, max)
|
|
551
|
+
);
|
|
544
552
|
};
|
|
545
553
|
const checkParameters = (parameters) => {
|
|
546
554
|
const invalid = parameters.find(
|
|
@@ -555,18 +563,30 @@ const checkParameters = (parameters) => {
|
|
|
555
563
|
}
|
|
556
564
|
return parameters;
|
|
557
565
|
};
|
|
558
|
-
const migrateParameters = (parameters) => {
|
|
566
|
+
const migrateParameters = (parameters, numRelearningSteps = 0, enableShortTerm = default_enable_short_term) => {
|
|
559
567
|
if (parameters === void 0) {
|
|
560
568
|
return [...default_w];
|
|
561
569
|
}
|
|
562
570
|
switch (parameters.length) {
|
|
563
571
|
case 21:
|
|
564
|
-
return
|
|
572
|
+
return clipParameters(
|
|
573
|
+
Array.from(parameters),
|
|
574
|
+
numRelearningSteps,
|
|
575
|
+
enableShortTerm
|
|
576
|
+
);
|
|
565
577
|
case 19:
|
|
566
578
|
console.debug("[FSRS-6]auto fill w from 19 to 21 length");
|
|
567
|
-
return
|
|
579
|
+
return clipParameters(
|
|
580
|
+
Array.from(parameters),
|
|
581
|
+
numRelearningSteps,
|
|
582
|
+
enableShortTerm
|
|
583
|
+
).concat([0, FSRS5_DEFAULT_DECAY]);
|
|
568
584
|
case 17: {
|
|
569
|
-
const w =
|
|
585
|
+
const w = clipParameters(
|
|
586
|
+
Array.from(parameters),
|
|
587
|
+
numRelearningSteps,
|
|
588
|
+
enableShortTerm
|
|
589
|
+
);
|
|
570
590
|
w[4] = +(w[5] * 2 + w[4]).toFixed(8);
|
|
571
591
|
w[5] = +(Math.log(w[5] * 3 + 1) / 3).toFixed(8);
|
|
572
592
|
w[6] = +(w[6] + 0.5).toFixed(8);
|
|
@@ -581,13 +601,18 @@ const migrateParameters = (parameters) => {
|
|
|
581
601
|
const generatorParameters = (props) => {
|
|
582
602
|
const learning_steps = Array.isArray(props?.learning_steps) ? props.learning_steps : default_learning_steps;
|
|
583
603
|
const relearning_steps = Array.isArray(props?.relearning_steps) ? props.relearning_steps : default_relearning_steps;
|
|
584
|
-
const
|
|
604
|
+
const enable_short_term = props?.enable_short_term ?? default_enable_short_term;
|
|
605
|
+
const w = migrateParameters(
|
|
606
|
+
props?.w,
|
|
607
|
+
relearning_steps.length,
|
|
608
|
+
enable_short_term
|
|
609
|
+
);
|
|
585
610
|
return {
|
|
586
611
|
request_retention: props?.request_retention || default_request_retention,
|
|
587
612
|
maximum_interval: props?.maximum_interval || default_maximum_interval,
|
|
588
613
|
w,
|
|
589
614
|
enable_fuzz: props?.enable_fuzz ?? default_enable_fuzz,
|
|
590
|
-
enable_short_term
|
|
615
|
+
enable_short_term,
|
|
591
616
|
learning_steps,
|
|
592
617
|
relearning_steps
|
|
593
618
|
};
|
|
@@ -677,9 +702,10 @@ class FSRSAlgorithm {
|
|
|
677
702
|
Number(value)
|
|
678
703
|
);
|
|
679
704
|
} else if (prop === "w") {
|
|
680
|
-
value =
|
|
681
|
-
|
|
682
|
-
target.relearning_steps.length
|
|
705
|
+
value = migrateParameters(
|
|
706
|
+
value,
|
|
707
|
+
target.relearning_steps.length,
|
|
708
|
+
target.enable_short_term
|
|
683
709
|
);
|
|
684
710
|
_this.forgetting_curve = forgetting_curve.bind(this, value);
|
|
685
711
|
_this.intervalModifier = _this.calculate_interval_modifier(
|
|
@@ -1492,9 +1518,10 @@ class FSRS extends FSRSAlgorithm {
|
|
|
1492
1518
|
} else if (prop === "enable_short_term") {
|
|
1493
1519
|
_this.Scheduler = value === true ? BasicScheduler : LongTermScheduler;
|
|
1494
1520
|
} else if (prop === "w") {
|
|
1495
|
-
value =
|
|
1496
|
-
|
|
1497
|
-
target.relearning_steps.length
|
|
1521
|
+
value = migrateParameters(
|
|
1522
|
+
value,
|
|
1523
|
+
target.relearning_steps.length,
|
|
1524
|
+
target.enable_short_term
|
|
1498
1525
|
);
|
|
1499
1526
|
_this.forgetting_curve = forgetting_curve.bind(this, value);
|
|
1500
1527
|
_this.intervalModifier = _this.calculate_interval_modifier(
|