Skip to content

Commit ec2dfb5

Browse files
authored
Implement symbolic sign function (#2715)
* Implement symbolic sign function and added tests for the same.
1 parent 7d28239 commit ec2dfb5

File tree

5 files changed

+19
-3
lines changed

5 files changed

+19
-3
lines changed

integration_tests/symbolics_06.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sympy import Symbol, sin, cos, exp, log, Abs, pi, diff
1+
from sympy import Symbol, sin, cos, exp, log, Abs, pi, diff, sign
22
from lpython import S
33

44
def test_elementary_functions():
@@ -25,6 +25,13 @@ def test_elementary_functions():
2525
assert(Abs(S(10)) == S(10))
2626
assert(Abs(S(-1)*x) == Abs(x))
2727

28+
# test sign
29+
assert(sign(S(-10)) == S(-1))
30+
assert(sign(S(0)) == S(0))
31+
assert(sign(S(10)) == S(1))
32+
assert(sign(S(2)* x) == sign(x))
33+
assert(sign(S(-1)* x) == S(-1) * sign(x))
34+
2835
# test composite functions
2936
a: S = exp(x)
3037
b: S = sin(a)

src/libasr/pass/intrinsic_function_registry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ inline std::string get_intrinsic_name(int x) {
154154
INTRINSIC_NAME_CASE(SymbolicLog)
155155
INTRINSIC_NAME_CASE(SymbolicExp)
156156
INTRINSIC_NAME_CASE(SymbolicAbs)
157+
INTRINSIC_NAME_CASE(SymbolicSign)
157158
INTRINSIC_NAME_CASE(SymbolicHasSymbolQ)
158159
INTRINSIC_NAME_CASE(SymbolicAddQ)
159160
INTRINSIC_NAME_CASE(SymbolicMulQ)
@@ -448,6 +449,8 @@ namespace IntrinsicElementalFunctionRegistry {
448449
{nullptr, &SymbolicExp::verify_args}},
449450
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicAbs),
450451
{nullptr, &SymbolicAbs::verify_args}},
452+
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicSign),
453+
{nullptr, &SymbolicSign::verify_args}},
451454
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicHasSymbolQ),
452455
{nullptr, &SymbolicHasSymbolQ::verify_args}},
453456
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicAddQ),
@@ -739,6 +742,8 @@ namespace IntrinsicElementalFunctionRegistry {
739742
"SymbolicExp"},
740743
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicAbs),
741744
"SymbolicAbs"},
745+
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicSign),
746+
"SymbolicSign"},
742747
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicHasSymbolQ),
743748
"SymbolicHasSymbolQ"},
744749
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicAddQ),
@@ -900,6 +905,7 @@ namespace IntrinsicElementalFunctionRegistry {
900905
{"SymbolicLog", {&SymbolicLog::create_SymbolicLog, &SymbolicLog::eval_SymbolicLog}},
901906
{"SymbolicExp", {&SymbolicExp::create_SymbolicExp, &SymbolicExp::eval_SymbolicExp}},
902907
{"SymbolicAbs", {&SymbolicAbs::create_SymbolicAbs, &SymbolicAbs::eval_SymbolicAbs}},
908+
{"SymbolicSign", {&SymbolicSign::create_SymbolicSign, &SymbolicSign::eval_SymbolicSign}},
903909
{"has", {&SymbolicHasSymbolQ::create_SymbolicHasSymbolQ, &SymbolicHasSymbolQ::eval_SymbolicHasSymbolQ}},
904910
{"AddQ", {&SymbolicAddQ::create_SymbolicAddQ, &SymbolicAddQ::eval_SymbolicAddQ}},
905911
{"MulQ", {&SymbolicMulQ::create_SymbolicMulQ, &SymbolicMulQ::eval_SymbolicMulQ}},

src/libasr/pass/intrinsic_functions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ enum class IntrinsicElementalFunctions : int64_t {
155155
SymbolicLog,
156156
SymbolicExp,
157157
SymbolicAbs,
158+
SymbolicSign,
158159
SymbolicHasSymbolQ,
159160
SymbolicAddQ,
160161
SymbolicMulQ,
@@ -5968,6 +5969,7 @@ create_symbolic_unary_macro(SymbolicCos)
59685969
create_symbolic_unary_macro(SymbolicLog)
59695970
create_symbolic_unary_macro(SymbolicExp)
59705971
create_symbolic_unary_macro(SymbolicAbs)
5972+
create_symbolic_unary_macro(SymbolicSign)
59715973
create_symbolic_unary_macro(SymbolicExpand)
59725974

59735975
} // namespace LCompilers::ASRUtils

src/libasr/pass/replace_symbolic.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
477477
BASIC_UNARYOP(Log, log)
478478
BASIC_UNARYOP(Exp, exp)
479479
BASIC_UNARYOP(Abs, abs)
480+
BASIC_UNARYOP(Sign, sign)
480481
BASIC_UNARYOP(Expand, expand)
481482
BASIC_TERNARYOP(Subs, subs2)
482483
case LCompilers::ASRUtils::IntrinsicElementalFunctions::SymbolicGetArgument: {

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7677,7 +7677,7 @@ we will have to use something else.
76777677
};
76787678
if (symbolic_attributes.find(at->m_attr) != symbolic_attributes.end()){
76797679
std::set<std::string> symbolic_functions = {
7680-
"sin", "cos", "log", "exp", "Abs", "Symbol"
7680+
"sin", "cos", "log", "exp", "Abs", "sign", "Symbol"
76817681
};
76827682
if (AST::is_a<AST::Attribute_t>(*call->m_func)) {
76837683
visit_Call(*call);
@@ -7809,7 +7809,7 @@ we will have to use something else.
78097809
"sum" // For sum called over lists
78107810
};
78117811
std::set<std::string> symbolic_functions = {
7812-
"sin", "cos", "log", "exp", "Abs"
7812+
"sin", "cos", "log", "exp", "Abs", "sign"
78137813
};
78147814
if ((symbolic_functions.find(call_name) != symbolic_functions.end()) &&
78157815
imported_functions[call_name] == "sympy"){

0 commit comments

Comments
 (0)