def test_long_alternating_chain(): string = '0' expected = UC('0') for i in range(1, 1000): op_name, op_id = { 0: (' + ', IDs.ADD), 1: (' - ', IDs.SUB) }[i % 2] string += op_name + str(i) expected = Expression(op_id, expected, UC(str(i))) check_result(string, expected)
def test_10_deep_chain(): string = '2' expected = UC('2') for i in list(range(10)): string = 'sqrt('+string+')' expected = Expression(IDs.SQRT, expected) print(string) check_result(string, expected)
def test_unnamed_constants(): assert from_root('pi').unnamed_constants == set() assert from_numexpr('2').unnamed_constants == {'2'} assert from_numexpr('2e-3').unnamed_constants == {'2e-3'} assert from_numexpr('A').unnamed_constants == set() assert from_numexpr('A + A').unnamed_constants == set() assert from_numexpr('A + B').unnamed_constants == set() assert from_numexpr('A + A*A - 3e7').unnamed_constants == {'3e7'} assert from_numexpr('arctan2(A, A)').unnamed_constants == set() assert from_numexpr('arctan2(A, B)').unnamed_constants == set() assert from_root('arctan2(A, pi)').unnamed_constants == set() assert from_numexpr('arctan2(arctan2(A, B), C)').unnamed_constants == set() for base, expect in [(UC('2'), {'2'}), (Variable('A'), set()), (NC(ConstantIDs.PI), set())]: expr = base for i in list(range(100)): expr = Expression(IDs.SQRT, expr) assert expr.unnamed_constants == expect
def test_get_variables(): assert from_root('pi').variables == set() assert from_numexpr('2').variables == set() assert from_numexpr('2e-3').variables == set() assert from_numexpr('A').variables == set(['A']) assert from_numexpr('A + A').variables == set(['A']) assert from_numexpr('A + B').variables == set(['A', 'B']) assert from_numexpr('A + A*A - 3e7').variables == set(['A']) assert from_numexpr('arctan2(A, A)').variables == set(['A']) assert from_numexpr('arctan2(A, B)').variables == set(['A', 'B']) assert from_root('arctan2(A, pi)').variables == set(['A']) assert from_numexpr('arctan2(arctan2(A, B), C)').variables == set( ['A', 'B', 'C']) for base, expect in [(UC('2'), set()), (Variable('A'), set(['A'])), (NC(ConstantIDs.PI), set())]: expr = base for i in list(range(100)): expr = Expression(IDs.SQRT, expr) assert expr.variables == expect
def test_not(): aee(~Expression(IDs.SQRT, UC('2')), Expression(IDs.NOT, Expression(IDs.SQRT, UC('2'))))
def test_subtraction(): aee(Expression(IDs.SQRT, UC('2')) - Expression(IDs.SQRT, UC('3')), Expression(IDs.SUB, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3')))) expression = Expression(IDs.SQRT, UC('2')) expression -= Expression(IDs.SQRT, UC('3')) aee(expression, Expression(IDs.SUB, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3')))) aee(np.subtract(Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))), Expression(IDs.SUB, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_expm1(): aee(np.expm1(Expression(IDs.SQRT, UC('2'))), Expression(IDs.EXPM1, Expression(IDs.SQRT, UC('2'))))
def test_log1p(): aee(np.log1p(Expression(IDs.SQRT, UC('2'))), Expression(IDs.LOG1p, Expression(IDs.SQRT, UC('2'))))
def test_less_than_or_equal(): aee(Expression(IDs.SQRT, UC('2')) <= Expression(IDs.SQRT, UC('3')), Expression(IDs.LTEQ, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_less_than(): aee(Expression(IDs.SQRT, UC('2')) < Expression(IDs.SQRT, UC('3')), Expression(IDs.LT, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_greater_than_or_equal(): aee(Expression(IDs.SQRT, UC('2')) >= Expression(IDs.SQRT, UC('3')), Expression(IDs.GTEQ, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_greater_than(): aee(Expression(IDs.SQRT, UC('2')) > Expression(IDs.SQRT, UC('3')), Expression(IDs.GT, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_not_equals(): aee(Expression(IDs.SQRT, UC('2')) != Expression(IDs.SQRT, UC('3')), Expression(IDs.NEQ, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_equals(): aee(Expression(IDs.SQRT, UC('2')) == Expression(IDs.SQRT, UC('3')), Expression(IDs.EQ, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_abs(): aee(abs(Expression(IDs.SQRT, UC('2'))), Expression(IDs.ABS, Expression(IDs.SQRT, UC('2')))) aee(np.abs(Expression(IDs.SQRT, UC('2'))), Expression(IDs.ABS, Expression(IDs.SQRT, UC('2'))))
def test_log(): aee(np.log(Expression(IDs.SQRT, UC('2'))), Expression(IDs.LOG, Expression(IDs.SQRT, UC('2'))))
def test_log10(): aee(np.log10(Expression(IDs.SQRT, UC('2'))), Expression(IDs.LOG10, Expression(IDs.SQRT, UC('2'))))
def test_sin(): aee(np.sin(Expression(IDs.SQRT, UC('2'))), Expression(IDs.SIN, Expression(IDs.SQRT, UC('2'))))
def test_exp(): aee(np.exp(Expression(IDs.SQRT, UC('2'))), Expression(IDs.EXP, Expression(IDs.SQRT, UC('2'))))
def test_arctan2(): aee(np.arctan2(Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))), Expression(IDs.ATAN2, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))))
def test_sqrt(): aee(np.sqrt(Expression(IDs.SQRT, UC('2'))), Expression(IDs.SQRT, Expression(IDs.SQRT, UC('2'))))
def test_cosh(): aee(np.cosh(Expression(IDs.SQRT, UC('2'))), Expression(IDs.COSH, Expression(IDs.SQRT, UC('2'))))
def test_addition(): aee(Expression(IDs.SQRT, UC('2')) + Expression(IDs.SQRT, UC('3')), Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3')))) aee(Expression(IDs.SQRT, UC('2')) + UC('3'), Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), UC('3'))) aee(UC('3') + Expression(IDs.SQRT, UC('2')), Expression(IDs.ADD, UC('3'), Expression(IDs.SQRT, UC('2')))) expression = Expression(IDs.SQRT, UC('2')) expression += Expression(IDs.SQRT, UC('3')) aee(expression, Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3')))) expression = Expression(IDs.SQRT, UC('2')) expression += UC('3') aee(expression, Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), UC('3'))) expression = UC('3') expression += Expression(IDs.SQRT, UC('2')) aee(expression, Expression(IDs.ADD, UC('3'), Expression(IDs.SQRT, UC('2')))) aee(np.add(Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3'))), Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), Expression(IDs.SQRT, UC('3')))) aee(np.add(Expression(IDs.SQRT, UC('2')), UC('3')), Expression(IDs.ADD, Expression(IDs.SQRT, UC('2')), UC('3'))) aee(np.add(UC('3'), Expression(IDs.SQRT, UC('2'))), Expression(IDs.ADD, UC('3'), Expression(IDs.SQRT, UC('2'))))
def test_tanh(): aee(np.tanh(Expression(IDs.SQRT, UC('2'))), Expression(IDs.TANH, Expression(IDs.SQRT, UC('2'))))
def test_long_chain(): args = [UC(str(i)) for i in range(1000)] check_result(' + '.join(map(str, args)), Expression(IDs.ADD, *args))
def test_arcsinh(): aee(np.arcsinh(Expression(IDs.SQRT, UC('2'))), Expression(IDs.ASINH, Expression(IDs.SQRT, UC('2'))))
def test_3_deep_chain(): string = 'sqrt(sqrt(sqrt(2)))' expected = Expression(IDs.SQRT, Expression(IDs.SQRT, Expression(IDs.SQRT, UC('2')))) check_result(string, expected)
def test_arccosh(): aee(np.arccosh(Expression(IDs.SQRT, UC('2'))), Expression(IDs.ACOSH, Expression(IDs.SQRT, UC('2'))))
def test_invalid_arg_parse(): with pytest.raises(ValueError): from_numexpr(Expression(IDs.SQRT, UC('2')))
def test_arctanh(): aee(np.arctanh(Expression(IDs.SQRT, UC('2'))), Expression(IDs.ATANH, Expression(IDs.SQRT, UC('2'))))