package splar.core.fm.randomization;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import splar.core.constraints.BooleanVariableInterface;
import splar.core.constraints.CNFClause;
import splar.core.constraints.CNFGenerator;
import splar.core.constraints.PropositionalFormula;
import splar.core.fm.FeatureGroup;
import splar.core.fm.FeatureTreeNode;
public class Random3CNFFeatureModel extends RandomFeatureModel2 {
/**
*
*/
private static final long serialVersionUID = -8424917116428155893L;
private CNFGenerator cnfGenerator = null;
public Random3CNFFeatureModel(String name,int numberOfFeaturesToCreate, int mandatoryOdds, int optionalOdds, int group1NOdds, int group11Odds, int minChildrenPerNode, int maxChildrenPerNode, int maxGroupCardinality, int balanceFactor) {
super(name, numberOfFeaturesToCreate, mandatoryOdds, optionalOdds, group1NOdds, group11Odds, minChildrenPerNode, maxChildrenPerNode, maxGroupCardinality, balanceFactor );
cnfGenerator = new CNFGenerator();
}
public void createCrossTreeConstraintsAsRandom3CNFFormula(int numVars, float clauseDensity) {
// Creates a 3-CNF feature model, i.e., a FT + 3-CNF CTC
// Creates a CNF formula based on distinct random feature model variables
List<BooleanVariableInterface> vars = new LinkedList<BooleanVariableInterface>();
for( FeatureTreeNode var : this.getNodes() ) {
if ( !(var instanceof FeatureGroup ) && !this.isRoot(var) ){
vars.add(var);
}
}
Collections.shuffle(vars);
int size = vars.size()-numVars;
for( int j = 1 ; j <= size ; j++ ) {
vars.remove(vars.size()-1);
}
List<CNFClause> clauses = cnfGenerator.generateCNFInstance(vars, null, clauseDensity, 3);
// Add clauses to feature model
int clauseCounter = 1;
for( CNFClause clause : clauses ) {
try {
this.addConstraint(new PropositionalFormula("Clause3CNF_"+(clauseCounter++),clause.toPropositionalFormula()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void dumpMetaData() {
System.out.println("<meta>");
System.out.println("<data name=\"description\">This is a 3-CNF Feature Model generated automatically</data>");
System.out.println("<data name=\"creator\">SPLOT Feature Model Generator</data>");
System.out.println("<data name=\"email\"></data>");
System.out.println("<data name=\"date\">" + new Date() + "</data>");
System.out.println("<data name=\"department\">SPLOT Project</data>");
System.out.println("<data name=\"organization\">University of Waterloo</data>");
System.out.println("<data name=\"address\"></data>");
System.out.println("<data name=\"phone\"></data>");
System.out.println("<data name=\"website\">http://www.splot-research.org/</data>");
System.out.println("<data name=\"reference\">http://www.splot-research.org/</data>");
System.out.println("</meta>");
}
}