Пример #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);
 }