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.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[] | readonly 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.1";
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
- [0, 0.8],
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
- return clip.map(([min, max], index) => clamp(parameters[index], min, max));
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 [...parameters];
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 [...parameters, 0, FSRS5_DEFAULT_DECAY];
579
+ return clipParameters(
580
+ Array.from(parameters),
581
+ numRelearningSteps,
582
+ enableShortTerm
583
+ ).concat([0, FSRS5_DEFAULT_DECAY]);
568
584
  case 17: {
569
- const w = [...parameters];
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 w = clipParameters(migrateParameters(props?.w), relearning_steps.length);
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: props?.enable_short_term ?? default_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 = clipParameters(
681
- migrateParameters(value),
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 = clipParameters(
1496
- migrateParameters(value),
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(