コード例 #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);
 }