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 CHANGED
@@ -54,8 +54,9 @@ class TypeConvert {
54
54
  throw new Error(`Invalid state:[${value}]`);
55
55
  }
56
56
  static time(value) {
57
- if (typeof value === "object" && value instanceof Date) {
58
- return value;
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.1";
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
- [0, 0.8],
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
- return clip.map(([min, max], index) => clamp(parameters[index], min, max));
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 [...parameters];
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 [...parameters, 0, FSRS5_DEFAULT_DECAY];
582
+ return clipParameters(
583
+ Array.from(parameters),
584
+ numRelearningSteps,
585
+ enableShortTerm
586
+ ).concat([0, FSRS5_DEFAULT_DECAY]);
570
587
  case 17: {
571
- const w = [...parameters];
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 w = clipParameters(migrateParameters(props?.w), relearning_steps.length);
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: props?.enable_short_term ?? default_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 = clipParameters(
683
- migrateParameters(value),
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 = clipParameters(
1498
- migrateParameters(value),
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(