public void EndEdit_Throws() { var value = new ClVariable("value", 0); var solver = new ClSimplexSolver(); solver.AddStay(value, ClStrength.Strong); solver.BeginEdit(value) .SuggestValue(value, 25) .EndEdit(); // <- Exception raised here }
public void Multiedit() { var x = new ClVariable("x"); var y = new ClVariable("y"); var w = new ClVariable("w"); var h = new ClVariable("h"); var e1 = _solver .AddStay(x) .AddStay(y) .AddStay(w) .AddStay(h) .BeginEdit(x, y) .SuggestValue(x, 10) .SuggestValue(y, 20) .Resolve(); Assert.IsTrue(Cl.Approx(x, 10)); Assert.IsTrue(Cl.Approx(y, 20)); Assert.IsTrue(Cl.Approx(w, 0)); Assert.IsTrue(Cl.Approx(h, 0)); _solver .BeginEdit(w, h) .SuggestValue(w, 30) .SuggestValue(h, 40) .EndEdit(); Assert.IsTrue(Cl.Approx(x, 10)); Assert.IsTrue(Cl.Approx(y, 20)); Assert.IsTrue(Cl.Approx(w, 30)); Assert.IsTrue(Cl.Approx(h, 40)); e1 .SuggestValue(x, 50) .SuggestValue(y, 60) .EndEdit(); Assert.IsTrue(Cl.Approx(x, 50)); Assert.IsTrue(Cl.Approx(y, 60)); Assert.IsTrue(Cl.Approx(w, 30)); Assert.IsTrue(Cl.Approx(h, 40)); }
public void EndEdit_NonRequiredVariable_SolvesCorrectly() { //Create a solver var solver = new ClSimplexSolver(); var variable = new ClVariable(0f); //Add a stay, indicating this var should stay at it's current value if possible solver.AddStay(variable, ClStrength.Strong, 1); //Bug Fixing Note: The stay is strong, which overpowers the SuggestValue. If the stay is Medium or Weak then the SuggestValue takes hold and this test does *not* fail! //tl;dr: This bug only happens if the suggest value does nothing? const double EXPECTED_VALUE = 10.0; //Suggest a value for the variable in an edit context var editContext = solver.BeginEdit(variable); editContext.SuggestValue(variable, EXPECTED_VALUE); editContext.EndEdit(); }
void BeginEdit() { solver.BeginEdit(); }
public void Playground() { //Implementation of this example: https://cassowary.readthedocs.org/en/latest/topics/examples.html#quadrilaterals var _0 = new ClPoint(10, 10); var _1 = new ClPoint(10, 200); var _2 = new ClPoint(200, 200); var _3 = new ClPoint(200, 10); var m0 = new ClPoint(0, 0); var m1 = new ClPoint(0, 0); var m2 = new ClPoint(0, 0); var m3 = new ClPoint(0, 0); //We don't want the points to move unless necessary _solver.AddPointStays(new[] { _0, _1, _2, _3 }); //Define the midpoints // ReSharper disable CompareOfFloatsByEqualityOperator _solver.AddConstraint(m0.X, _0.X, _1.X, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m0.Y, _0.Y, _1.Y, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m1.X, _1.X, _2.X, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m1.Y, _1.Y, _2.Y, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m2.X, _2.X, _3.X, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m2.Y, _2.Y, _3.Y, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m3.X, _3.X, _0.X, (m, a, b) => m == a * 0.5 + b * 0.5); _solver.AddConstraint(m3.Y, _3.Y, _0.Y, (m, a, b) => m == a * 0.5 + b * 0.5); // ReSharper restore CompareOfFloatsByEqualityOperator //Make sure left stays left and top stays top _solver.AddConstraint(_0.X, _2.X, (a, b) => a + 20 <= b); _solver.AddConstraint(_0.X, _3.X, (a, b) => a + 20 <= b); _solver.AddConstraint(_1.X, _2.X, (a, b) => a + 20 <= b); _solver.AddConstraint(_1.X, _3.X, (a, b) => a + 20 <= b); _solver.AddConstraint(_0.Y, _1.Y, (a, b) => a + 20 <= b); _solver.AddConstraint(_0.Y, _2.Y, (a, b) => a + 20 <= b); _solver.AddConstraint(_3.Y, _1.Y, (a, b) => a + 20 <= b); _solver.AddConstraint(_3.Y, _2.Y, (a, b) => a + 20 <= b); //Make sure all points stay in 500x500 convas _solver.AddConstraint(_0.X, a => a >= 0); _solver.AddConstraint(_0.Y, a => a >= 0); _solver.AddConstraint(_0.X, a => a <= 500); _solver.AddConstraint(_0.Y, a => a <= 500); Console.WriteLine(m0.X.Value + " " + m0.Y.Value); Console.WriteLine(m1.X.Value + " " + m1.Y.Value); Console.WriteLine(m2.X.Value + " " + m2.Y.Value); Console.WriteLine(m3.X.Value + " " + m3.Y.Value); _solver.BeginEdit(_2.X, _2.Y) .SuggestValue(_2.X, 300) .SuggestValue(_2.Y, 400) .EndEdit(); Console.WriteLine(m0.X.Value + " " + m0.Y.Value); Console.WriteLine(m1.X.Value + " " + m1.Y.Value); Console.WriteLine(m2.X.Value + " " + m2.Y.Value); Console.WriteLine(m3.X.Value + " " + m3.Y.Value); }