package splar.core.heuristics; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Vector; import splar.core.constraints.BooleanVariable; import splar.core.constraints.BooleanVariableInterface; import splar.core.constraints.CNFFormula; public abstract class VariableOrderingHeuristic { protected String name; protected Map<String,Object> parameters; protected String lastVo[]; protected double lastRunningTime; public VariableOrderingHeuristic(String name) { this.name = name; parameters = new LinkedHashMap<String,Object>(); lastVo = null; lastRunningTime = -1; registerToHeuristicManager(); } protected void registerToHeuristicManager() { VariableOrderingHeuristicsManager.createHeuristicsManager().registerHeuristic(name, this); } public String getName() { return name; } public String[] getVariableOrdering() { return lastVo; } public double getRunningTime() { return lastRunningTime; } public void setParameter(String name, Object value) { parameters.put(name,value); } public void clearParameters() { parameters.clear(); } public static Map<String,Integer> variableOrderingAsHashMap(String [] vo) { Map<String,Integer> map = new LinkedHashMap<String, Integer>(); for( int i = 0 ; i < vo.length ; i++ ) { map.put(vo[i], new Integer(i)); } return map; } public static String variableOrderingAsCommaSepString(String [] vo) { String voStr = ""; for( int i = 0 ; i < vo.length ; i++ ) { voStr += vo[i]; if ( i < (vo.length-1) ) { voStr += ","; } } return voStr; } public static Map<String,Integer> variableOrderingAsHashMap(BooleanVariableInterface[] vo) { Map<String,Integer> map = new LinkedHashMap<String, Integer>(); for( int i = 0 ; i < vo.length ; i++ ) { map.put(vo[i].getID(), new Integer(i)); } return map; } public static BooleanVariableInterface[] variableOrderingAsBooleanVariableArray(String vo[]) { Vector<BooleanVariableInterface> varOrderList = new Vector<BooleanVariableInterface>(); if ( vo != null ) { for (int i=0; i < vo.length; i++) { varOrderList.add(new BooleanVariable(vo[i])); } } return varOrderList.toArray(new BooleanVariableInterface[0]); } public static BooleanVariableInterface[] variableOrderingAsBooleanVariableArray(String commaSepString) { Vector<BooleanVariableInterface> varOrderList = new Vector<BooleanVariableInterface>(); String[] result = commaSepString.split(","); for (int i=0; i < result.length; i++) { varOrderList.add(new BooleanVariable(result[i].trim())); } return varOrderList.toArray(new BooleanVariableInterface[0]); } public static String[] variableOrderingAsStringVariableArray(BooleanVariableInterface vo[]) { String varOrder[] = null; int countVars = vo.length; if ( vo != null ) { varOrder = new String[countVars]; for( int i = 0 ; i < countVars ; i++ ) { varOrder[i] = vo[i].getID(); } } return varOrder; } public String[] run(CNFFormula cnf) { long start = System.nanoTime(); runPreProcessing(cnf); lastVo = runHeuristic(cnf); runPostProcessing(cnf); lastRunningTime = (System.nanoTime() - start)/1E6; return lastVo; } protected void runPreProcessing(CNFFormula cnf) { } protected void runPostProcessing(CNFFormula cnf) { } protected abstract String[] runHeuristic(CNFFormula cnf); }