private static void AddSpecifiedBoundsConstraints(Solver solver, IConstraintLayoutElement element)
        {
            var medium1 = Strength.Create(0, 1, 0, 1);
            var medium2 = Strength.Create(0, 1, 0, 2);

            solver.AddConstraint(element.Vars.Left == element.SpecifiedBounds.Left | medium1);
            solver.AddConstraint(element.Vars.Top == element.SpecifiedBounds.Top | medium1);
            solver.AddConstraint(element.Vars.Width == element.SpecifiedSize.Width | medium2);
            solver.AddConstraint(element.Vars.Height == element.SpecifiedSize.Height | medium2);
        }
 // TODO: extract interface
 internal void AddToSolver(Solver solver, Variable lhs, IConstraintLayoutParams layoutParams)
 {
     if (Control == null || Property == ConstraintProperty.None)
     {
         solver.AddConstraint(lhs == Constant);
     }
     else
     {
         var element    = layoutParams.GetElement(Control);
         var elementVar = element.Vars[Property];
         solver.AddConstraint(lhs == elementVar + Constant);
     }
 }
 void ConstraintTwoLongestSegs(LongestNudgedSegment prevSeg, LongestNudgedSegment seg)
 {
     if (!prevSeg.IsFixed || !seg.IsFixed)
     {
         Solver.AddConstraint(prevSeg.Id, seg.Id);
     }
 }
示例#4
0
 public void AddConstraints(Solver solver)
 {
     for (int i = 0; i < solver.MAX_VALUE; i++)
     {
         solver.AddConstraint(new DisjointGroupConstraint(solver, i));
     }
 }
示例#5
0
        public void test_managing_constraints()
        {
            // Test adding/removing constraints.

            var s  = new Solver();
            var v  = new Variable("foo");
            var c1 = v >= 1;
            var c2 = v <= 0;

            Assert.False(s.HasConstraint(c1));
            s.AddConstraint(c1);
            Assert.True(s.HasConstraint(c1));
            Assert.Throws <DuplicateConstraint>(() => s.AddConstraint(c1));
            Assert.Throws <UnknownConstraint>(() => s.RemoveConstraint(c2));
            Assert.Throws <UnsatisfiableConstraint>(() => s.AddConstraint(c2));
            s.RemoveConstraint(c1);
            Assert.False(s.HasConstraint(c1));

            s.AddConstraint(c2);
            Assert.True(s.HasConstraint(c2));
            s.Reset();
            Assert.False(s.HasConstraint(c2));
        }
 private void AddStructuralConstraints()
 {
     // Add the vertical structural constraints to the auto-generated ones.
     foreach (var c in structuralConstraints)
     {
         if (ConstraintLevel >= c.Level)
         {
             var hc = c as HorizontalSeparationConstraint;
             if (hc != null && IsHorizontal)
             {
                 FiNode u = (FiNode)(hc.LeftNode.AlgorithmData);
                 FiNode v = (FiNode)(hc.RightNode.AlgorithmData);
                 solver.AddConstraint(u.getOlapNode(IsHorizontal).Variable, v.getOlapNode(IsHorizontal).Variable, hc.Separation, hc.IsEquality);
             }
             var vc = c as VerticalSeparationConstraint;
             if (vc != null && !IsHorizontal)
             {
                 FiNode u = (FiNode)(vc.TopNode.AlgorithmData);
                 FiNode v = (FiNode)(vc.BottomNode.AlgorithmData);
                 solver.AddConstraint(u.getOlapNode(IsHorizontal).Variable, v.getOlapNode(IsHorizontal).Variable, vc.Separation, vc.IsEquality);
             }
         }
     }
 }
示例#7
0
        public void test_solving_under_constrained_system()
        {
            // Test solving an under constrained system.
            var s = new Solver();
            var v = new Variable("foo");
            var c = 2 * v + 1 >= 0;

            s.AddEditVariable(v, Strength.Weak);
            s.AddConstraint(c);
            s.SuggestValue(v, 10);
            s.UpdateVariables();

            Assert.Equal(21, c.Expression.Value);
            Assert.Equal(20, c.Expression.Terms[0].Value);
            Assert.Equal(10, c.Expression.Terms[0].Variable.Value);
        }
        /// <summary>
        /// Add a constraint that leftNode+gap eq|leq RightNode.
        /// </summary>
        /// <param name="idLeft">Caller's unique identifier for the left node</param>
        /// <param name="idRight">Caller's unique identifier for the right node</param>
        /// <param name="gap">Required gap</param>
        /// <param name="isEquality">Gap is exact rather than minimum</param>
        public void AddLeftRightSeparationConstraint(int idLeft, int idRight, double gap, bool isEquality)
        {
            // The variables must already have been added by AddNodeWithDesiredPosition.
            var varLeft = GetVariable(idLeft);

            if (varLeft == null)
            {
                return;
            }
            var varRight = GetVariable(idRight);

            if (varRight == null)
            {
                return;
            }
            solver.AddConstraint(varLeft, varRight, gap, isEquality);
        }
示例#9
0
        public void test_solving_with_strength()
        {
            // Test solving a system with unstatisfiable non-required constraint.

            var v1 = new Variable("foo");
            var v2 = new Variable("bar");
            var s  = new Solver();

            s.AddConstraint(v1 + v2 == 0);
            s.AddConstraint(v1 == 10);
            s.AddConstraint((v2 >= 0) | Strength.Weak);
            s.UpdateVariables();
            Assert.Equal(10, v1.Value);
            Assert.Equal(-10, v2.Value);

            s.Reset();

            s.AddConstraint(v1 + v2 == 0);
            s.AddConstraint((v1 >= 10) | Strength.Medium);
            s.AddConstraint((v2 == 2) | Strength.Strong);
            s.UpdateVariables();
            Assert.Equal(-2, v1.Value);
            Assert.Equal(2, v2.Value);
        }
        private static void AddCommonConstraints(Solver solver, IConstraintLayoutElement element, Rectangle layoutBounds)
        {
            var vars = element.Vars;

            solver.AddConstraint(vars.Left == layoutBounds.Left | Strength.Weak);
            solver.AddConstraint(vars.Top == layoutBounds.Top | Strength.Weak);

            // weak constraints to keep element within panel bounds
            solver.AddConstraint(vars.Left >= layoutBounds.Left | Strength.Medium);
            solver.AddConstraint(vars.Top >= layoutBounds.Top | Strength.Medium);
            solver.AddConstraint(vars.Right <= layoutBounds.Right | Strength.Medium);
            solver.AddConstraint(vars.Bottom <= layoutBounds.Bottom | Strength.Medium);

            // strong constraints to make width and height non-negative
            solver.AddConstraint(vars.Width >= 0);
            solver.AddConstraint(vars.Height >= 0);

            // strong constraints to set relations for width/left/center/right and height/top/middle/bottom
            solver.AddConstraint(vars.Left + vars.Width == vars.Right);
            solver.AddConstraint(vars.Left + vars.Width / 2 == vars.Center);
            solver.AddConstraint(vars.Top + vars.Height == vars.Bottom);
            solver.AddConstraint(vars.Top + vars.Height / 2 == vars.Middle);
        }