FSRS toggle should not be global
It makes sense for FSRS to be the default for new profiles, but it makes no sense that the FSRS/ Legacy SM-2 toggle is one for all profiles.
Some users (like me) have needs for the old algorithm in specific decks, so I need to use SM-2 for them. Basically, due to heavy suspension rules, it’s better for the intervals to be locally determined rather than rely also on parameters that are inferred from the whole data. FSRS calculation excludes suspended cards, and heavy suspension introduces sampling bias which makes the provided intervals too long. On the other hand, moving the suspended cards to another deck (still sharing the same profile), and un-suspending them, makes the intervals shorter than they should be. For reference, I suspend cards after a single fail after leaving learning phase.
It’s just an edge case, but its limiting for me
You probably mean “presets” sincre different “profiles” can have different algorithms, I think.
You can edit the optimization filter in the deck options to allow suspended cards to be part of the optimization. You say that that would “makes the intervals shorter than they should be”, but if that’s the case, you can just decrease the desired retention.
I like the suggestion though, but for other reasons…
That would be very nice!
FSRS is great, but SM-2 still has its place.
It would be awesome to be able to use FSRS for most decks but SM-2 for special decks where SM-2 behaviors were preferable.
The FSRS contributors are seeking sponsors on GitHub so I expect that with increased support from the community they may eventually be able to add such advanced features. (but I’m not involved with them so I don’t know if that’s possible or not.)
yeah, presets. Thanks for the info regarding fsrs options. As you well noted it’s not certain that considering those cards makes the algo innefective. In theory shouldn’t pose a problem I guess
Would it do any harm to keep changing the setting back and forth depending on which deck you are practicing?
Obviously it wouldn’t be as convenient, and being able to set it per-deck would be preferable. But if that feature just isn’t going to happen, then for some use cases switching the setting back and forth might be less inconvenient than maintaining separate profiles (especially since it avoids the need for multiple AnkiWeb accounts for syncing).
Perhaps especially for the use case of “I want to try out FSRS, but I’m not ready to trust it with all of my cards yet”. Someone might set up an FSRS test deck, turn FSRS on whenever they do that deck, and switch it off the rest of the time. If things go well with the FSRS deck, they eventually switch over completely, but they get to see how things go with FSRS for a while before they trust it with all of their cards.
As long as you’re careful to never do the wrong deck while you have the wrong algorithm active, I don’t think that will break anything. (Unless maybe you have addons that do other things like rescheduling cards.) But I could be wrong about that, which is why this is as much a question as it is a suggestion…
Also, here’s a crude little Anki addon I just wrote for myself to help with the switching back and forth thing.
I’m planning to switch back and forth because my first experiences with FSRS didn’t go well, but I don’t want to give up on it. So I’m going to keep using SM-2 for most cards for now, but have an “FSRS test deck” (with a separate preset) and turn FSRS on while doing that deck. If things go well with the test deck I’ll try letting FSRS handle all of my cards again.
The general idea is that cards have a tag for either “FSRS” or “SM2”. The addon checks whether the current active algorithm matches the card’s tag, and shows a warning if it does not. That way I won’t slip up and use the wrong algorithm on the wrong deck.
I’m not putting this up on the AnkiWeb addons page because I’ve never written an Anki addon before and I’m not sure the way it checks the current active algorithm will work with all versions of Anki.
But for anyone else who wants a little help not using the wrong algorithm if you’re switching back and forth, here you go:
from aqt import gui_hooks
from aqt import mw
def get_active_sched_algorithm():
fsrs_status = mw.col.get_config('fsrs')
status_map = {True: "FSRS", False: "SM-2", None: "Unknown"}
cur_algorithm = status_map.get(fsrs_status, "Unknown")
return cur_algorithm
def get_algorithm_tag(card):
note = card.note()
tags = {t.lower() for t in note.tags}
is_fsrs = "fsrs" in tags
is_sm2 = ("sm2" in tags) or ("sm-2" in tags) or ("sm_2" in tags)
if is_fsrs and not is_sm2:
return "FSRS"
if not is_fsrs and is_sm2:
return "SM-2"
if is_fsrs and is_sm2:
return "ambiguous_tags"
return "no_algorithm_tags"
def inject_algorithm_check(html, card, context):
current_algorithm = get_active_sched_algorithm()
card_pref = get_algorithm_tag(card)
# Decide message
if card_pref == "no_algorithm_tags":
div_style = "font-weight: bold;"
msg = "Card has no algorithm tags"
elif card_pref == "ambiguous_tags":
div_style = "font-weight: bold;"
msg = "Card has algorithm tags for both FSRS and SM-2"
elif card_pref != current_algorithm:
div_style = "color: #e74c3c; font-weight: bold;"
msg = f"algorithm mismatch: card tagged for {card_pref}, but active algorithm is {current_algorithm}"
else:
div_style = "color: #27ae60;"
msg = f"algorithm OK ({current_algorithm})"
result = f"<div style='padding: 10px; {div_style}'>{msg}</div>"
return html + result
gui_hooks.card_will_show.append(inject_algorithm_check)
(Again, I’ve never written an Anki addon before. Zero guarantees, use at your own risk.)
One alternative to FSRS is a project called Anki SRS Kai, it is based on SM2 and incorporates features from SM2 add-ons, so its performance is probably about midway between FSRS and SM2. But it’s developed by an individual and isn’t actively maintained, so I think it doesn’t have FSRS like community support.