|
|
@ -511,6 +511,25 @@ namespace storm { |
|
|
|
upperBound += sum; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Compute upper bound with permutations of size <= 3
|
|
|
|
ValueType upperBound2 = storm::utility::zero<ValueType>(); |
|
|
|
for (size_t i1 = 0; i1 < rates.size(); ++i1) { |
|
|
|
// + 1/a
|
|
|
|
ValueType sum = rates[i1]; |
|
|
|
upperBound2 += storm::utility::one<ValueType>() / sum; |
|
|
|
for (size_t i2 = 0; i2 < i1; ++i2) { |
|
|
|
// - 1/(a+b)
|
|
|
|
ValueType sum2 = sum + rates[i2]; |
|
|
|
upperBound2 -= storm::utility::one<ValueType>() / sum2; |
|
|
|
for (size_t i3 = 0; i3 < i2; ++i3) { |
|
|
|
// + 1/(a+b+c)
|
|
|
|
upperBound2 += storm::utility::one<ValueType>() / (sum2 + rates[i3]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
STORM_LOG_ASSERT(upperBound == upperBound2, "Upperbounds are different: " << upperBound << " and " << upperBound2); |
|
|
|
|
|
|
|
STORM_LOG_ASSERT(!storm::utility::isZero(upperBound), "UpperBound is 0"); |
|
|
|
return storm::utility::one<ValueType>() / upperBound; |
|
|
|
} |