internal override ConstraintSatisfaction SatisfiesContraint(Model model, ValueCombination combination) { ConstraintSatisfaction ifSatisfaction = If.SatisfiesContraint(model, combination); if (ifSatisfaction == ConstraintSatisfaction.InsufficientData) { return(ConstraintSatisfaction.InsufficientData); } if (ifSatisfaction == ConstraintSatisfaction.Unsatisfied) { return(ConstraintSatisfaction.Satisfied); } return(Then.SatisfiesContraint(model, combination)); }
internal override ConstraintSatisfaction SatisfiesContraint(Model model, ValueCombination combination) { ConstraintSatisfaction first = First.SatisfiesContraint(model, combination); ConstraintSatisfaction second = Second.SatisfiesContraint(model, combination); if (first == ConstraintSatisfaction.Satisfied || second == ConstraintSatisfaction.Satisfied) { return(ConstraintSatisfaction.Satisfied); } if (first == ConstraintSatisfaction.Unsatisfied && second == ConstraintSatisfaction.Unsatisfied) { return(ConstraintSatisfaction.Unsatisfied); } return(ConstraintSatisfaction.InsufficientData); }
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)); } }