1#ifndef PROBFD_PDBS_ASSIGNMENT_ENUMERATOR_H
2#define PROBFD_PDBS_ASSIGNMENT_ENUMERATOR_H
12class AssignmentEnumerator {
14 long long int multiplier;
18 std::vector<VariableInfo> var_infos_;
19 long long int num_assignments_;
25 AssignmentEnumerator();
31 explicit AssignmentEnumerator(
const auto& domain_sizes)
32 : var_infos_(domain_sizes.size())
34 using namespace std::views;
35 constexpr auto maxint = std::numeric_limits<long long int>::max();
37 long long int multiplier = 1;
39 for (
auto [cur_info, domain_size] : zip(var_infos_, domain_sizes)) {
40 cur_info.domain = domain_size;
41 cur_info.multiplier = multiplier;
43 if (multiplier > maxint / domain_size) {
44 throw std::range_error(
45 "Construction of PDB would exceed "
46 "std::numeric_limits<long long int>::max()");
49 multiplier *= domain_size;
52 num_assignments_ = multiplier;
59 unsigned int num_assignments()
const;
65 unsigned int num_vars()
const;
73 long long int get_multiplier(
int var)
const;
79 int get_domain_size(
int var)
const;
91 int rank_fact(
int idx,
int val)
const;
109 std::vector<int> unrank(
int assignment_index)
const;
121 int value_of(
int assignment_index,
int idx)
const;
147 next_index(
int& assignment_index, std::span<int> mutable_variables)
const;
Namespace dedicated to probabilistic pattern databases.
Definition gzocp_heuristic.h:16