Sketch: only attempt to solve if #vars == #equs
This commit is contained in:
parent
4758cb9c3f
commit
9e8c5ac5d6
50
Sketch.py
50
Sketch.py
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user