Spaces:
Running
Running
Update app.py
Browse filesFor Wolfram Verification, added specialized handling for different types of calculus problems and improved answer comparison
app.py
CHANGED
@@ -60,11 +60,32 @@ def parse_questions(content):
|
|
60 |
def verify_solution(problem, answer):
|
61 |
"""Verify a mathematical solution using Wolfram Alpha"""
|
62 |
try:
|
63 |
-
#
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
query = query.strip()
|
|
|
68 |
|
69 |
result = wolfram_client.query(query)
|
70 |
|
@@ -77,15 +98,28 @@ def verify_solution(problem, answer):
|
|
77 |
|
78 |
# Look for numerical results in multiple pods
|
79 |
for pod in result.pods:
|
80 |
-
if pod.title in ['Result', 'Solution', 'Numerical result', 'Decimal approximation']:
|
81 |
wolfram_answer = pod.text
|
82 |
-
#
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
return {
|
90 |
'verified': is_verified,
|
91 |
'wolfram_solution': wolfram_answer,
|
@@ -95,7 +129,7 @@ def verify_solution(problem, answer):
|
|
95 |
return {
|
96 |
'verified': False,
|
97 |
'wolfram_solution': None,
|
98 |
-
'error': "No
|
99 |
}
|
100 |
except Exception as e:
|
101 |
return {
|
@@ -104,6 +138,7 @@ def verify_solution(problem, answer):
|
|
104 |
'error': f"Error during verification: {str(e)}"
|
105 |
}
|
106 |
|
|
|
107 |
def generate_test(subject):
|
108 |
"""Generate and verify a math test"""
|
109 |
try:
|
|
|
60 |
def verify_solution(problem, answer):
|
61 |
"""Verify a mathematical solution using Wolfram Alpha"""
|
62 |
try:
|
63 |
+
# First, determine the type of problem
|
64 |
+
if "lim" in problem.lower():
|
65 |
+
# Format limit problem
|
66 |
+
# Extract the expression and point of evaluation
|
67 |
+
expr = re.search(r'lim.*?(\d+\/[x-]+\d+)', problem)
|
68 |
+
if expr:
|
69 |
+
query = f"limit of {expr.group(1)} as x approaches 2"
|
70 |
+
elif "integral" in problem.lower():
|
71 |
+
# Format integral problem
|
72 |
+
# Extract the integrand and limits
|
73 |
+
expr = re.search(r'\int_0\^1.*?([\dx+]+).*?dx', problem)
|
74 |
+
if expr:
|
75 |
+
query = f"integrate {expr.group(1)} from 0 to 1"
|
76 |
+
elif "derivative" in problem.lower() or "f(x)" in problem:
|
77 |
+
# Format derivative problem
|
78 |
+
# Extract the function to differentiate
|
79 |
+
expr = re.search(r'f\(x\)\s*=\s*([^\s]+)', problem)
|
80 |
+
if expr:
|
81 |
+
query = f"d/dx ({expr.group(1)})"
|
82 |
+
else:
|
83 |
+
# Default cleanup for other types of problems
|
84 |
+
query = problem.replace('$$', '').replace('$', '')
|
85 |
+
query = re.sub(r'(?i)find|calculate|solve|evaluate|determine', '', query)
|
86 |
+
|
87 |
query = query.strip()
|
88 |
+
print(f"Sending query to Wolfram Alpha: {query}") # Debug print
|
89 |
|
90 |
result = wolfram_client.query(query)
|
91 |
|
|
|
98 |
|
99 |
# Look for numerical results in multiple pods
|
100 |
for pod in result.pods:
|
101 |
+
if pod.title in ['Result', 'Solution', 'Numerical result', 'Decimal approximation', 'Limit', 'Definite integral', 'Derivative']:
|
102 |
wolfram_answer = pod.text
|
103 |
+
print(f"Wolfram Alpha pod {pod.title}: {wolfram_answer}") # Debug print
|
104 |
+
|
105 |
+
# For numerical answers
|
106 |
+
if answer.isdigit() or answer.replace('.', '').isdigit():
|
107 |
+
wolfram_nums = re.findall(r'[-+]?(?:\d*\.)?\d+', wolfram_answer)
|
108 |
+
if wolfram_nums:
|
109 |
+
wolfram_value = float(wolfram_nums[0])
|
110 |
+
user_value = float(answer)
|
111 |
+
is_verified = abs(wolfram_value - user_value) < 0.01
|
112 |
+
return {
|
113 |
+
'verified': is_verified,
|
114 |
+
'wolfram_solution': wolfram_answer,
|
115 |
+
'error': None
|
116 |
+
}
|
117 |
+
# For symbolic answers (like derivatives)
|
118 |
+
else:
|
119 |
+
# Clean up both answers for comparison
|
120 |
+
clean_wolfram = re.sub(r'\s+', '', wolfram_answer.lower())
|
121 |
+
clean_answer = re.sub(r'\s+', '', answer.lower())
|
122 |
+
is_verified = clean_wolfram == clean_answer
|
123 |
return {
|
124 |
'verified': is_verified,
|
125 |
'wolfram_solution': wolfram_answer,
|
|
|
129 |
return {
|
130 |
'verified': False,
|
131 |
'wolfram_solution': None,
|
132 |
+
'error': "No suitable solution found in Wolfram Alpha response"
|
133 |
}
|
134 |
except Exception as e:
|
135 |
return {
|
|
|
138 |
'error': f"Error during verification: {str(e)}"
|
139 |
}
|
140 |
|
141 |
+
|
142 |
def generate_test(subject):
|
143 |
"""Generate and verify a math test"""
|
144 |
try:
|