Skip to content

Commit 87b6aa3

Browse files
Improved feedback customization
Added ability to replace feedback generated by a specific tag
1 parent 472319a commit 87b6aa3

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

app/evaluation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ def generate_feedback(main_criteria, criteria_graphs, evaluation_parameters):
205205
response = evaluation_parameters["reserved_expressions"]["response"]
206206
criteria_feedback = set()
207207
is_correct = True
208+
custom_feedback = evaluation_parameters.get("custom_feedback",{})
208209
for (criterion_identifier, graph) in criteria_graphs.items():
209210
# TODO: Find better way to identify main criteria for criteria graph
210211
main_criteria = criterion_identifier+"_TRUE"
@@ -219,7 +220,7 @@ def generate_feedback(main_criteria, criteria_graphs, evaluation_parameters):
219220
# assumption that some way to return partial feedback
220221
# before script has executed completely will be available
221222
# in the future
222-
evaluation_result.add_feedback_from_tags(criteria_feedback, graph)
223+
evaluation_result.add_feedback_from_tags(criteria_feedback, graph, custom_feedback=custom_feedback)
223224
evaluation_result.is_correct = is_correct
224225
return
225226

@@ -317,6 +318,7 @@ def evaluation_function(response, answer, params, include_test_data=False) -> di
317318
"numerical": parameters.get("numerical", False),
318319
"atol": parameters.get("atol", 0),
319320
"rtol": parameters.get("rtol", 0),
321+
"custom_feedback": parameters.get("custom_feedback",{}),
320322
}
321323
)
322324

app/tests/example_tests.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,5 +608,41 @@ def test_custom_comparison_with_criteria_contains(self, response, value, tags):
608608
assert result["is_correct"] is value
609609
assert set(tags) == set(result["tags"])
610610

611+
@pytest.mark.parametrize(
612+
"response, answer, criteria, value, feedback_tags, custom_feedback, additional_params",
613+
[
614+
(
615+
"2*x^2+0.5+0.25*sin(x)^2",
616+
"2x^2",
617+
"answer <= response, 2+answer > response",
618+
False,
619+
[
620+
"answer <= response_TRUE",
621+
"2+answer > response_UNKNOWN",
622+
],
623+
{
624+
"answer <= response_TRUE": "AAA",
625+
"2+answer > response_UNKNOWN": "BBB",
626+
},
627+
{
628+
"symbol_assumptions": "('x', 'real')",
629+
}
630+
),
631+
]
632+
)
633+
def test_criteria_custom_feedback(self, response, answer, criteria, value, feedback_tags, custom_feedback, additional_params):
634+
params = {
635+
"strict_syntax": False,
636+
"elementary_functions": True,
637+
"criteria": criteria,
638+
"custom_feedback": custom_feedback,
639+
}
640+
params.update(additional_params)
641+
result = evaluation_function(response, answer, params, include_test_data=True)
642+
assert result["is_correct"] is value
643+
assert set(feedback_tags) == set(result["tags"])
644+
for string in custom_feedback.values():
645+
assert string in result["feedback"]
646+
611647
if __name__ == "__main__":
612648
pytest.main(['-sk not slow', "--tb=line", os.path.abspath(__file__)])

app/utility/evaluation_result_utilities.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,18 @@ def add_feedback(self, feedback_item):
2525
raise TypeError("Feedback must be on the form (tag, feedback).")
2626
self._feedback_tags
2727

28-
def add_feedback_from_tags(self, tags, graph):
28+
def add_feedback_from_tags(self, tags, graph, custom_feedback=None):
29+
if custom_feedback is None:
30+
custom_feedback = {}
2931
for (tag, inputs) in tags.items():
3032
if tag not in self._feedback_tags.keys():
31-
if inputs is None:
32-
feedback_string = graph.criteria[tag].feedback_string_generator(dict())
33+
if tag in custom_feedback.keys():
34+
feedback_string = custom_feedback[tag]
3335
else:
34-
feedback_string = graph.criteria[tag].feedback_string_generator(inputs)
36+
if inputs is None:
37+
feedback_string = graph.criteria[tag].feedback_string_generator(dict())
38+
else:
39+
feedback_string = graph.criteria[tag].feedback_string_generator(inputs)
3540
self.add_feedback((tag, feedback_string))
3641

3742
def add_criteria_graph(self, name, graph):

0 commit comments

Comments
 (0)