Commit db2aceedc099a63be6b38691f9adb90efd9073ff

Authored by Miguel Barão
1 parent 1cdce3ee
Exists in master and in 1 other branch dev

- generates questions in sequence corresponding to topological sort of the topics

Showing 2 changed files with 34 additions and 18 deletions   Show diff stats
app.py
... ... @@ -126,7 +126,6 @@ class LearnApp(object):
126 126 s.commit()
127 127 logger.debug('check_answer: saving done')
128 128  
129   - logger.debug('check_answer: will return knowledge.new_question')
130 129 return knowledge.new_question()
131 130  
132 131 # ------------------------------------------------------------------------
... ...
knowledge.py
... ... @@ -19,39 +19,56 @@ class Knowledge(object):
19 19 def __init__(self, depgraph, state={}):
20 20 self.depgraph = depgraph
21 21 self.state = state # {node: level, node: level, ...}
  22 +
  23 + self.topic = self.topic_generator()
  24 + self.current_topic = next(self.topic)
  25 +
  26 + self.questions = self.generate_questions_for_topic(self.current_topic)
22 27 self.current_question = None
23 28  
24   - self.seq = nx.topological_sort(self.depgraph)
25   - self.topic = None
  29 + # ------------------------------------------------------------------------
  30 + def topic_generator(self):
  31 + topics = nx.topological_sort(self.depgraph) # FIXME for now...
  32 + for t in topics:
  33 + self.questions = self.generate_questions_for_topic(t)
  34 + yield t
26 35  
  36 + # ------------------------------------------------------------------------
  37 + def generate_questions_for_topic(self, topic):
  38 + factory = self.depgraph.node[topic]['factory']
  39 + return [q.generate() for q in factory]
27 40  
  41 + # ------------------------------------------------------------------------
28 42 def get_current_question(self):
29 43 return self.current_question
30 44  
  45 + # ------------------------------------------------------------------------
31 46 def get_knowledge_state(self):
32 47 return self.state
33 48  
34   - # --- generates a new question given the current state
  49 + # --- generates a new question given the current state -------------------
35 50 def new_question(self):
36 51 logger.debug('new_question()')
  52 +
37 53 if self.current_question is None or self.current_question.get('grade', 0.0) > 0.9999:
38   - g = self.depgraph
39   - # choose topic, ie, node of the graph
40   - # print(g.nodes())
41   - self.topic = random.choice(g.nodes()) # FIXME
42   - # print(topic)
43   - # choose question from that topic
44   - question = random.choice(g.node[self.topic]['factory'])
45   - # print(question)
46   -
47   - self.current_question = question.generate()
48   - # print(self.current_question)
49   -
50   - # self.current_question = g.node[topic]['factory'].generate(ref)
  54 +
  55 + while not self.questions:
  56 + self.state[self.current_topic] = 1.0 # finished topic!
  57 + try:
  58 + self.current_topic = next(self.topic)
  59 + except StopIteration:
  60 + self.topic = self.topic_generator()
  61 + self.current_topic = next(self.topic)
  62 + self.questions = self.generate_questions_for_topic(self.current_topic)
  63 +
  64 + print(self.current_topic)
  65 + print(self.current_question)
  66 + self.current_question = self.questions.pop(0)
51 67 self.current_question['start_time'] = datetime.now()
  68 +
52 69 return self.current_question
53 70  
54   - # --- checks answer and updates knowledge state
  71 + # --- checks answer ------------------------------------------------------
55 72 # returns current question with correction, time and comments updated
56 73 def check_answer(self, answer):
57 74 logger.debug(f'check_answer("{answer}")')
... ...