TS-FSRS
    Preparing search index...

    Class FSRS

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    _seed?: string
    forgetting_curve: (elapsed_days: number, stability: number) => number

    The formula used is : $$R(t,S) = (1 + \text{FACTOR} \times \frac{t}{9 \cdot S})^{\text{DECAY}}$$

    Type declaration

      • (elapsed_days: number, stability: number): number
      • Parameters

        • elapsed_days: number

          t days since the last review

        • stability: number

          Stability (interval when R=90%)

        Returns number

        r Retrievability (probability of recall)

    intervalModifier: number

    Accessors

    • get interval_modifier(): number

      Returns number

    • set seed(seed: string): void

      Parameters

      • seed: string

      Returns void

    Methods

    • If fuzzing is disabled or ivl is less than 2.5, it returns the original interval.

      Parameters

      • ivl: number

        The interval to be fuzzed.

      • elapsed_days: number

        t days since the last review

      Returns int

      • The fuzzed interval.
    • Type Parameters

      Parameters

      • card: Card | CardInput

        Card to be processed

      • now: DateInput

        Current time or scheduled time

      • reset_count: boolean = false

        Should the review count information(reps,lapses) be reset. (Optional)

      • OptionalafterHandler: (recordLogItem: RecordLogItem) => R

        Convert the result to another type. (Optional)

      Returns R

      const now = new Date();
      const f = fsrs();
      const emptyCard = createEmptyCard(now);
      const scheduling_cards = f.repeat(emptyCard, now);
      const { card, log } = scheduling_cards[Rating.Hard];
      const forgetCard = f.forget(card, new Date(), true);
      interface RepeatRecordLog {
      card: CardUnChecked; //see method: createEmptyCard
      log: RevLogUnchecked; //see method: fsrs.repeat()
      }

      function forgetAfterHandler(recordLogItem: RecordLogItem): RepeatRecordLog {
      return {
      card: {
      ...(recordLogItem.card as Card & { cid: string }),
      due: recordLogItem.card.due.getTime(),
      state: State[recordLogItem.card.state] as StateType,
      last_review: recordLogItem.card.last_review
      ? recordLogItem.card.last_review!.getTime()
      : null,
      },
      log: {
      ...recordLogItem.log,
      cid: (recordLogItem.card as Card & { cid: string }).cid,
      due: recordLogItem.log.due.getTime(),
      review: recordLogItem.log.review.getTime(),
      state: State[recordLogItem.log.state] as StateType,
      rating: Rating[recordLogItem.log.rating] as RatingType,
      },
      };
      }
      const now = new Date();
      const f = fsrs();
      const emptyCardFormAfterHandler = createEmptyCard(now, cardAfterHandler); //see method: createEmptyCard
      const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now, repeatAfterHandler); //see method: fsrs.repeat()
      const { card } = repeatFormAfterHandler[Rating.Hard];
      const forgetFromAfterHandler = f.forget(card, date_scheduler(now, 1, true), false, forgetAfterHandler);
    • Get the retrievability of the card

      Type Parameters

      • T extends boolean

      Parameters

      • card: Card | CardInput

        Card to be processed

      • Optionalnow: DateInput

        Current time or scheduled time

      • format: T = ...

        default:true , Convert the result to another type. (Optional)

      Returns T extends true ? string : number

      The retrievability of the card,if format is true, the result is a string, otherwise it is a number

    • The formula used is : $$D_0(G) = w_4 - e^{(G-1) \cdot w_5} + 1 $$ $$D_0 = \min \lbrace \max \lbrace D_0(G),1 \rbrace,10 \rbrace$$ where the $$D_0(1)=w_4$$ when the first rating is good.

      Parameters

      • g: Grade

        Grade (rating at Anki) [1.again,2.hard,3.good,4.easy]

      Returns number

      Difficulty $$D \in [1,10]$$

    • The formula used is : $$ S_0(G) = w_{G-1}$$ $$S_0 = \max \lbrace S_0,0.1\rbrace $$

      Parameters

      • g: Grade

        Grade (rating at Anki) [1.again,2.hard,3.good,4.easy]

      Returns number

      Stability (interval when R=90%)

    • The formula used is : $$w_7 \cdot \text{init} +(1 - w_7) \cdot \text{current}$$

      Parameters

      • init: number

        $$w_2 : D_0(3) = w_2 + (R-2) \cdot w_3= w_2$$

      • current: number

        $$D - w_6 \cdot (R - 2)$$

      Returns number

      difficulty

    • Display the collection of cards and logs for the card scheduled at the current time, after applying a specific grade rating.

      Type Parameters

      Parameters

      • card: Card | CardInput

        Card to be processed

      • now: DateInput

        Current time or scheduled time

      • grade: Grade

        Rating of the review (Again, Hard, Good, Easy)

      • OptionalafterHandler: (recordLog: RecordLogItem) => R

        Convert the result to another type. (Optional)

      Returns R

      const card: Card = createEmptyCard(new Date());
      const f = fsrs();
      const recordLogItem = f.next(card, new Date(), Rating.Again);
      interface RevLogUnchecked
      extends Omit<ReviewLog, "due" | "review" | "state" | "rating"> {
      cid: string;
      due: Date | number;
      state: StateType;
      review: Date | number;
      rating: RatingType;
      }

      interface NextRecordLog {
      card: CardUnChecked; //see method: createEmptyCard
      log: RevLogUnchecked;
      }

      function nextAfterHandler(recordLogItem: RecordLogItem) {
      const recordItem = {
      card: {
      ...(recordLogItem.card as Card & { cid: string }),
      due: recordLogItem.card.due.getTime(),
      state: State[recordLogItem.card.state] as StateType,
      last_review: recordLogItem.card.last_review
      ? recordLogItem.card.last_review!.getTime()
      : null,
      },
      log: {
      ...recordLogItem.log,
      cid: (recordLogItem.card as Card & { cid: string }).cid,
      due: recordLogItem.log.due.getTime(),
      review: recordLogItem.log.review.getTime(),
      state: State[recordLogItem.log.state] as StateType,
      rating: Rating[recordLogItem.log.rating] as RatingType,
      },
      };
      return recordItem
      }
      const card: Card = createEmptyCard(new Date(), cardAfterHandler); //see method: createEmptyCard
      const f = fsrs();
      const recordLogItem = f.repeat(card, new Date(), Rating.Again, nextAfterHandler);
    • The formula used is : $$\text{delta}_d = -w_6 \cdot (g - 3)$$ $$\text{next}_d = D + \text{linear damping}(\text{delta}_d , D)$$ $$D^\prime(D,R) = w_7 \cdot D_0(4) +(1 - w_7) \cdot \text{next}_d$$

      Parameters

      • d: number

        Difficulty $$D \in [1,10]$$

      • g: Grade

        Grade (rating at Anki) [1.again,2.hard,3.good,4.easy]

      Returns number

      $$\text{next}_D$$

    • The formula used is : $$S^\prime_f(D,S,R) = w_{11}\cdot D^{-w_{12}}\cdot ((S+1)^{w_{13}}-1) \cdot e^{w_{14}\cdot(1-R)}$$ enable_short_term = true : $$S^\prime_f \in \min \lbrace \max \lbrace S^\prime_f,0.01\rbrace, \frac{S}{e^{w_{17} \cdot w_{18}}} \rbrace$$ enable_short_term = false : $$S^\prime_f \in \min \lbrace \max \lbrace S^\prime_f,0.01\rbrace, S \rbrace$$

      Parameters

      • d: number

        Difficulty D \in [1,10]

      • s: number

        Stability (interval when R=90%)

      • r: number

        Retrievability (probability of recall)

      Returns number

      S^\prime_f new stability after forgetting

    • The formula used is : $$S^\prime_r(D,S,R,G) = S\cdot(e^{w_8}\cdot (11-D)\cdot S^{-w_9}\cdot(e^{w_{10}\cdot(1-R)}-1)\cdot w_{15}(\text{if} G=2) \cdot w_{16}(\text{if} G=4)+1)$$

      Parameters

      • d: number

        Difficulty D \in [1,10]

      • s: number

        Stability (interval when R=90%)

      • r: number

        Retrievability (probability of recall)

      • g: Grade

        Grade (Rating[0.again,1.hard,2.good,3.easy])

      Returns number

      S^\prime_r new stability after recall

    • The formula used is : $$S^\prime_s(S,G) = S \cdot e^{w_{17} \cdot (G-3+w_{18})}$$

      Parameters

      • s: number

        Stability (interval when R=90%)

      • g: Grade

        Grade (Rating[0.again,1.hard,2.good,3.easy])

      Returns number

    • Calculates the next state of memory based on the current state, time elapsed, and grade.

      Parameters

      • memory_state: null | FSRSState

        The current state of memory, which can be null.

      • t: number

        The time elapsed since the last review.

      • g: number

        Grade (Rating[0.Manual,1.Again,2.Hard,3.Good,4.Easy])

      Returns FSRSState

      The next state of memory with updated difficulty and stability.

    • Display the collection of cards and logs for the four scenarios after scheduling the card at the current time.

      Type Parameters

      Parameters

      • card: Card | CardInput

        Card to be processed

      • now: DateInput

        Current time or scheduled time

      • OptionalafterHandler: (recordLog: IPreview) => R

        Convert the result to another type. (Optional)

      Returns R

      const card: Card = createEmptyCard(new Date());
      const f = fsrs();
      const recordLog = f.repeat(card, new Date());
      interface RevLogUnchecked
      extends Omit<ReviewLog, "due" | "review" | "state" | "rating"> {
      cid: string;
      due: Date | number;
      state: StateType;
      review: Date | number;
      rating: RatingType;
      }

      interface RepeatRecordLog {
      card: CardUnChecked; //see method: createEmptyCard
      log: RevLogUnchecked;
      }

      function repeatAfterHandler(recordLog: RecordLog) {
      const record: { [key in Grade]: RepeatRecordLog } = {} as {
      [key in Grade]: RepeatRecordLog;
      };
      for (const grade of Grades) {
      record[grade] = {
      card: {
      ...(recordLog[grade].card as Card & { cid: string }),
      due: recordLog[grade].card.due.getTime(),
      state: State[recordLog[grade].card.state] as StateType,
      last_review: recordLog[grade].card.last_review
      ? recordLog[grade].card.last_review!.getTime()
      : null,
      },
      log: {
      ...recordLog[grade].log,
      cid: (recordLog[grade].card as Card & { cid: string }).cid,
      due: recordLog[grade].log.due.getTime(),
      review: recordLog[grade].log.review.getTime(),
      state: State[recordLog[grade].log.state] as StateType,
      rating: Rating[recordLog[grade].log.rating] as RatingType,
      },
      };
      }
      return record;
      }
      const card: Card = createEmptyCard(new Date(), cardAfterHandler); //see method: createEmptyCard
      const f = fsrs();
      const recordLog = f.repeat(card, new Date(), repeatAfterHandler);
    • Reschedules the current card and returns the rescheduled collections and reschedule item.

      Type Parameters

      Parameters

      • current_card: Card | CardInput

        The current card to be rescheduled.

      • reviews: FSRSHistory[] = []

        The array of FSRSHistory objects representing the reviews.

      • options: Partial<RescheduleOptions<T>> = {}

        The optional reschedule options.

      Returns IReschedule<T>

      • The rescheduled collections and reschedule item.
      const f = fsrs()
      const grades: Grade[] = [Rating.Good, Rating.Good, Rating.Good, Rating.Good]
      const reviews_at = [
      new Date(2024, 8, 13),
      new Date(2024, 8, 13),
      new Date(2024, 8, 17),
      new Date(2024, 8, 28),
      ]

      const reviews: FSRSHistory[] = []
      for (let i = 0; i < grades.length; i++) {
      reviews.push({
      rating: grades[i],
      review: reviews_at[i],
      })
      }

      const results_short = scheduler.reschedule(
      createEmptyCard(),
      reviews,
      {
      skipManual: false,
      }
      )
      console.log(results_short)
    • Type Parameters

      Parameters

      • card: Card | CardInput

        Card to be processed

      • log: ReviewLogInput

        last review log

      • OptionalafterHandler: (prevCard: Card) => R

        Convert the result to another type. (Optional)

      Returns R

      const now = new Date();
      const f = fsrs();
      const emptyCardFormAfterHandler = createEmptyCard(now);
      const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now);
      const { card, log } = repeatFormAfterHandler[Rating.Hard];
      const rollbackFromAfterHandler = f.rollback(card, log);
      const now = new Date();
      const f = fsrs();
      const emptyCardFormAfterHandler = createEmptyCard(now, cardAfterHandler); //see method: createEmptyCard
      const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now, repeatAfterHandler); //see method: fsrs.repeat()
      const { card, log } = repeatFormAfterHandler[Rating.Hard];
      const rollbackFromAfterHandler = f.rollback(card, log, cardAfterHandler);