File size: 1,431 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
class RecommendationRuleEngine:
    """
    Expert system for recommendation decisions.
    """
    
    def score_topic(self, topic, user_knowledge_map):
        """
        Score a topic for recommendation suitability.
        Returns a score (higher is better).
        """
        score = 0
        current_knowledge = user_knowledge_map.get(topic.id, 0)
        
        # Rule 1: Don't recommend mastered topics (unless for review)
        if current_knowledge > 0.85:
            return -1
            
        # Rule 2: Prerequisites must be met
        if not self._check_prerequisites(topic, user_knowledge_map):
            return -10 # Blocked
            
        # Rule 3: Prioritize active topics
        if 0 < current_knowledge < 0.7:
            score += 5
            
        # Rule 4: Beginner topics get boost if nothing started
        if current_knowledge == 0 and topic.difficulty == "beginner":
            score += 3
            
        return score

    def _check_prerequisites(self, topic, knowledge_map):
        if not topic.prerequisites:
            return True
            
        if isinstance(topic.prerequisites, str):
            prereq_ids = [int(p) for p in topic.prerequisites.split(',') if p.strip()]
        else:
             prereq_ids = []
             
        for pid in prereq_ids:
            if knowledge_map.get(pid, 0) < 0.6:
                return False
        return True