@@ -72,6 +72,8 @@ enum class IntrinsicFunctions : int64_t {
7272 SymbolicPow,
7373 SymbolicPi,
7474 SymbolicInteger,
75+ SymbolicDiff,
76+ SymbolicExpand,
7577 Sum,
7678 // ...
7779};
@@ -2056,7 +2058,7 @@ namespace SymbolicSymbol {
20562058
20572059} // namespace SymbolicSymbol
20582060
2059- #define create_symbolic_binop_macro (X ) \
2061+ #define create_symbolic_binary_macro (X ) \
20602062namespace X { \
20612063 \
20622064 static inline void verify_args (const ASR::IntrinsicFunction_t& x, \
@@ -2107,11 +2109,12 @@ namespace X{
21072109 } \
21082110} // namespace X
21092111
2110- create_symbolic_binop_macro (SymbolicAdd)
2111- create_symbolic_binop_macro(SymbolicSub)
2112- create_symbolic_binop_macro(SymbolicMul)
2113- create_symbolic_binop_macro(SymbolicDiv)
2114- create_symbolic_binop_macro(SymbolicPow)
2112+ create_symbolic_binary_macro (SymbolicAdd)
2113+ create_symbolic_binary_macro(SymbolicSub)
2114+ create_symbolic_binary_macro(SymbolicMul)
2115+ create_symbolic_binary_macro(SymbolicDiv)
2116+ create_symbolic_binary_macro(SymbolicPow)
2117+ create_symbolic_binary_macro(SymbolicDiff)
21152118
21162119namespace SymbolicPi {
21172120
@@ -2166,6 +2169,46 @@ namespace SymbolicInteger {
21662169 }
21672170} // namespace SymbolicInteger
21682171
2172+ namespace SymbolicExpand {
2173+
2174+ static inline void verify_args (const ASR::IntrinsicFunction_t& x, diag::Diagnostics& diagnostics) {
2175+ const Location& loc = x.base .base .loc ;
2176+ ASRUtils::require_impl (x.n_args == 1 ,
2177+ " SymbolicExpand must have exactly 1 input argument" ,
2178+ loc, diagnostics);
2179+
2180+ ASR::ttype_t * input_type = ASRUtils::expr_type (x.m_args [0 ]);
2181+ ASRUtils::require_impl (ASR::is_a<ASR::SymbolicExpression_t>(*input_type),
2182+ " SymbolicExpand expects an argument of type SymbolicExpression" ,
2183+ x.base .base .loc , diagnostics);
2184+ }
2185+
2186+ static inline ASR::expr_t *eval_SymbolicExpand (Allocator &/* al*/ ,
2187+ const Location &/* loc*/ , Vec<ASR::expr_t *>& /* args*/ ) {
2188+ // TODO
2189+ return nullptr ;
2190+ }
2191+
2192+ static inline ASR::asr_t * create_SymbolicExpand (Allocator& al, const Location& loc,
2193+ Vec<ASR::expr_t *>& args,
2194+ const std::function<void (const std::string &, const Location &)> err) {
2195+ if (args.size () != 1 ) {
2196+ err (" Intrinsic expand function accepts exactly 1 argument" , loc);
2197+ }
2198+
2199+ ASR::ttype_t * argtype = ASRUtils::expr_type (args[0 ]);
2200+ if (!ASR::is_a<ASR::SymbolicExpression_t>(*argtype)) {
2201+ err (" Argument of SymbolicExpand function must be of type SymbolicExpression" ,
2202+ args[0 ]->base .loc );
2203+ }
2204+
2205+ ASR::ttype_t *to_type = ASRUtils::TYPE (ASR::make_SymbolicExpression_t (al, loc));
2206+ return UnaryIntrinsicFunction::create_UnaryFunction (al, loc, args, eval_SymbolicExpand,
2207+ static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicExpand), 0 , to_type);
2208+ }
2209+
2210+ } // namespace SymbolicExpand
2211+
21692212namespace IntrinsicFunctionRegistry {
21702213
21712214 static const std::map<int64_t ,
@@ -2228,6 +2271,10 @@ namespace IntrinsicFunctionRegistry {
22282271 {nullptr , &SymbolicPi::verify_args}},
22292272 {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicInteger),
22302273 {nullptr , &SymbolicInteger::verify_args}},
2274+ {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicDiff),
2275+ {nullptr , &SymbolicDiff::verify_args}},
2276+ {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicExpand),
2277+ {nullptr , &SymbolicExpand::verify_args}},
22312278 };
22322279
22332280 static const std::map<int64_t , std::string>& intrinsic_function_id_to_name = {
@@ -2282,6 +2329,10 @@ namespace IntrinsicFunctionRegistry {
22822329 " pi" },
22832330 {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicInteger),
22842331 " SymbolicInteger" },
2332+ {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicDiff),
2333+ " SymbolicDiff" },
2334+ {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::SymbolicExpand),
2335+ " SymbolicExpand" },
22852336 {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::Any),
22862337 " any" },
22872338 {static_cast <int64_t >(ASRUtils::IntrinsicFunctions::Sum),
@@ -2319,6 +2370,8 @@ namespace IntrinsicFunctionRegistry {
23192370 {" SymbolicPow" , {&SymbolicPow::create_SymbolicPow, &SymbolicPow::eval_SymbolicPow}},
23202371 {" pi" , {&SymbolicPi::create_SymbolicPi, &SymbolicPi::eval_SymbolicPi}},
23212372 {" SymbolicInteger" , {&SymbolicInteger::create_SymbolicInteger, &SymbolicInteger::eval_SymbolicInteger}},
2373+ {" diff" , {&SymbolicDiff::create_SymbolicDiff, &SymbolicDiff::eval_SymbolicDiff}},
2374+ {" expand" , {&SymbolicExpand::create_SymbolicExpand, &SymbolicExpand::eval_SymbolicExpand}},
23222375 };
23232376
23242377 static inline bool is_intrinsic_function (const std::string& name) {
@@ -2433,6 +2486,8 @@ inline std::string get_intrinsic_name(int x) {
24332486 INTRINSIC_NAME_CASE (SymbolicPow)
24342487 INTRINSIC_NAME_CASE (SymbolicPi)
24352488 INTRINSIC_NAME_CASE (SymbolicInteger)
2489+ INTRINSIC_NAME_CASE (SymbolicDiff)
2490+ INTRINSIC_NAME_CASE (SymbolicExpand)
24362491 INTRINSIC_NAME_CASE (Sum)
24372492 default : {
24382493 throw LCompilersException (" pickle: intrinsic_id not implemented" );
0 commit comments