File size: 1,572 Bytes
25732fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import math
from datetime import datetime

class KnowledgeRuleEngine:
    """
    Expert system for knowledge tracking decisions.
    """
    
    def calculate_forgetting(self, last_practice_date, current_knowledge):
        """
        Apply Ebbinghaus forgetting curve.
        """
        if not last_practice_date:
            return current_knowledge
            
        days_elapsed = (datetime.utcnow() - last_practice_date).days
        
        if days_elapsed <= 0:
            return current_knowledge
            
        # R = e^(-t/S)
        # Stability (S) increases with knowledge strength
        stability = max(1, current_knowledge * 30) 
        retention = math.exp(-days_elapsed / stability)
        
        return current_knowledge * retention

    def predict_growth(self, current_knowledge, is_correct, difficulty):
        """
        Predict new knowledge level after an interaction.
        """
        learning_rate = 0.1
        difficulty_weight = 1.0
        
        if difficulty == "advanced":
            difficulty_weight = 1.2
        elif difficulty == "beginner":
            difficulty_weight = 0.8
            
        if is_correct:
            # Logarithmic growth: harder to improve as you get closer to 1.0
            growth = learning_rate * difficulty_weight * (1 - current_knowledge)
            return min(1.0, current_knowledge + growth)
        else:
            # Penalty is smaller than growth
            penalty = learning_rate * 0.5 * current_knowledge
            return max(0.0, current_knowledge - penalty)