8namespace modelchecker {
10namespace rewardbounded {
16 return value == std::numeric_limits<uint64_t>::max();
31 return value < other.value;
35 return value == other.value;
39 return CostLimit(std::numeric_limits<uint64_t>::max());
44 for (uint64_t i = 0; i < lhs.size(); ++i) {
45 if (lhs[i] < rhs[i]) {
47 }
else if (rhs[i] < lhs[i]) {
61 std::vector<CostLimits> pointsToErase;
62 for (
auto const& b : generator) {
66 STORM_LOG_ASSERT(pointsToErase.empty(),
"Inconsistent generator of CostLimitClosure.");
72 pointsToErase.push_back(b);
75 for (
auto const& b : pointsToErase) {
78 generator.insert(std::move(costLimits));
85 for (
auto const& b : generator) {
95 for (
auto dim : downwardDimensions) {
102 return generator.empty();
107 for (
auto dim : downwardDimensions) {
114 for (uint64_t i = 0; i < lhs.size(); ++i) {
115 if (downwardDimensions.
get(i)) {
116 if (lhs[i] < rhs[i]) {
120 if (rhs[i] < lhs[i]) {
129 std::vector<CostLimits> result;
130 for (
auto const& b : generator) {
143 return downwardDimensions.
size();
149 auto manager = std::make_shared<storm::expressions::ExpressionManager>();
152 std::vector<storm::expressions::Expression> point;
154 for (uint64_t i = 0; i <
dimension; ++i) {
155 point.push_back(manager->declareIntegerVariable(
"x" + std::to_string(i)).getExpression());
156 solver->add(point.back() >= zero);
158 for (
auto const& cl : {first, second}) {
159 for (
auto const& q : cl.getGenerator()) {
161 for (uint64_t i = 0; i < point.size(); ++i) {
162 if (!cl.downwardDimensions.get(i) || !q[i].isInfinity()) {
163 assert(!q[i].isInfinity());
167 pointNotDominated = pointNotDominated || piNotDominated;
169 pointNotDominated = piNotDominated;
174 solver->add(pointNotDominated);
176 solver->add(manager->boolean(
false));
bool isInitialized() const
Checks whether the object encapsulates a base-expression.
static bool unionFull(CostLimitClosure const &first, CostLimitClosure const &second)
Returns true if the union of the two closures is full, i.e., contains every point.
std::vector< CostLimits > getDominatingCostLimits(CostLimits const &costLimits) const
uint64_t dimension() const
CostLimitClosure(storm::storage::BitVector const &downwardDimensions)
bool dominates(CostLimits const &lhs, CostLimits const &rhs) const
GeneratorType const & getGenerator() const
bool contains(CostLimits const &costLimits) const
std::set< CostLimits, CostLimitsCompare > GeneratorType
bool insert(CostLimits const &costLimits)
bool containsUpwardClosure(CostLimits const &costLimits) const
CostLimit(uint64_t const &costLimit)
bool operator<(CostLimit const &other) const
bool operator==(CostLimit const &other) const
static CostLimit infinity()
uint64_t const & get() const
A bit vector that is internally represented as a vector of 64-bit values.
size_t size() const
Retrieves the number of bits this bit vector can store.
bool get(uint_fast64_t index) const
Retrieves the truth value of the bit at the given index and performs a bound check.
#define STORM_LOG_ASSERT(cond, message)
std::vector< CostLimit > CostLimits
std::unique_ptr< storm::solver::SmtSolver > getSmtSolver(storm::expressions::ExpressionManager &manager)
bool operator()(CostLimits const &lhs, CostLimits const &rhs) const