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