Skip to content

Commit 0562b8d

Browse files
committed
Implemented query methods for log and exp class
1 parent cba7320 commit 0562b8d

4 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/libasr/pass/intrinsic_function_registry.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ enum class IntrinsicScalarFunctions : int64_t {
8282
SymbolicAddQ,
8383
SymbolicMulQ,
8484
SymbolicPowQ,
85+
SymbolicLogQ,
86+
SymbolicExpQ,
8587
// ...
8688
};
8789

@@ -146,6 +148,8 @@ inline std::string get_intrinsic_name(int x) {
146148
INTRINSIC_NAME_CASE(SymbolicAddQ)
147149
INTRINSIC_NAME_CASE(SymbolicMulQ)
148150
INTRINSIC_NAME_CASE(SymbolicPowQ)
151+
INTRINSIC_NAME_CASE(SymbolicLogQ)
152+
INTRINSIC_NAME_CASE(SymbolicExpQ)
149153
default : {
150154
throw LCompilersException("pickle: intrinsic_id not implemented");
151155
}
@@ -3146,6 +3150,8 @@ namespace X {
31463150
create_symbolic_query_macro(SymbolicAddQ)
31473151
create_symbolic_query_macro(SymbolicMulQ)
31483152
create_symbolic_query_macro(SymbolicPowQ)
3153+
create_symbolic_query_macro(SymbolicLogQ)
3154+
create_symbolic_query_macro(SymbolicExpQ)
31493155

31503156

31513157
#define create_symbolic_unary_macro(X) \
@@ -3307,6 +3313,10 @@ namespace IntrinsicScalarFunctionRegistry {
33073313
{nullptr, &SymbolicMulQ::verify_args}},
33083314
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicPowQ),
33093315
{nullptr, &SymbolicPowQ::verify_args}},
3316+
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicLogQ),
3317+
{nullptr, &SymbolicLogQ::verify_args}},
3318+
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicExpQ),
3319+
{nullptr, &SymbolicExpQ::verify_args}},
33103320
};
33113321

33123322
static const std::map<int64_t, std::string>& intrinsic_function_id_to_name = {
@@ -3417,6 +3427,10 @@ namespace IntrinsicScalarFunctionRegistry {
34173427
"SymbolicMulQ"},
34183428
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicPowQ),
34193429
"SymbolicPowQ"},
3430+
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicLogQ),
3431+
"SymbolicLogQ"},
3432+
{static_cast<int64_t>(IntrinsicScalarFunctions::SymbolicExpQ),
3433+
"SymbolicExpQ"},
34203434
};
34213435

34223436

@@ -3475,6 +3489,8 @@ namespace IntrinsicScalarFunctionRegistry {
34753489
{"AddQ", {&SymbolicAddQ::create_SymbolicAddQ, &SymbolicAddQ::eval_SymbolicAddQ}},
34763490
{"MulQ", {&SymbolicMulQ::create_SymbolicMulQ, &SymbolicMulQ::eval_SymbolicMulQ}},
34773491
{"PowQ", {&SymbolicPowQ::create_SymbolicPowQ, &SymbolicPowQ::eval_SymbolicPowQ}},
3492+
{"LogQ", {&SymbolicLogQ::create_SymbolicLogQ, &SymbolicLogQ::eval_SymbolicLogQ}},
3493+
{"ExpQ", {&SymbolicExpQ::create_SymbolicExpQ, &SymbolicExpQ::eval_SymbolicExpQ}},
34783494
};
34793495

34803496
static inline bool is_intrinsic_function(const std::string& name) {

src/libasr/pass/replace_symbolic.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,28 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
921921
ASRUtils::TYPE(ASR::make_Logical_t(al, loc, 4)), nullptr));
922922
break;
923923
}
924+
case LCompilers::ASRUtils::IntrinsicScalarFunctions::SymbolicLogQ: {
925+
ASR::symbol_t* basic_get_type_sym = declare_basic_get_type_function(al, loc, module_scope);
926+
ASR::expr_t* value1 = handle_argument(al, loc, intrinsic_func->m_args[0]);
927+
Vec<ASR::call_arg_t> call_args;
928+
call_args.reserve(al, 1);
929+
ASR::call_arg_t call_arg;
930+
call_arg.loc = loc;
931+
call_arg.m_value = value1;
932+
call_args.push_back(al, call_arg);
933+
ASR::expr_t* function_call = ASRUtils::EXPR(ASRUtils::make_FunctionCall_t_util(al, loc,
934+
basic_get_type_sym, basic_get_type_sym, call_args.p, call_args.n,
935+
ASRUtils::TYPE(ASR::make_Integer_t(al, loc, 4)), nullptr, nullptr));
936+
// Using 29 as the right value of the IntegerCompare node as it represents SYMENGINE_LOG through SYMENGINE_ENUM
937+
return ASRUtils::EXPR(ASR::make_IntegerCompare_t(al, loc, function_call, ASR::cmpopType::Eq,
938+
ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, loc, 29, ASRUtils::TYPE(ASR::make_Integer_t(al, loc, 4)))),
939+
ASRUtils::TYPE(ASR::make_Logical_t(al, loc, 4)), nullptr));
940+
break;
941+
}
942+
case LCompilers::ASRUtils::IntrinsicScalarFunctions::SymbolicExpQ: {
943+
// TODO
944+
break;
945+
}
924946
default: {
925947
throw LCompilersException("IntrinsicFunction: `"
926948
+ ASRUtils::get_intrinsic_name(intrinsic_id)
@@ -1437,6 +1459,13 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
14371459

14381460
ASR::stmt_t *assert_stmt = ASRUtils::STMT(ASR::make_Assert_t(al, x.base.base.loc, test, x.m_msg));
14391461
pass_result.push_back(al, assert_stmt);
1462+
} else if (ASR::is_a<ASR::IntrinsicScalarFunction_t>(*x.m_test)) {
1463+
ASR::IntrinsicScalarFunction_t* intrinsic_func = ASR::down_cast<ASR::IntrinsicScalarFunction_t>(x.m_test);
1464+
if (intrinsic_func->m_type->type == ASR::ttypeType::Logical) {
1465+
ASR::expr_t* test = process_attributes(al, x.base.base.loc, x.m_test, module_scope);
1466+
ASR::stmt_t *assert_stmt = ASRUtils::STMT(ASR::make_Assert_t(al, x.base.base.loc, test, x.m_msg));
1467+
pass_result.push_back(al, assert_stmt);
1468+
}
14401469
}
14411470
}
14421471
};

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6040,6 +6040,12 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
60406040
} else if (symbolic_type == "Pow") {
60416041
tmp = attr_handler.eval_symbolic_is_Pow(se, al, x.base.base.loc, args, diag);
60426042
return;
6043+
} else if (symbolic_type == "log") {
6044+
tmp = attr_handler.eval_symbolic_is_log(se, al, x.base.base.loc, args, diag);
6045+
return;
6046+
} else if (symbolic_type == "exp") {
6047+
tmp = attr_handler.eval_symbolic_is_exp(se, al, x.base.base.loc, args, diag);
6048+
return;
60436049
} else {
60446050
throw SemanticError(symbolic_type + " symbolic type not supported yet", x.base.base.loc);
60456051
}

src/lpython/semantics/python_attribute_eval.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,34 @@ struct AttributeHandler {
499499
{ throw SemanticError(msg, loc); });
500500
}
501501

502+
static ASR::asr_t* eval_symbolic_is_log(ASR::expr_t *s, Allocator &al, const Location &loc,
503+
Vec<ASR::expr_t*> &args, diag::Diagnostics &/*diag*/) {
504+
Vec<ASR::expr_t*> args_with_list;
505+
args_with_list.reserve(al, args.size() + 1);
506+
args_with_list.push_back(al, s);
507+
for(size_t i = 0; i < args.size(); i++) {
508+
args_with_list.push_back(al, args[i]);
509+
}
510+
ASRUtils::create_intrinsic_function create_function =
511+
ASRUtils::IntrinsicScalarFunctionRegistry::get_create_function("LogQ");
512+
return create_function(al, loc, args_with_list, [&](const std::string &msg, const Location &loc)
513+
{ throw SemanticError(msg, loc); });
514+
}
515+
516+
static ASR::asr_t* eval_symbolic_is_exp(ASR::expr_t *s, Allocator &al, const Location &loc,
517+
Vec<ASR::expr_t*> &args, diag::Diagnostics &/*diag*/) {
518+
Vec<ASR::expr_t*> args_with_list;
519+
args_with_list.reserve(al, args.size() + 1);
520+
args_with_list.push_back(al, s);
521+
for(size_t i = 0; i < args.size(); i++) {
522+
args_with_list.push_back(al, args[i]);
523+
}
524+
ASRUtils::create_intrinsic_function create_function =
525+
ASRUtils::IntrinsicScalarFunctionRegistry::get_create_function("ExpQ");
526+
return create_function(al, loc, args_with_list, [&](const std::string &msg, const Location &loc)
527+
{ throw SemanticError(msg, loc); });
528+
}
529+
502530
}; // AttributeHandler
503531

504532
} // namespace LCompilers::LPython

0 commit comments

Comments
 (0)