package splar.apps.generator; import java.util.Random; import javax.swing.JFrame; /*------------------------------------------ * SPLOT FEATURE MODEL GENERATOR, SEPT 2009 * ----------------------------------------- * This Software generates 3-CNF Feature Models * See paper "SAT-Based Analysis of Feature Models is Easy" from Marcilio Mendonca et. al for details * * Marcilio Mendonca * School of Computer Science * University of Waterloo * * September 2009 */ public class FMGeneratorMain implements FMGeneratorGUIListener, FMGeneratorEngineListener { FMGeneratorGUI gui = null; FMGeneratorEngine engine = null; public static void main(String args[]) { // double density = 5; // int v = 100; // int numbers[] = new int[v]; // // for( int i = 0 ; i < (int)(v*density) ; i++ ) { // numbers[Math.abs(new Random().nextInt())%v]++; // } // // int count = 0; // for( int i = 0 ; i < v ; i++ ) { // if (numbers[i] == 0 ) // count++; // System.out.println("v[" + i +"] = " + numbers[i]); // } // System.out.println("Non-assigned: " + count); // CNFGenerator gen = new CNFGenerator(); // List<BooleanVariableInterface> variables = new LinkedList<BooleanVariableInterface>(); // variables.add( new BooleanVariable("a")); // variables.add( new BooleanVariable("b")); // variables.add( new BooleanVariable("c")); // variables.add( new BooleanVariable("d")); // variables.add( new BooleanVariable("e")); // List<CNFClause> clauses = gen.generateCNFInstance(variables, null, 0.5f, 3); // Set<BooleanVariableInterface> varset = new HashSet<BooleanVariableInterface>(); // for( CNFClause clause : clauses ) { // System.out.println(clause); // for( BooleanVariableInterface clauseVar : clause.getVariables() ) { // varset.add(clauseVar); // } // } // System.out.println("% used vars: " + (varset.size()*100.0)/variables.size()); new FMGeneratorMain().run(); } public void run() { gui = new FMGeneratorGUI("SPLOT 3-CNF Feature Model Generator - Marcilio Mendonca - Sept 2009 (alfa version) - (www.splot-research.org)"); gui.setSize(600,700); gui.setLocation(0,0); gui.setVisible(true); gui.addListener(this); gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); engine = new FMGeneratorEngine(); engine.addListener(this); } private void dumpEngineParameters() { gui.addMessage("Collection name......: " + gui.getCollectionName()); gui.addMessage("Collection path......: " + gui.getCollectionPath()); gui.addMessage("Collection size......: " + gui.getCollectionSize()); gui.addMessage("FT size (# features).: " + gui.getFeatureTreeSize()); gui.addMessage("FT % Mandatory.......: " + gui.getFeatureTreeMandatoryPercentage()); gui.addMessage("FT % Optional........: " + gui.getFeatureTreeOptionalPercentage()); gui.addMessage("FT % XOR groups......: " + gui.getFeatureTreeExclusiveORPercentage()); gui.addMessage("FT % OR groups.......: " + gui.getFeatureTreeInclusiveORPercentage()); gui.addMessage("FT Min Branch. Factor: " + gui.getFeatureTreeMinBranchingFactor()); gui.addMessage("FT Max Branch. Factor: " + gui.getFeatureTreeMaxBranchingFactor()); gui.addMessage("FT Max Group Size....: " + gui.getFeatureTreeMaxFeatureGroupSize()); gui.addMessage("CTCR.................: " + gui.getCTCR()); // gui.addMessage("CTCR tolerance.......:" + gui.getCTCRange()); gui.addMessage("CTC Clause Density...:" + gui.getCTCClauseDensity()); gui.addMessage("Consistency Option...: " + gui.getConsistentyOption()); } private void runGeneratorEngine() { engine.setCollectionName(gui.getCollectionName()); engine.setCollectionPath(gui.getCollectionPath()); engine.setCollectionSize(gui.getCollectionSize()); engine.setFeatureModelSize(gui.getFeatureTreeSize()); engine.setMandatoryPercentage(gui.getFeatureTreeMandatoryPercentage()); engine.setOptionalPercentage(gui.getFeatureTreeOptionalPercentage()); engine.setExclusiveORPercentage(gui.getFeatureTreeExclusiveORPercentage()); engine.setInclusiveORPercentage(gui.getFeatureTreeInclusiveORPercentage()); engine.setMinimumBranchingFactor(gui.getFeatureTreeMinBranchingFactor()); engine.setMaximumBranchingFactor(gui.getFeatureTreeMaxBranchingFactor()); engine.setMaximumGroupSize(gui.getFeatureTreeMaxFeatureGroupSize()); engine.setCTCR(gui.getCTCR()); // engine.setCTCRTolerance(gui.getCTCRange()); engine.setClauseDensity(gui.getCTCClauseDensity()); engine.setModelConsistency(gui.getConsistentyOption()); engine.run(); } public void startGeneration(FMGeneratorGUIEvent event) { try { new Thread( new Runnable(){ public void run(){ gui.disableGeneration(); gui.enableCancelGeneration(); gui.clearMessages(); long startTime = System.currentTimeMillis(); dumpEngineParameters(); runGeneratorEngine(); gui.addMessage(">> Generation Time: " + (System.currentTimeMillis()-startTime)/1000 + " seg"); gui.disableCancelGeneration(); gui.enableGeneration(); } } ).start(); } catch (Exception e) { e.printStackTrace(); } } public void cancelGeneration() { gui.disableCancelGeneration(); engine.cancel(); gui.enableGeneration(); } public void generatingModel(String modelName) { gui.setMessage("Generating model: " + modelName); } public void doneGeneratingModel(String modelName) { } public void modelAccepted(String modelName) { gui.addMessage(">> Model generated: " + modelName); } public void modelRejected(String modelName, String reason) { gui.addMessage("Model rejected: " + modelName + " (reason = " + reason + " )"); } public void modelGenerationStarted() { } public void modelGenerationEnded() { gui.setMessage("Done!"); } public void modelIsUnsat(String modelName) { } public void modelIsSat(String modelName) { } public void errorDuringGeneration(String modelName, String errorMessage) { } public void generationCanceled() { gui.addMessage("Generation canceled by user"); gui.setMessage("Generation canceled by user"); } }