Пример #1
0
        public void FloatPredeteriminationTest()
        {
            var p   = new Problem(nameof(GeneralSumConstraintTest));
            var dom = new FloatDomain("unit", -1, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            var y   = (FloatVariable)dom.Instantiate("y");

            y.PredeterminedValue = 1;
            var sum = x + y;
            int spuriousHitCount = 0;

            for (int i = 0; i < 100; i++)
            {
                var v = Random.Float(-1, 1);
                x.PredeterminedValue = v;
                var s = p.Solve();
                // Should always give us the predetermined value
                Assert.AreEqual(x.Value(s), v);
                Assert.AreEqual(sum.Value(s), v + 1);
                if (i % 2 == 0)
                {
                    x.Reset();
                    s = p.Solve();
                    // Should almost never give us the formerly predetermined value
                    // ReSharper disable CompareOfFloatsByEqualityOperator
                    if (x.Value(s) == v || sum.Value(s) == v + 1)
                    {
                        // ReSharper restore CompareOfFloatsByEqualityOperator
                        spuriousHitCount++;
                    }
                }
            }

            Assert.IsTrue(spuriousHitCount < 3);
        }
Пример #2
0
        /// <inheritdoc />
        public FloatVariable(object name, FloatDomain d, Literal condition, Problem problem) : base(name, problem, condition)
        {
            FloatDomain = d;
            Bounds      = d.Bounds;
            var floatSolver = problem.GetSolver <FloatSolver>();

            Index = floatSolver.Variables.Count;
            floatSolver.Variables.Add(this);
        }
Пример #3
0
        public void ConstantBoundDependencyTest()
        {
            var p   = new Problem(nameof(FloatTest));
            var dom = new FloatDomain("unit", 0, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            var a   = (Proposition)"a";

            p.Assert((x > 0.1f) > a);
            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Assert.IsTrue(x.Value(s) <= 0.1f || s[a]);
            }
        }
Пример #4
0
        //Test wp in float cases
        public void SumConstrainTest()
        {
            var pp  = new Problem("SumConstraintTest");
            var dom = new FloatDomain("unit", 0, 1);
            var a   = (FloatVariable)dom.Instantiate("a");
            var b   = (FloatVariable)dom.Instantiate("b");
            var sum = a + b;

            for (int i = 0; i < 100; i++)
            {
                var s = pp.Solve();
                Console.WriteLine(s.Model);
                Assert.IsTrue(Math.Abs(sum.Value(s) - (a.Value(s) + b.Value(s))) < 0.00001f);
            }
        }
Пример #5
0
        public void NaiveSquareTest()
        {
            var p   = new Problem(nameof(NaiveSquareTest));
            var dom = new FloatDomain("signed unit", -1, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            //p.Assert("foo");
            var square = x * x;

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                Assert.IsTrue(Math.Abs(square.Value(s) - x.Value(s) * x.Value(s)) < 0.00001f);
            }
        }
Пример #6
0
        public void SignedProductTest()
        {
            var p   = new Problem(nameof(SignedProductTest));
            var dom = new FloatDomain("signed unit", -1, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            var y   = (FloatVariable)dom.Instantiate("y");
            //p.Assert("foo");
            var product = x * y;

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                Assert.IsTrue(Math.Abs(product.Value(s) - x.Value(s) * y.Value(s)) < 0.00001f);
            }
        }
Пример #7
0
        public void SumConstraintTest()
        {
            var p   = new Problem(nameof(SumConstraintTest));
            var dom = new FloatDomain("unit", 0, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            var y   = (FloatVariable)dom.Instantiate("y");
            //p.Assert("foo");
            var sum = x + y;

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                Assert.IsTrue(Math.Abs(sum.Value(s) - (x.Value(s) + y.Value(s))) < 0.00001f);
            }
        }
Пример #8
0
        public void FloatTest()
        {
            var p   = new Problem(nameof(FloatTest));
            var dom = new FloatDomain("unit", 0, 1);
            var x   = (FloatVariable)dom.Instantiate("x");
            var y   = (FloatVariable)dom.Instantiate("y");

            var a = (Proposition)"a";
            var b = (Proposition)"b";
            var c = (Proposition)"c";
            var d = (Proposition)"d";
            var e = (Proposition)"e";

            p.Assert(a > (x > .2f));
            p.Assert(b > (x > .3f));
            p.Assert(c > (x < .5f));
            p.Assert(d > (x < .8f));
            p.Assert(e > (x == y));
            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                var xVal = x.Value(s);
                var yVal = y.Value(s);
                if (s[a])
                {
                    Assert.IsTrue(xVal >= .2f);
                }
                if (s[b])
                {
                    Assert.IsTrue(xVal >= .3f);
                }
                if (s[c])
                {
                    Assert.IsTrue(xVal <= .5f);
                }
                if (s[d])
                {
                    Assert.IsTrue(xVal <= .8f);
                }
                if (s[e])
                {
                    Assert.AreEqual(xVal, yVal);
                }
            }
        }
Пример #9
0
        public void FloatPredeterminationTest()
        {
            var problem     = new Problem("test");
            var dom         = new FloatDomain("signed unit", -1, 1);
            var x           = (FloatVariable)dom.Instantiate("x", problem);
            var y           = (FloatVariable)dom.Instantiate("y", problem);
            var z           = (FloatVariable)dom.Instantiate("z", problem);
            var bigThresh   = 1.5f;
            var smallThresh = -2.3f;
            var xBig        = x > bigThresh;
            var ySmall      = y < smallThresh;
            var zBig        = z > bigThresh;
            var zSmall      = z < smallThresh;
            var xLTy        = x < y;
            var xGTz        = x > z;
            var yLTz        = y < z;

            for (var i = 0; i < 100; i++)
            {
                var xVal = Random.Float(-1, 1);
                var yVal = Random.Float(-1, 1);
                x.PredeterminedValue = xVal;
                y.PredeterminedValue = yVal;
                var s = problem.Solve();
                Assert.AreEqual(xVal, x.Value(s));
                Assert.AreEqual(yVal, y.Value(s));

                Assert.IsTrue(problem.IsPredetermined(xBig));
                Assert.AreEqual(s[xBig], xVal >= bigThresh);

                Assert.IsTrue(problem.IsPredetermined(ySmall));
                Assert.AreEqual(s[ySmall], yVal <= smallThresh);

                Assert.IsTrue(problem.IsPredetermined(xLTy));
                Assert.AreEqual(s[xLTy], xVal <= yVal);

                Assert.IsFalse(problem.IsPredetermined(zBig));
                Assert.IsFalse(problem.IsPredetermined(zSmall));

                Assert.IsFalse(problem.IsPredetermined(xGTz));
                Assert.IsFalse(problem.IsPredetermined(yLTz));
            }
        }
Пример #10
0
        public void UndefinedFloatVarEquationHasNoEffectTest()
        {
            var p    = new Problem("test");
            var dom  = new FloatDomain("signed unit", -1, 1);
            var prop = (Proposition)"prop";
            var x    = new FloatVariable("x", dom, prop, p);
            var y    = (FloatVariable)dom.Instantiate("y");

            p.Assert(Not(prop));
            p.Assert(x == y);

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Assert.IsFalse(x.IsDefinedInInternal(s));
                Assert.IsTrue(y.IsDefinedInInternal(s));
                Assert.IsFalse(ReferenceEquals(x.Representative, y.Representative));
            }
        }
Пример #11
0
        public void UndefinedFloatVarTest()
        {
            var p    = new Problem("test");
            var dom  = new FloatDomain("signed unit", -1, 1);
            var prop = (Proposition)"prop";
            var x    = new FloatVariable("x", dom, prop, p);

            p.Assert(Not(prop));
            Solution s = null;

            for (int i = 0; i < 100; i++)
            {
                s = p.Solve();
                Console.WriteLine(s.Model);
                Assert.IsFalse(s[prop]);
                Assert.IsFalse(x.IsDefinedInInternal(s));
            }
            Console.WriteLine(x.Value(s));
        }
Пример #12
0
        public void ConstantProductConstraintTest()
        {
            for (int j = 0; j < 100; j++)
            {
                var p   = new Problem(nameof(ConstantProductConstraintTest));
                var dom = new FloatDomain("signed unit", -1, 1);
                var x   = (FloatVariable)dom.Instantiate("x");
                var c   = Random.Float(-100, 100);

                var product = c * x;

                for (int i = 0; i < 100; i++)
                {
                    var s = p.Solve();
                    Console.WriteLine(s.Model);
                    Assert.IsTrue(Math.Abs(product.Value(s) / (x.Value(s)) - c) < 0.0001f);
                }
            }
        }
Пример #13
0
        public void AverageConstraintTest()
        {
            var p    = new Problem(nameof(AverageConstraintTest));
            var dom  = new FloatDomain("unit", -1, 1);
            var vars = new FloatVariable[10];

            for (int i = 0; i < vars.Length; i++)
            {
                vars[i] = (FloatVariable)dom.Instantiate("x" + i);
            }
            var average = FloatVariable.Average(vars);

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                var avg = vars.Select(v => v.Value(s)).Average();
                Assert.IsTrue(Math.Abs(average.Value(s) - avg) < 0.00001f);
            }
        }
Пример #14
0
        public void GeneralSumConstraintTest()
        {
            var p    = new Problem(nameof(GeneralSumConstraintTest));
            var dom  = new FloatDomain("unit", -1, 1);
            var vars = new FloatVariable[10];

            for (int i = 0; i < vars.Length; i++)
            {
                vars[i] = (FloatVariable)dom.Instantiate("x" + i);
            }
            var sum = FloatVariable.Sum(vars);

            for (int i = 0; i < 100; i++)
            {
                var s = p.Solve();
                Console.WriteLine(s.Model);
                var realSum = vars.Select(v => v.Value(s)).Sum();
                Assert.IsTrue(Math.Abs(sum.Value(s) - realSum) < 0.00001f);
            }
        }
Пример #15
0
        public void SumConditionTest()
        {
            var problem = new Problem("test");
            var dom     = new FloatDomain("signed unit", -1, 1);
            var p       = (Proposition)"p";
            var x       = (FloatVariable)dom.Instantiate("x", problem, p);
            var q       = (Proposition)"q";
            var y       = (FloatVariable)dom.Instantiate("y", problem, q);
            var sum     = x + y;

            Assert.IsTrue(ReferenceEquals(sum.Condition, problem.Conjunction(p, q)));

            for (int i = 0; i < 100; i++)
            {
                var s = problem.Solve();
                Console.WriteLine(s.Model);
                Assert.AreEqual(sum.IsDefinedInInternal(s), x.IsDefinedInInternal(s) & y.IsDefinedInInternal(s));
                if (sum.IsDefinedInInternal(s))
                {
                    Assert.IsTrue(Math.Abs(sum.Value(s) - (x.Value(s) + y.Value(s))) < 0.00001f);
                }
            }
        }