示例#1
0
        public void TestUnidirectionalComputationConstraint()
        {
            {
                var solver = new SimpleConstraintSolver();
                var x      = solver.CreateVariable("x");
                var y      = solver.CreateVariable("y");
                var r      = solver.CreateVariable("r");
                var phi    = solver.CreateVariable("phi");
                UnidirectionalComputationConstraint.CreateUnidirectionalComputationConstraint(new[] { x, y }, new[] { r, phi }, CartesianToPolar);

                var rx = new Range(20, 40, EPS);
                x.RestrictRange(rx);
                var ry = new Range(30, 50, EPS);
                y.RestrictRange(ry);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(50, 50, EPS), r.Value);
            }
            {
                //var solver = new SimpleConstraintSolver();
                //var x = solver.Create("a");
                //var y = solver.Create("b");
                //var r = solver.Create("r");
                //var phi = solver.Create("phi");
                //new UnidirectionalComputationConstraint(new[] { x, y }, new[] { r, phi }, CartesianToPolar);
            }
        }
示例#2
0
        public void TestIsInverseConstraint()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                IsInverseConstraint.CreateIsInverseConstraint(a, b);

                var r = new Range(3, 4, EPS);
                a.RestrictRange(r);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(-r, b.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                IsInverseConstraint.CreateIsInverseConstraint(a, b);

                var r = new Range(3, 4, EPS);
                b.RestrictRange(r);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(-r, a.Value);
            }
        }
示例#3
0
        public void TestVariableMinimization()
        {
            var solver = new SimpleConstraintSolver();
            var a      = solver.CreateVariable("a");
            var b      = solver.CreateVariable("b");
            var c1     = a + b;
            var c2     = a + b;

            Assert.AreSame(c1, c2);
        }
示例#4
0
        public void TestRangeConstraint()
        {
            {
                var             solver = new SimpleConstraintSolver();
                NumericVariable a      = solver.CreateVariable("a");

                var r = new Range(3, 4, EPS);
                RangeConstraint.CreateRangeConstraint(a, r);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(r, a.Value);
            }
        }
示例#5
0
        public void TestSimpleSumDownwards()
        {
            var solver = new SimpleConstraintSolver();
            var a      = solver.CreateVariable("a");
            var b      = solver.CreateVariable("b");
            var c      = a + b;

            a.RestrictRange(2, 2);
            c.RestrictRange(5, 5);
            solver.Solve(_noAbortCheck);
            Assert.AreEqual(new Range(3, 3, EPS), b.Value);
        }
示例#6
0
        public void TestSimpleSum()
        {
            var solver = new SimpleConstraintSolver();
            var a      = solver.CreateVariable("a");
            var b      = solver.CreateVariable("b");
            var c      = a + b;

            a.RestrictRange(2, 2);
            b.RestrictRange(3, 3);
            solver.Solve(_noAbortCheck);
            Assert.AreEqual(5, c.Value.Lo);
            Assert.AreEqual(5, c.Value.Hi);
        }
示例#7
0
        public void TestSumIs0Constraint()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                var c      = solver.CreateVariable("c");
                SumIs0Constraint.CreateSumIs0Constraint(a, b, c);

                a.RestrictRange(new Range(30, 50, EPS));
                b.RestrictRange(new Range(10, double.PositiveInfinity, EPS));
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(double.NegativeInfinity, -40, EPS), c.Value);
            }
        }
示例#8
0
        public void TestConstraintMinimization()
        {
            var solver = new SimpleConstraintSolver();
            var a      = solver.CreateVariable("a");
            var b      = solver.CreateVariable("b");
            var c1     = a + b;
            var c2     = a + b;

            Assert.AreSame(c1, c2);

            solver.MarkSubsumingConstraints();

            // There is only one Sum0Constraint at all variables
            Assert.AreEqual(1, a.ActiveConstraints.Count());
            Assert.AreEqual(1, b.ActiveConstraints.Count());
            Assert.AreEqual(1, c1.ActiveConstraints.Count());
        }
示例#9
0
 public void TestConstraintPropagation()
 {
     {
         var solver = new SimpleConstraintSolver();
         var a      = solver.CreateVariable("a");
         var b      = solver.CreateVariable("b");
         var c      = solver.CreateVariable("c");
         var d      = solver.CreateVariable("d");
         UnidirectionalComputationConstraint.CreateUnidirectionalComputationConstraint(new[] { a }, new[] { b }, OneMore);
         UnidirectionalComputationConstraint.CreateUnidirectionalComputationConstraint(new[] { b }, new[] { c }, OneMore);
         UnidirectionalComputationConstraint.CreateUnidirectionalComputationConstraint(new[] { c }, new[] { d }, OneMore);
         a.Set(10);
         solver.Solve(_noAbortCheck);
         Assert.AreEqual(10, a.GetValue());
         Assert.AreEqual(11, b.GetValue());
         Assert.AreEqual(12, c.GetValue());
         Assert.AreEqual(13, d.GetValue());
     }
 }
示例#10
0
        public void TestTimes()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = a * 3;

                a.RestrictRange(2, 3);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(6, 9, EPS), b.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = a * 3;

                b.RestrictRange(2, 3);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(2 / 3.0, 1, EPS), a.Value);
            }
        }
示例#11
0
            internal ArrowBuilder(SimpleConstraintSolver solver, string name,
                                  VariableVector tail, VariableVector head, double width, Color color,
                                  string text, LineTextPlacement lineTextPlacement, Font textFont, Color textColor, double textPadding, double textLocation,
                                  string edgeInfo, int creationOrder, int drawingOrder, int fixingOrder) : base(creationOrder, drawingOrder, fixingOrder)
            {
                // Simple stuff
                _name              = name;
                _width             = width;
                _color             = color;
                _text              = text;
                _lineTextPlacement = lineTextPlacement;
                _textFont          = textFont;
                _textColor         = textColor;
                _textPadding       = (float)textPadding;
                _textLocation      = textLocation;
                _edgeInfo          = edgeInfo;

                // Vectors
                _tail    = tail.AlsoNamed(_name + ".T");
                _head    = head.AlsoNamed(_name + ".H");
                _textBox = new VariableVector(_name + ".TXT", solver);
            }
示例#12
0
        public void TestProportionalConstraint()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                ProportionalConstraint.CreateProportionalConstraint(5, a, b);

                b.RestrictRange(new Range(30, 40, EPS));
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(6, 8, EPS), a.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                ProportionalConstraint.CreateProportionalConstraint(5, a, b);

                a.RestrictRange(new Range(30, 40, EPS));
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(150, 200, EPS), b.Value);
            }
        }
示例#13
0
        public void TestAtLeastConstraint()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                AtLeastConstraint.CreateAtLeastConstraint(a, b);

                a.RestrictRange(new Range(3, 4, EPS));
                solver.Solve(_noAbortCheck);
                // (3..4) >= (x..y) means that y is at most 4
                Assert.AreEqual(new Range(double.NegativeInfinity, 4, EPS), b.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                AtLeastConstraint.CreateAtLeastConstraint(a, b);

                b.RestrictRange(new Range(3, 4, EPS));
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(3, double.PositiveInfinity, EPS), a.Value);
            }
        }
示例#14
0
        public void TestMinus()
        {
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                var c      = a - b;

                a.RestrictRange(2, 3);
                b.RestrictRange(5, 6);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(-4, -2, EPS), c.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                var c      = a - b;

                a.RestrictRange(2, 3);
                c.RestrictRange(5, 6);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(-4, -2, EPS), b.Value);
            }
            {
                var solver = new SimpleConstraintSolver();
                var a      = solver.CreateVariable("a");
                var b      = solver.CreateVariable("b");
                var c      = a - b;

                b.RestrictRange(2, 3);
                c.RestrictRange(5, 6);
                solver.Solve(_noAbortCheck);
                Assert.AreEqual(new Range(7, 9, EPS), a.Value);
            }
        }
示例#15
0
            public BoxBuilder([NotNull] SimpleConstraintSolver solver,
                              [NotNull] VariableVector anchor, [NotNull] VariableVector diagonal,
                              BoxAnchoring boxAnchoring, Color color,
                              double borderWidth, Color borderColor, int connectors, string text,
                              BoxTextPlacement boxTextPlacement, Font textFont, Color textColor, double textPadding,
                              int creationOrder, int drawingOrder, int fixingOrder,
                              string name, [CanBeNull] string htmlRef) : base(creationOrder, drawingOrder, fixingOrder)
            {
                _solver = solver;
                Name    = name ?? anchor.Name;

                _anchor   = anchor;
                _textBox  = new VariableVector(Name + ".TXT", _solver);
                _diagonal = diagonal.AlsoNamed(Name + "./").Restrict(_textBox);

                var halfDiagonal   = diagonal / 2;
                var halfHorizontal = halfDiagonal.Horizontal();
                var halfVertical   = halfDiagonal.Vertical();
                var vertical       = diagonal.Vertical();
                var horizontal     = diagonal.Horizontal();

                switch (boxAnchoring)
                {
                case BoxAnchoring.Center:
                    _center       = anchor;
                    _lowerLeft    = anchor - halfDiagonal;
                    _centerLeft   = anchor - halfHorizontal;
                    _upperLeft    = anchor + ~halfDiagonal;
                    _centerTop    = anchor + halfVertical;
                    _upperRight   = anchor + halfDiagonal;
                    _centerRight  = anchor + halfHorizontal;
                    _lowerRight   = anchor + !halfDiagonal;
                    _centerBottom = anchor - halfVertical;
                    break;

                case BoxAnchoring.LowerLeft:
                    _center       = anchor + halfDiagonal;
                    _lowerLeft    = anchor;
                    _centerLeft   = anchor + halfVertical;
                    _upperLeft    = anchor + vertical;
                    _centerTop    = _upperLeft + halfHorizontal;
                    _upperRight   = anchor + diagonal;
                    _centerRight  = _centerLeft + horizontal;
                    _lowerRight   = anchor + horizontal;
                    _centerBottom = anchor + halfHorizontal;
                    break;

                case BoxAnchoring.CenterLeft:
                    _center       = anchor + halfHorizontal;
                    _lowerLeft    = anchor - halfVertical;
                    _centerLeft   = anchor;
                    _upperLeft    = anchor + halfVertical;
                    _centerTop    = anchor + halfDiagonal;
                    _upperRight   = _centerTop + halfHorizontal;
                    _centerRight  = anchor + horizontal;
                    _lowerRight   = _centerRight - halfVertical;
                    _centerBottom = anchor + !halfDiagonal;
                    break;

                case BoxAnchoring.UpperLeft:
                    _center       = anchor - ~halfDiagonal;
                    _lowerLeft    = anchor - vertical;
                    _centerLeft   = anchor - halfVertical;
                    _upperLeft    = anchor;
                    _centerTop    = anchor + halfHorizontal;
                    _upperRight   = anchor + horizontal;
                    _centerRight  = _upperRight - halfVertical;
                    _lowerRight   = anchor - ~diagonal;
                    _centerBottom = anchor + new VariableVector(null, diagonal.X / 2, -diagonal.Y);
                    break;

                case BoxAnchoring.CenterTop:
                    _center       = anchor - halfVertical;
                    _lowerLeft    = _center - halfDiagonal;
                    _centerLeft   = anchor - halfDiagonal;
                    _upperLeft    = anchor - halfHorizontal;
                    _centerTop    = anchor;
                    _upperRight   = anchor + halfHorizontal;
                    _centerRight  = anchor + !halfDiagonal;
                    _lowerRight   = _centerRight - halfVertical;
                    _centerBottom = anchor - vertical;
                    break;

                case BoxAnchoring.UpperRight:
                    _center       = anchor - halfDiagonal;
                    _lowerLeft    = anchor - diagonal;
                    _centerLeft   = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / -2);
                    _upperLeft    = anchor - horizontal;
                    _centerTop    = anchor - halfHorizontal;
                    _upperRight   = anchor;
                    _centerRight  = anchor - halfVertical;
                    _lowerRight   = anchor - vertical;
                    _centerBottom = anchor + new VariableVector(null, diagonal.X / -2, -diagonal.Y);
                    break;

                case BoxAnchoring.CenterRight:
                    _center       = anchor - halfHorizontal;
                    _lowerLeft    = _center - halfDiagonal;
                    _centerLeft   = anchor - horizontal;
                    _upperLeft    = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / 2);
                    _centerTop    = anchor + ~halfDiagonal;
                    _upperRight   = anchor + halfVertical;
                    _centerRight  = anchor;
                    _lowerRight   = anchor - halfVertical;
                    _centerBottom = anchor - halfDiagonal;
                    break;

                case BoxAnchoring.LowerRight:
                    _center       = anchor + ~halfDiagonal;
                    _lowerLeft    = anchor - horizontal;
                    _centerLeft   = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / 2);
                    _upperLeft    = anchor + ~diagonal;
                    _centerTop    = anchor + new VariableVector(null, diagonal.X / -2, diagonal.Y);
                    _upperRight   = anchor + vertical;
                    _centerRight  = anchor + halfVertical;
                    _lowerRight   = anchor;
                    _centerBottom = anchor - halfHorizontal;
                    break;

                case BoxAnchoring.CenterBottom:
                    _center       = anchor + halfVertical;
                    _lowerLeft    = anchor - halfHorizontal;
                    _centerLeft   = anchor + ~halfDiagonal;
                    _upperLeft    = _centerLeft + halfVertical;
                    _centerTop    = anchor + vertical;
                    _upperRight   = _centerTop + halfHorizontal;
                    _centerRight  = anchor + halfDiagonal;
                    _lowerRight   = anchor + halfHorizontal;
                    _centerBottom = anchor;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(boxAnchoring), boxAnchoring, null);
                }

                _center       = _center.AlsoNamed(Name + "CC");
                _lowerLeft    = _lowerLeft.AlsoNamed(Name + ".LL");
                _centerLeft   = _centerLeft.AlsoNamed(Name + ".CL");
                _upperLeft    = _upperLeft.AlsoNamed(Name + ".UL");
                _centerTop    = _centerTop.AlsoNamed(Name + ".CT");
                _upperRight   = _upperRight.AlsoNamed(Name + ".UR");
                _centerRight  = _centerRight.AlsoNamed(Name + ".CR");
                _lowerRight   = _lowerRight.AlsoNamed(Name + ".LR");
                _centerBottom = _centerBottom.AlsoNamed(Name + ".CB");

                _upperRight.SetY(_centerTop.Y);
                _upperRight.SetY(_upperLeft.Y);
                _centerTop.SetY(_upperLeft.Y);
                _centerRight.SetY(_center.Y);
                _centerRight.SetY(_centerLeft.Y);
                _center.SetY(_centerLeft.Y);
                _lowerRight.SetY(_centerBottom.Y);
                _lowerRight.SetY(_lowerLeft.Y);
                _centerBottom.SetY(_lowerLeft.Y);

                // Simple stuff
                _color            = color;
                _borderWidth      = (float)borderWidth;
                _text             = text.Split('\r', '\n');
                _boxTextPlacement = boxTextPlacement;
                _textColor        = textColor;
                _textPadding      = textPadding;
                _htmlRef          = htmlRef;
                _textFont         = textFont;
                _borderColor      = borderColor;
                _sectorAngle      = 2 * Math.PI / connectors;
            }
示例#16
0
 protected GraphicsRenderer()
 {
     _solver = new GraphicsRendererSolver(this);
 }