Skip to content

Commit cdbcf28

Browse files
authored
Merge pull request #2683 from anutosh491/infinite
Introducing Symbolic Infinity constant
2 parents dfeacbc + 780b1a1 commit cdbcf28

File tree

5 files changed

+47
-7
lines changed

5 files changed

+47
-7
lines changed

integration_tests/symbolics_12.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from sympy import Symbol, E, log, exp
1+
from sympy import Symbol, E, log, exp, oo
22
from lpython import S
33

44
def main0():
5+
# Testing out symbolic constants like E, oo etc
6+
57
# Define symbolic variables
68
x: S = Symbol('x')
79
y: S = Symbol('y')
@@ -30,10 +32,39 @@ def main0():
3032
assert expr2 == E ** S(1)
3133

3234
# Print the results
33-
print("x =", x)
34-
print("z =", z)
35-
print("log(E) =", expr1)
36-
print("exp(1) =", expr2)
35+
print("x = ", x)
36+
print("z = ", z)
37+
print("log(E) = ", expr1)
38+
print("exp(1) = ", expr2)
39+
40+
# Test symbolic infinity constant
41+
inf: S = oo
42+
43+
# Check if inf is equal to oo
44+
assert inf == oo
45+
46+
# Perform some symbolic operations with oo
47+
z = x + inf
48+
49+
# Check if z is equal to x + oo
50+
assert z == x + oo
51+
52+
# Check if x is not equal to 2 * oo + y
53+
assert x != S(2) * oo + y
54+
55+
# Evaluate some mathematical expressions with oo
56+
expr1 = log(oo)
57+
expr2 = exp(oo)
58+
59+
# Check the results
60+
assert expr1 == oo
61+
assert expr2 == oo
62+
63+
# Print the results
64+
print("inf = ", inf)
65+
print("z = ", z)
66+
print("log(oo) = ", expr1)
67+
print("exp(oo) = ", expr2)
3768

3869

3970
main0()

src/libasr/pass/intrinsic_function_registry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ inline std::string get_intrinsic_name(int x) {
144144
INTRINSIC_NAME_CASE(SymbolicPow)
145145
INTRINSIC_NAME_CASE(SymbolicPi)
146146
INTRINSIC_NAME_CASE(SymbolicE)
147+
INTRINSIC_NAME_CASE(SymbolicInfinity)
147148
INTRINSIC_NAME_CASE(SymbolicInteger)
148149
INTRINSIC_NAME_CASE(SymbolicDiff)
149150
INTRINSIC_NAME_CASE(SymbolicExpand)
@@ -424,6 +425,8 @@ namespace IntrinsicElementalFunctionRegistry {
424425
{nullptr, &SymbolicPi::verify_args}},
425426
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicE),
426427
{nullptr, &SymbolicE::verify_args}},
428+
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicInfinity),
429+
{nullptr, &SymbolicInfinity::verify_args}},
427430
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicInteger),
428431
{nullptr, &SymbolicInteger::verify_args}},
429432
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicDiff),
@@ -707,6 +710,8 @@ namespace IntrinsicElementalFunctionRegistry {
707710
"pi"},
708711
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicE),
709712
"E"},
713+
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicInfinity),
714+
"oo"},
710715
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicInteger),
711716
"SymbolicInteger"},
712717
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicDiff),
@@ -870,6 +875,7 @@ namespace IntrinsicElementalFunctionRegistry {
870875
{"SymbolicPow", {&SymbolicPow::create_SymbolicPow, &SymbolicPow::eval_SymbolicPow}},
871876
{"pi", {&SymbolicPi::create_SymbolicPi, &SymbolicPi::eval_SymbolicPi}},
872877
{"E", {&SymbolicE::create_SymbolicE, &SymbolicE::eval_SymbolicE}},
878+
{"oo", {&SymbolicInfinity::create_SymbolicInfinity, &SymbolicInfinity::eval_SymbolicInfinity}},
873879
{"SymbolicInteger", {&SymbolicInteger::create_SymbolicInteger, &SymbolicInteger::eval_SymbolicInteger}},
874880
{"diff", {&SymbolicDiff::create_SymbolicDiff, &SymbolicDiff::eval_SymbolicDiff}},
875881
{"expand", {&SymbolicExpand::create_SymbolicExpand, &SymbolicExpand::eval_SymbolicExpand}},

src/libasr/pass/intrinsic_functions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ enum class IntrinsicElementalFunctions : int64_t {
145145
SymbolicPow,
146146
SymbolicPi,
147147
SymbolicE,
148+
SymbolicInfinity,
148149
SymbolicInteger,
149150
SymbolicDiff,
150151
SymbolicExpand,
@@ -5672,6 +5673,7 @@ namespace X {
56725673

56735674
create_symbolic_constants_macro(SymbolicPi)
56745675
create_symbolic_constants_macro(SymbolicE)
5676+
create_symbolic_constants_macro(SymbolicInfinity)
56755677

56765678
namespace SymbolicInteger {
56775679

src/libasr/pass/replace_symbolic.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
438438
}
439439
BASIC_CONST(Pi, pi)
440440
BASIC_CONST(E, E)
441+
BASIC_CONST(Infinity, infinity)
441442
BASIC_BINOP(Add, add)
442443
BASIC_BINOP(Sub, sub)
443444
BASIC_BINOP(Mul, mul)

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3211,7 +3211,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
32113211
std::string name = x.m_id;
32123212
ASR::symbol_t *s = current_scope->resolve_symbol(name);
32133213
std::set<std::string> not_cpython_builtin = {
3214-
"pi", "E"};
3214+
"pi", "E", "oo"};
32153215
if (s) {
32163216
tmp = ASR::make_Var_t(al, x.base.base.loc, s);
32173217
} else if (name == "i32" || name == "i64" || name == "f32" ||
@@ -7508,7 +7508,7 @@ we will have to use something else.
75087508
"diff", "expand", "has"
75097509
};
75107510
std::set<std::string> symbolic_constants = {
7511-
"pi", "E"
7511+
"pi", "E", "oo"
75127512
};
75137513
if (symbolic_attributes.find(call_name) != symbolic_attributes.end() &&
75147514
symbolic_constants.find(mod_name) != symbolic_constants.end()){

0 commit comments

Comments
 (0)