def test_multiedit2(self): x = Variable('x') y = Variable('y') w = Variable('w') h = Variable('h') solver = SimplexSolver() solver.add_stay(x) solver.add_stay(y) solver.add_stay(w) solver.add_stay(h) solver.add_edit_var(x) solver.add_edit_var(y) solver.begin_edit() solver.suggest_value(x, 10) solver.suggest_value(y, 20) solver.resolve() solver.end_edit() self.assertAlmostEqual(x.value, 10) self.assertAlmostEqual(y.value, 20) self.assertAlmostEqual(w.value, 0) self.assertAlmostEqual(h.value, 0) solver.add_edit_var(w) solver.add_edit_var(h) solver.begin_edit() solver.suggest_value(w, 30) solver.suggest_value(h, 40) solver.end_edit() self.assertAlmostEqual(x.value, 10) self.assertAlmostEqual(y.value, 20) self.assertAlmostEqual(w.value, 30) self.assertAlmostEqual(h.value, 40) solver.add_edit_var(x) solver.add_edit_var(y) solver.begin_edit() solver.suggest_value(x, 50) solver.suggest_value(y, 60) solver.end_edit() self.assertAlmostEqual(x.value, 50) self.assertAlmostEqual(y.value, 60) self.assertAlmostEqual(w.value, 30) self.assertAlmostEqual(h.value, 40)
def test_quadrilateral(self): "A simple version of the quadrilateral test" solver = SimplexSolver() class Point(object): def __init__(self, identifier, x, y): self.x = Variable('x' + identifier, x) self.y = Variable('y' + identifier, y) def __repr__(self): return u'(%s, %s)' % (self.x.value, self.y.value) __hash__ = object.__hash__ def __eq__(self, other): return self.x.value == other[0] and self.y.value == other[1] points = [ Point('0', 10, 10), Point('1', 10, 200), Point('2', 200, 200), Point('3', 200, 10), Point('m0', 0, 0), Point('m1', 0, 0), Point('m2', 0, 0), Point('m3', 0, 0), ] midpoints = points[4:] # Add point stays weight = 1.0 multiplier = 2.0 for point in points[:4]: solver.add_stay(point.x, WEAK, weight) solver.add_stay(point.y, WEAK, weight) weight = weight * multiplier for start, end in [(0, 1), (1, 2), (2, 3), (3, 0)]: cle = (points[start].x + points[end].x) / 2 cleq = midpoints[start].x == cle solver.add_constraint(cleq) cle = (points[start].y + points[end].y) / 2 cleq = midpoints[start].y == cle solver.add_constraint(cleq) cle = points[0].x + 20 solver.add_constraint(cle <= points[2].x) solver.add_constraint(cle <= points[3].x) cle = points[1].x + 20 solver.add_constraint(cle <= points[2].x) solver.add_constraint(cle <= points[3].x) cle = points[0].y + 20 solver.add_constraint(cle <= points[1].y) solver.add_constraint(cle <= points[2].y) cle = points[3].y + 20 solver.add_constraint(cle <= points[1].y) solver.add_constraint(cle <= points[2].y) for point in points: solver.add_constraint(point.x >= 0) solver.add_constraint(point.y >= 0) solver.add_constraint(point.x <= 500) solver.add_constraint(point.y <= 500) # Check the initial answers self.assertEqual(points[0], (10.0, 10.0)) self.assertEqual(points[1], (10.0, 200.0)) self.assertEqual(points[2], (200.0, 200.0)) self.assertEqual(points[3], (200.0, 10.0)) self.assertEqual(points[4], (10.0, 105.0)) self.assertEqual(points[5], (105.0, 200.0)) self.assertEqual(points[6], (200.0, 105.0)) self.assertEqual(points[7], (105.0, 10.0)) # Now move point 2 to a new location solver.add_edit_var(points[2].x) solver.add_edit_var(points[2].y) solver.begin_edit() solver.suggest_value(points[2].x, 300) solver.suggest_value(points[2].y, 400) solver.end_edit() # Check that the other points have been moved. self.assertEqual(points[0], (10.0, 10.0)) self.assertEqual(points[1], (10.0, 200.0)) self.assertEqual(points[2], (300.0, 400.0)) self.assertEqual(points[3], (200.0, 10.0)) self.assertEqual(points[4], (10.0, 105.0)) self.assertEqual(points[5], (155.0, 300.0)) self.assertEqual(points[6], (250.0, 205.0)) self.assertEqual(points[7], (105.0, 10.0))