19 using index_type =
typename node_type::index_type;
20 using label_type =
typename node_type::label_type;
22 using unique_key_type =
const std::tuple<label_type, index_type, index_type>;
23 using compute_key_type =
const std::tuple<index_type, index_type, index_type>;
25 using cache_ptr = std::weak_ptr<const typename node_ptr::element_type>;
27 using unique_table_type = std::unordered_map<unique_key_type, cache_ptr>;
28 using compute_table_type = std::unordered_map<compute_key_type, cache_ptr>;
29 using index_table_type = std::unordered_map<unique_key_type, index_type>;
31 const node_type __terminal_false, __terminal_true;
32 const node_ptr terminal_false, terminal_true;
36 unique_table_type unique_table;
37 compute_table_type compute_table;
39 const node_ptr next_then_node(
const node_ptr& n,
const label_type& label)
const {
40 if (n->label() != label)
return n;
41 return n->then_node();
44 const node_ptr next_else_node(
const node_ptr& n,
const label_type& label)
const {
45 if (n->label() != label)
return n;
46 return n->else_node();
52 static unique_key_type make_unique_key(
const label_type& l,
const node_ptr& t,
const node_ptr& e) {
53 return unique_key_type(l, t->index(), e->index());
60 return compute_key_type(i->index(), t->index(), e->index());
69 __terminal_false(0), __terminal_true(1),
70 terminal_false(&__terminal_false, null_deleter()),
71 terminal_true(&__terminal_true, null_deleter())
93 const unique_key_type key = make_unique_key(_label, t, e);
94 const auto it = unique_table.find(key);
95 if (it != unique_table.end() && !it->second.expired()) {
96 return it->second.lock();
100 unique_table[key] = pf;
116 if (if_node->is_terminal()) {
117 return (if_node->index()) ? then_node : else_node;
121 const compute_key_type compute_key = make_compute_key(if_node, then_node, else_node);
122 const auto it = compute_table.find(compute_key);
123 if (it != compute_table.end() && !it->second.expired()) {
124 return it->second.lock();
127 const label_type& v = std::min(if_node->label(),
128 std::min(then_node->label(),
129 else_node->label()));
132 const node_ptr then_child =
ite(next_then_node(if_node, v),
133 next_then_node(then_node, v),
134 next_then_node(else_node, v));
135 const node_ptr else_child =
ite(next_else_node(if_node, v),
136 next_else_node(then_node, v),
137 next_else_node(else_node, v));
140 if (then_child == else_child)
return then_child;
145 compute_table[compute_key] = unique;
const node_ptr & one() const
1定節点を返します
Definition: boolean_function_cache.h:86
const node_ptr apply_and(const node_ptr &a, const node_ptr &b)
and を適用した結果を返します
Definition: boolean_function_cache.h:159
boloq の名前空間
Definition: boolean_function.h:3
const node_ptr apply_xor(const node_ptr &a, const node_ptr &b)
or を適用した結果を返します
Definition: boolean_function_cache.h:173
index_type get_index(const key_type &key)
インデックスを生成します
Definition: index_generator.h:25
const node_ptr new_var(const label_type &_label, const node_ptr &t, const node_ptr &e)
新しいノードを生成します
Definition: boolean_function_cache.h:91
const node_ptr apply_not(const node_ptr &a)
not を適用した結果を返します
Definition: boolean_function_cache.h:152
N node_type
このクラスが扱うノードの型
Definition: boolean_function_cache.h:12
const node_ptr & zero() const
0定節点を返します
Definition: boolean_function_cache.h:82
basic_node< size_t, size_t > node
標準的なノードのクラス
Definition: node.h:94
基本的な演算キャッシュのテーブルです
Definition: boolean_function_cache.h:9
constexpr basic_boolean_function_cache()
コンストラクタ
Definition: boolean_function_cache.h:68
const node_ptr new_var(const label_type &_label)
新しいノードを生成します
Definition: boolean_function_cache.h:107
const node_ptr ite(const node_ptr &if_node, const node_ptr &then_node, const node_ptr &else_node)
Definition: boolean_function_cache.h:114
typename node_type::node_ptr node_ptr
このクラスが扱うノードのポインタ型
Definition: boolean_function_cache.h:14
basic_boolean_function_cache & operator=(const basic_boolean_function_cache &)=delete
代入は禁止されています
const node_ptr apply_or(const node_ptr &a, const node_ptr &b)
or を適用した結果を返します
Definition: boolean_function_cache.h:166