1+ import logging
12from typing import Any
23from sympy import simplify_logic , Equivalent
34from lf_toolkit .evaluation import Result , Params
45from lf_toolkit .parse .set import SetParser , LatexPrinter , SymPyBooleanTransformer , ASCIIPrinter
56
67from .parse import parse_with_feedback , FeedbackException
78
9+ logger = logging .getLogger (__name__ )
10+ logging .basicConfig (level = logging .DEBUG , format = "%(levelname)s [%(name)s] %(message)s" )
11+
812def evaluation_function (
913 response : Any ,
1014 answer : Any ,
@@ -33,36 +37,58 @@ def evaluation_function(
3337 to output the evaluation response.
3438 """
3539
40+ logger .debug ("evaluation_function called" )
41+ logger .debug ("response type=%s value=%r" , type (response ).__name__ , response )
42+ logger .debug ("answer type=%s value=%r" , type (answer ).__name__ , answer )
43+ logger .debug ("params value=%r" , params )
44+
3645 parser = SetParser .instance ()
3746 sympyTransformer = SymPyBooleanTransformer ()
3847
3948 # here we want to compare the response set with the example solution set.
4049 # we have to do the following steps
4150
4251 try :
52+ is_latex = params .get ("is_latex" , False )
53+ logger .debug ("is_latex=%r" , is_latex )
54+
4355 # 1. convert the `response`, which may be a latex string, to a sympy expression
44- responseSet = parse_with_feedback (response , latex = params .get ("is_latex" , False ))
56+ logger .debug ("parsing response..." )
57+ responseSet = parse_with_feedback (response , latex = is_latex )
58+ logger .debug ("responseSet=%r" , responseSet )
4559 responseSetSympy = sympyTransformer .transform (responseSet )
60+ logger .debug ("responseSetSympy=%r" , responseSetSympy )
4661
4762 # 2. convert the `answer`, which may be a latex string, to a sympy expression
4863 # TODO: what if answer is also in latex? how do we know?
49- answerSet = parser .parse (answer , latex = False )
64+ logger .debug ("parsing answer..." )
65+ try :
66+ answerSet = parser .parse (answer , latex = False )
67+ except Exception as e :
68+ logger .error ("failed to parse answer: type=%s value=%r error=%r" , type (answer ).__name__ , answer , e )
69+ raise FeedbackException () from e
70+ logger .debug ("answerSet=%r" , answerSet )
5071 answerSetSympy = sympyTransformer .transform (answerSet )
72+ logger .debug ("answerSetSympy=%r" , answerSetSympy )
5173
5274 # 3. compare the two sympy expressions w/ simplification enabled.
5375 # If they are equal, the sets produced by the two expressions are
5476 # semantically equal. However, the expressions may not be equal.
5577 semantic_equal = simplify_logic (Equivalent (responseSetSympy , answerSetSympy )) == True
78+ logger .debug ("semantic_equal=%r" , semantic_equal )
5679
5780 # 4. compare the two sympy expressions w/ simplifaction disabled.
5881 # If they are equal, the expressions are also equal in syntax.
5982 # This respects laws of commutativity, e.g. A u B == B u A.
6083 syntactic_equal = responseSetSympy == answerSetSympy
84+ logger .debug ("syntactic_equal=%r" , syntactic_equal )
6185
6286 enforce_expression_equality = params .get ("enforce_expression_equality" , False )
87+ logger .debug ("enforce_expression_equality=%r" , enforce_expression_equality )
6388
6489 # 5. `is_correct` is True, iff 3) is True, and either 4) or `enforce_expression_equality` is True
6590 is_correct = semantic_equal and (syntactic_equal or not enforce_expression_equality )
91+ logger .debug ("is_correct=%r" , is_correct )
6692
6793 feedback_items = []
6894
@@ -84,6 +110,7 @@ def evaluation_function(
84110 feedback_items = feedback_items ,
85111 )
86112 except FeedbackException as e :
113+ logger .error ("FeedbackException: %r" , e )
87114 return Result (
88115 is_correct = False ,
89116 feedback_items = [("parse_error" , str (e ))]
0 commit comments