package splar.plugins.reasoners.sat.sat4j;
import java.util.Map;
import java.util.Random;
import org.sat4j.core.LiteralsUtils;
import org.sat4j.minisat.core.ILits2;
import org.sat4j.minisat.orders.VarOrder;
public class StaticVariableOrderSAT extends VarOrder<ILits2> {
private static final long serialVersionUID = 1L;
private String[] varOrder;
private Map<String,Integer> varName2IndexMap;
private String[] varIndex2NameMap;
private Boolean phase = false; // false: negative first, true: positive first, null: random
private int valueOrder[] = null;
public StaticVariableOrderSAT(String varOrder[], Boolean phase, Map<String,Integer> varName2IndexMap, String[] varIndex2NameMap) {
this.varOrder = varOrder;
this.varName2IndexMap = varName2IndexMap;
this.varIndex2NameMap = varIndex2NameMap;
this.phase = phase;
this.valueOrder = null;
}
public void setPhase(boolean phase) {
this.phase = phase;
}
public void setValueOrder(int valueOrder[]) {
if ( this.valueOrder == null ) {
this.valueOrder = new int[valueOrder.length];
}
System.arraycopy(valueOrder, 0, this.valueOrder, 0, valueOrder.length);
}
/*
* (non-Javadoc)
*
* @see org.sat4j.minisat.IHeuristics#init()
*/
@Override
public void init() {
super.init();
if ( valueOrder == null ) {
Random random = new Random();
for( int i = 0 ; i < varOrder.length ; i++ ) {
int varIndex = varName2IndexMap.get(varOrder[i]);
// random
if ( phase == null ) {
order[i+1] = ( random.nextBoolean() ) ? LiteralsUtils.posLit(varIndex) : LiteralsUtils.negLit(varIndex);
}
// positive first
else if (phase.booleanValue()) {
order[i+1] = LiteralsUtils.posLit(varIndex);
}
// negative first
else {
order[i+1] = LiteralsUtils.negLit(varIndex);
}
// System.out.print(varOrder[i] + ": " + ((order[i+1]%2==1) ? "false" : "true") + ", ");
varpos[varIndex] = i+1;
}
}
else {
for( int i = 0 ; i < valueOrder.length ; i++ ) {
int varIndex = varName2IndexMap.get(varOrder[i]);
order[i+1] = (valueOrder[i] == 1) ? LiteralsUtils.posLit(varIndex) : LiteralsUtils.negLit(varIndex);
varpos[varIndex] = i+1;
}
}
lastVar = 1;
}
@Override
public String toString() {
return "Init VSIDS order with binary clause occurrences."; //$NON-NLS-1$
}
}