Sketch: only attempt to solve if #vars == #equs

This commit is contained in:
Josh Holtrop 2011-04-23 22:23:07 -04:00
parent 4758cb9c3f
commit 9e8c5ac5d6

View File

@ -6,6 +6,8 @@ class Sketch(object):
def __init__(self): def __init__(self):
self.shapes = [] self.shapes = []
self.constraints = [] self.constraints = []
self.num_variables = 0
self.num_constraints = 0
def __iter__(self): def __iter__(self):
return self.shapes.__iter__() return self.shapes.__iter__()
@ -28,26 +30,28 @@ class Sketch(object):
shape_vars[shape_var] = varid shape_vars[shape_var] = varid
varid += 1 varid += 1
varid_to_shape_var.append(shape_var) varid_to_shape_var.append(shape_var)
dim = len(equations) self.num_constraints = len(equations)
if len(shape_vars) > dim: self.num_variables = len(shape_vars)
dim = len(shape_vars) dim = self.num_constraints
equs = [] if self.num_variables > dim:
variables = oovars(dim) dim = self.num_variables
for e in equations: if self.num_variables == self.num_constraints:
coeffs = e[0] sle_equs = []
equ = -e[1] variables = oovars(dim)
for c in coeffs: for e in equations:
equ = c[0] * variables[shape_vars[c[1]]] + equ coeffs = e[0]
equs.append(equ) equ = -e[1]
if len(equs) < dim: for c in coeffs:
print 'TODO: pad equation list: %d equations, %d vars' % \ equ = c[0] * variables[shape_vars[c[1]]] + equ
(len(equs), len(variables)) sle_equs.append(equ)
s = sle(equs) s = sle(sle_equs)
r = s.solve() r = s.solve()
if r.ff != float('inf'): if r.ff != float('inf'):
print "SOLVED: ", r(variables) print "SOLVED: ", r(variables)
for i in range(len(variables)): for i in range(len(variables)):
varid_to_shape_var[i][0].setVar(varid_to_shape_var[i][1], varid_to_shape_var[i][0].setVar(varid_to_shape_var[i][1],
r(variables[i])) r(variables[i]))
for s in self.shapes: for s in self.shapes:
print 'shape:', repr(s.vars) print 'shape:', repr(s.vars)
return True
return False