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 change_key_type =
const std::tuple<index_type, label_type>;
24 using bin_op_key_type =
const std::tuple<index_type, index_type>;
26 using cache_ptr = std::weak_ptr<typename node_ptr::element_type>;
30 std::unordered_map<unique_key_type, cache_ptr> unique_table;
31 std::unordered_map<change_key_type, cache_ptr> change_table;
32 std::unordered_map<bin_op_key_type, cache_ptr> union_table;
33 std::unordered_map<bin_op_key_type, cache_ptr> intersection_table;
35 const node_type __terminal_false, __terminal_true;
36 const node_ptr terminal_false, terminal_true;
41 static unique_key_type make_unique_key(
const label_type& l,
const node_ptr& t,
const node_ptr& e) {
42 return std::make_tuple(l, t->index(), e->index());
48 static change_key_type make_change_key(
const node_ptr& n,
const label_type& l) {
49 return std::make_tuple(n->index(), l);
52 static bin_op_key_type make_bin_op_key(
const node_ptr& p,
const node_ptr& q) {
53 return std::make_tuple(p->index(), q->index());
62 __terminal_false(0), __terminal_true(1),
63 terminal_false(&__terminal_false, null_deleter()),
64 terminal_true(&__terminal_true, null_deleter())
85 if (t ==
zero())
return e;
87 const unique_key_type key = make_unique_key(_label, t, e);
88 const auto it = unique_table.find(key);
89 if (it != unique_table.end() && !it->second.expired()) {
90 return it->second.lock();
94 unique_table[key] = pf;
109 if (_root->label() == v)
return new_var(v, _root->else_node(), _root->then_node());
110 if (_root->label() > v)
return new_var(v, _root,
zero());
111 const auto key = make_change_key(_root, v);
112 const auto it = change_table.find(key);
113 if (it != change_table.end() && !it->second.expired()) {
114 return it->second.lock();
119 change_table[key] = r;
127 if (p ==
zero())
return q;
128 if (q ==
zero() || p == q)
return p;
129 const auto key = make_bin_op_key(p, q);
130 const auto it = union_table.find(key);
131 if (it != union_table.end() && !it->second.expired()) {
132 return it->second.lock();
136 if (p->label() < q->label()) {
141 else if (p->label() > q->label()) {
152 union_table[key] = r;
161 if (p == q)
return p;
162 const auto key = make_bin_op_key(p, q);
163 const auto it = intersection_table.find(key);
164 if (it != intersection_table.end() && !it->second.expired()) {
165 return it->second.lock();
169 if (p->label() < q->label()) {
172 else if (p->label() > q->label()) {
181 intersection_table[key] = r;
N node_type
このクラスが扱うノードの型
Definition: combination_cache.h:12
boloq の名前空間
Definition: boolean_function.h:3
basic_combination_cache & operator=(const basic_combination_cache &)=delete
代入は禁止されています
const node_ptr new_var(const label_type &_label)
新しいノードを生成します
Definition: combination_cache.h:101
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: combination_cache.h:84
basic_combination_cache()
コンストラクタ
Definition: combination_cache.h:61
const node_ptr apply_union(const node_ptr &p, const node_ptr &q)
和集合を返します
Definition: combination_cache.h:126
const node_ptr apply_intersection(const node_ptr &p, const node_ptr &q)
積集合を返します
Definition: combination_cache.h:159
basic_node< size_t, size_t > node
標準的なノードのクラス
Definition: node.h:94
const node_ptr & zero() const
0定節点を返します
Definition: combination_cache.h:75
const node_ptr & one() const
1定節点を返します
Definition: combination_cache.h:79
const node_ptr apply_change(const node_ptr &_root, const label_type &v)
特定のアイテムの存在を反転させた結果を返します
Definition: combination_cache.h:108
typename node_type::node_ptr node_ptr
このクラスが扱うノードのポインタ型
Definition: combination_cache.h:14
基本的な演算キャッシュのテーブルです
Definition: combination_cache.h:9