/// <summary> /// Generates all valid combinations of all configuration options in the given model. /// </summary> /// <param name="vm">the variability model containing the binary options and their constraints</param> /// <param name="optionsToConsider">the options that should be considered. All other options are ignored</param> /// <returns>Returns a list of <see cref="Configuration"/></returns> public List <Configuration> GenerateAllVariants(VariabilityModel vm, List <ConfigurationOption> optionsToConsider) { List <Configuration> allConfigurations = new List <Configuration>(); List <Expr> variables; Dictionary <Expr, ConfigurationOption> termToOption; Dictionary <ConfigurationOption, Expr> optionToTerm; Tuple <Context, BoolExpr> z3Tuple = Z3Solver.GetInitializedSolverSystem(out variables, out optionToTerm, out termToOption, vm); Context z3Context = z3Tuple.Item1; BoolExpr z3Constraints = z3Tuple.Item2; Microsoft.Z3.Solver solver = z3Context.MkSolver(); solver.Set(RANDOM_SEED, z3RandomSeed); solver.Assert(z3Constraints); while (solver.Check() == Status.SATISFIABLE) { Model model = solver.Model; Tuple <List <BinaryOption>, Dictionary <NumericOption, double> > confOpts = RetrieveConfiguration(variables, model, termToOption, optionsToConsider); Configuration c = new Configuration(confOpts.Item1, confOpts.Item2); // Check if the non-boolean constraints are satisfied bool configIsValid = vm.configurationIsValid(c); bool isInConfigurationFile = !VariantGenerator.IsInConfigurationFile(c, allConfigurations); bool fulfillsMixedConstraintrs = VariantGenerator.FulfillsMixedConstraints(c, vm); if (configIsValid && isInConfigurationFile && fulfillsMixedConstraintrs) { allConfigurations.Add(c); } solver.Push(); solver.Assert(Z3Solver.NegateExpr(z3Context, Z3Solver.ConvertConfiguration(z3Context, confOpts.Item1, optionToTerm, vm, numericValues: confOpts.Item2))); } solver.Push(); solver.Pop(Convert.ToUInt32(allConfigurations.Count() + 1)); return(allConfigurations); }
public bool checkConfigurationSAT(Configuration c, VariabilityModel vm, bool partialConfiguration = false) { List <Expr> variables; Dictionary <Expr, ConfigurationOption> termToOption; Dictionary <ConfigurationOption, Expr> optionToTerm; Tuple <Context, BoolExpr> z3Tuple = Z3Solver.GetInitializedSolverSystem(out variables, out optionToTerm, out termToOption, vm); Context z3Context = z3Tuple.Item1; BoolExpr z3Constraints = z3Tuple.Item2; List <Expr> constraints = new List <Expr>(); Microsoft.Z3.Solver solver = z3Context.MkSolver(); solver.Assert(z3Constraints); solver.Assert(Z3Solver.ConvertConfiguration(z3Context, c.getBinaryOptions(BinaryOption.BinaryValue.Selected), optionToTerm, vm, partialConfiguration, c.NumericOptions)); if (solver.Check() == Status.SATISFIABLE) { return(true); } return(false); }