Пример #1
0
 private MaxSATResult none() {
   nbInitialVariables = nVars();
   Tristate res;
   this.initRelaxation();
   this.solver = this.rebuildSolver();
   LNGIntVector assumptions = new LNGIntVector();
   LNGIntVector currentObjFunction = new LNGIntVector();
   this.encoder.setIncremental(IncrementalStrategy.NONE);
   this.activeSoft.growTo(nSoft(), false);
   for (int i = 0; i < nSoft(); i++) this.coreMapping.put(softClauses.get(i).assumptionVar(), i);
   while (true) {
     res = searchSATSolver(this.solver, satHandler(), assumptions);
     if (res == Tristate.UNDEF) return MaxSATResult.UNDEF;
     else if (res == Tristate.TRUE) {
       nbSatisfiable++;
       int newCost = computeCostModel(this.solver.model(), Integer.MAX_VALUE);
       saveModel(this.solver.model());
       if (verbosity != Verbosity.NONE) this.output.println("o " + newCost);
       ubCost = newCost;
       if (nbSatisfiable == 1) {
         if (!foundUpperBound(ubCost, null)) return MaxSATResult.UNDEF;
         for (int i = 0; i < this.objFunction.size(); i++)
           assumptions.push(not(this.objFunction.get(i)));
       } else return MaxSATResult.OPTIMUM;
     } else {
       lbCost++;
       nbCores++;
       if (verbosity != Verbosity.NONE) this.output.println("c LB : " + lbCost);
       if (nbSatisfiable == 0) return MaxSATResult.UNSATISFIABLE;
       else if (lbCost == ubCost) {
         assert nbSatisfiable > 0;
         if (verbosity != Verbosity.NONE) this.output.println("c LB = UB");
         return MaxSATResult.OPTIMUM;
       } else if (!foundLowerBound(lbCost, null)) return MaxSATResult.UNDEF;
       sumSizeCores += this.solver.conflict().size();
       for (int i = 0; i < this.solver.conflict().size(); i++) {
         assert !this.activeSoft.get(this.coreMapping.get(this.solver.conflict().get(i)));
         this.activeSoft.set(this.coreMapping.get(this.solver.conflict().get(i)), true);
       }
       currentObjFunction.clear();
       assumptions.clear();
       for (int i = 0; i < nSoft(); i++) {
         if (this.activeSoft.get(i))
           currentObjFunction.push(softClauses.get(i).relaxationVars().get(0));
         else assumptions.push(not(softClauses.get(i).assumptionVar()));
       }
       if (verbosity != Verbosity.NONE)
         this.output.println(
             String.format(
                 "c Relaxed soft clauses %d / %d",
                 currentObjFunction.size(), this.objFunction.size()));
       this.solver = this.rebuildSolver();
       this.encoder.encodeCardinality(this.solver, currentObjFunction, lbCost);
     }
   }
 }
Пример #2
0
 private MaxSATResult iterative() {
   if (this.encoder.cardEncoding() != CardinalityEncoding.TOTALIZER)
     throw new IllegalStateException(
         "Error: Currently algorithm MSU3 with iterative encoding only  supports the totalizer encoding.");
   nbInitialVariables = nVars();
   Tristate res;
   this.initRelaxation();
   this.solver = this.rebuildSolver();
   final LNGIntVector assumptions = new LNGIntVector();
   final LNGIntVector joinObjFunction = new LNGIntVector();
   final LNGIntVector currentObjFunction = new LNGIntVector();
   final LNGIntVector encodingAssumptions = new LNGIntVector();
   this.encoder.setIncremental(IncrementalStrategy.ITERATIVE);
   this.activeSoft.growTo(nSoft(), false);
   for (int i = 0; i < nSoft(); i++) this.coreMapping.put(softClauses.get(i).assumptionVar(), i);
   while (true) {
     res = searchSATSolver(this.solver, satHandler(), assumptions);
     if (res == Tristate.UNDEF) return MaxSATResult.UNDEF;
     else if (res == Tristate.TRUE) {
       nbSatisfiable++;
       int newCost = computeCostModel(this.solver.model(), Integer.MAX_VALUE);
       saveModel(this.solver.model());
       if (verbosity != Verbosity.NONE) this.output.println("o " + newCost);
       ubCost = newCost;
       if (nbSatisfiable == 1) {
         if (!foundUpperBound(ubCost, null)) return MaxSATResult.UNDEF;
         for (int i = 0; i < this.objFunction.size(); i++)
           assumptions.push(not(this.objFunction.get(i)));
       } else {
         assert lbCost == newCost;
         return MaxSATResult.OPTIMUM;
       }
     } else {
       lbCost++;
       nbCores++;
       if (verbosity != Verbosity.NONE) this.output.println("c LB : " + lbCost);
       if (nbSatisfiable == 0) return MaxSATResult.UNSATISFIABLE;
       if (lbCost == ubCost) {
         assert nbSatisfiable > 0;
         if (verbosity != Verbosity.NONE) this.output.println("c LB = UB");
         return MaxSATResult.OPTIMUM;
       }
       sumSizeCores += this.solver.conflict().size();
       if (this.solver.conflict().size() == 0) return MaxSATResult.UNSATISFIABLE;
       if (!foundLowerBound(lbCost, null)) return MaxSATResult.UNDEF;
       joinObjFunction.clear();
       for (int i = 0; i < this.solver.conflict().size(); i++) {
         if (this.coreMapping.containsKey(this.solver.conflict().get(i))) {
           assert !this.activeSoft.get(this.coreMapping.get(this.solver.conflict().get(i)));
           this.activeSoft.set(this.coreMapping.get(this.solver.conflict().get(i)), true);
           joinObjFunction.push(
               softClauses
                   .get(this.coreMapping.get(this.solver.conflict().get(i)))
                   .relaxationVars()
                   .get(0));
         }
       }
       currentObjFunction.clear();
       assumptions.clear();
       for (int i = 0; i < nSoft(); i++)
         if (this.activeSoft.get(i))
           currentObjFunction.push(softClauses.get(i).relaxationVars().get(0));
         else assumptions.push(not(softClauses.get(i).assumptionVar()));
       if (verbosity != Verbosity.NONE)
         this.output.println(
             String.format(
                 "c Relaxed soft clauses %d / %d",
                 currentObjFunction.size(), this.objFunction.size()));
       if (!this.encoder.hasCardEncoding()) {
         if (lbCost != currentObjFunction.size()) {
           this.encoder.buildCardinality(this.solver, currentObjFunction, lbCost);
           joinObjFunction.clear();
           this.encoder.incUpdateCardinality(
               this.solver, joinObjFunction, currentObjFunction, lbCost, encodingAssumptions);
         }
       } else
         this.encoder.incUpdateCardinality(
             this.solver, joinObjFunction, currentObjFunction, lbCost, encodingAssumptions);
       for (int i = 0; i < encodingAssumptions.size(); i++)
         assumptions.push(encodingAssumptions.get(i));
     }
   }
 }