How do my review ahead answers affect the new interval's similarity

def _earlyReviewIvl(self, card: Card, ease: int) -> int:
        assert card.odid and card.type == CARD_TYPE_REV
        assert card.factor
        assert ease > 1

        elapsed = card.ivl - (card.odue - self.today)
#// elapsed: number of days that have passed since you reviewed the card
#// card.ivl: card's given interval
#// card.odue: card's original due date
#// self.today: today date

        conf = self._revConf(card)

        easyBonus = 1
        # early 3/4 reviews shouldn't decrease previous interval
        minNewIvl = 1

        if ease == BUTTON_TWO:  #// if you press hard
            factor = conf.get("hardFactor", 1.2)
#// hardFactor: should 
            # hard cards shouldn't have their interval decreased by more than 50%
            # of the normal factor
            minNewIvl = factor / 2
        elif ease == BUTTON_THREE:  #// if you press good
            factor = card.factor / 1000
        else:  # ease == BUTTON_FOUR:  #// if you press easy
            factor = card.factor / 1000
            ease4 = conf["ease4"]
#// ease4: should be the ease bonus (review tab in deck options) not sure tho
            # 1.3 -> 1.15
            easyBonus = ease4 - (ease4 - 1) / 2

        ivl_1 = max(elapsed * factor, 1)
#// card.factor: if ease = 250%, card.factor = 2500
#// factor: if ease = 250%, factor = 2.5

        # cap interval decreases
        ivl_2 = max(card.ivl * minNewIvl, ivl_1) * easyBonus

        ivl_3 = self._constrainedIvl(ivl_2, conf, prev=0, fuzz=False)
#// self._constrainedIvl -> applies fuzz,checks for maximum interval cap,
#// checks for previous interval and does one more thing that i honestly don't understand :/
#// for review ahead, fuzz is false (no fuzz applies)
#// previous interval = 0, maximum is always the interval that this function gives it
#// so i'll just assume that it has no effect on the interval and just use this function in my example (:|)

        return ivl_3
#// returns new interval for the card
if you press hard

card.ivl = 20 (days)
elapsed = 9 (days)

easyBonus = 1
minNewIvl = 0.55 (factor = conf.get("hardFactor", 1.2 | then minNewIvl = factor / 2) (my hard factor is 110% -> anki stores it as 1.10 => 1.10/2 = 0.55)
factor = 1.1

ivl_1 = 10
ivl_2 = 11
final interval on hard button = 11 (days)

if you press good

card.ivl = 20 (days)
elapsed = 9 (days)

easyBonus = 1
minNewIvl = 1
factor = 2.5

ivl_1 = 22.5
ivl_2 = 22.5
final interval on good button = 22 (days)

if you press easy

card.ivl = 20 (days)
elapsed = 9 (days)

easyBonus = 1.15 (check out #NOTE)
minNewIvl = 1
factor = 2.5

ivl_1 = 22.5
ivl_2 = 25.8
final interval on easy button = 26 (days)

#NOTE -> how easyBonus was calculated:
ease4 = conf[“ease4”] -> this is the easy bonus that you set on deck options -> review tab | if it’s 130%, anki stores it as 1.3

easyBonus = ease4 - (ease4 - 1) / 2

so if ease4 = 1.3 -> easyBonus = 1.3 - (0.3)/2 => 1.3 - 0.15 = 1.15

I know it’s a mess :expressionless: hope you understand it tho

2 Likes