Commit e05e05f4 by Piotr Mitros

merge in tolerance bug fix

parents 7b49f21e fca78b83
...@@ -19,24 +19,36 @@ global_context={'random':random, ...@@ -19,24 +19,36 @@ 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_rel = evaluator(dict(),dict(),tol[:-1]) * 0.01
tolerance = tolerance_rel * 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
self.correct_answer = contextualize_text(xml.get('answer'), context) self.correct_answer = contextualize_text(xml.get('answer'), context)
self.correct_answer = float(self.correct_answer) self.correct_answer = float(self.correct_answer)
self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default', self.tolerance_xml = 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_xml, 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'}
...@@ -77,10 +89,9 @@ class formularesponse(object): ...@@ -77,10 +89,9 @@ class formularesponse(object):
self.xml = xml self.xml = xml
self.correct_answer = contextualize_text(xml.get('answer'), context) self.correct_answer = contextualize_text(xml.get('answer'), context)
self.samples = contextualize_text(xml.get('samples'), context) self.samples = contextualize_text(xml.get('samples'), context)
self.tolerance = xml.xpath('//*[@id=$id]//responseparam[@type="tolerance"]/@default', self.tolerance_xml = 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_xml, 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