Completed
Push — main ( 19662a...9f7f07 )
by Yume
14s queued 11s
created

models.*Mem.ComputeEfactor   A

Complexity

Conditions 2

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nop 2
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
package models
2
3
import (
4
	"gorm.io/gorm"
5
)
6
7
// Mem structure
8
type Mem struct {
9
	gorm.Model
10
	UserID     uint `json:"user_id" example:"1"`
11
	User       User
12
	CardID     uint `json:"card_id" example:"1"`
13
	Card       Card
14
	Quality    MemQuality `json:"quality" example:"0"` // [0: Blackout - 1: Error with choices - 2: Error with hints - 3: Error - 4: Good with hints - 5: Perfect]
15
	Repetition uint       `json:"repetition" example:"0" `
16
	Efactor    float32    `json:"e_factor" example:"2.5"`
17
	Interval   uint       `json:"interval" example:"0"`
18
}
19
20
type MemQuality int64
21
22
const (
23
	MemQualityBlackout MemQuality = iota
24
	MemQualityErrorMCQ
25
	MemQualityErrorHints
26
	MemQualityError
27
	MemQualityGoodMCQ
28
	MemQualityPerfect
29
)
30
31
func (mem *Mem) FillDefaultValues(userID, cardID uint) {
32
	mem.UserID = userID
33
	mem.CardID = cardID
34
	mem.Quality = MemQualityBlackout
35
	mem.Repetition = 0
36
	mem.Efactor = 2.5
37
	mem.Interval = 0
38
}
39
40
func (mem *Mem) ComputeEfactor(oldEfactor float32, quality MemQuality) {
41
	eFactor := oldEfactor + (0.1 - (5.0-float32(quality))*(0.08+(5-float32(quality)))*0.02)
42
43
	if eFactor < 1.3 {
44
		mem.Efactor = 1.3
45
	} else {
46
		mem.Efactor = eFactor
47
	}
48
}
49
50
func (mem *Mem) ComputeTrainingEfactor(oldEfactor float32, quality MemQuality) {
51
	eFactor := oldEfactor + (0.1 - (5.0-float32(quality))*(0.08+(5-float32(quality)))*0.02)
52
	computedEfactor := (oldEfactor + eFactor) / 2
53
	if computedEfactor < 1.3 {
54
		mem.Efactor = 1.3
55
	} else {
56
		mem.Efactor = computedEfactor
57
	}
58
}
59
60
func (mem *Mem) GetCardType() CardType {
61
	if mem.Efactor <= 2 || mem.Repetition < 2 || (mem.Efactor <= 2.3 && mem.Repetition < 4) {
62
		return CardMCQ
63
	}
64
65
	return mem.Card.Type
66
}
67
68
func (mem *Mem) ComputeInterval(oldInterval uint, eFactor float32, repetition uint) {
69
	switch repetition {
70
	case 0:
71
		mem.Interval = 1
72
	case 1, 2:
73
		mem.Interval = 2
74
	case 3:
75
		mem.Interval = 3
76
	default:
77
		mem.Interval = uint(float32(oldInterval)*eFactor*0.75) + 1
78
	}
79
}
80
81
func (mem *Mem) ComputeQualitySuccess() {
82
	if mem.GetCardType() == CardMCQ {
83
		mem.Quality = MemQualityError
84
	} else {
85
		if mem.Repetition > 3 {
86
			mem.Quality = MemQualityPerfect
87
		}
88
		mem.Quality = MemQualityGoodMCQ
89
	}
90
}
91
92
func (mem *Mem) ComputeQualityFail() {
93
	if mem.GetCardType() == CardMCQ {
94
		if mem.Repetition <= 3 {
95
			mem.Quality = MemQualityBlackout
96
		}
97
		mem.Quality = MemQualityErrorMCQ
98
	}
99
	if mem.Repetition <= 4 {
100
		mem.Quality = MemQualityErrorMCQ
101
	}
102
	mem.Quality = MemQualityErrorHints
103
}
104
105
func (mem *Mem) IsMCQ() bool {
106
	return mem.Efactor <= 1.4 || mem.Quality <= MemQualityErrorMCQ || mem.Repetition < 2
107
}
108