Adding constraints for making the cells different in each cage
[Benchmarks_CSolver.git] / kilerSudoku / csolversudoku.py
index b3eb63c8e0fc8a8b7bfeff2606972bff5c222ed8..d6a169c685c1eacf9d973562590606d57e87ca70 100644 (file)
@@ -35,18 +35,9 @@ def generateKillerSudokuConstraints(N, killerRules):
                                        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 = []
@@ -103,15 +94,15 @@ def generateKillerSudokuConstraints(N, killerRules):
 
        # 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)