Skip to content

Commit c3b7c1a

Browse files
committed
refactor(arithmetic): simplify initDifficulty and remove redundant input clamping
- merge initDifficulty and initDifficultyRaw into a single function with clamp parameter - remove redundant constrainDifficulty/constrainStability from nextRecallStability inputs - remove redundant constrainDifficulty/constrainStability from nextForgetStability inputs
1 parent b793d19 commit c3b7c1a

5 files changed

Lines changed: 15 additions & 21 deletions

File tree

arithmetic.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ func (p *Parameters) initStability(r Rating) float64 {
4949
return min(max(p.W[r-1], 0.1), sMax)
5050
}
5151

52-
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 {
57-
return p.W[4] - math.Exp(p.W[5]*float64(r-1)) + 1
52+
func (p *Parameters) initDifficulty(r Rating, clamp bool) float64 {
53+
d0 := p.W[4] - math.Exp(p.W[5]*float64(r-1)) + 1
54+
if clamp {
55+
return constrainDifficulty(d0)
56+
}
57+
return d0
5858
}
5959

6060
func (p *Parameters) nextInterval(s, elapsedDays float64) float64 {
@@ -77,7 +77,7 @@ func (p *Parameters) nextIntervalRaw(s float64) float64 {
7777
func (p *Parameters) nextDifficulty(d float64, r Rating) float64 {
7878
deltaD := -p.W[6] * float64(r-3)
7979
nextD := d + linearDamping(deltaD, d)
80-
return constrainDifficulty(p.meanReversion(p.initDifficultyRaw(Easy), nextD))
80+
return constrainDifficulty(p.meanReversion(p.initDifficulty(Easy, false), nextD))
8181
}
8282

8383
func (p *Parameters) shortTermStability(s float64, r Rating) float64 {
@@ -94,9 +94,6 @@ func (p *Parameters) meanReversion(init float64, current float64) float64 {
9494
}
9595

9696
func (p *Parameters) nextRecallStability(d float64, s float64, r float64, rating Rating) float64 {
97-
d = constrainDifficulty(d)
98-
s = constrainStability(s)
99-
10097
var hardPenalty, easyBonus float64
10198
if rating == Hard {
10299
hardPenalty = p.W[15]
@@ -119,9 +116,6 @@ func (p *Parameters) nextRecallStability(d float64, s float64, r float64, rating
119116
}
120117

121118
func (p *Parameters) nextForgetStability(d float64, s float64, r float64) float64 {
122-
d = constrainDifficulty(d)
123-
s = constrainStability(s)
124-
125119
newS := p.W[11] *
126120
math.Pow(d, -p.W[12]) *
127121
(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 != p.initDifficulty(Good, true) {
1122+
t.Errorf("NextState new card: got difficulty=%v want=%v", item.Memory.Difficulty, p.initDifficulty(Good, true))
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 = p.initDifficulty(grade, true)
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 = bs.parameters.initDifficulty(grade, true)
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 = lts.parameters.initDifficulty(Again, true)
4343
nextAgain.Stability = lts.parameters.initStability(Again)
4444

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

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

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

0 commit comments

Comments
 (0)