// walks the constraints and adds any needed interactions and marks existing combinations as Excluded private void GenerateInteractionsForConstraints(Model model, int order) { completeConstraints.Clear(); completeConstraints.AddRange(model.Constraints); completeConstraints.Add(new TaggedValueConstraint()); // clear any pregenerated data foreach (var constraint in completeConstraints) { constraint.ClearCache(); } var constraintInteractions = new List <ParameterInteraction>(); foreach (var constraint in completeConstraints) { var constraintInteraction = constraint.GetExcludedCombinations(model); constraintInteractions.Add(constraintInteraction); MergeConstraintInteraction(order, constraintInteraction); } var uncoveredCombinations = from interaction in Interactions from combination in interaction.Combinations where combination.State == ValueCombinationState.Uncovered select combination; // make sure uncovered combinations don't violate any constraints foreach (var combination in uncoveredCombinations) { foreach (var constraint in completeConstraints) { if (constraint.SatisfiesContraint(model, combination) == ConstraintSatisfaction.Unsatisfied) { combination.State = ValueCombinationState.Excluded; } } } GenerateDependentConstraintInteractions(model, order, constraintInteractions); // if any interaction has only excluded combinations then everything is excluded if (Interactions.Any((i) => i.Combinations.All((c) => c.State == ValueCombinationState.Excluded))) { uncoveredCombinations = from interaction in Interactions from combination in interaction.Combinations where combination.State == ValueCombinationState.Uncovered select combination; foreach (var combination in uncoveredCombinations) { combination.State = ValueCombinationState.Excluded; } } }