Skip to content

Commit f17b508

Browse files
committed
refactor(arithmetic): simplify initDifficulty and remove redundant input clamping
- drop redundant constrainDifficulty and initDifficultyRaw - remove clamp from initDifficulty, apply constrainDifficulty at call sites matching py-fsrs approach - remove redundant constrainDifficulty/constrainStability from nextRecallStability and nextForgetStability inputs
1 parent b793d19 commit f17b508

5 files changed

Lines changed: 9 additions & 19 deletions

File tree

arithmetic.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@ func (p *Parameters) initStability(r Rating) float64 {
5050
}
5151

5252
func (p *Parameters) initDifficulty(r Rating) float64 {
53-
return constrainDifficulty(p.W[4] - math.Exp(p.W[5]*float64(r-1)) + 1)
54-
}
55-
56-
func (p *Parameters) initDifficultyRaw(r Rating) float64 {
5753
return p.W[4] - math.Exp(p.W[5]*float64(r-1)) + 1
5854
}
5955

@@ -77,7 +73,7 @@ func (p *Parameters) nextIntervalRaw(s float64) float64 {
7773
func (p *Parameters) nextDifficulty(d float64, r Rating) float64 {
7874
deltaD := -p.W[6] * float64(r-3)
7975
nextD := d + linearDamping(deltaD, d)
80-
return constrainDifficulty(p.meanReversion(p.initDifficultyRaw(Easy), nextD))
76+
return constrainDifficulty(p.meanReversion(p.initDifficulty(Easy), nextD))
8177
}
8278

8379
func (p *Parameters) shortTermStability(s float64, r Rating) float64 {
@@ -94,9 +90,6 @@ func (p *Parameters) meanReversion(init float64, current float64) float64 {
9490
}
9591

9692
func (p *Parameters) nextRecallStability(d float64, s float64, r float64, rating Rating) float64 {
97-
d = constrainDifficulty(d)
98-
s = constrainStability(s)
99-
10093
var hardPenalty, easyBonus float64
10194
if rating == Hard {
10295
hardPenalty = p.W[15]
@@ -119,9 +112,6 @@ func (p *Parameters) nextRecallStability(d float64, s float64, r float64, rating
119112
}
120113

121114
func (p *Parameters) nextForgetStability(d float64, s float64, r float64) float64 {
122-
d = constrainDifficulty(d)
123-
s = constrainStability(s)
124-
125115
newS := p.W[11] *
126116
math.Pow(d, -p.W[12]) *
127117
(math.Pow(s+1, p.W[13]) - 1) *

fsrs_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,8 +1118,8 @@ func TestNextStateElapsedZero(t *testing.T) {
11181118
if item.Memory.Stability != p.initStability(Good) {
11191119
t.Errorf("NextState new card: got stability=%v want=%v", item.Memory.Stability, p.initStability(Good))
11201120
}
1121-
if item.Memory.Difficulty != p.initDifficulty(Good) {
1122-
t.Errorf("NextState new card: got difficulty=%v want=%v", item.Memory.Difficulty, p.initDifficulty(Good))
1121+
if item.Memory.Difficulty != constrainDifficulty(p.initDifficulty(Good)) {
1122+
t.Errorf("NextState new card: got difficulty=%v want=%v", item.Memory.Difficulty, constrainDifficulty(p.initDifficulty(Good)))
11231123
}
11241124

11251125
current := &MemoryState{Stability: 5.0, Difficulty: 5.0}

parameters.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (p *Parameters) nextStateInner(current *MemoryState, desiredRetention, elap
7878

7979
if current == nil || current.Stability == 0 {
8080
newS = p.initStability(grade)
81-
newD = p.initDifficulty(grade)
81+
newD = constrainDifficulty(p.initDifficulty(grade))
8282
} else {
8383
newD = p.nextDifficulty(current.Difficulty, grade)
8484
if elapsed == 0 && p.EnableShortTerm {

scheduler_basic.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (bs basicScheduler) newState(grade Rating) SchedulingInfo {
4343
}
4444

4545
next := bs.current
46-
next.Difficulty = bs.parameters.initDifficulty(grade)
46+
next.Difficulty = constrainDifficulty(bs.parameters.initDifficulty(grade))
4747
next.Stability = bs.parameters.initStability(grade)
4848
steps := bs.parameters.LearningSteps
4949
elapsed := bs.elapsedDays()

scheduler_longterm.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,16 @@ func (lts longTermScheduler) newState(grade Rating) SchedulingInfo {
3939
}
4040

4141
func (lts longTermScheduler) initDs(nextAgain, nextHard, nextGood, nextEasy *Card) {
42-
nextAgain.Difficulty = lts.parameters.initDifficulty(Again)
42+
nextAgain.Difficulty = constrainDifficulty(lts.parameters.initDifficulty(Again))
4343
nextAgain.Stability = lts.parameters.initStability(Again)
4444

45-
nextHard.Difficulty = lts.parameters.initDifficulty(Hard)
45+
nextHard.Difficulty = constrainDifficulty(lts.parameters.initDifficulty(Hard))
4646
nextHard.Stability = lts.parameters.initStability(Hard)
4747

48-
nextGood.Difficulty = lts.parameters.initDifficulty(Good)
48+
nextGood.Difficulty = constrainDifficulty(lts.parameters.initDifficulty(Good))
4949
nextGood.Stability = lts.parameters.initStability(Good)
5050

51-
nextEasy.Difficulty = lts.parameters.initDifficulty(Easy)
51+
nextEasy.Difficulty = constrainDifficulty(lts.parameters.initDifficulty(Easy))
5252
nextEasy.Stability = lts.parameters.initStability(Easy)
5353
}
5454

0 commit comments

Comments
 (0)