diff --git a/cornflow-dags/DAG/bar_cutting/schemas/config.json b/cornflow-dags/DAG/bar_cutting/schemas/config.json index d857a6310..2fd261c41 100644 --- a/cornflow-dags/DAG/bar_cutting/schemas/config.json +++ b/cornflow-dags/DAG/bar_cutting/schemas/config.json @@ -4,7 +4,7 @@ "properties": { "solver": { "type": "string", - "enum": ["mip", "CG", "mip.cbc", "CG.cbc"], + "enum": ["mip", "CG", "mip.cbc", "mip.gurobi", "CG.cbc", "CG.gurobi"], "default": "mip.cbc" }, "timeLimit": { diff --git a/cornflow-dags/DAG/bar_cutting/solvers/column_generation.py b/cornflow-dags/DAG/bar_cutting/solvers/column_generation.py index 37016e21d..dac7c1335 100644 --- a/cornflow-dags/DAG/bar_cutting/solvers/column_generation.py +++ b/cornflow-dags/DAG/bar_cutting/solvers/column_generation.py @@ -204,13 +204,14 @@ def solve(self, config): _, solver_name = solver_name.split(".") SOLVER_PARAMETERS = dict( - sec=config.get("timeLimit", 360), - allow=config.get("gapAbs", 1), - ratio=config.get("gaPRel", 0.01), - tee=config.get("msg", 1), + time_limit=config.get("timeLimit", 360), + abs_gap=config.get("abs_gap", 1), + rel_gap=config.get("rel_gap", 0.01), + solver=solver_name ) + SOLVER_PARAMETERS = self.get_solver_config(SOLVER_PARAMETERS) - opt = SolverFactory(solver_name) + opt = SolverFactory(solver_name, tee=config.get("msg", 1)) opt.options.update(SOLVER_PARAMETERS) more_patterns_bar1 = True diff --git a/cornflow-dags/DAG/bar_cutting/solvers/mip_model.py b/cornflow-dags/DAG/bar_cutting/solvers/mip_model.py index bc8c604ff..cbcc52b58 100644 --- a/cornflow-dags/DAG/bar_cutting/solvers/mip_model.py +++ b/cornflow-dags/DAG/bar_cutting/solvers/mip_model.py @@ -140,13 +140,14 @@ def solve(self, config): _, solver_name = solver_name.split(".") SOLVER_PARAMETERS = dict( - sec=config.get("timeLimit", 360), - allow=config.get("gapAbs", 1), - ratio=config.get("gaPRel", 0.01), - tee=config.get("msg", 1), + time_limit=config.get("timeLimit", 360), + abs_gap=config.get("abs_gap", 1), + rel_gap=config.get("rel_gap", 0.01), + solver=solver_name ) + SOLVER_PARAMETERS = self.get_solver_config(SOLVER_PARAMETERS) - opt = SolverFactory(solver_name) + opt = SolverFactory(solver_name, tee=config.get("msg", 1)) opt.options.update(SOLVER_PARAMETERS) results = opt.solve(model_instance) diff --git a/cornflow-dags/DAG/facility_location/schemas/config.json b/cornflow-dags/DAG/facility_location/schemas/config.json index 441d4605a..c772ab520 100644 --- a/cornflow-dags/DAG/facility_location/schemas/config.json +++ b/cornflow-dags/DAG/facility_location/schemas/config.json @@ -4,7 +4,7 @@ "properties": { "solver": { "type": "string", - "enum": ["Pyomo", "Pyomo.cbc"], + "enum": ["Pyomo", "Pyomo.cbc", "Pyomo.gurobi"], "default": "Pyomo.cbc" }, "timeLimit": { diff --git a/cornflow-dags/DAG/facility_location/solvers/PyomoSolver.py b/cornflow-dags/DAG/facility_location/solvers/PyomoSolver.py index 8054f383f..5afc0e3b9 100644 --- a/cornflow-dags/DAG/facility_location/solvers/PyomoSolver.py +++ b/cornflow-dags/DAG/facility_location/solvers/PyomoSolver.py @@ -338,8 +338,8 @@ def solve(self, config): _, solver_name = solver_name.split(".") opt = SolverFactory(solver_name) - opt.options.update(config) - results = opt.solve(model_instance) + opt.options.update(self.get_solver_config(config)) + results = opt.solve(model_instance, tee=config.get("msg", True)) status = results.solver.status termination_condition = PYOMO_STOP_MAPPING[results.solver.termination_condition] diff --git a/cornflow-dags/DAG/knapsack/__init__.py b/cornflow-dags/DAG/knapsack/__init__.py index 4473e0204..842752085 100644 --- a/cornflow-dags/DAG/knapsack/__init__.py +++ b/cornflow-dags/DAG/knapsack/__init__.py @@ -17,7 +17,7 @@ class Knapsack(ApplicationCore): MIP=MIPSolver, ) schema = get_empty_schema( - properties=dict(timeLimit=dict(type="number")), solvers=list(solvers.keys()) + ["MIP.cbc"], + properties=dict(timeLimit=dict(type="number")), solvers=list(solvers.keys()) + ["MIP.cbc", "MIP.gurobi"], ) def get_solver_name(self, data, conf): diff --git a/cornflow-dags/DAG/knapsack/solvers/MIPSolver.py b/cornflow-dags/DAG/knapsack/solvers/MIPSolver.py index bde075b01..973000656 100644 --- a/cornflow-dags/DAG/knapsack/solvers/MIPSolver.py +++ b/cornflow-dags/DAG/knapsack/solvers/MIPSolver.py @@ -79,8 +79,8 @@ def solve(self, config): _, solver_name = solver_name.split(".") opt = SolverFactory(solver_name) - opt.options.update(config) - results = opt.solve(model_instance) + opt.options.update(self.get_solver_config(config)) + results = opt.solve(model_instance, tee=config.get("msg", True)) status = results.solver.status termination_condition = PYOMO_STOP_MAPPING[results.solver.termination_condition] diff --git a/cornflow-dags/DAG/roadef/schemas/config.json b/cornflow-dags/DAG/roadef/schemas/config.json index f7ef21e2b..b68f2ddae 100644 --- a/cornflow-dags/DAG/roadef/schemas/config.json +++ b/cornflow-dags/DAG/roadef/schemas/config.json @@ -4,7 +4,17 @@ "solver":{ "type": "string", "default": "Greedy", - "enum": ["Greedy", "MIPModel", "PeriodicMIPModel", "MIPModel.PULP_CBC_CMD", "PeriodicMIPModel.PULP_CBC_CMD"] + "enum": [ + "Greedy", + "MIPModel", + "PeriodicMIPModel", + "MIPModel.PULP_CBC_CMD", + "PeriodicMIPModel.PULP_CBC_CMD", + "MIPModel.GUROBI_CMD", + "PeriodicMIPModel.GUROBI_CMD", + "MIPModel.GUROBI", + "PeriodicMIPModel.GUROBI" + ] }, "timeLimit":{ "type": "number" diff --git a/cornflow-dags/DAG/roadef/solvers/MIPModel.py b/cornflow-dags/DAG/roadef/solvers/MIPModel.py index 97de35826..7683ea395 100644 --- a/cornflow-dags/DAG/roadef/solvers/MIPModel.py +++ b/cornflow-dags/DAG/roadef/solvers/MIPModel.py @@ -88,21 +88,23 @@ def solve(self, config=None): solver_name = self.get_solver(config) config_first = dict( solver=solver_name, - gapRel=0.1, + rel_gap=0.1, timeLimit=min(200.0, self._get_remaining_time()), msg=self.print_log, ) + config_first = self.get_solver_config(config_first, lib="pulp") def config_iteration(self, warm_start): - return dict( + conf = dict( solver=solver_name, - gapRel=0.05, + rel_gap=0.05, timeLimit=min(100.0, self._get_remaining_time()), msg=self.print_log, warmStart=warm_start, ) + return self.get_solver_config(conf, lib="pulp") - solver = pl.getSolver(**config_first) + solver = pl.getSolver(solver=solver_name, **config_first) used_routes, previous_value = self.solve_one_iteration( solver, used_routes, previous_value, current_round ) @@ -111,7 +113,7 @@ def config_iteration(self, warm_start): self.print_in_console( f"=================== ROUND {current_round} ========================" ) - solver = pl.getSolver(**config_iteration(self, current_round != 1)) + solver = pl.getSolver(solver=solver_name, **config_iteration(self, current_round != 1)) used_routes, previous_value = self.solve_one_iteration( solver, used_routes, previous_value, current_round diff --git a/cornflow-dags/DAG/roadef/solvers/PeriodicMIP.py b/cornflow-dags/DAG/roadef/solvers/PeriodicMIP.py index 69f423c75..d51d84507 100644 --- a/cornflow-dags/DAG/roadef/solvers/PeriodicMIP.py +++ b/cornflow-dags/DAG/roadef/solvers/PeriodicMIP.py @@ -103,21 +103,23 @@ def solve(self, config=None): config_first = dict( solver=solver_name, - gapRel=0.1, + rel_gap=0.1, timeLimit=min(200.0, self._get_remaining_time()), msg=self.print_log, ) + config_first = self.get_solver_config(config_first, lib="pulp") def config_iteration(self): - return dict( + conf = dict( solver=solver_name, - gapRel=0.05, + rel_gap=0.05, timeLimit=min(100.0, self._get_remaining_time()), msg=self.print_log, warmStart=(current_round != 1), ) + return self.get_solver_config(conf, lib="pulp") - solver = pl.getSolver(**config_first) + solver = pl.getSolver(solver=solver_name, **config_first) used_routes, previous_value = self.solve_one_iteration( solver, used_routes, previous_value, current_round ) @@ -127,8 +129,7 @@ def config_iteration(self): self.print_in_console( f"=================== ROUND {current_round} ========================" ) - - solver = pl.getSolver(**config_iteration(self)) + solver = pl.getSolver(solver=solver_name, **config_iteration(self)) used_routes, previous_value = self.solve_one_iteration( solver, used_routes, previous_value, current_round diff --git a/cornflow-dags/DAG/run_deployed_dags.py b/cornflow-dags/DAG/run_deployed_dags.py index d2738eb84..f8f3c35ad 100644 --- a/cornflow-dags/DAG/run_deployed_dags.py +++ b/cornflow-dags/DAG/run_deployed_dags.py @@ -55,7 +55,7 @@ def run_examples(**kwargs): instance_id = response["id"] - config = {"timeLimit": 60, "msg": True, "seconds": 60} + config = {"timeLimit": 60, "msg": True} try: response = cf_client.create_execution( diff --git a/cornflow-dags/DAG/two_dimension_bin_packing/schemas/config.json b/cornflow-dags/DAG/two_dimension_bin_packing/schemas/config.json index c27170052..aaf26f833 100644 --- a/cornflow-dags/DAG/two_dimension_bin_packing/schemas/config.json +++ b/cornflow-dags/DAG/two_dimension_bin_packing/schemas/config.json @@ -7,9 +7,6 @@ "enum": ["right_corner.cbc", "right_corner.gurobi", "right_corner.scip"], "default": "right_corner.cbc" }, - "seconds": { - "type": "number" - }, "timeLimit": { "type": "number" }, diff --git a/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py b/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py index 06808399a..31332d47a 100644 --- a/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py +++ b/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py @@ -262,7 +262,7 @@ def solve(self, options): opt = SolverFactory(solver_name, solver_io="python") else: opt = SolverFactory(solver_name) - opt.options.update(options) + opt.options.update(self.get_solver_config(options)) results = opt.solve(model_instance, tee=options.get("msg")) if options.get("log"): diff --git a/cornflow-dags/DAG/vrp/solvers/modelMIP.py b/cornflow-dags/DAG/vrp/solvers/modelMIP.py index 045f3d0ae..8b55f5483 100644 --- a/cornflow-dags/DAG/vrp/solvers/modelMIP.py +++ b/cornflow-dags/DAG/vrp/solvers/modelMIP.py @@ -266,14 +266,14 @@ def solve(self, options): :return: """ SOLVER_PARAMETERS = dict( - sec=options.get("timeLimit", 300), - allow=options.get("gapAbs", 1), - ratio=options.get("gaPRel", 0.01), - tee=options.get("msg", 0), + timeLimit=options.get("timeLimit", 360), + abs_gap=options.get("abs_gap", 1), + rel_gap=options.get("rel_gap", 0.01), + solver="cbc" ) - + SOLVER_PARAMETERS = self.get_solver_config(SOLVER_PARAMETERS) mip_vrp = self.get_mip_model() - opt = SolverFactory("cbc") + opt = SolverFactory("cbc", tee=options.get("msg", 1)) opt.options.update(SOLVER_PARAMETERS) termination_condition = STATUS_NOT_SOLVED diff --git a/cornflow-dags/tests/test_dags.py b/cornflow-dags/tests/test_dags.py index 57dedced2..acbdc7ba9 100644 --- a/cornflow-dags/tests/test_dags.py +++ b/cornflow-dags/tests/test_dags.py @@ -22,7 +22,7 @@ class BaseDAGTests: class SolvingTests(unittest.TestCase): def setUp(self) -> None: self.app = None - self.config = SuperDict(msg=False, timeLimit=1, seconds=1) + self.config = SuperDict(msg=False, timeLimit=1) @property def app(self) -> ApplicationCore: @@ -242,7 +242,6 @@ def setUp(self): self.app = Rostering() self.config.update(dict(solver="mip.PULP_CBC_CMD", rel_gap=0.02)) - self.config.pop("seconds") class BarCutting(BaseDAGTests.SolvingTests): @@ -265,7 +264,7 @@ def setUp(self): from DAG.facility_location import FacilityLocation self.app = FacilityLocation() - self.config.update(dict(solver="Pyomo.cbc", gapAbs=1, gapRel=0.01)) + self.config.update(dict(solver="Pyomo.cbc", abs_gap=1, rel_gap=0.01)) class PuLP(BaseDAGTests.SolvingTests): @@ -275,7 +274,6 @@ def setUp(self): self.app = PuLP() self.config.update(dict(solver="PULP_CBC_CMD")) - self.config.pop("seconds") class TwoBinPackingTestCase(BaseDAGTests.SolvingTests):