From a1d5cc0187acd1bf9bedc97ded2c25ebb6c72b39 Mon Sep 17 00:00:00 2001 From: kwikrick Date: Sat, 25 Aug 2012 22:29:03 +0000 Subject: [PATCH] attempt to keep position and orientation of problem with no fixes closest to prototype --- geosolver/clsolver.py | 16 +++++++++++++--- geosolver/geometric.py | 24 ++++++++++++++++++------ test/test_3d.py | 20 ++++++++++---------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/geosolver/clsolver.py b/geosolver/clsolver.py index 48eeb04..fce4c6a 100644 --- a/geosolver/clsolver.py +++ b/geosolver/clsolver.py @@ -12,7 +12,7 @@ from multimethod import MultiVariable, MultiMethod from cluster import * from configuration import Configuration from gmatch import gmatch -from method import OrMethod +from method import OrMethod,SetMethod from incremental import MutableSet,Union,Filter # -------------------------------------------------- @@ -521,8 +521,10 @@ class ClusterSolver(Notifier): diag_print("keep top-level: "+str(cluster),"clsolver") # add method to determine root-variable - self._add_root_method(merge.input_clusters(),merge.outputs()[0]) - + if hasattr(merge,"noremove") and merge.noremove == True: + self._add_root_false(merge.outputs()[0]) + else: + self._add_root_method(merge.input_clusters(),merge.outputs()[0]) # add solution selection methods, only if information increasing if infinc: output2 = self._add_prototype_selector(merge) @@ -542,6 +544,14 @@ class ClusterSolver(Notifier): # make sure its deleted when cluster is deleted self._add_dependency(outcluster, method) + def _add_root_false(self,outcluster): + outroot = rootname(outcluster) + method = SetMethod(outroot, False) + # add method + self._add_method(method) + # make sure its deleted when cluster is deleted + self._add_dependency(outcluster, method) + # -- removing objects diff --git a/geosolver/geometric.py b/geosolver/geometric.py index 0adb79e..314c68b 100644 --- a/geosolver/geometric.py +++ b/geosolver/geometric.py @@ -119,7 +119,7 @@ class GeometricProblem (Notifier, Listener): return self.has_variable(variable) def set_point(self, variable, prototype): - """deprictaed - use set_prototype""" + """depricated - use set_prototype""" return self.set_prototype(variable, prototype) def get_point(self, variable): @@ -326,6 +326,12 @@ class GeometricSolver (Listener): # add constraints toadd = set(self.cg.constraints()) + # add coincidences first. Prevents re-mapping of primitves and re-solving of problem + for con in list(toadd): + if isinstance(con, CoincidenceConstraint): + self._add_constraint(con) + toadd.remove(con) + # add selection constraints first. Prevents re-evaluation for con in list(toadd): if isinstance(con, SelectionConstraint): @@ -649,11 +655,17 @@ class GeometricSolver (Listener): v0 = vars[0] v1 = vars[1] dist = con.get_parameter() - p0 = vector.vector([0.0,0.0]) - p1 = vector.vector([dist,0.0]) - if self.dimension == 3: - p0.append(0.0) - p1.append(0.0) + #p0 = vector.vector([0.0,0.0]) + #p1 = vector.vector([dist,0.0]) + # use prototype to orient rigid - minimize difference solution and prototype + p0 = self.problem.get_prototype(v0) + v = self.problem.get_prototype(v1) - p0 + if vector.norm(v) != 0: + v = v / vector.norm(v) + else: + v = vector.vector([0.0 for i in range(self.dimension)]) + v[0] = 1.0 + p1 = p0+v*dist conf = Configuration({v0:p0,v1:p1}) self.dr.set(rig, [conf]) assert con.satisfied(conf.map) diff --git a/test/test_3d.py b/test/test_3d.py index 6474234..b602f7b 100644 --- a/test/test_3d.py +++ b/test/test_3d.py @@ -357,19 +357,19 @@ def selection_problem(): def test3d(): #diag_select("clsolver") - test(double_tetrahedron_problem()) - test(ada_tetrahedron_problem()) - test(double_banana_problem()) - test(double_banana_plus_one_problem()) - test(random_triangular_problem_3D(10,10.0,0.0,0.5)) - test(random_distance_problem_3D(10,1.0,0.0)) + #test(double_tetrahedron_problem()) + #test(ada_tetrahedron_problem()) + #test(double_banana_problem()) + #test(double_banana_plus_one_problem()) + #test(random_triangular_problem_3D(10,10.0,0.0,0.5)) + #test(random_distance_problem_3D(10,1.0,0.0)) test(fix1_problem_3d()) test(fix2_problem_3d()) test(fix3_problem_3d()) - test(selection_problem()) - selection_test() - test(overconstrained_tetra()) - test(diamond_3d()) + #test(selection_problem()) + #selection_test() + #test(overconstrained_tetra()) + #test(diamond_3d()) if __name__ == "__main__": test3d()