Esempio n. 1
0
        public void VerifySolverModelSerialization()
        {
            const string solverName1 = "Test1";
            const string solverName2 = "Test2";

            const string path =
                @"G:\Source\Kingdom Software\Kingdom.ConstraintSolvers\Working\src\Kingdom.Constraints.Sample.Fixturing.Tests\ExportedSolverModel.dat";

            using (var sc = GetSampleContext(solverName1))
            {
                sc.NewSearch();

                var vars = sc.Expressions.OfType <IntVar>().ToArray();

                var x = vars.SingleOrDefault(v => v.Name() == "x");
                var y = vars.SingleOrDefault(v => v.Name() == "y");

                Assert.That(x, Is.Not.Null);
                Assert.That(y, Is.Not.Null);

                var collector = sc.Monitors.OfType <SolutionCollector>().SingleOrDefault();

                Assert.That(collector, Is.Not.Null);

                var count = 0;

                while (sc.NextSolution())
                {
                    // ReSharper disable once PossibleNullReferenceException
                    Assert.That(collector.SolutionCount(), Is.GreaterThan(0));

                    Assert.That(collector.SolutionCount(), Is.EqualTo(++count));

                    // ReSharper disable once PossibleNullReferenceException
                    Console.WriteLine("Solution: {0} + {1} = 5", x.Value(),
                                      // ReSharper disable once PossibleNullReferenceException
                                      y.Value()
                                      );

                    break;
                }

                sc.Save(path);
            }

            //const string constraintName = "equation";

            using (var sc = new SolverContext(solverName2))
            {
                sc
                .Monitor(s => s.MakeAllSolutionCollector())
                ;

                var collector = sc.Monitors.OfType <SolutionCollector>().SingleOrDefault();

                sc.Load(path);

                //Assert.That(sc.Solver.ConstraintCount(), Is.EqualTo(1));

                var x = GetIntVarFromIntExpr(sc.Solver.ModelLoader(), "x");
                var y = GetIntVarFromIntExpr(sc.Solver.ModelLoader(), "y");

                var strats = new { Var = Solver.INT_VAR_SIMPLE, Val = Solver.INT_VALUE_SIMPLE };

                sc
                .Expression(delegate { return(x); })
                .Expression(delegate { return(y); })
                .Constrain(s =>
                {
                    var c = x + y == 5;

                    //c.Cst.SetName(constraintName);
                    //Assert.That(c.Cst.Name(), Is.EqualTo(constraintName));
                    Assert.That(c.Cst.Name(), Is.EqualTo(string.Empty));

                    Assert.That(c, Is.TypeOf <WrappedConstraint>());
                    Assert.That(c.Cst.ToString(), Is.Not.EqualTo("TrueConstraint()"));
                    Assert.That(c.Cst.ToString(), Is.EqualTo("((x(0..10) + y(0..10)) == 5)"));

                    return(c);
                })
                .CreateDecisionBuilder(
                    e => new IntVarVector(e.OfType <IntVar>().ToList())
                    , (s, vect) => s.MakePhase(vect, strats.Var, strats.Val)
                    )
                ;

                // TODO: TBD: new search? or ability to pick up where we left off?
                sc.NewSearch();

                // TODO: TBD: currently, "re-loading" does not include state, i.e. previously covered ground, so to speak.
                var count = 0;

                while (sc.NextSolution())
                {
                    // ReSharper disable once PossibleNullReferenceException
                    Assert.That(collector.SolutionCount(), Is.GreaterThan(0));

                    Assert.That(collector.SolutionCount(), Is.EqualTo(++count));

                    // ReSharper disable once PossibleNullReferenceException
                    Console.WriteLine("Solution: {0} + {1} = 5", x.Value(),
                                      // ReSharper disable once PossibleNullReferenceException
                                      y.Value()
                                      );

                    break;
                }


                // TODO: TBD: we seem to have the Constraints loaded. What about the variables?
            }
        }
Esempio n. 2
0
        private static SolverContext GetSampleContext(string modelName)
        {
            var strats = new { Var = INT_VAR_SIMPLE, Val = INT_VALUE_SIMPLE };

            const int vmin = 0, vmax = 10;

            const string xName = "x";
            const string yName = "y";
            // TODO: TBD: so apparently naming constraints may not be such a good thing...
            const string constraintName = "equation";

            var sc = new SolverContext(modelName);

            Assert.That(sc.Get(s => s.ConstraintCount()), Is.EqualTo(0));

            var exprs = sc.Expressions;

            Assert.That(exprs, Has.Count.EqualTo(0));

            sc
            .Expression(s =>
            {
                var x = s.MakeIntVar(vmin, vmax, xName);
                Assert.That(x.Name(), Is.EqualTo(xName));
                return(x);
            })
            .Expression(s =>
            {
                var y = s.MakeIntVar(vmin, vmax, yName);
                Assert.That(y.Name(), Is.EqualTo(yName));
                return(y);
            })
            ;

            Assert.That(exprs, Has.Count.EqualTo(2));
            Assert.That(sc.Constraints, Has.Count.EqualTo(0));

            sc
            .Constrain(s =>
            {
                var x = (IntVar)exprs.First(e => e.Name() == xName);
                var y = (IntVar)exprs.First(e => e.Name() == yName);

                var c = x + y == 5;

                Assert.That(c, Is.TypeOf <WrappedConstraint>());
                Assert.That(c.Cst.ToString(), Is.EqualTo("((x(0..10) + y(0..10)) == 5)"));

                c.Cst.SetName(constraintName);
                Assert.That(c.Cst.Name(), Is.EqualTo(constraintName));

                return(c);
            })
            ;

            Assert.That(sc.Constraints, Has.Count.EqualTo(1));
            Assert.That(sc.Monitors, Has.Count.EqualTo(0));

            sc
            .Monitor(s => s.MakeAllSolutionCollector())
            ;

            Assert.That(sc.Monitors, Has.Count.EqualTo(1));
            Assert.Null(sc.DecisionBuilder);

            sc
            .CreateDecisionBuilder(
                e => new IntVarVector(e.OfType <IntVar>().ToList())
                , (s, v) => s.MakePhase(v, strats.Var, strats.Val)
                )
            ;

            Assert.NotNull(sc.DecisionBuilder);

            return(sc);
        }