AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
assignment_enumerator.h
1#ifndef PROBFD_PDBS_ASSIGNMENT_ENUMERATOR_H
2#define PROBFD_PDBS_ASSIGNMENT_ENUMERATOR_H
3
4#include <limits>
5#include <ranges>
6#include <span>
7#include <stdexcept>
8#include <vector>
9
10namespace probfd::pdbs {
11
12class AssignmentEnumerator {
13 struct VariableInfo {
14 long long int multiplier;
15 int domain;
16 };
17
18 std::vector<VariableInfo> var_infos_;
19 long long int num_assignments_;
20
21public:
25 AssignmentEnumerator();
26
31 explicit AssignmentEnumerator(const auto& domain_sizes)
32 : var_infos_(domain_sizes.size())
33 {
34 using namespace std::views;
35 constexpr auto maxint = std::numeric_limits<long long int>::max();
36
37 long long int multiplier = 1;
38
39 for (auto [cur_info, domain_size] : zip(var_infos_, domain_sizes)) {
40 cur_info.domain = domain_size;
41 cur_info.multiplier = multiplier;
42
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()");
47 }
48
49 multiplier *= domain_size;
50 }
51
52 num_assignments_ = multiplier;
53 }
54
58 [[nodiscard]]
59 unsigned int num_assignments() const;
60
64 [[nodiscard]]
65 unsigned int num_vars() const;
66
72 [[nodiscard]]
73 long long int get_multiplier(int var) const;
74
78 [[nodiscard]]
79 int get_domain_size(int var) const;
80
90 [[nodiscard]]
91 int rank_fact(int idx, int val) const;
92
108 [[nodiscard]]
109 std::vector<int> unrank(int assignment_index) const;
110
120 [[nodiscard]]
121 int value_of(int assignment_index, int idx) const;
122
146 bool
147 next_index(int& assignment_index, std::span<int> mutable_variables) const;
148};
149
150} // namespace probfd::pdbs
151
152#endif // PROBFD_PDBS_ASSIGNMENT_ENUMERATOR_H
Namespace dedicated to probabilistic pattern databases.
Definition gzocp_heuristic.h:16