package splar.plugins.reasoners.bdd.javabdd;
import java.util.ArrayList;
import net.sf.javabdd.BDD;
import net.sf.javabdd.BDDFactory;
public class BDDGenerationStatistics {
private ArrayList<BDDGenerationStatisticsRecord> stats;
private double pathCount = -1;
private int bvoIndex = -1; // BVO = best variable order
private int wvoIndex = -1; // WVO = worst variable order
private double wvoCountNodes = -1;
private double bvoCountNodes = Integer.MAX_VALUE;
private int index;
public BDDGenerationStatistics(int countVars) {
stats = new ArrayList<BDDGenerationStatisticsRecord>();
index = 0;
wvoCountNodes = -1;
bvoCountNodes = Integer.MAX_VALUE;
}
public void addStats(BDDFactory bddFactory, BDD bdd, String[] varOrder) {
if (pathCount == -1 ) {
pathCount = bdd.pathCount();
}
int bddNodeCount = bdd.nodeCount();
if ( bddNodeCount < bvoCountNodes ) {
bvoCountNodes = bddNodeCount;
bvoIndex = index;
}
if ( bddNodeCount > wvoCountNodes ) {
wvoCountNodes = bddNodeCount;
wvoIndex = index;
}
stats.add(index, new BDDGenerationStatisticsRecord(bddFactory, bdd, varOrder, bddNodeCount));
index++;
// System.out.print("\n" + index +"-Count: ");
// for ( int i = 0 ; i < varOrder.length ; i++ ) {
// System.out.print(varOrder[i] + ",");
// }
// System.out.print("\nBest: " + bvoIndex +"(" + bvoCountNodes + ")" + "Worst: " + wvoIndex + "(" + wvoCountNodes + ")");
}
public int countStats() {
return stats.size();
}
public BDD getBDD(int index) {
return stats.get(index).bdd;
}
public double getPathsCount() {
return pathCount;
}
public String[] getVariableOrder(int index) {
return stats.get(index).varOrder;
}
public double getNodesCount(int index) {
return stats.get(index).nodesCount;
}
public int getBestVariableOrderIndex() {
return bvoIndex;
}
public int getWorstVariableOrderIndex() {
return wvoIndex;
}
}
class BDDGenerationStatisticsRecord {
public BDDGenerationStatisticsRecord(BDDFactory bddFactory , BDD bdd, String[] varOrder, int nodesCount) {
this.bddFactory = bddFactory;
this.bdd = bdd;
this.varOrder = new String[varOrder.length];
System.arraycopy(varOrder, 0, this.varOrder, 0, varOrder.length);
this.nodesCount = nodesCount;
}
public BDDFactory bddFactory;
public BDD bdd;
public String[] varOrder;
public int nodesCount;
}