csolverlb.addConstraint(solver,b);
def getElement(cage):
- cageSum = cage[0]
- cageSize = len(cage[1])
- cageCells = cage[1]
- cb = combinations([ii for ii in range(1, N+1)], cageSize)
- f = lambda x : sum(x) == cageSum
- comb = ifilter(f, cb) # all valid combinations
- allPossible = list(chain(comb))
- #s1 = [ allPossible[ i for i in range(1, N+1)]]
- set1 = (c_long* len(s1))(*s1)
- s1 = csolverlb.createSet(solver, c_uint(1), set1, c_uint(N))
- problem = np.array([[csolverlb.getElementVar(solver,s1) for i in range(N)] for i in range(N)])
- elements = [ problem[cage[1][i][0]][cage[1][i][1]] for i in range(len(cage[1])) ]
+ elems = [ problem[cage[1][i][0]][cage[1][i][1]] for i in range(len(cage[1])) ]
+ valid(elems)
+ return elems
def generateSumConstraint(sumCage, elements):
d = []
# ensure rows and columns have distinct values
for i in range( N):
- valid(problem[:,i])
- valid(problem[i,:])
+ valid(problem[:,i])
+ valid(problem[i,:])
# ensure each block has distinct values
root = int(N**(0.5))
- collections = [ root*i for i in range(root)]
- for i in collections:
- for j in collections:
- valid([problem[i + k % root, j + k // root] for k in range(N)])
+ collections = [ root*i for i in range(root)]
+ for i in collections:
+ for j in collections:
+ valid([problem[i + k % root, j + k // root] for k in range(N)])
#Serializing the problem before solving it ....
csolverlb.serialize(solver)