Exemple #1
0
class InstanceTestCase(unittest.TestCase):
    code = ""
    instance: GenInstance
    solver: Solver

    def setUp(self):
        self.solver = Solver.lookup("gecode")
        self.instance = Instance(self.solver)
        self.instance.add_string(self.code)
def minizinc(*files, solver=gecode, data={}, all_solutions=False):
    """Solve using minizinc."""
    model = Model(files)
    instance = Instance(solver, model)
    for key, value in data.items():
        if isinstance(value, str):
            instance.add_string(f'{key} = {value};\n')
        else:
            instance[key] = value
    return instance.solve(all_solutions=all_solutions)
class TestEnum(InstanceTestCase):
    code = """
    enum DAY = {Mo, Tu, We, Th, Fr, Sa, Su};
    var DAY: d;
    """

    def test_value(self):
        self.instance.add_string("constraint d == Mo;")
        result = self.instance.solve()
        assert isinstance(result["d"], str)
        assert result["d"] == "Mo"

    def test_cmp_in_instance(self):
        self.instance.add_string("var DAY: d2;")
        self.instance.add_string("constraint d < d2;")
        result = self.instance.solve()
        assert isinstance(result["d"], str)
        assert isinstance(result["d2"], str)
        # TODO: assert result["d"] < result["d2"]

    def test_cmp_between_instances(self):
        append = "constraint d == Mo;"
        self.instance.add_string(append)
        result = self.instance.solve()

        inst = Instance(self.solver)
        inst.add_string(self.code + append)
        result2 = inst.solve()
        assert isinstance(result["d"], str)
        assert isinstance(result2["d"], str)
        assert result["d"] == result2["d"]

        inst = Instance(self.solver)
        inst.add_string("""
            enum DAY = {Mo, Tu, We, Th, Fr};
            var DAY: d;
            """ + append)
        result2 = inst.solve()
        # TODO: assert type(result["d"]) != type(result2["d"])
        # TODO: assert result["d"] == result2["d"]

    def test_assign(self):
        self.instance = Instance(self.solver)
        self.instance.add_string("""
            enum TT;
            var TT: t1;
            """)
        TT = enum.Enum("TT", ["one"])
        self.instance["TT"] = TT
        result = self.instance.solve()

        assert isinstance(result["t1"], TT)
        assert result["t1"] is TT.one
    def test_cmp_between_instances(self):
        append = "constraint d == Mo;"
        self.instance.add_string(append)
        result = self.instance.solve()

        inst = Instance(self.solver)
        inst.add_string(self.code + append)
        result2 = inst.solve()
        assert isinstance(result["d"], str)
        assert isinstance(result2["d"], str)
        assert result["d"] == result2["d"]

        inst = Instance(self.solver)
        inst.add_string("""
            enum DAY = {Mo, Tu, We, Th, Fr};
            var DAY: d;
            """ + append)
        result2 = inst.solve()
class TestEnum(InstanceTestCase):
    code = """
    enum DAY = {Mo, Tu, We, Th, Fr, Sa, Su};
    var DAY: d;
    """

    def test_value(self):
        self.instance.add_string("constraint d == Mo;")
        result = self.instance.solve()
        assert isinstance(result["d"], enum.Enum)
        assert result["d"].name == "Mo"

    def test_cmp_in_instance(self):
        self.instance.add_string("var DAY: d2;")
        self.instance.add_string("constraint d < d2;")
        result = self.instance.solve()
        assert isinstance(result["d"], enum.Enum)
        assert isinstance(result["d2"], enum.Enum)
        # TODO: assert result["d"] < result["d2"]

    def test_cmp_between_instances(self):
        append = "constraint d == Mo;"
        self.instance.add_string(append)
        result = self.instance.solve()

        inst = Instance(self.solver)
        inst.add_string(self.code + append)
        result2 = inst.solve()
        assert isinstance(result["d"], enum.Enum)
        assert isinstance(result2["d"], enum.Enum)
        assert result["d"].name == result2["d"].name

        inst = Instance(self.solver)
        inst.add_string(
            """
            enum DAY = {Mo, Tu, We, Th, Fr};
            var DAY: d;
            """
            + append
        )
        result2 = inst.solve()
        assert result["d"].name == result2["d"].name

    def test_assign(self):
        self.instance = Instance(self.solver)
        self.instance.add_string(
            """
            enum TT;
            var TT: t1;
            """
        )
        TT = enum.Enum("TT", ["one"])
        self.instance["TT"] = TT
        result = self.instance.solve()

        assert isinstance(result["t1"], TT)
        assert result["t1"] is TT.one

    def test_collections(self):
        self.instance = Instance(self.solver)
        self.instance.add_string(
            """
            enum TT;
            array[int] of var TT: arr_t;
            var set of TT: set_t;
            """
        )
        TT = enum.Enum("TT", ["one", "two", "three"])
        self.instance["TT"] = TT
        self.instance["arr_t"] = [TT(3), TT(2), TT(1)]
        self.instance["set_t"] = {TT(2), TT(1)}
        result = self.instance.solve()

        assert result["arr_t"] == [TT(3), TT(2), TT(1)]
        assert result["set_t"] == {TT(1), TT(2)}

    def test_intenum_collections(self):
        self.instance = Instance(self.solver)
        self.instance.add_string(
            """
            enum TT;
            % array[int] of var TT: arr_t;
            var set of TT: set_t;
            """
        )
        TT = enum.IntEnum("TT", ["one", "two", "three"])
        self.instance["TT"] = TT
        # TODO:  self.instance["arr_t"] = [TT(3), TT(2), TT(1)]
        self.instance["set_t"] = {TT(2), TT(1)}
        result = self.instance.solve()

        # TODO: assert result["arr_t"] == [TT(3), TT(2), TT(1)]
        assert result["set_t"] == {TT(1), TT(2)}
s = "n=" + str(n) + ";\n"

s += "card = [|\n"
for i in range(0, n + 1):
    for j in range(i, n + 1):
        s += "  " + str(i) + "," + str(j) + ",|" + "\n"
        if (i == n and j == n):
            s = s[:-1]
            s += "];"

chuffed = Solver.lookup("chuffed")

generator = Model("./minizinc/Dominosa_Instances.mzn")

#generator.add_file("./Dominosa_Instances.dzn")
instance = Instance(chuffed, generator)
instance.add_string(s)
# Find and print all possible solutions
r = instance.solve(all_solutions=False)

m = r['temp']
m = np.array(m, dtype=int)

format = ""
for i in range(0, n + 2):
    format += "%i "

#scriviamo su file
np.savetxt('./Instances/Instances' + str(n) + '.txt', m, fmt=format)
#print(m)
#sys.stdout.flush()