-
Notifications
You must be signed in to change notification settings - Fork 1
/
module_workflow.py
156 lines (131 loc) · 5.39 KB
/
module_workflow.py
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#TODO: slow down print out process
#TODO: print out ALL retrieved variables
# ISSUES:
#TODO: module3.get_random_identifier_values
# strToSympy parsing \frac, etc.
#TODO: module5.check_value:
# allow percentage float tolerance for answer value
#TODO: enable concept name input, e.g., 'speed' or 'acceleration' instead of QID
#TODO: extend cleanings (integral, greek letters \, variable interchange, x(t) -> x_t)
import module1_formula_and_identifier_retrieval as module1
import module2_formula_rearrangement as module2
import module3_identifier_value_generation as module3
import module4_question_text_generation as module4
import module5_solution_value_and_unit_check as module5
##############################################
# Module 1: Formula and Identifier Retrieval #
##############################################
# INSTRUCTOR INPUT
# Input formula question QID
#qid = input('Input formula question QID:')
# Example
#qid = 'Q11376'#: 'acceleration'
qid = 'Q11652'# 'frequency':
#qid = 'Q35875'# 'mass-energy equivalence'
#qid = 'Q2397319'# 'Newton's second law of motion for constant mass'
#qid = 'Q3711325'# 'speed'
print('\nInput formula question QID: ',qid)
# Get item from QID
print('\nRetrieving Wikidata item...\n')
item = module1.get_Wikidata_item(qid)
# Get concept name from item
concept_name = module1.get_concept_name(item)
print(f'Retrieving formula concept name: >>{concept_name}<<\n')
# Example
#concept_name = 'acceleration'
# System output for processing question
print(f'Generating physics formula question for >>{concept_name}<<...\n')
# Example
#print('Generating physics formula question for >>acceleration<<...')
# Get defining formula
defining_formula = module1.get_defining_formula(item)
print(f'Retrieving defining formula: >>{defining_formula}<<\n')
# Example
# 'defining formula' (P2534) = 'a = dv/dt'
#defining_formula = '\\boldsymbol{a} = \\frac{\\mathrm{d} \\boldsymbol{v}}{\\mathrm{d} t}'
# Get formula unit dimension
formula_unit_dimension = module1.get_formula_unit_dimension(item)
print('Retrieving formula identifier properties...\n')
formula_identifiers = module1.get_identifier_properties(item)
# Get formula identifier (symbol, name) tuples
print('Retrieving formula identifier symbols and names...\n')
# Example
#formula_identifiers = [('a', 'acceleration'), ('v', 'velocity'), ('t', 'duration')]
# a: 'acceleration' (Q11376)
# v: 'velocity' (Q11465)
# t: 'duration' (Q2199864)
print('Retrieving formula identifier units...\n')
# Get formula identifier property (name, symbol, unit) triples
# Example
# 'ISQ dimension' property (P4020) = 'LT^-2
#formula_unit_dimensions = '\mathsf{L} \mathsf{T}^{-2}'
#identifier_unit_dimensions = ['\\mathsf{L} \\mathsf{T}^{-1}', '\\mathsf{T}']
###################################
# Module 2: Formula Rearrangement #
###################################
print('Generating formula rearrangements...\n')
# Get formula rearrangements using Computer Algebra Systems (CAS), maybe SymPy
#formula_rearrangements = module2.get_random_formula_rearrangements(defining_formula)
# Example
#formula_rearrangements = ['a = v/t', 'v = a t','t = v/a']
#########################################
# Module 3: Identifier Value Generation #
#########################################
print('Generating random identifier values...\n')
identifier_values = module3.get_random_identifier_values(formula_identifiers,defining_formula)
# (randomize)
# Example
#identifier_values = [3,6,2]#, [6,3,2], [2,6,3] # [a,v,t]
######################################
# Module 4: Question Text Generation #
######################################
print('Generating formula question text...\n')
question_text = module4.get_question_text(formula_identifiers,identifier_values)
# Example
#question_text = 'What is the acceleration a, given velocity v = 6 m/s and time t = 2 s ?' # a = v/t = 3 m/s^2
# a) 'What is the force F, given mass m = 2 kg and acceleration a = 3 m/s^2 ?'
# b) 'What is the mass m, given force F = 6 N and acceleration a = 3 m/s^2 ?'
# c) 'What is the acceleration a, given Force F = 6 N and mass m = 2 kg ?'
# (randomize)
print(question_text,'\n')
#############
# STUDENT INPUT
print('Get student answer input...\n')
identifier_name, identifier_symbol = module5.get_lhs_identifier_properties(formula_identifiers)
answer_unit = None
while answer_unit == None:
answer_input = input(f'{identifier_name} {identifier_symbol} = ?')
answer_value,answer_unit = module5.get_answer_value_and_unit(answer_input)
print('\nParse answer input...\n')
print(f'Answer value: {answer_value}')
print(f'Answer unit: {answer_unit}\n')
# Example
# a = 3 m/s^2
###########################################
# Module 5: Solution Value and Unit Check #
###########################################
print('Check answer value and unit...\n')
# check solution value
solution_value = identifier_values[0]
value_correct = module5.check_value(solution_value,answer_value)
#value_correct = True
print(f'Solution value: {solution_value}')
print(f'Answer value: {answer_value}')
if value_correct:
print('Value answer correct!')
else:
print('Value answer incorrect!')
# 'correct'
print()
# check solution unit
solution_unit = formula_unit_dimension
unit_correct = module5.check_unit(solution_unit,answer_unit)
#unit_correct = True
print(f'Solution unit: {formula_unit_dimension}')
print(f'Answer unit: {answer_unit}')
if unit_correct:
print('Unit answer correct!')
else:
print('Unit answer incorrect!')
# 'correct'
print('\nEnd of system workflow.')