Skip to content

Commit

Permalink
Merge pull request lcompilers#2686 from anutosh491/is_integer
Browse files Browse the repository at this point in the history
 Adding support for is_integer attribute
  • Loading branch information
Shaikh-Ubaid committed May 6, 2024
2 parents 76135f0 + f703bc7 commit 41f8d49
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 1 deletion.
4 changes: 4 additions & 0 deletions integration_tests/symbolics_02.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,5 +98,9 @@ def test_symbolic_operations():
print(b4)
assert(b4 == False)

# is_integer check
assert(pi1.is_integer == False)
assert(a.is_integer == True)
assert(c.is_integer == True)

test_symbolic_operations()
6 changes: 6 additions & 0 deletions src/libasr/pass/intrinsic_function_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ inline std::string get_intrinsic_name(int x) {
INTRINSIC_NAME_CASE(SymbolicLogQ)
INTRINSIC_NAME_CASE(SymbolicSinQ)
INTRINSIC_NAME_CASE(SymbolicGetArgument)
INTRINSIC_NAME_CASE(SymbolicIsInteger)
default : {
throw LCompilersException("pickle: intrinsic_id not implemented");
}
Expand Down Expand Up @@ -457,6 +458,8 @@ namespace IntrinsicElementalFunctionRegistry {
{nullptr, &SymbolicSinQ::verify_args}},
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicGetArgument),
{nullptr, &SymbolicGetArgument::verify_args}},
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicIsInteger),
{nullptr, &SymbolicIsInteger::verify_args}},
};

static const std::map<int64_t, std::string>& intrinsic_function_id_to_name = {
Expand Down Expand Up @@ -742,6 +745,8 @@ namespace IntrinsicElementalFunctionRegistry {
"SymbolicSinQ"},
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicGetArgument),
"SymbolicGetArgument"},
{static_cast<int64_t>(IntrinsicElementalFunctions::SymbolicIsInteger),
"SymbolicIsInteger"},
};


Expand Down Expand Up @@ -891,6 +896,7 @@ namespace IntrinsicElementalFunctionRegistry {
{"LogQ", {&SymbolicLogQ::create_SymbolicLogQ, &SymbolicLogQ::eval_SymbolicLogQ}},
{"SinQ", {&SymbolicSinQ::create_SymbolicSinQ, &SymbolicSinQ::eval_SymbolicSinQ}},
{"GetArgument", {&SymbolicGetArgument::create_SymbolicGetArgument, &SymbolicGetArgument::eval_SymbolicGetArgument}},
{"is_integer", {&SymbolicIsInteger::create_SymbolicIsInteger, &SymbolicIsInteger::eval_SymbolicIsInteger}},
};

static inline bool is_intrinsic_function(const std::string& name) {
Expand Down
2 changes: 2 additions & 0 deletions src/libasr/pass/intrinsic_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ enum class IntrinsicElementalFunctions : int64_t {
SymbolicLogQ,
SymbolicSinQ,
SymbolicGetArgument,
SymbolicIsInteger,
// ...
};

Expand Down Expand Up @@ -5853,6 +5854,7 @@ create_symbolic_query_macro(SymbolicMulQ)
create_symbolic_query_macro(SymbolicPowQ)
create_symbolic_query_macro(SymbolicLogQ)
create_symbolic_query_macro(SymbolicSinQ)
create_symbolic_query_macro(SymbolicIsInteger)

#define create_symbolic_unary_macro(X) \
namespace X { \
Expand Down
2 changes: 2 additions & 0 deletions src/libasr/pass/replace_symbolic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
case LCompilers::ASRUtils::IntrinsicElementalFunctions::SymbolicPowQ:
case LCompilers::ASRUtils::IntrinsicElementalFunctions::SymbolicLogQ:
case LCompilers::ASRUtils::IntrinsicElementalFunctions::SymbolicSinQ:
case LCompilers::ASRUtils::IntrinsicElementalFunctions::SymbolicIsInteger:
return true;
default:
return false;
Expand Down Expand Up @@ -513,6 +514,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
BASIC_ATTR(PowQ, 17)
BASIC_ATTR(LogQ, 29)
BASIC_ATTR(SinQ, 35)
BASIC_ATTR(IsInteger, 0)
default: {
throw LCompilersException("IntrinsicFunction: `"
+ ASRUtils::get_intrinsic_name(intrinsic_id)
Expand Down
14 changes: 14 additions & 0 deletions src/lpython/semantics/python_attribute_eval.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ struct AttributeHandler {
{"diff", &eval_symbolic_diff},
{"expand", &eval_symbolic_expand},
{"has", &eval_symbolic_has_symbol},
{"is_integer", &eval_symbolic_is_integer}
};
}

Expand Down Expand Up @@ -562,6 +563,19 @@ struct AttributeHandler {
return create_function(al, loc, args_with_list, diag);
}

static ASR::asr_t* eval_symbolic_is_integer(ASR::expr_t *s, Allocator &al, const Location &loc,
Vec<ASR::expr_t*> &args, diag::Diagnostics &diag) {
Vec<ASR::expr_t*> args_with_list;
args_with_list.reserve(al, args.size() + 1);
args_with_list.push_back(al, s);
for(size_t i = 0; i < args.size(); i++) {
args_with_list.push_back(al, args[i]);
}
ASRUtils::create_intrinsic_function create_function =
ASRUtils::IntrinsicElementalFunctionRegistry::get_create_function("is_integer");
return create_function(al, loc, args_with_list, diag);
}

}; // AttributeHandler

} // namespace LCompilers::LPython
Expand Down
7 changes: 6 additions & 1 deletion src/runtime/lpython/lpython.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@

# data-types

def get_sympy_S(x):
from sympy import S
return S(x)


type_to_convert_func = {
"i1": bool,
"i8": int,
Expand All @@ -34,7 +39,7 @@
"Callable": lambda x: x,
"Allocatable": lambda x: x,
"Pointer": lambda x: x,
"S": lambda x: x,
"S": get_sympy_S,
}

class Type:
Expand Down

0 comments on commit 41f8d49

Please sign in to comment.