Skip to content

Commit

Permalink
Extracting old branching heuristic into NaiveHeuristic.
Browse files Browse the repository at this point in the history
  • Loading branch information
rtaupe committed Jan 5, 2017
1 parent 76ecc11 commit 5a50aba
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 34 deletions.
40 changes: 6 additions & 34 deletions src/main/java/at/ac/tuwien/kr/alpha/solver/DefaultSolver.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2016, the Alpha Team.
* Copyright (c) 2016-2017, the Alpha Team.
* All rights reserved.
*
* Additional changes made by Siemens.
Expand Down Expand Up @@ -30,8 +30,7 @@
import at.ac.tuwien.kr.alpha.common.AnswerSet;
import at.ac.tuwien.kr.alpha.common.NoGood;
import at.ac.tuwien.kr.alpha.grounder.Grounder;
import at.ac.tuwien.kr.alpha.solver.heuristics.BerkMin;
import at.ac.tuwien.kr.alpha.solver.heuristics.BranchingHeuristic;
import at.ac.tuwien.kr.alpha.solver.heuristics.*;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -55,6 +54,7 @@ public class DefaultSolver extends AbstractSolver {
private final Assignment assignment;
private final GroundConflictNoGoodLearner learner;
private final BranchingHeuristic branchingHeuristic;
private final BranchingHeuristic fallbackBranchingHeuristic;

private boolean initialize = true;

Expand All @@ -71,6 +71,7 @@ public DefaultSolver(Grounder grounder) {
this.choiceStack = new ChoiceStack(grounder);
this.learner = new GroundConflictNoGoodLearner(assignment, store);
this.branchingHeuristic = new BerkMin(assignment, this::isAtomChoicePoint, this::isAtomActiveChoicePoint);
this.fallbackBranchingHeuristic = new NaiveHeuristic(assignment, choiceOn, choiceOff);
}

@Override
Expand Down Expand Up @@ -377,36 +378,7 @@ private int computeChoice() {
return berkminChoice;
}

// Check if there is an enabled choice that is not also disabled
// HINT: tracking changes of ChoiceOn, ChoiceOff directly could
// increase performance (analyze store.getChangedAssignments()).
for (Integer enablerAtom : choiceOn.keySet()) {
if (assignment.getTruth(enablerAtom) == null || FALSE.equals(assignment.getTruth(enablerAtom))) {
continue;
}

Integer nextChoiceCandidate = choiceOn.get(enablerAtom);

// Only consider unassigned choices or choices currently MBT (and changing to TRUE following the guess)
if (assignment.getTruth(nextChoiceCandidate) != null && !MBT.equals(assignment.getTruth(nextChoiceCandidate))) {
continue;
}

// Check that candidate is not disabled already
boolean isDisabled = false;
for (Map.Entry<Integer, Integer> disablerAtom : choiceOff.entrySet()) {
if (nextChoiceCandidate.equals(disablerAtom.getValue())
&& assignment.getTruth(disablerAtom.getKey()) != null
&& !(FALSE.equals(assignment.getTruth(disablerAtom.getKey())))) {
isDisabled = true;
break;
}
}

if (!isDisabled) {
return nextChoiceCandidate;
}
}
return 0;
//TODO: remove fallback as soon as we are sure that BerkMin will always choose an atom
return fallbackBranchingHeuristic.chooseAtom();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/**
* Copyright (c) 2016-2017, the Alpha Team.
* All rights reserved.
*
* Additional changes made by Siemens.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1) Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2) Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package at.ac.tuwien.kr.alpha.solver.heuristics;

import at.ac.tuwien.kr.alpha.common.NoGood;
import at.ac.tuwien.kr.alpha.solver.Assignment;
import at.ac.tuwien.kr.alpha.solver.GroundConflictNoGoodLearner.ConflictAnalysisResult;

import java.util.Collection;
import java.util.Map;

import static at.ac.tuwien.kr.alpha.solver.ThriceTruth.FALSE;
import static at.ac.tuwien.kr.alpha.solver.ThriceTruth.MBT;

/**
* The default heuristic that had been used by {@link at.ac.tuwien.kr.alpha.solver.DefaultSolver} before {@link BerkMin} was implemented.
*
*/
public class NaiveHeuristic implements BranchingHeuristic {

private Assignment assignment;
private Map<Integer, Integer> choiceOn;
private Map<Integer, Integer> choiceOff;

public NaiveHeuristic(Assignment assignment, Map<Integer, Integer> choiceOn, Map<Integer, Integer> choiceOff) {
this.assignment = assignment;
this.choiceOn = choiceOn;
this.choiceOff = choiceOff;
}

@Override
public void violatedNoGood(NoGood violatedNoGood) {
}

@Override
public void analyzedConflict(ConflictAnalysisResult analysisResult) {
}

@Override
public void newNoGood(NoGood newNoGood) {
}

@Override
public void newNoGoods(Collection<NoGood> newNoGoods) {
}

@Override
public double getActivity(int literal) {
throw new UnsupportedOperationException();
}

@Override
public int chooseAtom() {
// Check if there is an enabled choice that is not also disabled
// HINT: tracking changes of ChoiceOn, ChoiceOff directly could
// increase performance (analyze store.getChangedAssignments()).
for (Integer enablerAtom : choiceOn.keySet()) {
if (assignment.getTruth(enablerAtom) == null || FALSE.equals(assignment.getTruth(enablerAtom))) {
continue;
}

Integer nextChoiceCandidate = choiceOn.get(enablerAtom);

// Only consider unassigned choices or choices currently MBT (and changing to TRUE following the guess)
if (assignment.getTruth(nextChoiceCandidate) != null && !MBT.equals(assignment.getTruth(nextChoiceCandidate))) {
continue;
}

// Check that candidate is not disabled already
boolean isDisabled = false;
for (Map.Entry<Integer, Integer> disablerAtom : choiceOff.entrySet()) {
if (nextChoiceCandidate.equals(disablerAtom.getValue()) && assignment.getTruth(disablerAtom.getKey()) != null
&& !(FALSE.equals(assignment.getTruth(disablerAtom.getKey())))) {
isDisabled = true;
break;
}
}

if (!isDisabled) {
return nextChoiceCandidate;
}
}
return 0;
}

@Override
public boolean chooseSign(int atom) {
return true;
}

}

0 comments on commit 5a50aba

Please sign in to comment.