public void TestVariableInExpr()
 {
     AbstractExpr input = Polynomial.CreateNamedVariable("a").C + Polynomial.CreateNamedVariable("c");
     var visitor = new RewritingVisitor(Polynomial.CreateNamedVariable("a"), Polynomial.CreateConstant(1));
     IAbstractExpr result = input.Accept(visitor, Ig.nore);
     Assert.AreEqual(Polynomial.CreateConstant(1).C + Polynomial.CreateNamedVariable("c"), result);
 }
 public void TestPolynomial()
 {
     var input = Polynomial.CreatePolynomial(Polynomial.CreateNamedVariable("a"), 1, 2, 3); // x²+2x+3
     var visitor = new RewritingVisitor(Polynomial.CreateNamedVariable("a"), Polynomial.CreateConstant(2));
     IAbstractExpr result = input.Accept(visitor, Ig.nore);
     // lambda x.x²+2x+3 (2) = 4+4+3 = 11
     Assert.AreEqual(Polynomial.CreateConstant(11), result);
 }
示例#3
0
        private void ResolveBacksubstitutions()
        {
            //var foldingVisitor = new ConstantFoldingVisitor();
            var foldingVisitor = new PolynomialFoldingVisitor();

            // The "ToArrays" are necessary because we modify _closedVariables below. Without them,
            // we get InvalidOperationExceptions telling us that the "Collection was modified."
            var varsWithValue = ClosedVariables.Values.OfType<VariableWithValue>().ToArray();
            var varsWithBacksubstitutions = ClosedVariables.Values.OfType<VariableWithBacksubstitution>().ToArray();

            while (varsWithBacksubstitutions.Any()) {
                if (!varsWithValue.Any()) {
                    Debug.WriteLine("---- No complete backsubstitution possible ----");
                    foreach (var vb in varsWithBacksubstitutions) {
                        Debug.WriteLine(vb);
                    }
                    throw new InvalidOperationException("No solution found - " +
                              "there are more variables to substitute, but still open substitutions");
                }

                var newVarsWithValue = new Dictionary<IVariable, VariableWithValue>();
                foreach (var varWithValue in varsWithValue) {
                    var newVarsWithBacksubstitutions = new List<VariableWithBacksubstitution>();
                    // We substitute each variable into all open backsubstitutions.
                    //var rewriter = new RewritingVisitor(new Dictionary<IAbstractExpr, IAbstractExpr>
                    //                                { { varWithValue.Variable,
                    //                                    Polynomial.CreateConstant(varWithValue.Value)
                    //                                } });
                    var rewriter = new RewritingVisitor(varWithValue.Variable,
                                                        Polynomial.CreateConstant(varWithValue.Value));
                    foreach (var varWithBacksub in varsWithBacksubstitutions) {
                        IAbstractExpr rewritten = varWithBacksub.Expr
                                                               .Accept(rewriter)
                                                               .Accept(foldingVisitor);
                        // If the result, after constant folding, is a constant, we have found a new solution value.
                        // Otherwise, we still have a - maybe smaller - backsubstitution for this variable.
                        if (rewritten is IConstant) {
                            var result = new VariableWithValue(varWithBacksub.Variable, ((IConstant)rewritten).Value);
                            newVarsWithValue.Add(varWithBacksub.Variable, result);
                            ClosedVariables[varWithBacksub.Variable] = result;
                        } else {
                            var result = new VariableWithBacksubstitution(varWithBacksub.Variable, rewritten);
                            newVarsWithBacksubstitutions.Add(result);
                        }
                    }
                    newVarsWithBacksubstitutions.RemoveAll(v => ClosedVariables.ContainsKey(v.Variable) && ClosedVariables[v.Variable] is VariableWithValue);
                    varsWithBacksubstitutions = newVarsWithBacksubstitutions.ToArray();
                }
                varsWithValue = newVarsWithValue.Values.ToArray();
            }
        }
示例#4
0
        private SolverNode CloseVariable(IVariable variable,
                                         IAbstractExpr expression,
                                         AbstractConstraint sourceConstraintToBeRemoved)
        {
            //var foldingVisitor = new ConstantFoldingVisitor();
            var foldingVisitor = new PolynomialFoldingVisitor();
            expression = expression.Accept(foldingVisitor);

            // Rewrite all constraints
            //var rewriter = new RewritingVisitor(
            //    new Dictionary<IAbstractExpr, IAbstractExpr> { { variable, expression } });
            var rewriter = new RewritingVisitor(variable, expression);
            IEnumerable<AbstractConstraint> rewrittenConstraints =
                Constraints.Except(sourceConstraintToBeRemoved)
                    .Select(c => c.Accept(rewriter, Ig.nore));

            // Create new variable->value knowledge or new backsubstition.
            var newBacksubstitutions = new Dictionary<IVariable, AbstractClosedVariable>(ClosedVariables) {{
                variable, expression is IConstant
                    ? (AbstractClosedVariable)
                        new VariableWithValue(variable, ((IConstant) expression).Value)
                    : new VariableWithBacksubstitution(variable, expression)
                }};

            // Create new node.
            return new SolverNode(rewrittenConstraints, newBacksubstitutions, this);
        }