Infrared
Loading...
Searching...
No Matches
functions.hpp
1#ifndef INFRARED_FUNCTIONS_HPP
2#define INFRARED_FUNCTIONS_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
27#include <vector>
28#include <unordered_map>
29#include <memory>
30#include <string>
31#include <iterator>
32#include <cassert>
33#include <numeric>
34
35#include "assignment.hpp"
36#include "simple_map.hpp"
37
38namespace ired {
39
40 template<class FunValue, class EP>
41 class FeatureNetwork;
42
46 class Dependency {
47 public:
48 using var_idx_t = int;
49
50 explicit
51 Dependency(const std::vector<var_idx_t> &vars) : vars_(vars) {}
52
53 const std::vector<var_idx_t> &
54 vars() const {return vars_;}
55
56 virtual
58
59 private:
60 const std::vector<var_idx_t> vars_;
61 };
62
66 template<class FunValue=double>
67 class Function : public Dependency {
68 public:
70 using base_t = self_t;
72 using fun_value_t = FunValue;
73
74 explicit
75 Function(const std::vector<var_idx_t> &vars) : Dependency(vars) {}
76
77 virtual
79 operator () (const assignment_t &) const = 0;
80
87 virtual
88 bool
89 guaranteed_zero(const assignment_t &a) const { return false; }
90
91 virtual
92 bool
93 auto_materialize() const { return true; }
94
95 virtual
96 std::string
97 name() const { return "Function"; }
98
99 virtual
101 };
102
103 template <class T>
104 inline
105 std::ostream & operator << (std::ostream &out, const Function<T> &f) {
106 out << f.name() << "(";
107 for (auto i : f.vars()) { out << i << ", "; }
108 out << ") <"<<&f<<">";
109 return out;
110 }
111
118 struct mapS {};
119
126 struct simple_mapS {};
127
134 struct vecS {};
135
139 template<class FunValue, class T>
141 using type = T;
142 };
143
148 template<class FunValue>
149 struct container_selector<FunValue,vecS> {
150 //using type = std::vector<FunValue>;
152 static void init(type &x, size_t size, const FunValue &zero) {
153 x.resize(size);
154 std::fill(x.begin(),x.end(),zero);
155 }
156 static bool guaranteed_zero(const type &x, size_t i) {
157 return false;
158 }
159 static FunValue get(const type &x, size_t i, const FunValue &zero) {
160 assert(i<x.size());
161 return x[i];
162 }
163 static void set(type &x,size_t i, const FunValue &v, const FunValue &zero) {x[i]=v;}
164 };
165
170 template<class FunValue>
171 struct container_selector<FunValue,mapS> {
172 using type = std::unordered_map<int,FunValue>;
173 static void init(type &x, size_t size, const FunValue &zero) {
174 }
175 static const FunValue& get(const type &x, size_t i, const FunValue &zero) {
176 auto it = x.find(i);
177 if (it != x.end()) return it->second; else return zero;
178 }
179 static bool guaranteed_zero(const type &x, size_t i) {
180 return x.find(i) == x.end();
181 }
182 static void set(type &x,size_t i, const FunValue &v, const FunValue &zero) {
183 if (v!=zero) {
184 x[i]=v;
185 } else {
186 x.erase(i); //erases key i if it exists
187 }
188 }
189 };
190
198 template<class FunValue>
201 static void init(type &x, size_t size, const FunValue &zero) {
202 }
203 static const FunValue& get(const type &x, size_t i, const FunValue &zero) {
204 auto it = x.find(i);
205 if (it != x.end()) return it->second; else return zero;
206 }
207 static bool guaranteed_zero(const type &x, size_t i) {
208 return x.find(i) == x.end();
209 }
210 static void set( type &x, size_t i, const FunValue &v, const FunValue &zero ) {
211 if (v!=zero) {
212 x.push_ascending(i,v);
213 } else {
214 // x.erase(i); //erases key i if it exists
215 }
216 }
217 };
218
219
220
232 template< class FunValue, class ContainerS = simple_mapS >
233 class MaterializedFunction : public Function<FunValue> {
234 public:
237 using base_t = typename parent_t::base_t;
238
241 using fun_value_t = FunValue;
243
245
256 template<class FeatureNetwork>
257 MaterializedFunction(const std::vector<var_idx_t> &vars,
258 const FeatureNetwork &cn
259 )
260 :
261 parent_t(vars),
262 domains_(extract_domains(cn.domains())),
263 zero_(FeatureNetwork::evaluation_policy_t::zero()),
264 name_("Message")
265 {
266 container_selector<FunValue,ContainerS>::init(data_, calc_size(), zero_);
267 }
268
279 template<class FeatureNetwork>
281 const FeatureNetwork &cn
282 )
283 :
284 parent_t(unique(function->vars())),
285 domains_(extract_domains(cn.domains())),
286 zero_(FeatureNetwork::evaluation_policy_t::zero()),
287 name_(function->name())
288 {
289 using feature_network_t = FeatureNetwork;
290
291 using ep = typename feature_network_t::evaluation_policy_t;
292
293 container_selector<FunValue,ContainerS>::init(data_, calc_size(), zero_);
294
295 auto a = Assignment(cn.domains());
296
297 auto constraints = std::vector<const typename feature_network_t::constraint_t *>();
298 auto functions = std::vector<const typename feature_network_t::function_t *> {function};
299
300 auto initial_value = a.eval_determined(functions, ep()); //evaluate 0-ary functions
301
302 auto it = a.make_iterator(this->vars(),
303 cn,
304 constraints,
305 functions,
306 initial_value
307 );
308
309 for(; ! it.finished() ; ++it ) {
310 set( a, it.value() );
311 }
312 }
313
320 operator () ( const assignment_t & a ) const override {
321 return container_selector<FunValue,ContainerS>::get(data_, index(a), zero_);
322 }
323
330 void
331 set( const assignment_t & a, const fun_value_t &val) {
332 return container_selector<FunValue,ContainerS>::set(data_, index(a), val, zero_);
333 }
334
340 bool guaranteed_zero(const assignment_t &a) const override {
342 }
343
345 virtual
346 bool
347 auto_materialize() const override { return false; }
348
350 virtual
351 std::string
352 name() const override { return "Materialized"+name_; }
353
355 auto
356 datasize() const {return data_.size();}
357
358 private:
359 FiniteDomainVector domains_;
360 data_t data_;
361 fun_value_t zero_;
362 std::string name_;
363
364 template<class T>
365 auto unique( const std::vector<T> &xs ) {
366 auto vec = xs;
367 std::sort( vec.begin(), vec.end() );
368 vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
369 return vec;
370 }
371
372 auto
373 extract_domains(const FiniteDomainVector &v) {
374 auto ds = FiniteDomainVector();
375 for ( auto x: this->vars() ) {
376 ds.push_back(v[x]);
377 }
378 return ds;
379 }
380
381
384 auto
385 index( const assignment_t & a ) const {
386 size_t x = 0;
387 size_t i = 0;
388 auto vars = this->vars();
389 for ( size_t i=0; i < domains_.size(); i++) {
390 x *= domains_[i].size();
391 x += a[vars[i]] - domains_[i].lb();
392 }
393 return x;
394 }
395
398 auto
399 calc_size() const {
400 return std::accumulate( domains_.begin(), domains_.end(), 1,
401 [](int acc, const FiniteDomain &x) { return x.size()*acc; } );
402 }
403 };
404
407}
408
409#endif
A (partial) assignment of variables to values.
Definition assignment.hpp:76
Dependencies specify a dependency between variables.
Definition functions.hpp:46
int var_idx_t
Definition functions.hpp:48
const std::vector< var_idx_t > & vars() const
Definition functions.hpp:54
virtual ~Dependency()
Definition functions.hpp:57
Dependency(const std::vector< var_idx_t > &vars)
Definition functions.hpp:51
the feature network
Definition feature_network.hpp:208
const auto & domains() const
Get vector of domains (read only)
Definition feature_network.hpp:319
Functions evaluate assignments of a subset of variables.
Definition functions.hpp:67
virtual std::string name() const
Definition functions.hpp:97
virtual bool auto_materialize() const
Definition functions.hpp:93
self_t base_t
Definition functions.hpp:70
Function< FunValue > self_t
Definition functions.hpp:69
virtual fun_value_t operator()(const assignment_t &) const =0
Assignment assignment_t
Definition functions.hpp:71
Function(const std::vector< var_idx_t > &vars)
Definition functions.hpp:75
virtual bool guaranteed_zero(const assignment_t &a) const
Definition functions.hpp:89
virtual ~Function()
Definition functions.hpp:100
FunValue fun_value_t
Definition functions.hpp:72
A materialized function.
Definition functions.hpp:233
MaterializedFunction(const std::vector< var_idx_t > &vars, const FeatureNetwork &cn)
construct 'empty' with variables, domains, and zero value
Definition functions.hpp:257
fun_value_t operator()(const assignment_t &a) const override
evaluate function
Definition functions.hpp:320
virtual std::string name() const override
name of the class
Definition functions.hpp:352
typename parent_t::base_t base_t
Definition functions.hpp:237
virtual bool auto_materialize() const override
whether to automatically materialize when added to CN
Definition functions.hpp:347
void set(const assignment_t &a, const fun_value_t &val)
set function value
Definition functions.hpp:331
typename container_selector< FunValue, ContainerS >::type data_t
Definition functions.hpp:244
auto datasize() const
number of stored function values
Definition functions.hpp:356
FunValue fun_value_t
Definition functions.hpp:241
MaterializedFunction(const function_t *function, const FeatureNetwork &cn)
materializing constructor
Definition functions.hpp:280
typename parent_t::var_idx_t var_idx_t
Definition functions.hpp:239
bool guaranteed_zero(const assignment_t &a) const override
check whether this object knows that some function value is zero
Definition functions.hpp:340
typename parent_t::assignment_t assignment_t
Definition functions.hpp:240
Space saving replacement for map.
Definition simple_map.hpp:36
auto end() const
Definition simple_map.hpp:89
const_iterator find(const key_t &key) const
Definition simple_map.hpp:70
void push_ascending(const key_t &key, const val_t &val)
push in ascending order of keys
Definition simple_map.hpp:101
Definition assignment.hpp:29
std::vector< FiniteDomain > FiniteDomainVector
Definition finite_domain.hpp:148
std::ostream & operator<<(std::ostream &out, const Function< T > &f)
Definition functions.hpp:105
std::unordered_map< int, FunValue > type
Definition functions.hpp:172
static void init(type &x, size_t size, const FunValue &zero)
Definition functions.hpp:173
static void set(type &x, size_t i, const FunValue &v, const FunValue &zero)
Definition functions.hpp:182
static const FunValue & get(const type &x, size_t i, const FunValue &zero)
Definition functions.hpp:175
static bool guaranteed_zero(const type &x, size_t i)
Definition functions.hpp:179
static void set(type &x, size_t i, const FunValue &v, const FunValue &zero)
Definition functions.hpp:210
static bool guaranteed_zero(const type &x, size_t i)
Definition functions.hpp:207
static void init(type &x, size_t size, const FunValue &zero)
Definition functions.hpp:201
static const FunValue & get(const type &x, size_t i, const FunValue &zero)
Definition functions.hpp:203
static void set(type &x, size_t i, const FunValue &v, const FunValue &zero)
Definition functions.hpp:163
static bool guaranteed_zero(const type &x, size_t i)
Definition functions.hpp:156
typename vector_nbv_sel< FunValue >::type type
Definition functions.hpp:151
static void init(type &x, size_t size, const FunValue &zero)
Definition functions.hpp:152
static FunValue get(const type &x, size_t i, const FunValue &zero)
Definition functions.hpp:159
Switching containers in MaterializedFuntion.
Definition functions.hpp:140
T type
Definition functions.hpp:141
map selector class
Definition functions.hpp:118
simple map selector class
Definition functions.hpp:126
vector selector class
Definition functions.hpp:134
std::vector< T > type
Definition assignment.hpp:42