Infrared
Loading...
Searching...
No Matches
feature_network.hpp
1#ifndef INFRARED_FEATURE_NETWORK_HPP
2#define INFRARED_FEATURE_NETWORK_HPP
3
4/*
5 * InfraRed --- A generic engine for Boltzmann sampling over constraint networks
6 * (C) Sebastian Will, 2018
7 *
8 * This file is part of the InfraRed source code.
9 *
10 * InfraRed provides a generic framework for tree decomposition-based
11 * Boltzmann sampling over constraint networks
12 */
13
21#include <vector>
22#include <memory>
23#include <limits>
24#include <iterator>
25#include <cstdlib>
26
27#include "cluster.hpp"
28#include "finite_domain.hpp"
29
30namespace ired {
31
49 template<class FunValue>
51 public:
52 using fun_value_t = FunValue;
55
56 // selector for stochastic backtracking
57 class selector {
58 public:
59 selector(const fun_value_t &value):
60 value_(value),
61 r_( rand()/(RAND_MAX+1.0) * value) {
62 }
63
64 auto
65 select(const fun_value_t &x) {
66 return x > r_;
67 }
68 private:
69 fun_value_t value_;
70 fun_value_t r_;
71 };
72
73 static
75 plus(const fun_value_t &x, const fun_value_t &y) {
76 return x+y;
77 }
78
79 static
81 mul(const fun_value_t &x, const fun_value_t &y) {
82 return x*y;
83 }
84
85 static
87 one() {
88 return fun_value_t(1);
89 }
90
91 static
93 zero() {
94 return fun_value_t();
95 }
96 };
97
99 template<class FunValue>
100 class StdEvaluationPolicy: public PFEvaluationPolicy<FunValue> {
101 };
102
114 template<class FunValue>
116 public:
117 using fun_value_t = FunValue;
120
121 // selector for 'classic' backtracking
122 class selector {
123 public:
124 selector(const fun_value_t &value): value_(value) {}
125 auto
126 select(const fun_value_t &x) {
127 return x==value_;
128 }
129 private:
130 fun_value_t value_;
131 };
132
133 static
135 plus(const fun_value_t &x, const fun_value_t &y) {
136 return std::max(x,y);
137 }
138
139 static
141 mul(const fun_value_t &x, const fun_value_t &y) {
142 return x + y;
143 }
144
145 static
147 one() {
148 return fun_value_t();
149 }
150
151 static
154 return std::numeric_limits<fun_value_t>::min();
155 }
156 };
157
163 template<>
165 public:
166 using fun_value_t = bool;
169
170 static
172 plus(const fun_value_t &x, const fun_value_t &y) {
173 return x || y;
174 }
175
176 static
178 mul(const fun_value_t &x, const fun_value_t &y) {
179 return x && y;
180 }
181
182 static
184 one() {
185 return true;
186 }
187
188 static
191 return false;
192 }
193 };
194
208 template<class FunValue, class EvaluationPolicy> class FeatureNetwork {
209 public: using var_idx_t = int; using var_value_t = int;
210
211 using fun_value_t = FunValue;
212
216
217 using evaluation_policy_t = EvaluationPolicy;
218
221
226
230 explicit
232 : domains_(domains) {
233 };
234
239 : domains_(num_vars, domain) {
240 };
241
242
244
245
253 domains_.push_back(domain);
254 return domains_.size()-1;
255 }
256
268 auto
269 add_constraint(const std::shared_ptr<constraint_t> &x) {
270 if ( x->auto_materialize() ) {
271 //materialize it
272
273 // for evaluating the constraints, construct a
274 // constraint network with the same variables
275 // and domains as this one, which evaluates constraints
277 auto mx = std::make_shared<MaterializedFunction<bool, vecS>>(x.get(),cn);
278
279 constraints_.push_back( mx );
280 } else {
281 constraints_.push_back( x );
282 }
283 return constraints_.back().get();
284 }
285
297 auto
298 add_function(const std::shared_ptr<function_t> &x) {
299 if ( x->auto_materialize() ) {
300 //materialize it
301 auto mx = std::make_shared<MaterializedFunction<typename function_t::fun_value_t, vecS>>(x.get(),*this);
302 functions_.push_back( mx );
303 } else {
304 functions_.push_back( x );
305 }
306 return functions_.back().get();
307 }
308
312 int
313 num_vars() const {return domains_.size();}
314
318 const
319 auto & domains() const {
320 return domains_;
321 }
322
323 private:
324 FiniteDomainVector domains_;
325
326 std::vector<std::shared_ptr<function_t>> functions_;
327 std::vector<std::shared_ptr<constraint_t>> constraints_;
328 };
329
330}
331#endif
Definition feature_network.hpp:122
auto select(const fun_value_t &x)
Definition feature_network.hpp:126
selector(const fun_value_t &value)
Definition feature_network.hpp:124
Evaluation Strategy for Optimization (max/+); defining the arctic semiring.
Definition feature_network.hpp:115
static fun_value_t plus(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:135
static fun_value_t one()
Definition feature_network.hpp:147
static fun_value_t zero()
Definition feature_network.hpp:153
static fun_value_t mul(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:141
FunValue fun_value_t
Definition feature_network.hpp:117
A (partial) assignment of variables to values.
Definition assignment.hpp:76
Cluster (or bag) in the cluster tree.
Definition cluster.hpp:40
the feature network
Definition feature_network.hpp:208
FunValue fun_value_t
Definition feature_network.hpp:211
auto add_function(const std::shared_ptr< function_t > &x)
add function
Definition feature_network.hpp:298
int var_idx_t
Definition feature_network.hpp:209
~FeatureNetwork()
Definition feature_network.hpp:243
int num_vars() const
Number of variables.
Definition feature_network.hpp:313
EvaluationPolicy evaluation_policy_t
Definition feature_network.hpp:217
FeatureNetwork(const FiniteDomainVector &domains)
Construct with domains.
Definition feature_network.hpp:231
auto add_constraint(const std::shared_ptr< constraint_t > &x)
add constraint
Definition feature_network.hpp:269
FeatureNetwork(int num_vars, FiniteDomain domain)
Construct with domains of equal size.
Definition feature_network.hpp:238
int var_value_t
Definition feature_network.hpp:209
const auto & domains() const
Get vector of domains (read only)
Definition feature_network.hpp:319
FeatureNetwork()
Construct empty.
Definition feature_network.hpp:225
var_idx_t add_variable(FiniteDomain domain)
add variable with domain size
Definition feature_network.hpp:252
Definition finite_domain.hpp:29
Functions evaluate assignments of a subset of variables.
Definition functions.hpp:67
Definition feature_network.hpp:57
auto select(const fun_value_t &x)
Definition feature_network.hpp:65
selector(const fun_value_t &value)
Definition feature_network.hpp:59
The evaluation policy to calculate partition functions.
Definition feature_network.hpp:50
static fun_value_t one()
Definition feature_network.hpp:87
static fun_value_t zero()
Definition feature_network.hpp:93
FunValue fun_value_t
Definition feature_network.hpp:52
static fun_value_t plus(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:75
static fun_value_t mul(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:81
static fun_value_t plus(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:172
bool fun_value_t
Definition feature_network.hpp:166
static fun_value_t mul(const fun_value_t &x, const fun_value_t &y)
Definition feature_network.hpp:178
static fun_value_t zero()
Definition feature_network.hpp:190
static fun_value_t one()
Definition feature_network.hpp:184
define PFEvaluationPolicy as standard
Definition feature_network.hpp:100
Definition assignment.hpp:29
std::vector< FiniteDomain > FiniteDomainVector
Definition finite_domain.hpp:148
Function< bool > Constraint
A constraint is simply a boolean-valued function.
Definition functions.hpp:406