Commit a4dc0150 by Piotr Mitros

Bug fix. Not very tested

--HG--
branch : tolerance_bug
parent 7b49f21e
...@@ -19,6 +19,19 @@ global_context={'random':random, ...@@ -19,6 +19,19 @@ global_context={'random':random,
'calc':calc, 'calc':calc,
'eia':eia} 'eia':eia}
def compare_with_tolerance(v1, v2, tol):
''' Compare v1 to v2 with maximum tolerance tol
tol is relative if it ends in %; otherwise, it is absolute
'''
relative = "%" in tol
if relative:
tolerance = evaluator(dict(),dict(),tol[:-1]) * 0.01
tolerance = tolerance * max(abs(v1), abs(v2))
else:
tolerance = evaluator(dict(),dict(),tol)
return abs(v1-v2) <= tolerance
class numericalresponse(object): class numericalresponse(object):
def __init__(self, xml, context): def __init__(self, xml, context):
self.xml = xml self.xml = xml
...@@ -27,16 +40,15 @@ class numericalresponse(object): ...@@ -27,16 +40,15 @@ class numericalresponse(object):
self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default', self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default',
id=xml.get('id'))[0] id=xml.get('id'))[0]
self.tolerance = contextualize_text(self.tolerance, context) self.tolerance = contextualize_text(self.tolerance, context)
self.tolerance = evaluator(dict(),dict(),self.tolerance)
self.answer_id = xml.xpath('//*[@id=$id]//textline/@id', self.answer_id = xml.xpath('//*[@id=$id]//textline/@id',
id=xml.get('id'))[0] id=xml.get('id'))[0]
def grade(self, student_answers): def grade(self, student_answers):
''' Display HTML for a numeric response ''' ''' Display HTML for a numeric response '''
student_answer = student_answers[self.answer_id] student_answer = student_answers[self.answer_id]
error = abs(evaluator(dict(),dict(),student_answer) - self.correct_answer) correct = compare_with_tolerance (evaluator(dict(),dict(),student_answer), self.correct_answer, self.tolerance)
allowed_error = abs(self.correct_answer*self.tolerance)
if error <= allowed_error: if correct:
return {self.answer_id:'correct'} return {self.answer_id:'correct'}
else: else:
return {self.answer_id:'incorrect'} return {self.answer_id:'incorrect'}
...@@ -80,7 +92,6 @@ class formularesponse(object): ...@@ -80,7 +92,6 @@ class formularesponse(object):
self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default', self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default',
id=xml.get('id'))[0] id=xml.get('id'))[0]
self.tolerance = contextualize_text(self.tolerance, context) self.tolerance = contextualize_text(self.tolerance, context)
self.tolerance = evaluator(dict(),dict(),self.tolerance)
self.answer_id = xml.xpath('//*[@id=$id]//textline/@id', self.answer_id = xml.xpath('//*[@id=$id]//textline/@id',
id=xml.get('id'))[0] id=xml.get('id'))[0]
self.context = context self.context = context
...@@ -105,7 +116,7 @@ class formularesponse(object): ...@@ -105,7 +116,7 @@ class formularesponse(object):
student_result = evaluator(student_variables,dict(),student_answers[self.answer_id]) student_result = evaluator(student_variables,dict(),student_answers[self.answer_id])
if math.isnan(student_result) or math.isinf(student_result): if math.isnan(student_result) or math.isinf(student_result):
return {self.answer_id:"incorrect"} return {self.answer_id:"incorrect"}
if abs( student_result - instructor_result ) > self.tolerance: if not compare_with_tolerance(student_result, instructor_result, self.tolerance):
return {self.answer_id:"incorrect"} return {self.answer_id:"incorrect"}
return {self.answer_id:"correct"} return {self.answer_id:"correct"}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment