26 assert(!offsets.
empty());
27 if (winningRegion[observation].
empty()) {
28 winningRegion[observation].push_back(offsets);
31 std::vector<storm::storage::BitVector> newWinningSupport = std::vector<storm::storage::BitVector>();
33 for (
auto const& support : winningRegion[observation]) {
34 newWinningSupport.push_back(support | offsets);
38 winningRegion[observation].clear();
39 for (
auto const& newWinning : newWinningSupport) {
40 update(observation, newWinning);
80 std::vector<storm::expressions::Expression> expressionForEntry;
82 for (
auto const& winningForObservation : winningRegion[observation]) {
83 if (winningForObservation.full()) {
84 assert(winningRegion[observation].size() == 1);
85 return varsForStates.front().getManager().boolean(
false);
87 std::vector<storm::expressions::Expression> subexpr;
88 std::vector<storm::expressions::Expression> leftHandSides;
89 assert(varsForStates.size() == winningForObservation.size());
90 for (uint64_t i = 0; i < varsForStates.size(); ++i) {
91 if (winningForObservation.get(i)) {
92 leftHandSides.push_back(varsForStates[i]);
94 subexpr.push_back(varsForStates[i]);
98 for (
auto const& lhs : leftHandSides) {
116 uint64_t observation = 0;
117 std::vector<uint64_t> winningObservations;
118 std::vector<uint64_t> loosingObservations;
120 for (
auto const& winningSupport : winningRegion) {
122 winningObservations.push_back(observation);
123 }
else if (winningRegion[observation].
empty()) {
124 loosingObservations.push_back(observation);
126 std::cout <<
"***** observation" << observation <<
'\n';
127 for (
auto const& support : winningSupport) {
128 std::cout <<
" " << support;
134 std::cout <<
"and " << winningObservations.size() <<
" winning observations: (";
135 for (
auto const& obs : winningObservations) {
136 std::cout << obs <<
" ";
138 std::cout <<
") and " << loosingObservations.size() <<
" loosing observations: (";
139 for (
auto const& obs : loosingObservations) {
140 std::cout << obs <<
" ";
176std::pair<storm::RationalNumber, storm::RationalNumber>
count(std::vector<storm::storage::BitVector>
const& origSets,
177 std::vector<storm::storage::BitVector>
const& intersects,
178 std::vector<storm::storage::BitVector>
const& intersectsInfo, storm::RationalNumber val,
179 bool plus, uint64_t remdepth) {
180 assert(intersects.size() == intersectsInfo.size());
181 storm::RationalNumber newVal = val;
182 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
183 for (uint64_t i = 0; i < intersects.size(); ++i) {
185 newVal += carl::pow(two, intersects[i].getNumberOfSetBits());
187 newVal -= carl::pow(two, intersects[i].getNumberOfSetBits());
191 storm::RationalNumber diff = val - newVal;
195 if (remdepth == 0 || 20 * diff < max) {
197 return std::make_pair(val, newVal);
199 return std::make_pair(newVal, val);
202 storm::RationalNumber skipped = 0;
203 uint64_t upperBoundElements = origSets.size() * intersects.size();
204 STORM_LOG_DEBUG(
"Upper bound on number of elements to be considered " << upperBoundElements);
207 uint64_t critoom = 0;
208 storm::RationalNumber n = 1;
215 critoom = oom -
static_cast<uint64_t
>(floor(log2(upperBoundElements)));
219 uint64_t intersectSetSkip = critoom -
static_cast<uint64_t
>(floor(log2(origSets.size())));
221 std::vector<storm::storage::BitVector> useIntersects;
222 std::vector<storm::storage::BitVector> useInfo;
223 for (uint64_t i = 0; i < intersects.size(); ++i) {
224 if (upperBoundElements > 10000 && intersects[i].getNumberOfSetBits() < intersectSetSkip - 3) {
225 skipped += (carl::pow(two, intersects[i].getNumberOfSetBits()) * origSets.size());
228 useIntersects.push_back(intersects[i]);
229 useInfo.push_back(intersectsInfo[i]);
233 uint64_t origSetSkip = critoom -
static_cast<uint64_t
>(floor(log2(useIntersects.size())));
236 std::vector<storm::storage::BitVector> newIntersects;
237 std::vector<storm::storage::BitVector> newInfo;
239 for (uint64_t i = 0; i < origSets.size(); ++i) {
240 if (upperBoundElements > 20000 && origSets[i].getNumberOfSetBits() < origSetSkip - 3) {
241 skipped += (carl::pow(two, origSets[i].getNumberOfSetBits()) * useIntersects.size());
245 for (uint64_t j = 0; j < useIntersects.size(); ++j) {
246 if (useInfo[j].get(i)) {
251 if (newinf == useInfo[j]) {
255 for (
auto const& entry : newInfo) {
256 if (entry == newinf) {
262 newInfo.push_back(newinf);
263 newIntersects.push_back(origSets[i] & useIntersects[j]);
268 auto res =
count(origSets, newIntersects, newInfo, newVal, !plus, remdepth - 1);
270 storm::RationalNumber tmp = res.first - skipped;
273 storm::RationalNumber tmp = res.second + skipped;
280 storm::RationalNumber upper = 0;
281 storm::RationalNumber lower = 0;
282 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
283 for (
auto const& winningSets : winningRegion) {
284 storm::RationalNumber totalForObs = 0;
285 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
287 std::vector<storm::storage::BitVector> info;
288 for (uint64_t i = 0; i < winningSets.size(); ++i) {
291 info.push_back(entry);
293 auto res =
count(winningSets, winningSets, info, totalForObs,
true, 40);
301 return std::make_pair(lower, upper);
340 std::vector<uint64_t> observationSizes;
344 uint64_t observation = 0;
346 std::stringstream preamblestream;
348 if (boost::starts_with(line,
"#")) {
352 STORM_LOG_THROW(line ==
":preamble", storm::exceptions::WrongFormatException,
"Expected to see :preamble");
354 }
else if (state == 1) {
355 if (line ==
":winningregion") {
358 preamblestream << line <<
'\n';
360 }
else if (state == 2) {
361 std::vector<std::string> entries;
362 boost::split(entries, line, boost::is_space());
363 std::vector<uint64_t> observationSizes;
364 for (
auto const& entry : entries) {
365 observationSizes.push_back(std::stoul(entry));
369 }
else if (state == 3) {
370 std::vector<std::string> entries;
371 boost::split(entries, line, boost::is_any_of(
";"));
373 for (std::string
const& bvString : entries) {
380 return {wr, preamblestream.str()};
std::basic_istream< CharT, Traits > & getline(std::basic_istream< CharT, Traits > &input, std::basic_string< CharT, Traits, Allocator > &str)
Overloaded getline function which handles different types of newline ( and \r).
std::pair< storm::RationalNumber, storm::RationalNumber > count(std::vector< storm::storage::BitVector > const &origSets, std::vector< storm::storage::BitVector > const &intersects, std::vector< storm::storage::BitVector > const &intersectsInfo, storm::RationalNumber val, bool plus, uint64_t remdepth)