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