From 100a2906f7760ec1b434b2cd304cfb752fabda1e Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Fri, 24 May 2024 10:49:35 +0530 Subject: [PATCH 1/3] Implement symbolic sign function --- src/libasr/pass/intrinsic_function_registry.h | 6 ++++++ src/libasr/pass/intrinsic_functions.h | 2 ++ src/libasr/pass/replace_symbolic.cpp | 1 + src/lpython/semantics/python_ast_to_asr.cpp | 4 ++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libasr/pass/intrinsic_function_registry.h b/src/libasr/pass/intrinsic_function_registry.h index 9d26a37954..d68cba8207 100644 --- a/src/libasr/pass/intrinsic_function_registry.h +++ b/src/libasr/pass/intrinsic_function_registry.h @@ -154,6 +154,7 @@ inline std::string get_intrinsic_name(int x) { INTRINSIC_NAME_CASE(SymbolicLog) INTRINSIC_NAME_CASE(SymbolicExp) INTRINSIC_NAME_CASE(SymbolicAbs) + INTRINSIC_NAME_CASE(SymbolicSign) INTRINSIC_NAME_CASE(SymbolicHasSymbolQ) INTRINSIC_NAME_CASE(SymbolicAddQ) INTRINSIC_NAME_CASE(SymbolicMulQ) @@ -448,6 +449,8 @@ namespace IntrinsicElementalFunctionRegistry { {nullptr, &SymbolicExp::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicAbs), {nullptr, &SymbolicAbs::verify_args}}, + {static_cast(IntrinsicElementalFunctions::SymbolicSign), + {nullptr, &SymbolicSign::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicHasSymbolQ), {nullptr, &SymbolicHasSymbolQ::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicAddQ), @@ -739,6 +742,8 @@ namespace IntrinsicElementalFunctionRegistry { "SymbolicExp"}, {static_cast(IntrinsicElementalFunctions::SymbolicAbs), "SymbolicAbs"}, + {static_cast(IntrinsicElementalFunctions::SymbolicSign), + "SymbolicSign"}, {static_cast(IntrinsicElementalFunctions::SymbolicHasSymbolQ), "SymbolicHasSymbolQ"}, {static_cast(IntrinsicElementalFunctions::SymbolicAddQ), @@ -900,6 +905,7 @@ namespace IntrinsicElementalFunctionRegistry { {"SymbolicLog", {&SymbolicLog::create_SymbolicLog, &SymbolicLog::eval_SymbolicLog}}, {"SymbolicExp", {&SymbolicExp::create_SymbolicExp, &SymbolicExp::eval_SymbolicExp}}, {"SymbolicAbs", {&SymbolicAbs::create_SymbolicAbs, &SymbolicAbs::eval_SymbolicAbs}}, + {"SymbolicSign", {&SymbolicSign::create_SymbolicSign, &SymbolicSign::eval_SymbolicSign}}, {"has", {&SymbolicHasSymbolQ::create_SymbolicHasSymbolQ, &SymbolicHasSymbolQ::eval_SymbolicHasSymbolQ}}, {"AddQ", {&SymbolicAddQ::create_SymbolicAddQ, &SymbolicAddQ::eval_SymbolicAddQ}}, {"MulQ", {&SymbolicMulQ::create_SymbolicMulQ, &SymbolicMulQ::eval_SymbolicMulQ}}, diff --git a/src/libasr/pass/intrinsic_functions.h b/src/libasr/pass/intrinsic_functions.h index a644854e12..4fdb328153 100644 --- a/src/libasr/pass/intrinsic_functions.h +++ b/src/libasr/pass/intrinsic_functions.h @@ -155,6 +155,7 @@ enum class IntrinsicElementalFunctions : int64_t { SymbolicLog, SymbolicExp, SymbolicAbs, + SymbolicSign, SymbolicHasSymbolQ, SymbolicAddQ, SymbolicMulQ, @@ -5968,6 +5969,7 @@ create_symbolic_unary_macro(SymbolicCos) create_symbolic_unary_macro(SymbolicLog) create_symbolic_unary_macro(SymbolicExp) create_symbolic_unary_macro(SymbolicAbs) +create_symbolic_unary_macro(SymbolicSign) create_symbolic_unary_macro(SymbolicExpand) } // namespace LCompilers::ASRUtils diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index c2977a8b18..a9382227fa 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -477,6 +477,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorm_attr) != symbolic_attributes.end()){ std::set symbolic_functions = { - "sin", "cos", "log", "exp", "Abs", "Symbol" + "sin", "cos", "log", "exp", "Abs", "sign", "Symbol" }; if (AST::is_a(*call->m_func)) { visit_Call(*call); @@ -7809,7 +7809,7 @@ we will have to use something else. "sum" // For sum called over lists }; std::set symbolic_functions = { - "sin", "cos", "log", "exp", "Abs" + "sin", "cos", "log", "exp", "Abs", "sign" }; if ((symbolic_functions.find(call_name) != symbolic_functions.end()) && imported_functions[call_name] == "sympy"){ From 112ba15146ae936a86762be269117bbe066d3001 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Fri, 24 May 2024 10:49:35 +0530 Subject: [PATCH 2/3] Implement symbolic sign function --- src/libasr/pass/intrinsic_function_registry.h | 6 ++++++ src/libasr/pass/intrinsic_functions.h | 2 ++ src/libasr/pass/replace_symbolic.cpp | 1 + src/lpython/semantics/python_ast_to_asr.cpp | 4 ++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libasr/pass/intrinsic_function_registry.h b/src/libasr/pass/intrinsic_function_registry.h index 9d26a37954..d68cba8207 100644 --- a/src/libasr/pass/intrinsic_function_registry.h +++ b/src/libasr/pass/intrinsic_function_registry.h @@ -154,6 +154,7 @@ inline std::string get_intrinsic_name(int x) { INTRINSIC_NAME_CASE(SymbolicLog) INTRINSIC_NAME_CASE(SymbolicExp) INTRINSIC_NAME_CASE(SymbolicAbs) + INTRINSIC_NAME_CASE(SymbolicSign) INTRINSIC_NAME_CASE(SymbolicHasSymbolQ) INTRINSIC_NAME_CASE(SymbolicAddQ) INTRINSIC_NAME_CASE(SymbolicMulQ) @@ -448,6 +449,8 @@ namespace IntrinsicElementalFunctionRegistry { {nullptr, &SymbolicExp::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicAbs), {nullptr, &SymbolicAbs::verify_args}}, + {static_cast(IntrinsicElementalFunctions::SymbolicSign), + {nullptr, &SymbolicSign::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicHasSymbolQ), {nullptr, &SymbolicHasSymbolQ::verify_args}}, {static_cast(IntrinsicElementalFunctions::SymbolicAddQ), @@ -739,6 +742,8 @@ namespace IntrinsicElementalFunctionRegistry { "SymbolicExp"}, {static_cast(IntrinsicElementalFunctions::SymbolicAbs), "SymbolicAbs"}, + {static_cast(IntrinsicElementalFunctions::SymbolicSign), + "SymbolicSign"}, {static_cast(IntrinsicElementalFunctions::SymbolicHasSymbolQ), "SymbolicHasSymbolQ"}, {static_cast(IntrinsicElementalFunctions::SymbolicAddQ), @@ -900,6 +905,7 @@ namespace IntrinsicElementalFunctionRegistry { {"SymbolicLog", {&SymbolicLog::create_SymbolicLog, &SymbolicLog::eval_SymbolicLog}}, {"SymbolicExp", {&SymbolicExp::create_SymbolicExp, &SymbolicExp::eval_SymbolicExp}}, {"SymbolicAbs", {&SymbolicAbs::create_SymbolicAbs, &SymbolicAbs::eval_SymbolicAbs}}, + {"SymbolicSign", {&SymbolicSign::create_SymbolicSign, &SymbolicSign::eval_SymbolicSign}}, {"has", {&SymbolicHasSymbolQ::create_SymbolicHasSymbolQ, &SymbolicHasSymbolQ::eval_SymbolicHasSymbolQ}}, {"AddQ", {&SymbolicAddQ::create_SymbolicAddQ, &SymbolicAddQ::eval_SymbolicAddQ}}, {"MulQ", {&SymbolicMulQ::create_SymbolicMulQ, &SymbolicMulQ::eval_SymbolicMulQ}}, diff --git a/src/libasr/pass/intrinsic_functions.h b/src/libasr/pass/intrinsic_functions.h index a644854e12..4fdb328153 100644 --- a/src/libasr/pass/intrinsic_functions.h +++ b/src/libasr/pass/intrinsic_functions.h @@ -155,6 +155,7 @@ enum class IntrinsicElementalFunctions : int64_t { SymbolicLog, SymbolicExp, SymbolicAbs, + SymbolicSign, SymbolicHasSymbolQ, SymbolicAddQ, SymbolicMulQ, @@ -5968,6 +5969,7 @@ create_symbolic_unary_macro(SymbolicCos) create_symbolic_unary_macro(SymbolicLog) create_symbolic_unary_macro(SymbolicExp) create_symbolic_unary_macro(SymbolicAbs) +create_symbolic_unary_macro(SymbolicSign) create_symbolic_unary_macro(SymbolicExpand) } // namespace LCompilers::ASRUtils diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index c2977a8b18..a9382227fa 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -477,6 +477,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitorm_attr) != symbolic_attributes.end()){ std::set symbolic_functions = { - "sin", "cos", "log", "exp", "Abs", "Symbol" + "sin", "cos", "log", "exp", "Abs", "sign", "Symbol" }; if (AST::is_a(*call->m_func)) { visit_Call(*call); @@ -7809,7 +7809,7 @@ we will have to use something else. "sum" // For sum called over lists }; std::set symbolic_functions = { - "sin", "cos", "log", "exp", "Abs" + "sin", "cos", "log", "exp", "Abs", "sign" }; if ((symbolic_functions.find(call_name) != symbolic_functions.end()) && imported_functions[call_name] == "sympy"){ From f202bf8fea16735e5ca6f1098299e6478aa28db8 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Thu, 13 Jun 2024 11:48:37 +0530 Subject: [PATCH 3/3] Added tests --- integration_tests/symbolics_06.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/integration_tests/symbolics_06.py b/integration_tests/symbolics_06.py index 5b603f6537..f56d76c80d 100644 --- a/integration_tests/symbolics_06.py +++ b/integration_tests/symbolics_06.py @@ -1,4 +1,4 @@ -from sympy import Symbol, sin, cos, exp, log, Abs, pi, diff +from sympy import Symbol, sin, cos, exp, log, Abs, pi, diff, sign from lpython import S def test_elementary_functions(): @@ -25,6 +25,13 @@ def test_elementary_functions(): assert(Abs(S(10)) == S(10)) assert(Abs(S(-1)*x) == Abs(x)) + # test sign + assert(sign(S(-10)) == S(-1)) + assert(sign(S(0)) == S(0)) + assert(sign(S(10)) == S(1)) + assert(sign(S(2)* x) == sign(x)) + assert(sign(S(-1)* x) == S(-1) * sign(x)) + # test composite functions a: S = exp(x) b: S = sin(a)