Skip to content

Commit cde8ed9

Browse files
committed
add latin squares and unique sudoku instance name
1 parent 390e5c5 commit cde8ed9

3 files changed

Lines changed: 42 additions & 2 deletions

File tree

pycona/benchmarks/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
from .nurse_rostering import construct_nurse_rostering
77
from .zebra import construct_zebra_problem
88
from .nqueens import construct_nqueens_problem
9-
from .golomb import construct_golomb
9+
from .golomb import construct_golomb
10+
from .latin_squares import construct_latin_squares

pycona/benchmarks/latin_squares.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import cpmpy as cp
2+
from cpmpy.transformations.normalize import toplevel_list
3+
from ..answering_queries.constraint_oracle import ConstraintOracle
4+
from ..problem_instance import ProblemInstance, absvar
5+
6+
7+
def construct_latin_squares(grid_size=4):
8+
"""
9+
:return: a ProblemInstance object, along with a constraint-based oracle
10+
"""
11+
12+
# Create a dictionary with the parameters
13+
parameters = {"grid_size": grid_size}
14+
15+
# Variables
16+
grid = cp.intvar(1, grid_size, shape=(grid_size, grid_size), name="grid")
17+
18+
model = cp.Model()
19+
20+
# Constraints on rows and columns
21+
for row in grid:
22+
model += cp.AllDifferent(row).decompose()
23+
24+
for col in grid.T: # numpy's Transpose
25+
model += cp.AllDifferent(col).decompose()
26+
27+
C_T = list(set(toplevel_list(model.constraints)))
28+
29+
# Create the language:
30+
AV = absvar(2) # create abstract vars - as many as maximum arity
31+
32+
# create abstract relations using the abstract vars
33+
lang = [AV[0] == AV[1], AV[0] != AV[1], AV[0] < AV[1], AV[0] > AV[1], AV[0] >= AV[1], AV[0] <= AV[1]]
34+
35+
instance = ProblemInstance(variables=grid, params=parameters, language=lang, name=f"latin_squares_{grid_size}")
36+
37+
oracle = ConstraintOracle(C_T)
38+
39+
return instance, oracle

pycona/benchmarks/sudoku.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def construct_sudoku(block_size_row=2, block_size_col=2, grid_size=4):
3737
# create abstract relations using the abstract vars
3838
lang = [AV[0] == AV[1], AV[0] != AV[1], AV[0] < AV[1], AV[0] > AV[1], AV[0] >= AV[1], AV[0] <= AV[1]]
3939

40-
instance = ProblemInstance(variables=grid, params=parameters, language=lang, name="sudoku")
40+
instance = ProblemInstance(variables=grid, params=parameters, language=lang, name=f"sudoku_{block_size_row}_{block_size_col}_{grid_size}")
4141

4242
oracle = ConstraintOracle(C_T)
4343

0 commit comments

Comments
 (0)