예제 #1
0
        // 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;
                }
            }
        }