3 #include <utils/printer.h>
4 #include <state/mConfiguration/mConfiguration.h>
7 template<
typename NodeType,
typename V>
8 class MConfigurationMap;
15 template <
typename T,
typename V>
42 using Utils::Debug::operator<<;
43 std::ostringstream ss;
44 ss << this->
msg << std::endl;
45 ss <<
" pattern: " <<
key << std::endl;
46 ss <<
" state: " <<
value << std::endl;
47 ss <<
" map: " <<
map.
debug() << std::endl;
69 template<
typename NodeType,
typename V>
94 const NodeType& root = key.
getNode();
96 typename std::map<std::pair<NodeType, int>, std::map<MConf, std::set<V>>>::iterator it = pattern_map.find({root, arity});
97 if(it == pattern_map.end()) {
98 pattern_map[{root, arity}] = {{key, {val}}};
100 else if (it->second.count(key) > 0) {
101 it->second[key].insert(val);
104 it->second.insert({key, {val}});
113 const NodeType& root = state.
getNode();
115 return pattern_map.at({root, arity});
122 std::map<MConf, std::set<std::pair<V, Unification>>>
getMatching(
const std::shared_ptr<const MConf>& state)
const {
123 const NodeType& root = state->getNode();
124 size_t arity = state->getArity();
125 typename std::map<std::pair<NodeType, int>, std::map<MConf, std::set<V>>>::const_iterator it = pattern_map.find({root, arity});
126 if(it == pattern_map.end()) {
127 return std::map<MConf, std::set<std::pair<V, Unification>>>();
129 const std::map<MConf, std::set<V>>& candidates = it->second;
131 std::map<MConf, std::set<std::pair<V, Unification>>> matching_map;
132 for(
const auto& [pattern, values] : candidates) {
133 for(
const V& val: values) {
134 std::optional<Unification> unification_opt = pattern.unifyWithMConf_opt(state);
135 if(unification_opt) {
136 matching_map[pattern].insert({val, *unification_opt});
148 template<
typename CharT =
char,
typename Traits = std::
char_traits<CharT>>
149 std::function<std::basic_ostream<CharT, Traits>&(std::basic_ostream<CharT, Traits>&)>
debug()
const {
150 return Utils::Debug::debug<decltype(pattern_map), CharT, Traits>(pattern_map);
155 std::pair<NodeType, int>,
156 std::map<MConf, std::set<V>>