bool Z3BaseSolverImpl::computeInitialValues(const Query &query, const std::vector<const Array*> &objects, std::vector<std::vector<unsigned char> > &values, bool &hasSolution) { ++stats::queries; ++stats::queryCounterexamples; z3::check_result result = check(query); switch (result) { case z3::unknown: postCheck(query); return false; case z3::unsat: postCheck(query); hasSolution = false; ++stats::queriesValid; return true; case z3::sat: extractModel(objects, values); postCheck(query); hasSolution = true; ++stats::queriesInvalid; return true; } }
V3MPDRCube* const V3VrfMPDR::recursiveBlockCube(V3MPDRCube* const badCube) { // Create a Queue for Blocking Cubes V3BucketList<V3MPDRCube*> badQueue(getPDRFrame()); assert (badCube); badQueue.add(getPDRDepth(), badCube); // Block Cubes from the Queue V3MPDRTimedCube baseCube, generalizedCube; while (badQueue.pop(baseCube.first, baseCube.second)) { assert (baseCube.first < getPDRFrame()); if (!baseCube.first) { // Clear All Cubes in badQueue before Return V3Set<const V3MPDRCube*>::Set traceCubes; traceCubes.clear(); const V3MPDRCube* traceCube = baseCube.second; while (true) { traceCubes.insert(traceCube); if (_pdrBad == traceCube) break; traceCube = traceCube->getNextCube(); } while (badQueue.pop(generalizedCube.first, generalizedCube.second)) { if (traceCubes.end() == traceCubes.find(generalizedCube.second)) delete generalizedCube.second; } return baseCube.second; // A Cube cannot be blocked by R0 --> Cex } if (!isBlocked(baseCube)) { assert (!existInitial(baseCube.second->getState())); // Check Reachability : SAT (R ^ ~cube ^ T ^ cube') if (checkReachability(baseCube.first, baseCube.second->getState())) { // SAT, Not Blocked Yet if (profileON()) _ternaryStat->start(); generalizedCube.second = extractModel(baseCube.second, baseCube.first - 1); if (profileON()) _ternaryStat->end(); badQueue.add(baseCube.first - 1, generalizedCube.second); // This Cube should be blocked in previous frame badQueue.add(baseCube.first, baseCube.second); // This Cube has not yet been blocked (postpone to future) } else { // UNSAT, Blocked bool satGen = true; while (true) { if (profileON()) _generalStat->start(); generalizedCube.first = baseCube.first; generalizedCube.second = new V3MPDRCube(*(baseCube.second)); generalization(generalizedCube); // Generalization if (profileON()) _generalStat->end(); addBlockedCube(generalizedCube); // Record this Cube that is bad and to be blocked // I found Niklas Een has modified the original IWLS paper and alter the line below // However, I suggest the alteration restricts PDR (i.e. fold-free) and does not help if (satGen && (baseCube.first < getPDRDepth()) && (generalizedCube.first < getPDRFrame())) badQueue.add(baseCube.first + 1, baseCube.second); //if ((baseCube.first < getPDRDepth()) && (generalizedCube.first < getPDRDepth())) // badQueue.add(generalizedCube.first + 1, baseCube.second); if (!isForwardSATGen() || getPDRDepth() <= generalizedCube.first) break; baseCube.second = forwardModel(generalizedCube.second); if (!baseCube.second) break; baseCube.first = baseCube.first + 1; satGen = false; if (checkReachability(baseCube.first, baseCube.second->getState())) break; } } } //else delete baseCube.second; } return 0; }
// PDR Main Functions V3MPDRCube* const V3VrfMPDR::getInitialObligation() { // If SAT(R ^ T ^ !p) assert (_pdrBad); _pdrSvr->assumeRelease(); assumeReachability(getPDRDepth()); // Assume R const V3NetVec& state = _pdrBad->getState(); assert (1 == state.size()); _pdrSvr->addBoundedVerifyData(state[0], 0); _pdrSvr->assumeProperty(_pdrSvr->getFormula(state[0], 0)); if (profileON()) _solveStat->start(); _pdrSvr->simplify(); const bool result = _pdrSvr->assump_solve(); if (profileON()) _solveStat->end(); if (!result) return 0; V3MPDRCube* const cube = extractModel(_pdrBad, getPDRDepth()); assert (cube); return cube; }
void ModelMaker::timerEvent(QTimerEvent*) { if(isReady){ if(paintCanvas->hasClicked){ } Mat img; QString constructText = "<b>Construct a polygon to make a model</b> <br> <font color='red'> <i color='red'>Left Click</i> </font> to draw points <font color='green'> <i>Right Click</i> </font> to close path "; ui->messagelabel->setText(constructText); if (isPlaying && !isScrubbing && !paintCanvas->gettingCenter && !paintCanvas->gettingHead){ if(currentFrame<capture.get(CV_CAP_PROP_FRAME_COUNT)){ img = nextFrame(); currentimg=img.clone(); displayImage(img); current = QString::number(capture.get(CV_CAP_PROP_POS_FRAMES)); ui->statusBar->showMessage(QString::number((int)(100*capture.get(CV_CAP_PROP_POS_FRAMES)/capture.get(CV_CAP_PROP_FRAME_COUNT)))+"% "+ current+"/"+(QString::number(capture.get(CV_CAP_PROP_FRAME_COUNT)))); ui->seekbar->setValue(capture.get(CV_CAP_PROP_POS_FRAMES)); currentFrame++; } }else if(isScrubbing){ updateFrame(); } ///Determine the Center location of the target if(paintCanvas->gettingCenter){ paintCanvas->lastPoint = QPoint(centroids.at(0).x()/xscale,centroids.at(0).y()/yscale); QString markcenterText = "<b>Mark Target Details</b> <br> <font color='red'> <i color='green'>Left Click</i> </font> to set the <font color='red'> <b>CENTER</b> </font> of the target "; ui->messagelabel->setText(markcenterText); } if(paintCanvas->gettingHead){ paintCanvas->lastPoint = QPoint(centroids.at(0).x()/xscale,centroids.at(0).y()/yscale); QString markheadText = "<b>Mark Target Details</b> <br> <font color='red'> <i color='green'>Left Click</i> </font> to set the <font color='red'> <b>HEAD</b> (and thus, orientation) </font> of the target "; ui->messagelabel->setText(markheadText); } else if (saveOut&& !paintCanvas->gettingCenter&& !paintCanvas->gettingHead){ capture.set(CV_CAP_PROP_POS_FRAMES,(double)currentFrame-1); capture.read(img); extractModel(img); capture.set(CV_CAP_PROP_POS_FRAMES,(double)currentFrame); saveOut=false; } if(paintCanvas->replyCenter == QMessageBox::Yes){ paintCanvas->gettingCenter = false; //Start the "GetHead" method getHead(); paintCanvas->replyCenter = replyNull; paintCanvas->clearImage(); } else if(paintCanvas->replyCenter == QMessageBox::No){ paintCanvas->clearImage(); paintCanvas->gettingCenter = true; } if(paintCanvas->replyHead == QMessageBox::Yes){ paintCanvas->gettingHead = false; double dX =-(paintCanvas->centerPoint.x()-paintCanvas->headPoint.x()); double dY =-(paintCanvas->centerPoint.y()-paintCanvas->headPoint.y()); angle =0.0; angle = atan2(dY, dX); /* angle =0; double temp_angle =0; if(dX>0 && dY>0){ temp_angle = atan(dY/dX); qDebug()<<"before"<<temp_angle*180/CV_PI; angle += CV_PI/2+temp_angle; qDebug()<<"++"; }else if(dX<0 && dY<0){ temp_angle = atan(dY/dX); qDebug()<<"before"<<temp_angle*180/CV_PI; temp_angle = CV_PI/2-temp_angle; angle += -temp_angle; qDebug()<<"--"; }else if(dX>0 && dY<0){ temp_angle = atan(dY/dX); qDebug()<<"before"<<temp_angle*180/CV_PI; temp_angle = CV_PI/2+temp_angle; angle += temp_angle; qDebug()<<"+-"; }else if(dX<0 && dY>0){ temp_angle = atan(dY/dX); qDebug()<<"before"<<temp_angle*180/CV_PI; temp_angle = CV_PI/2-temp_angle; angle += -temp_angle; qDebug()<<"-+"; } */ qDebug()<<"after"<<angle*180/CV_PI; paintCanvas->replyHead = replyNull; paintCanvas->clearImage(); } else if(paintCanvas->replyHead == QMessageBox::No){ paintCanvas->clearImage(); paintCanvas->gettingHead = true; } if(paintCanvas->replyMask == QMessageBox::Yes) { paintCanvas->polygons.push_back(paintCanvas->temp); bool ok; //Start the "Getcenter" method getCenter(); QString text = QInputDialog::getText(this, "ROI Name", "Attach a name to this Region Of Interest", QLineEdit::Normal, "name",&ok); paintCanvas->polyNames.push_back(text); polyinfo = text; if(savepath==nopath){ on_actionSave_Direcory_triggered(); } processPolygons(); saveOut =true; polyinfo += " Region added"; ui->statusBar->showMessage(polyinfo,2000); paintCanvas->temp.clear(); paintCanvas->replyMask = replyNull; } else if(paintCanvas->replyMask == QMessageBox::No){ paintCanvas->masks.pop_back(); polyinfo = "Polygon cleared"; paintCanvas->temp.clear(); ui->statusBar->showMessage(polyinfo,2000); paintCanvas->replyMask = replyNull; } } }
V3SIPDRCube* const V3SVrfIPDR::recursiveBlockCube2(V3SIPDRCube* const badCube) { //unfolding_depth uint32_t d = _decompDepth; //cerr << "_decompDepth : " << d << endl; if(heavy_debug) cerr << "\n\n\nrecursiveBlockCube2\n"; // Create a Queue for Blocking Cubes V3BucketList<V3SIPDRCube*> badQueue(getPDRFrame()); assert (badCube); badQueue.add(getPDRDepth(), badCube); vector<uint32_t> v; for (unsigned i = 0; i <= getPDRDepth(); ++i){ v.push_back(0); } // Block Cubes from the Queue V3SIPDRTimedCube baseCube, generalizedCube; while (badQueue.pop(baseCube.first, baseCube.second)) { v[baseCube.first]++; if(heavy_debug){ cerr << "\nPoped: baseCube frame: " << baseCube.first << ", cube: "; printState( baseCube.second->getState() ); } assert (baseCube.first < getPDRFrame()); if (!baseCube.first) { // Clear All Cubes in badQueue before Return V3Set<const V3SIPDRCube*>::Set traceCubes; traceCubes.clear(); const V3SIPDRCube* traceCube = baseCube.second; while (true) { traceCubes.insert(traceCube); if (_pdrBad == traceCube) break; traceCube = traceCube->getNextCube(); } while (badQueue.pop(generalizedCube.first, generalizedCube.second)) { if (traceCubes.end() == traceCubes.find(generalizedCube.second)) delete generalizedCube.second; } return baseCube.second; // A Cube cannot be blocked by R0 --> Cex } if (!isBlocked(baseCube)) { assert (!existInitial2(baseCube.second->getState())); // Check Reachability : SAT (R ^ ~cube ^ T ^ cube') if( baseCube.first >= d && v[baseCube.first] > 10){ //if( false ){ if(checkReachability2(baseCube.first - d + 1, baseCube.second->getState(),false)){ if(heavy_debug){ cerr << "SAT, generalizing... Frame before gen:" << baseCube.first << " Cube before gen:"; printState(baseCube.second->getState()); } if (profileON()) _ternaryStat->start(); generalizedCube.second = extractModel2(baseCube.first - d, baseCube.second); if (profileON()) _ternaryStat->end(); if(heavy_debug){ cerr << "SAT, pushing to queue, Frame after gen:" << baseCube.first-d << " Cube after gen:"; printState(generalizedCube.second->getState()); } badQueue.add(baseCube.first - d, generalizedCube.second); // This Cube should be blocked in previous frame badQueue.add(baseCube.first, baseCube.second); // This Cube has not yet been blocked (postpone to future) //cout << "WOW" << endl; continue; } } if (checkReachability(baseCube.first, baseCube.second->getState())) { // SAT, Not Blocked Yet if(heavy_debug){ cerr << "SAT, generalizing... Frame before gen:" << baseCube.first << " Cube before gen:"; printState(baseCube.second->getState()); } if (profileON()) _ternaryStat->start(); generalizedCube.second = extractModel(baseCube.first - 1, baseCube.second); if (profileON()) _ternaryStat->end(); if(heavy_debug){ cerr << "SAT, pushing to queue, Frame after gen:" << baseCube.first-1 << " Cube after gen:"; printState(generalizedCube.second->getState()); } badQueue.add(baseCube.first - 1, generalizedCube.second); // This Cube should be blocked in previous frame badQueue.add(baseCube.first, baseCube.second); // This Cube has not yet been blocked (postpone to future) } else { // UNSAT, Blocked if (profileON()) _generalStat->start(); generalizedCube.first = baseCube.first; generalizedCube.second = new V3SIPDRCube(*(baseCube.second)); generalization2(generalizedCube); // Generalization if (profileON()) _generalStat->end(); addBlockedCube(generalizedCube); // Record this Cube that is bad and to be blocked if ((baseCube.first < getPDRDepth()) && (generalizedCube.first < getPDRFrame())) badQueue.add(baseCube.first + 1, baseCube.second); } } } return 0; }