Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
Extremum.cpp
Go to the documentation of this file.
2
7
8namespace storm::utility {
9
10template<storm::OptimizationDirection Dir, typename ValueType>
11Extremum<Dir, ValueType>::Extremum(ValueType const& value) : extremalValue(value) {
12 // Intentionally left empty
13}
14
15template<storm::OptimizationDirection Dir, typename ValueType>
16Extremum<Dir, ValueType>::Extremum(ValueType&& value) : extremalValue(std::move(value)) {
17 // Intentionally left empty
18}
19
20template<storm::OptimizationDirection Dir, typename ValueType>
22 extremalValue = value;
23 return *this;
24}
25
26template<storm::OptimizationDirection Dir, typename ValueType>
28 extremalValue = std::move(value);
29 return *this;
30}
31
32template<storm::OptimizationDirection Dir, typename ValueType>
33bool Extremum<Dir, ValueType>::better(ValueType const& value) const {
34 if constexpr (storm::solver::minimize(Dir)) {
35 return value < extremalValue;
36 } else {
37 static_assert(storm::solver::maximize(Dir));
38 return value > extremalValue;
39 }
40}
41
42template<storm::OptimizationDirection Dir, typename ValueType>
44 if (better(other.extremalValue)) {
45 extremalValue = other.extremalValue;
46 return true;
47 }
48 return false;
49}
50
51template<storm::OptimizationDirection Dir, typename ValueType>
53 if (better(other.extremalValue)) {
54 extremalValue = std::move(other.extremalValue);
55 return true;
56 }
57 return false;
58}
59
60template<storm::OptimizationDirection Dir, typename ValueType>
61bool Extremum<Dir, ValueType>::operator&=(ValueType const& value) {
62 if (better(value)) {
63 extremalValue = value;
64 return true;
65 }
66 return false;
68
69template<storm::OptimizationDirection Dir, typename ValueType>
70bool Extremum<Dir, ValueType>::operator&=(ValueType&& value) {
71 if (better(value)) {
72 extremalValue = std::move(value);
73 return true;
74 }
75 return false;
76}
77
78template<storm::OptimizationDirection Dir, typename ValueType>
80 if constexpr (StoresPlainValues) {
81 return extremalValue == baseValue();
82 } else {
83 if constexpr (storm::solver::minimize(Dir)) {
84 return extremalValue.isPositiveInfinity();
85 } else {
86 static_assert(storm::solver::maximize(Dir));
87 return extremalValue.isNegativeInfinity();
88 }
89 }
90}
91
92template<storm::OptimizationDirection Dir, typename ValueType>
93ValueType const& Extremum<Dir, ValueType>::operator*() const {
94 STORM_LOG_ASSERT(!empty(), "Tried to get empty extremum.");
95 if constexpr (StoresPlainValues) {
96 return extremalValue;
97 } else {
98 return extremalValue.getFinite();
99 }
100}
101
102template<storm::OptimizationDirection Dir, typename ValueType>
104 STORM_LOG_ASSERT(!empty(), "Tried to get empty extremum.");
105 if constexpr (StoresPlainValues) {
106 return extremalValue;
107 } else {
108 return extremalValue.getFinite();
109 }
111
112template<storm::OptimizationDirection Dir, typename ValueType>
113std::optional<ValueType> Extremum<Dir, ValueType>::getOptionalValue() const {
114 if (empty()) {
115 return {};
116 }
117 return **this;
118}
119
120template<storm::OptimizationDirection Dir, typename ValueType>
124
125template<storm::OptimizationDirection Dir, typename ValueType>
127 extremalValue = baseValue();
128}
129
132
136#if STORM_RATIONAL_NUMBER_DIFFERS_FROM_COEFFICIENT
139#endif
140
141} // namespace storm::utility
Stores and manages an extremal (maximal or minimal) value.
Definition Extremum.h:17
bool operator&=(Extremum const &other)
Updates the stored value, if the given extremal value is better.
Definition Extremum.cpp:43
ValueType const & operator*() const
Definition Extremum.cpp:93
std::optional< ValueType > getOptionalValue() const
Definition Extremum.cpp:113
bool better(ValueType const &value) const
Definition Extremum.cpp:33
storm::utility::ExtendedValueType< ValueType > const & getExtendedValue() const
Definition Extremum.cpp:121
void reset()
Forgets the extremal value so that this represents the extremum over an empty set.
Definition Extremum.cpp:126
Extremum & operator=(Extremum const &)=default
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
bool constexpr maximize(OptimizationDirection d)
bool constexpr minimize(OptimizationDirection d)
std::conditional_t< storm::NumberTraits< ValueType >::HasInfinity, ValueType, ExtendedNumber< ValueType > > ExtendedValueType
The type to use for values that may be infinite.