#ifndef ISAAC_SYMBOLIC_ENGINE_PROCESS #define ISAAC_SYMBOLIC_ENGINE_PROCESS #include #include #include "isaac/tools/cpp/string.hpp" #include "isaac/jit/syntax/expression/expression.h" #include "isaac/jit/syntax/engine/binder.h" #include "isaac/jit/syntax/engine/object.h" #include "isaac/array.h" namespace isaac { namespace symbolic { //Traverse template inline void traverse(expression_tree const & tree, size_t root, FUN const & fun, std::function const & recurse) { expression_tree::node const & node = tree[root]; if (node.type==COMPOSITE_OPERATOR_TYPE && recurse(root)){ traverse(tree, node.binary_operator.lhs, fun, recurse); traverse(tree, node.binary_operator.rhs, fun, recurse); } if (node.type != INVALID_SUBTYPE) fun(root); } template inline void traverse(expression_tree const & tree, size_t root, FUN const & fun) { return traverse(tree, root, fun, [](size_t){return true;}); } template inline void traverse(expression_tree const & tree, FUN const & fun) { return traverse(tree, tree.root(), fun); } //Extract symbolic types template inline void extract(expression_tree const & tree, symbols_table const & table, size_t root, std::set& processed, std::vector& result, bool array_recurse = true) { auto extract_impl = [&](size_t index) { symbols_table::const_iterator it = table.find(index); if(it!=table.end()) { T* obj = dynamic_cast(&*it->second); if(obj && processed.insert(obj->process("#name")).second) result.push_back(obj); } }; auto recurse = [&](size_t index){ return array_recurse?true:dynamic_cast(&*table.at(index))==0;}; traverse(tree, root, extract_impl, recurse); } template inline std::vector extract(expression_tree const & tree, symbols_table const & table, std::vector roots, bool array_recurse = true) { std::vector result; std::set processed; for(size_t root: roots) extract(tree, table, root, processed, result, array_recurse); return result; } template inline std::vector extract(expression_tree const & tree, symbols_table const & table, size_t root, bool array_recurse = true) { return extract(tree, table, std::vector{root}, array_recurse); } template inline std::vector extract(expression_tree const & tree, symbols_table const & table) { return extract(tree, table, tree.root()); } // Filter nodes std::vector find(expression_tree const & tree, size_t root, std::function const & pred); std::vector find(expression_tree const & tree, std::function const & pred); std::vector assignments(expression_tree const & tree); std::vector lhs_of(expression_tree const & tree, std::vector const & in); std::vector rhs_of(expression_tree const & tree, std::vector const & in); // Hash std::string hash(expression_tree const & tree); //Set arguments void set_arguments(expression_tree const & tree, driver::Kernel & kernel, uint32_t& current_arg); //Symbolize symbols_table symbolize(isaac::expression_tree const & expression); } } #endif