Пример #1
0
        internal void Process(OrangeConstraintRepeaterContext context)
        {
            Debug.Assert(context.HasRepeaters);

            _context = context;
            var constraintExpressionParser            = new ConstraintExpressionParser();
            var expressionTemplateWithoutExpanderText = StripExpanderFrom(context.Constraint.Expression.Text);

            while (context.Next())
            {
                var expressionText = InsertCounterValuesInto(expressionTemplateWithoutExpanderText);
                var expandedConstraintExpressionResult = constraintExpressionParser.Parse(expressionText);
                ProcessConstraint(expandedConstraintExpressionResult.Root);
            }
        }
 /// <summary>
 /// Parse the raw constraint expression.
 /// </summary>
 /// <param name="rawExpression">Raw constraint expression.</param>
 internal void ParseUnit(string rawExpression)
 {
     if (!string.IsNullOrWhiteSpace(rawExpression))
     {
         var interpreter = new ConstraintExpressionParser();
         var parseResult = interpreter.Parse(rawExpression);
         if (parseResult.Status == ParseStatus.Success)
         {
             Node = parseResult.Root;
         }
     }
     else
     {
         Node = null;
     }
 }
 internal void Process(OrConstraintRepeaterContext theContext)
 {
     this.context = theContext;
     if (!theContext.HasRepeaters)
     {
         ProcessSimpleConstraint(theContext.Constraint.Expression.Node);
     }
     else
     {
         var expressionTemplateWithoutExpanderText = StripExpanderFrom(theContext.Constraint.Expression.Text);
         while (theContext.Next())
         {
             var expressionText = InsertCounterValuesInto(expressionTemplateWithoutExpanderText);
             var expandedConstraintExpressionResult = new ConstraintExpressionParser().Parse(expressionText);
             ProcessSimpleConstraint(expandedConstraintExpressionResult.Root);
         }
     }
 }
        private void CreateArcFrom(AllDifferentConstraintModel constraint)
        {
            var solverAggregateVariable = _modelSolverMap.GetSolverAggregateVariableByName(constraint.Expression.Text);

            /*
             * Iterate through all variables inside the aggregate and ensure
             * that each variable is not equal to all variables to their
             * right. The not equal operator is commutative so there is no need
             * to express the constraint the other way around.
             */
            for (var i = 0; i < solverAggregateVariable.Variables.Count; i++)
            {
                for (var z = i + 1; z < solverAggregateVariable.Variables.Count; z++)
                {
                    var expressionText = $"${solverAggregateVariable.Name}[{i}] <> ${solverAggregateVariable.Name}[{z}]";
                    var interpreter    = new ConstraintExpressionParser();
                    var parseResult    = interpreter.Parse(expressionText);
                    Debug.Assert(parseResult.IsSuccess);
                    _constraintNetwork.AddArc(_arcBuilder.Build(parseResult.Root));
                }
            }
        }
        private void PopulateConstraintNetwork(ModelModel model)
        {
            foreach (var constraint in model.Constraints)
            {
                switch (constraint)
                {
                case ExpressionConstraintModel expressionConstraint:
                    CreateArcFrom(expressionConstraint);
                    break;

                case AllDifferentConstraintModel allDifferentConstraint:
                    CreateArcFrom(allDifferentConstraint);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }

            // Constraints inside bundles must be processed after the bucket maps have been created
            foreach (var bucket in model.Buckets)
            {
                foreach (var allDifferentConstraint in bucket.Bundle.AllDifferentConstraints)
                {
                    var variableNames = new List <string>(ExtractVariablesFrom(allDifferentConstraint.Expression.Text));

                    for (var bundleCounter = 0; bundleCounter < bucket.Size; bundleCounter++)
                    {
                        var bucketName     = bucket.Name.Text;
                        var expressionText = $"%{bucketName}[{bundleCounter}].{variableNames[0]} <> %{bucketName}[{bundleCounter}].{variableNames[1]}";
                        var interpreter    = new ConstraintExpressionParser();
                        var parseResult    = interpreter.Parse(expressionText);
                        Debug.Assert(parseResult.IsSuccess);
                        _constraintNetwork.AddArc(_arcBuilder.Build(parseResult.Root));
                    }
                }
            }
        }