## 3 Materials and Methods
### Elements of Feedback Used during Learning in the Developed Platform  
A very important phase while designing the method was the development of a mechanism for handling feedback during the learning process, which consists of 2 elements:  
* Error vector: Creates a learning history for a given student and accumulates mistakes that are grouped into classes. With a given node in the concept graph, multiple types of defined errors can be associated.  
Figure 1: Stages of the proposed method supporting learning/teaching mathematics regarding students with blindness.  
Figure 2: Concept graph developed for the mathematics course on mathematical analysis (green elements come from the exercise described in Section 3.4).  
Knowledge vector: stores information about the concepts mastered by the student based on correctly solved exercises.  
The number of components of the error/knowledge vector results unequivocally from the number of nodes in the concept graph. For a given node, the type of error directly relates to the concept, e.g., the error in determining the domain of a function relates to the concept of defining the domain of a function. In the error vector component, we stored a list with timestamps corresponding to the moment of making an error while solving a step of the exercise assigned to the related concept. The length of the list determines how often a given error was made by a given user.  
The knowledge vector is symmetrical to the structure of the concept graph--it is a list containing timestamps of phases of correctly solved exercises assigned to a related concept. The current state of the knowledge vector reflects the student's mastery of the material and determines the path that the user follows in the graph.  
Figure 3 illustrates a scenario where the student is at a specific stage of the exercise corresponding to monotonicity intervals of a polynomial. This stage corresponds to concept C25 in the knowledge vector, which has a value of 0. The mistake made by the student while solving this stage of the exercise results in entering a value of 1 into the error vector. According to the proposed learning mode, the system requests the student to solve this stage again. Another mistake leads to entering the value 2 into the error vector and presenting a similar example in a step-by-step mode. After studying the example exercise, the student attempts to solve this specific step for the third time. In the case of a correct solution, the value 1 is set in the C25 field of the knowledge vector. However, if the solution is incorrect, the system redirects the student to the node selected from the set of predecessors (according to the proposed algorithm), the one with the largest value in the error vector. In the example exercise, it is the C9 node. The pseudocode of selecting the predecessor in the concept graph and the corresponding next exercise in case of student errors during the learning process is illustrated in the Algorithm 1.  
```
1:Require: concept graph C, knowledge_vector, error_vector
2:require: list of all exercises E corresponding for each element in graph C
3:
4:input: current node N in concept graph C
5:
6:M = C_get_predecessors(N)
7:W[] = 0
8:M_predecessor = None
9:forM\({}_{i}\) in M:
10:W\({}_{i}\) = error_vector[M\({}_{i}\)]
11:endfor
12:if all W\({}_{i}\) in W == 0:
13:M_predecessor = select M\({}_{i}\) from M where
14:min(knowledge_vector[M\({}_{i}\)].time_stamp)
15:else
16:maxW = max(W[])
17:M_temp = select all M\({}_{i}\) from M where W\({}_{i}\) == maxW
18:M_predecessor = select M\({}_{i}\) from M_temp where
19:max(error_vector[M\({}_{i}\)].time_stamp)
20:Z = select random exercise from E corresponding to M_predecessor
21:output:Z
```  
**Algorithm 1** Pseudocode of exercise selection during learning mode