1#ifndef INFRARED_FUNCTIONS_HPP
2#define INFRARED_FUNCTIONS_HPP
28#include <unordered_map>
35#include "assignment.hpp"
36#include "simple_map.hpp"
40 template<
class FunValue,
class EP>
53 const std::vector<var_idx_t> &
54 vars()
const {
return vars_;}
60 const std::vector<var_idx_t> vars_;
66 template<
class FunValue=
double>
97 name()
const {
return "Function"; }
106 out << f.
name() <<
"(";
107 for (
auto i : f.
vars()) { out << i <<
", "; }
108 out <<
") <"<<&f<<
">";
139 template<
class FunValue,
class T>
148 template<
class FunValue>
152 static void init(
type &x,
size_t size,
const FunValue &zero) {
154 std::fill(x.begin(),x.end(),zero);
159 static FunValue
get(
const type &x,
size_t i,
const FunValue &zero) {
163 static void set(
type &x,
size_t i,
const FunValue &v,
const FunValue &zero) {x[i]=v;}
170 template<
class FunValue>
172 using type = std::unordered_map<int,FunValue>;
173 static void init(
type &x,
size_t size,
const FunValue &zero) {
175 static const FunValue&
get(
const type &x,
size_t i,
const FunValue &zero) {
177 if (it != x.end())
return it->second;
else return zero;
180 return x.find(i) == x.end();
182 static void set(
type &x,
size_t i,
const FunValue &v,
const FunValue &zero) {
198 template<
class FunValue>
201 static void init(
type &x,
size_t size,
const FunValue &zero) {
203 static const FunValue&
get(
const type &x,
size_t i,
const FunValue &zero) {
205 if (it != x.
end())
return it->second;
else return zero;
210 static void set(
type &x,
size_t i,
const FunValue &v,
const FunValue &zero ) {
232 template<
class FunValue,
class ContainerS = simple_mapS >
256 template<
class FeatureNetwork>
262 domains_(extract_domains(cn.domains())),
279 template<
class FeatureNetwork>
285 domains_(extract_domains(cn.domains())),
287 name_(function->
name())
291 using ep =
typename feature_network_t::evaluation_policy_t;
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};
300 auto initial_value = a.eval_determined(functions, ep());
302 auto it = a.make_iterator(this->
vars(),
309 for(; ! it.finished() ; ++it ) {
310 set( a, it.value() );
352 name()
const override {
return "Materialized"+name_; }
365 auto unique(
const std::vector<T> &xs ) {
367 std::sort( vec.begin(), vec.end() );
368 vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
375 for (
auto x: 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();
400 return std::accumulate( domains_.begin(), domains_.end(), 1,
401 [](
int acc,
const FiniteDomain &x) { return x.size()*acc; } );
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