Ejemplo n.º 1
0
        internal override ConstraintSatisfaction SatisfiesContraint(Model model, ValueCombination combination)
        {
            if (CachedInteraction == null)
            {
                GetExcludedCombinations(model);
            }

            return(InternalConstraintHelpers.SatisfiesContraint(model, combination, CachedInteraction));
        }
Ejemplo n.º 2
0
        internal override ParameterInteraction GetExcludedCombinations(Model model)
        {
            if (CachedInteraction == null)
            {
                CachedInteraction = InternalConstraintHelpers.GetExcludedCombinations
                                        (model, this, FirstParameter, SecondParameter, Value, (value1, value2) => value1.Equals(value2));
            }

            return(new ParameterInteraction(CachedInteraction));
        }
Ejemplo n.º 3
0
        internal override ParameterInteraction GetExcludedCombinations(Model model)
        {
            if (CachedInteraction == null)
            {
                CachedInteraction = InternalConstraintHelpers.GetExcludedCombinations
                                        (model, this, LeftParameter, RightParameter, Value, (value1, value2) => value1.CompareTo(value2) > 0);
            }

            return(new ParameterInteraction(CachedInteraction));
        }
        public ConstraintSatisfaction SatisfiesConstraint <T>(Expression expression, Model <T> model, ValueCombination combination) where T : new()
        {
            switch (expression.NodeType)
            {
            case ExpressionType.AndAlso:
            {
                var andAlso = (BinaryExpression)expression;
                ConstraintSatisfaction left = SatisfiesConstraint(andAlso.Left, model, combination);
                if (left == ConstraintSatisfaction.Unsatisfied)
                {
                    return(ConstraintSatisfaction.Unsatisfied);
                }

                ConstraintSatisfaction right = SatisfiesConstraint(andAlso.Right, model, combination);
                if (right == ConstraintSatisfaction.Unsatisfied)
                {
                    return(ConstraintSatisfaction.Unsatisfied);
                }

                if (left == right)
                {
                    return(left);
                }
                else
                {
                    return(ConstraintSatisfaction.InsufficientData);
                }
            }

            case ExpressionType.Conditional:
                var conditional             = (ConditionalExpression)expression;
                ConstraintSatisfaction test = SatisfiesConstraint(conditional.Test, model, combination);
                if (test == ConstraintSatisfaction.InsufficientData)
                {
                    return(ConstraintSatisfaction.InsufficientData);
                }

                if (test == ConstraintSatisfaction.Satisfied)
                {
                    return(SatisfiesConstraint(conditional.IfTrue, model, combination));
                }
                else
                {
                    return(SatisfiesConstraint(conditional.IfFalse, model, combination));
                }

            case ExpressionType.Lambda:
                return(SatisfiesConstraint(((LambdaExpression)expression).Body, model, combination));

            case ExpressionType.OrElse:
            {
                var orElse = (BinaryExpression)expression;
                ConstraintSatisfaction left = SatisfiesConstraint(orElse.Left, model, combination);
                if (left == ConstraintSatisfaction.Satisfied)
                {
                    return(ConstraintSatisfaction.Satisfied);
                }

                ConstraintSatisfaction right = SatisfiesConstraint(orElse.Right, model, combination);
                if (right == ConstraintSatisfaction.Satisfied)
                {
                    return(ConstraintSatisfaction.Satisfied);
                }

                if (left == right)
                {
                    return(left);
                }
                else
                {
                    return(ConstraintSatisfaction.InsufficientData);
                }
            }

            default:
                if (!mapExpressionsToRequiredParams.ContainsKey(expression))
                {
                    throw new InternalVariationGenerationException("Expected data for expression not found.");
                }
                return(InternalConstraintHelpers.SatisfiesContraint(model, combination, mapExpressionsToRequiredParams[expression].Interaction));
            }
        }