Example #1
0
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;
    }
}
Example #2
0
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;
}
Example #3
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;
}
Example #4
0
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;
        }
        
        
    }
}
Example #5
0
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;
}