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); } }
public void AddConstraints(Solver solver) { for (int i = 0; i < solver.MAX_VALUE; i++) { solver.AddConstraint(new DisjointGroupConstraint(solver, i)); } }
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); } } } }
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); }
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); }