summaryrefslogtreecommitdiff
path: root/src/study/SpacedRepetitionModel.h
blob: d39a1b84c4c91bf002902d721f7902b4fa7445f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#ifndef SPACEDREPETITIONMODEL_H
#define SPACEDREPETITIONMODEL_H

#include "IStudyModel.h"
#include "StudyRecord.h"
#include "StudySettings.h"

#include <QMultiMap>
#include <QTime>

class CardPack;
class IRandomGenerator;

class SpacedRepetitionModel: public IStudyModel
{
    Q_OBJECT

public:
    static const int NewCardsDayLimit = 10;

public:
    SpacedRepetitionModel(CardPack* aCardPack, IRandomGenerator* random);
    ~SpacedRepetitionModel();

public:
    Card* getCurCard() const { return curCard; }
    QList<int> getAvailableGrades() const;
    bool isNew() const;
    void setRecallTime( int aTime ) { curRecallTime = aTime; }
    int estimatedNewReviewedCardsToday() const;
    int countTodayRemainingCards() const;

public slots:
    void scheduleCard(int newGrade);

protected:
    void pickNextCardAndNotify();

private:
    StudyRecord createNewStudyRecord(int newGrade);
    int getNewLevel(const StudyRecord& prevStudy, int newGrade);
    double getNewEasiness(const StudyRecord& prevStudy, int newGrade);
    double getChangeableEasiness(const StudyRecord& prevStudy, int newGrade) const;
    double limitEasiness(double eas) const;
    double getNextInterval(const StudyRecord& prevStudy,
            const StudyRecord& newStudy);
    double getNextRepeatingInterval(const StudyRecord& prevStudy,
            const StudyRecord& newStudy);
    double getIncreasedInterval(double prevInterval, double newEasiness);
    double getNextRepeatingIntervalForShortLearning(
            const StudyRecord& prevStudy, const StudyRecord& newStudy);
    double getNextRepeatingIntervalForLongLearning(
            const StudyRecord& prevStudy, const StudyRecord& newStudy);
    void saveStudyRecord(const StudyRecord& newStudy);
    void pickNextCard();
    bool pickNewCard();
    QString getRandomStr(const QStringList& list) const;
    bool reachedNewCardsDayLimit() const;
    bool mustPickScheduledCard();
    bool tooManyScheduledCards() const;
    bool mustRandomPickScheduledCard() const;
    bool pickActiveCard();
    bool pickPriorityActiveCard();
    bool pickLearningCard();
    void saveStudy();
    
private slots:
    void updateStudyState();

private:
    Card* curCard;   ///< The card selected for repetition
    Card* prevCard;  ///< Previous reviewed card. Found in the study history.
    int curRecallTime;        ///< Recall time of the current card, ms
    QTime answerTime;        ///< Full answer time of the current card: recall + evaluation, ms    
    StudySettings* settings;
    IRandomGenerator* random;
};

#endif