Esempio n. 1
0
 def test_bad_strings(self):
     for s in BAD_STRINGS:
         try:
             process_sympy(s)
         except:
             pass
         else:
             self.fail('No exception raised for bad input %s' % s)
Esempio n. 2
0
    def test_explicit_latex(self):

        test_cases = [
            ('0x', Mul(0, x, evaluate=False)),
            ('0 = 0', Eq(0, 0)),
            ('0 = 1', Eq(0, 1)),
            ('10x = 10x', Eq(10 * x, 10 * x)),
            (r'\sin ^ { - 1 } ( x )', asin(x)),
            (r'\cos^{-1}x', acos(x)),
            (r'\tan^ {-1 }x', atan(x)),
            (r'\cot^ {-1 }x', acot(x)),
            (r'\sinh^{-1}(x)', asinh(x)),
            (r'\sqrt{-1}', I),
            (r'\exp{x}', exp(x)),
            (r'\exp(x)', exp(x)),
            ('e^{x}', E**x),
        ]

        failed_tests = []
        for s_l_expr, expr in test_cases:
            l_expr = process_sympy(s_l_expr)
            equiv = equivalent(expr, l_expr)
            if not equiv:
                print '%s %s' % (s_l_expr, 'PASSED' if equiv else 'FAILED')
                failed_tests.append((s_l_expr, l_expr))
                print 'sympy: %s\nlatex: %s\n' % (expr, l_expr)

        if failed_tests:
            print len(failed_tests), 'failed test cases'
        assert len(failed_tests) == 0
Esempio n. 3
0
    def test_generated_cases(self):

        failed_tests = []
        n_tests = 20
        print 'Generating', n_tests, 'test_cases\n'
        for _ in np.arange(n_tests):
            n_terms = np.random.randint(1, high=5)
            expr = generate_term()
            for _ in np.arange(n_terms - 1):
                term = generate_term()
                op = np.random.choice(ops)
                if op == '+':
                    expr = expr + term
                elif op == '-':
                    expr = expr - term
                elif op == '*':
                    expr = expr * term
                elif op == '/':
                    expr = expr / term
                elif op == '^':
                    expr = expr**term
                else:
                    assert False
            s_l_expr = latex(expr)
            try:
                l_expr = process_sympy(s_l_expr)
                equiv = equivalent(expr, l_expr)
                e = None
            except Exception as e:
                # Parsing failed
                l_expr = None
                equiv = False
            if not equiv:
                print '%s %s' % (s_l_expr, 'PASSED' if equiv else 'FAILED')
                failed_tests.append((s_l_expr, l_expr))
                print 'sympy: %s\nlatex: %s' % (expr, l_expr)
                if e is not None:
                    print e
                print

        if failed_tests:
            print len(failed_tests), 'failed test cases'
        assert len(failed_tests) == 0
Esempio n. 4
0
    def test_parsing_failures(self):

        test_cases = [
            r'\poo',  # \poo is not a control sequence
            r'\sqrt{\x}',  # \x is not a control sequence
            # Syntax errors
            '(x',
            'x)',
            '{x',
            '}x',
            'x}',
            'x{',
            '{',
            '}',
            'x^',
            'x_',
            'x^_',
            'x_^',
            # Misinterpreted legitimate control sequences do not fail and give incorrect output; treat them as cases that should fail until interpreted
            r'\frac{\partial^2U}{\partial y^2}',  # partial derivative
            r'\cos 90^\circ',  # degrees
            r'\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}}',  # continued fraction
            r'\dfrac{1}{2}',  # display mode
            r'\binom{9}{3}',  # binomial coefficient
        ]

        failed_tests = []
        for s_l_expr in test_cases:
            try:
                l_expr = process_sympy(s_l_expr)
                passed = False
            except:
                passed = True
            if not passed:
                print '%s %s' % (s_l_expr, 'PASSED' if passed else 'FAILED')
                failed_tests.append((s_l_expr, l_expr))
                print '  %s\n' % l_expr

        if failed_tests:
            print len(failed_tests), 'failed test cases'
        assert len(failed_tests) == 0
Esempio n. 5
0
    def test_nyi(self):

        test_cases = [
            r'\int^5_1 2x\,dx = 24',  # small space \,
        ]

        failed_tests = []
        for s_l_expr in test_cases:
            try:
                l_expr = process_sympy(s_l_expr)
                passed = True
                e = None
            except Exception as e:
                passed = False
                l_expr = None
            if not passed:
                failed_tests.append((s_l_expr, l_expr))
                print '%s %s' % (s_l_expr, 'PASSED' if passed else 'FAILED')
                if e is not None:
                    print '%s\n' % e

        if failed_tests:
            print len(failed_tests), 'failed test cases'
        assert len(failed_tests) == 0
Esempio n. 6
0
    'student_answers': ['-3y + 2x']
}, {
    'correct_answer':
    'x\\times x',
    'student_answers': ['x\\times x', 'x\\cdot x', 'x^2', '(\\sqrt{x})^{4}']
}, {
    'correct_answer': '23e^{-1\\times \\sqrt{t^2}}',
    'student_answers': ['23e^{-t}']
}, {
    'correct_answer': 'a=x^2+1',
    'student_answers': ['x^2+1=a']
}]

for answer_set in answer_sets:
    correct_answer = answer_set['correct_answer']
    correct_answer_parsed = process_sympy(answer_set['correct_answer'])
    for student_answer in answer_set['student_answers']:
        student_answer_parsed = process_sympy(student_answer)
        print('correct_answer (c): ', correct_answer, correct_answer_parsed)
        print('student_answer (a): ', student_answer, student_answer_parsed)
        print('')
        print('Expression Tree (srepr(c) == srepr(a)) =>',
              srepr(correct_answer_parsed) == srepr(student_answer_parsed))
        print('srepr(c) =>', srepr(correct_answer_parsed))
        print('srepr(a) =>', srepr(student_answer_parsed))
        print('')
        # print('Structural (c == a) =>', correct_answer_parsed == student_answer_parsed)
        print('Symbolic (simplify(c - s) == 0) =>',
              simplify(correct_answer_parsed - student_answer_parsed) == 0)
        print('simplified =>',
              simplify(correct_answer_parsed - student_answer_parsed))
Esempio n. 7
0
from latex2sympy import process_sympy
from sympy import *
import sys
sys.path.append("..")

theta = Symbol('theta', real=True)

latex = "\\begin{matrix}1&2\\\\3&4\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))

latex = "\\begin{matrix}1&2\\\\3&4\\\\5&6\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))

latex = "\\begin{matrix}1&2&3\\\\4&5&6\\\\7&8&9\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))

latex = "\\begin{matrix}x^1&x^2&x^3\\\\y^1&y^2&y^3\\\\z^1&z^2&z^3\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))

latex = "\\begin{matrix}x\\\\y\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))

latex = "2\\cdot\\begin{matrix}x\\\\y\\end{matrix}"
math = process_sympy(latex)
print("latex: %s to math: %s" % (latex, math))
Esempio n. 8
0
v = Matrix([1, 2])

# sub settings
sub_settings_symbols = {}
sub_settings_symbols[Symbol('M' + hashlib.md5('M'.encode()).hexdigest(),
                            real=True)] = M
sub_settings_symbols[Symbol('v' + hashlib.md5('v'.encode()).hexdigest(),
                            real=True)] = v

# one parameters
latex = "\\begin{matrix}1&2\\\\3&4\\end{matrix}\\cdot[!v!]"
equation_sympy_check = MatMul(
    M, Symbol('v' + hashlib.md5('v'.encode()).hexdigest(), real=True))
equation_sympy_subs_check = MatMul(M, v)
# placeholders
equation_sympy = process_sympy(latex)
print('latex = %s' % latex)
print('equation_sympy = %s' % equation_sympy)
print('equation_sympy_check = %s' % equation_sympy_check)
print('equation_sympy = %s' % (srepr(equation_sympy)))

equation_sympy_subs = equation_sympy.subs(sub_settings_symbols, evaluate=False)
print('equation_sympy_subs = %s' % equation_sympy_subs)
print('equation_sympy_subs_check = %s' % equation_sympy_subs_check)

# two parameters

# sub settings
print('')
print('============== Two Parameters -> M*v = Matrix*Vector =============')
sub_settings_symbols = {}
Esempio n. 9
0
 def test_good_pairs(self):
     for s, eq in GOOD_PAIRS:
         print 'test_good_pairs:', 'input:', s, 'output:', str(eq)
         self.assertEqual(process_sympy(s), eq)
Esempio n. 10
0
    def test_static_cases(self):

        test_cases = [
            # Linear algebra
            1 * x,
            Eq(8 * x, 0),
            Eq(10 * x, 5),
            Eq(x - 4 * x, -21),
            Eq(3 * x, 21),
            Eq(2 + 5, x),
            Eq(3 * (x - 4), x),
            Eq(12, 2 * x),
            Eq(3 * (x - 4) / x, 1),
            Eq(12 / x, 2),
            0.5 * x + 0.1,
            Rational(1, 10) + Rational(1, 2) * x,
            Add(x, 2 * x, -3 * x, evaluate=False),
            # Trigonometry
            sin(x),
            cos(x),
            tan(x),
            csc(x),
            sec(x),
            cot(x),
            1 - sin(x)**2,
            cos(x)**2,
            Eq(sin(x)**2, x),
            Eq(-x, 1 - cos(x)**2 - 2 * x),
            sin(2 * x),
            2 * sin(x) * cos(x),
            Eq(1 - sin(2 * x), 0),
            Eq(sin(x)**2, 2 * sin(x) * cos(x) - cos(x)**2),
            cos(x * y),
            acos(x),
            Pow(cos(x), 1, evaluate=False),
            Pow(cos(x), 0, evaluate=False),
            # Hyperbolic functions
            sinh(x),
            cosh(x),
            tanh(x),
            #csch(x),
            #sech(x),
            #coth(x),
            # Exponential
            E,
            sqrt(E),
            E**x,
            exp(x),
            exp(ln(x), evaluate=False),
            # Imaginary/Complex
            I,
            3 + 8 * I,
            re(x + I * y, evaluate=False),
            im(x + y * I, evaluate=False),
            re(1 - I, evaluate=False),
            im(1 - I, evaluate=False),
            E**(I * theta),
            # Infinity
            oo,
            Add(oo, oo, evaluate=False),
            Add(oo, Mul(3, oo, evaluate=False), evaluate=False),
            -oo,
            Add(-oo, -oo, evaluate=False),
            Mul(-2, oo, evaluate=False),
            Mul(-2, -oo, evaluate=False),
            Mul(-2, -oo, -5, evaluate=False),
            # Calculus
            Limit(x**2, x, theta),
            # Miscellaneous
            Abs(x),
            parse_expr('n!'),
            parse_expr('n!!'),
            factorial2(2 * x + y),
            pi,
            Pow(0, 0, evaluate=False),
        ]

        failed_tests = []
        for expr in test_cases:
            try:
                s_l_expr = latex(expr)
                l_expr = process_sympy(s_l_expr)
                equiv = equivalent(expr, l_expr)
                e = None
            except Exception as e:
                # Parsing failed
                l_expr = None
                equiv = False
            if not equiv:
                print '%s %s' % (s_l_expr, 'PASSED' if equiv else 'FAILED')
                failed_tests.append((s_l_expr, l_expr))
                print 'sympy: %s\nlatex: %s' % (expr, l_expr)
                if e is not None:
                    print e
                print

        if failed_tests:
            print len(failed_tests), 'failed test cases'
        assert len(failed_tests) == 0