def test_unconstrained_problem(self): solver = Solver() var1 = solver.add_variable() var2 = solver.add_variable() solver.add_rule(Rule(var1, [(1, var2)], 3)) self.assertFalse(solver.is_constrained)
def test_simple_constrained_problem(self): solver = Solver() var1 = solver.add_variable() var2 = solver.add_variable() solver.add_rule(Rule(var1, [(1, var2)], 3)) solver.add_rule(Rule(var2, [], 3)) self.assertTrue(solver.is_constrained)
class Sketch: def __init__(self): self._solver = Solver() self._geometric_elements = [] @property def solver(self) -> Solver: return self._solver @property def is_constrained(self) -> bool: return all([x.is_constrained for x in self._geometric_elements]) def add_variable_point(self) -> Point: coordinates = [self._solver.add_variable() for i in range(3)] point = Point(tuple(coordinates)) self._geometric_elements.append(point) return point def add_variable_line(self): point = self.add_variable_point() diffs = [self._solver.add_variable() for i in range(3)] line = Line(point, diffs) self._geometric_elements.append(line) return line def add_point(self, positions: Tuple[float, float, float]): coordinates = [] for position in positions: new_constant = self._solver.add_variable() self._solver.add_rule(Rule(new_constant, [], position)) coordinates.append(new_constant) point = Point(tuple(coordinates)) self._geometric_elements.append(point) return point def add_line(self, positions: Tuple[float, float, float], diffs: Tuple[float, float, float]): point = self.add_point(positions) diff_list = [] for diff in diffs: new_constant = self._solver.add_variable() self._solver.add_rule(Rule(new_constant, [], diff)) diff_list.append(new_constant) return Line(point, diff_list) def add_alignment_constraint(self, point1: Point, point2: Point, dimension: int, distance: float): new_rule = Rule(point1[dimension], [(1, point2[dimension])], distance) self._solver.add_rule(new_rule)