Skip to content

Issue with the number of parameters in FSRS-RS #388

@temeipu-offical

Description

@temeipu-offical

https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm
This article suggests that FSRS-5 has 19 default parameters, while FSRS-RS uses FSRS-5.5 with 17 parameters, which seems contradictory. FSRS-RS-DART, however, has 19 parameters, suggesting a slightly newer version. Therefore, which library should I use: FSRS-RS or FSRS-RS-DART? Which library has a more recent version of FSRS? Furthermore, why are the version and code differences between these libraries so significant?

All the library versions I mentioned are the latest versions.

Below is the source code for FSRS-RS.benchmark.rs

pub fn criterion_benchmark(c: &mut Criterion) {
    let fsrs = FSRS::new(&[
        0.81497127,
        1.5411042,
        4.007436,
        9.045982,
        4.9264183,
        1.039322,
        0.93803364,
        0.0,
        1.5530516,
        0.10299722,
        0.9981442,
        2.210701,
        0.018248068,
        0.3422524,
        1.3384504,
        0.22278537,
        2.6646678,
    ])
    .unwrap();

    c.bench_function("next_states", |b| b.iter(|| black_box(next_states(&fsrs))));

    c.bench_function("current_retrievability", |b| {
        let state = MemoryState {
            stability: 51.344814,
            difficulty: 7.005062,
        };
        b.iter(|| {
            black_box(current_retrievability(
                black_box(state),
                black_box(21.0),
                black_box(FSRS6_DEFAULT_DECAY),
            ))
        })
    });

    {
        let mut single_group = c.benchmark_group("calc_mem");
        let n_cards = 1000;
        let n_reviews = 10;
        single_group.throughput(Throughput::Elements(n_cards));
        single_group.bench_function(
            format!("calc_mem n_cards={n_cards}, n_reviews={n_reviews}"),
            |b| b.iter(|| black_box(calc_mem(&fsrs, n_reviews, n_cards.try_into().unwrap()))),
        );
        single_group.finish();
    }

    {
        let mut batch_group = c.benchmark_group("calc_mem_batch");
        for n_cards in [1000, 10_000] {
            for n_reviews in [10, 100, 200] {
                batch_group.throughput(Throughput::Elements(n_cards));
                batch_group.bench_function(
                    format!("calc_mem_batch n_cards={n_cards}, n_reviews={n_reviews}"),
                    |b| {
                        b.iter(|| {
                            black_box(calc_mem_batch(
                                &fsrs,
                                n_reviews,
                                n_cards.try_into().unwrap(),
                            ))
                        })
                    },
                );
            }
        }
        batch_group.finish();
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions