diff --git a/djangoapps/courseware/capa/calc.py b/djangoapps/courseware/capa/calc.py index 63c5c9de01..fb64c58139 100644 --- a/djangoapps/courseware/capa/calc.py +++ b/djangoapps/courseware/capa/calc.py @@ -5,6 +5,7 @@ import operator import re import numpy +import numbers import scipy.constants from pyparsing import Word, alphas, nums, oneOf, Literal @@ -121,7 +122,7 @@ def evaluator(variables, functions, string, cs=False): def number_parse_action(x): # [ '7' ] -> [ 7 ] return [super_float("".join(x))] def exp_parse_action(x): # [ 2 ^ 3 ^ 2 ] -> 512 - x = [e for e in x if type(e) in [float, numpy.float64, numpy.complex]] # Ignore ^ + x = [e for e in x if isinstance(e, numbers.Number)] # Ignore ^ x.reverse() x=reduce(lambda a,b:b**a, x) return x @@ -130,7 +131,7 @@ def evaluator(variables, functions, string, cs=False): return x[0] if 0 in x: return float('nan') - x = [1./e for e in x if type(e) == float] # Ignore ^ + x = [1./e for e in x if isinstance(e, numbers.Number)] # Ignore || return 1./sum(x) def sum_parse_action(x): # [ 1 + 2 - 3 ] -> 0 total = 0.0 @@ -217,4 +218,7 @@ if __name__=='__main__': print evaluator({},{}, "-(7+5)") print evaluator({},{}, "-0.33") print evaluator({},{}, "-.33") + print evaluator({},{}, "5+1*j") + print evaluator({},{}, "j||1") + print evaluator({},{}, "e^(j*pi)") print evaluator({},{}, "5+7 QWSEKO") diff --git a/djangoapps/courseware/tests.py b/djangoapps/courseware/tests.py index b0d7cad19f..2b2b354177 100644 --- a/djangoapps/courseware/tests.py +++ b/djangoapps/courseware/tests.py @@ -20,7 +20,7 @@ class ModelsTest(unittest.TestCase): variables={'R1':2.0, 'R3':4.0} functions={'sin':numpy.sin, 'cos':numpy.cos} - self.assertEqual(calc.evaluator(variables, functions, "10000||sin(7+5)-6k"), 4000.0) + self.assertTrue(abs(calc.evaluator(variables, functions, "10000||sin(7+5)+0.5356"))<0.01) self.assertEqual(calc.evaluator({'R1': 2.0, 'R3':4.0}, {}, "13"), 13) self.assertEqual(calc.evaluator(variables, functions, "13"), 13) self.assertEqual(calc.evaluator({'a': 2.2997471478310274, 'k': 9, 'm': 8, 'x': 0.66009498411213041}, {}, "5"), 5) @@ -30,6 +30,8 @@ class ModelsTest(unittest.TestCase): self.assertEqual(calc.evaluator(variables, functions, "R1*R3"), 8.0) self.assertTrue(abs(calc.evaluator(variables, functions, "sin(e)-0.41"))<0.01) self.assertTrue(abs(calc.evaluator(variables, functions, "k*T/q-0.025"))<0.001) + self.assertTrue(abs(calc.evaluator(variables, functions, "e^(j*pi)")+1)<0.00001) + self.assertTrue(abs(calc.evaluator(variables, functions, "j||1")-0.5-0.5j)<0.00001) exception_happened = False try: calc.evaluator({},{}, "5+7 QWSEKO")