25 assert(!offsets.
empty());
26 if (winningRegion[observation].
empty()) {
27 winningRegion[observation].push_back(offsets);
30 std::vector<storm::storage::BitVector> newWinningSupport = std::vector<storm::storage::BitVector>();
32 for (
auto const& support : winningRegion[observation]) {
33 newWinningSupport.push_back(support | offsets);
37 winningRegion[observation].clear();
38 for (
auto const& newWinning : newWinningSupport) {
39 update(observation, newWinning);
79 std::vector<storm::expressions::Expression> expressionForEntry;
81 for (
auto const& winningForObservation : winningRegion[observation]) {
82 if (winningForObservation.full()) {
83 assert(winningRegion[observation].size() == 1);
84 return varsForStates.front().getManager().boolean(
false);
86 std::vector<storm::expressions::Expression> subexpr;
87 std::vector<storm::expressions::Expression> leftHandSides;
88 assert(varsForStates.size() == winningForObservation.size());
89 for (uint64_t i = 0; i < varsForStates.size(); ++i) {
90 if (winningForObservation.get(i)) {
91 leftHandSides.push_back(varsForStates[i]);
93 subexpr.push_back(varsForStates[i]);
97 for (
auto const& lhs : leftHandSides) {
115 uint64_t observation = 0;
116 std::vector<uint64_t> winningObservations;
117 std::vector<uint64_t> loosingObservations;
119 for (
auto const& winningSupport : winningRegion) {
121 winningObservations.push_back(observation);
122 }
else if (winningRegion[observation].
empty()) {
123 loosingObservations.push_back(observation);
125 std::cout <<
"***** observation" << observation <<
'\n';
126 for (
auto const& support : winningSupport) {
127 std::cout <<
" " << support;
133 std::cout <<
"and " << winningObservations.size() <<
" winning observations: (";
134 for (
auto const& obs : winningObservations) {
135 std::cout << obs <<
" ";
137 std::cout <<
") and " << loosingObservations.size() <<
" loosing observations: (";
138 for (
auto const& obs : loosingObservations) {
139 std::cout << obs <<
" ";
175std::pair<storm::RationalNumber, storm::RationalNumber>
count(std::vector<storm::storage::BitVector>
const& origSets,
176 std::vector<storm::storage::BitVector>
const& intersects,
177 std::vector<storm::storage::BitVector>
const& intersectsInfo, storm::RationalNumber val,
178 bool plus, uint64_t remdepth) {
179 assert(intersects.size() == intersectsInfo.size());
180 storm::RationalNumber newVal = val;
181 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
182 for (uint64_t i = 0; i < intersects.size(); ++i) {
184 newVal += carl::pow(two, intersects[i].getNumberOfSetBits());
186 newVal -= carl::pow(two, intersects[i].getNumberOfSetBits());
190 storm::RationalNumber diff = val - newVal;
194 if (remdepth == 0 || 20 * diff < max) {
196 return std::make_pair(val, newVal);
198 return std::make_pair(newVal, val);
201 storm::RationalNumber skipped = 0;
202 uint64_t upperBoundElements = origSets.size() * intersects.size();
203 STORM_LOG_DEBUG(
"Upper bound on number of elements to be considered " << upperBoundElements);
206 uint64_t critoom = 0;
207 storm::RationalNumber n = 1;
214 critoom = oom -
static_cast<uint64_t
>(floor(log2(upperBoundElements)));
218 uint64_t intersectSetSkip = critoom -
static_cast<uint64_t
>(floor(log2(origSets.size())));
220 std::vector<storm::storage::BitVector> useIntersects;
221 std::vector<storm::storage::BitVector> useInfo;
222 for (uint64_t i = 0; i < intersects.size(); ++i) {
223 if (upperBoundElements > 10000 && intersects[i].getNumberOfSetBits() < intersectSetSkip - 3) {
224 skipped += (carl::pow(two, intersects[i].getNumberOfSetBits()) * origSets.size());
227 useIntersects.push_back(intersects[i]);
228 useInfo.push_back(intersectsInfo[i]);
232 uint64_t origSetSkip = critoom -
static_cast<uint64_t
>(floor(log2(useIntersects.size())));
235 std::vector<storm::storage::BitVector> newIntersects;
236 std::vector<storm::storage::BitVector> newInfo;
238 for (uint64_t i = 0; i < origSets.size(); ++i) {
239 if (upperBoundElements > 20000 && origSets[i].getNumberOfSetBits() < origSetSkip - 3) {
240 skipped += (carl::pow(two, origSets[i].getNumberOfSetBits()) * useIntersects.size());
244 for (uint64_t j = 0; j < useIntersects.size(); ++j) {
245 if (useInfo[j].get(i)) {
250 if (newinf == useInfo[j]) {
254 for (
auto const& entry : newInfo) {
255 if (entry == newinf) {
261 newInfo.push_back(newinf);
262 newIntersects.push_back(origSets[i] & useIntersects[j]);
267 auto res =
count(origSets, newIntersects, newInfo, newVal, !plus, remdepth - 1);
269 storm::RationalNumber tmp = res.first - skipped;
272 storm::RationalNumber tmp = res.second + skipped;
279 storm::RationalNumber upper = 0;
280 storm::RationalNumber lower = 0;
281 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
282 for (
auto const& winningSets : winningRegion) {
283 storm::RationalNumber totalForObs = 0;
284 storm::RationalNumber two = storm::utility::convertNumber<storm::RationalNumber>(2);
286 std::vector<storm::storage::BitVector> info;
287 for (uint64_t i = 0; i < winningSets.size(); ++i) {
290 info.push_back(entry);
292 auto res =
count(winningSets, winningSets, info, totalForObs,
true, 40);
300 return std::make_pair(lower, upper);
339 std::vector<uint64_t> observationSizes;
343 uint64_t observation = 0;
345 std::stringstream preamblestream;
347 if (boost::starts_with(line,
"#")) {
351 STORM_LOG_THROW(line ==
":preamble", storm::exceptions::WrongFormatException,
"Expected to see :preamble");
353 }
else if (state == 1) {
354 if (line ==
":winningregion") {
357 preamblestream << line <<
'\n';
359 }
else if (state == 2) {
360 std::vector<std::string> entries;
361 boost::split(entries, line, boost::is_space());
362 std::vector<uint64_t> observationSizes;
363 for (
auto const& entry : entries) {
364 observationSizes.push_back(std::stoul(entry));
368 }
else if (state == 3) {
369 std::vector<std::string> entries;
370 boost::split(entries, line, boost::is_any_of(
";"));
372 for (std::string
const& bvString : entries) {
379 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)