1#ifndef INFRARED_ASSIGNMENT_HPP
2#define INFRARED_ASSIGNMENT_HPP
27#include "finite_domain.hpp"
30 template<
class FeatureNetwork>
42 using type = std::vector<T>;
47 using type = std::vector<char>;
99 :values_(domains.
size()), domains_(domains)
101 for (
int i=0; i < values_.size(); ++i ) {
132 size()
const {
return values_.size(); }
140 return values_[i] != domains_[i].undet();
149 values_[i] = domains_[i].undet();
169 domains_[i].inc( values_[i] );
181 template<
class FeatureNetwork>
185 const std::vector<const typename FeatureNetwork::constraint_t *> &
187 const std::vector<const typename FeatureNetwork::function_t *> &
198 template<
class Function,
class EP>
203 for(
const auto &f : functions ) {
204 if ( all_of( f->vars().begin(), f->vars().end(),
205 [&] (
auto v) { return is_det(v); } ) )
208 x = EP::mul( x, (*f)(*
this) );
219 std::vector<var_value_t> values_;
241 template<
class FeatureNetwork>
273 const std::vector<var_idx_t> &vars,
275 const std::vector<const constraint_t *> &constraints,
276 const std::vector<const function_t *> &functions,
281 domains_(cn.domains()),
282 initial_value_(initial_value),
288 constraint_board_ = create_board<constraint_t>(constraints);
289 function_board_ = create_board<function_t>(functions);
301 value_stack_.resize(vars_.size()+1);
303 value_stack_[0] = initial_value_;
305 if ( value_stack_[0]==ep::zero() ) {
310 if ( vars_.size() > 0 ) {
325 assert( ( top_==0 && vars_.size()==0 )
326 || top_ ==
static_cast<int>(vars_.size())-1 );
327 return value_stack_[vars_.size()];
343 stage1_size_ = stage1_size;
344 finish_stage2_hook_ = hook;
373 while (top_ <
static_cast<int>(vars_.size())) {
378 a_.
inc( vars_[top_] );
380 while ( a_[vars_[top_]] > domains_[vars_[top_]].ub() ) {
384 if (top_ == stage1_size_) {
385 finish_stage2_hook_();
395 a_.
inc( vars_[top_] );
400 if ( ! constraints_valid_at_top() )
403 if ( ! functions_valid_at_top() )
407 if ( value_stack_[top_+1] == ep::zero() )
416 if (top_ == stage1_size_) {
417 finish_stage2_hook_();
421 assert( top_ ==
static_cast<int>(vars_.size())-1 );
433 template<
class Function>
434 struct board_t {
using type = std::vector<std::vector<const Function *>>; };
437 const std::vector<var_idx_t> &vars_;
440 typename board_t<constraint_t>::type constraint_board_;
441 typename board_t<function_t>::type function_board_;
445 using value_stack_t =
typename vector_nbv_sel<fun_value_t>::type;
446 value_stack_t value_stack_;
449 std::function<void()> finish_stage2_hook_;
454 constraints_valid_at_top()
const {
455 assert(top_ < (
int)vars_.size());
458 const auto &constraints = constraint_board_[top_];
459 return all_of( constraints.begin(), constraints.end(),
460 [&](
auto c) { return (*c)(a_); } );
469 functions_valid_at_top()
const {
470 assert(top_ < (
int)vars_.size());
473 const auto &functions = function_board_[top_];
474 return all_of( functions.begin(), functions.end(),
475 [&](
auto f) { return ! f->guaranteed_zero(a_); } );
483 auto x = value_stack_[top_];
484 for (
const auto f: function_board_[top_] ) {
485 x = ep::mul( x, (*f)(a_) );
488 value_stack_[top_+1] = x;
503 template<
class Function>
505 create_board(
const std::vector<const Function *> &functions) {
507 typename board_t<Function>::type board(vars_.size());
510 for(
const auto &f : functions ) {
515 for (
auto var : f->vars() ) {
517 if ( a_.is_det(var) )
continue;
522 auto idx = std::distance(vars_.begin(), find(vars_.begin(),vars_.end(),var));
526 last_idx = std::max(last_idx,
static_cast<int>(idx));
531 if ( 0 <= last_idx && last_idx <
static_cast<int>(vars_.size()) ) {
533 board[last_idx].push_back( f );
546 const std::vector<const typename CN::constraint_t *> &
548 const std::vector<const typename CN::function_t *> &
550 const typename CN::fun_value_t & initial_value
Iterate over the assignments of a subset of variables.
Definition assignment.hpp:242
auto value()
get evaluation according to functions
Definition assignment.hpp:323
typename ep::constraint_t constraint_t
Definition assignment.hpp:250
const auto & operator++()
Next valid partial assignment.
Definition assignment.hpp:353
assignment_t::var_idx_t var_idx_t
Definition assignment.hpp:245
AssignmentIterator(assignment_t &a, const std::vector< var_idx_t > &vars, const FeatureNetwork &cn, const std::vector< const constraint_t * > &constraints, const std::vector< const function_t * > &functions, const fun_value_t &initial_value)
constructor
Definition assignment.hpp:272
bool finished()
Check for termination.
Definition assignment.hpp:428
Assignment assignment_t
Definition assignment.hpp:244
typename ep::fun_value_t fun_value_t
Definition assignment.hpp:248
assignment_t::var_value_t var_value_t
Definition assignment.hpp:246
typename FeatureNetwork::evaluation_policy_t ep
Definition assignment.hpp:247
typename ep::function_t function_t
Definition assignment.hpp:249
void reset()
Reset iterator.
Definition assignment.hpp:297
void register_finish_stage2_hook(int stage1_size, const std::function< void()> &hook)
register hook to run after finishing stage 2 enumeration
Definition assignment.hpp:342
A (partial) assignment of variables to values.
Definition assignment.hpp:76
int var_value_t
variable value type
Definition assignment.hpp:86
auto eval_determined(const std::vector< const Function * > &functions, const EP &)
evaluate constraints/functions where all variables are already determined
Definition assignment.hpp:200
auto is_det(var_idx_t i) const
check whether variable is determined
Definition assignment.hpp:139
Assignment(const FiniteDomainVector &domains)
construct empty
Definition assignment.hpp:98
int var_idx_t
variable index type
Definition assignment.hpp:83
void set_undet(var_idx_t i)
set variables to undetermined
Definition assignment.hpp:148
auto make_iterator(const std::vector< var_idx_t > &vars, const FeatureNetwork &cn, const std::vector< const typename FeatureNetwork::constraint_t * > &constraints, const std::vector< const typename FeatureNetwork::function_t * > &functions, const typename FeatureNetwork::fun_value_t &initial_value)
make sub-assignment iterator
void inc(var_idx_t i)
increment value of variable
Definition assignment.hpp:168
void set_undet(const std::vector< var_idx_t > &xs)
set variables to undetermined
Definition assignment.hpp:157
auto size() const
get number of variables in assignment
Definition assignment.hpp:132
const auto & values() const
get values (read only)
Definition assignment.hpp:126
const auto & operator[](var_idx_t i) const
get value of a variable (read only)
Definition assignment.hpp:112
the feature network
Definition feature_network.hpp:208
FunValue fun_value_t
Definition feature_network.hpp:211
EvaluationPolicy evaluation_policy_t
Definition feature_network.hpp:217
Definition assignment.hpp:29
std::vector< FiniteDomain > FiniteDomainVector
Definition finite_domain.hpp:148
std::vector< char > type
Definition assignment.hpp:47
Definition assignment.hpp:41
std::vector< T > type
Definition assignment.hpp:42