Source code for ml4co_kit.solver.common.gurobi

r"""
Gurobi (Commercial Closed-Source Solver)
"""

# Copyright (c) 2024 Thinklab@SJTU
# ML4CO-Kit is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
# http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.


from ml4co_kit.optimizer.base import OptimizerBase
from ml4co_kit.task.base import TaskBase, TASK_TYPE
from ml4co_kit.solver.base import SolverBase, SOLVER_TYPE
from .lib.gurobi.op_gurobi import op_gurobi
from .lib.gurobi.tsp_gurobi import tsp_gurobi
from .lib.gurobi.mcl_gurobi import mcl_gurobi
from .lib.gurobi.mis_gurobi import mis_gurobi
from .lib.gurobi.mvc_gurobi import mvc_gurobi
from .lib.gurobi.atsp_gurobi import atsp_gurobi
from .lib.gurobi.cvrp_gurobi import cvrp_gurobi
from .lib.gurobi.mcut_gurobi import mcut_gurobi
from .lib.gurobi.mopo_gurobi import mopo_gurobi
from .lib.gurobi.maxretpo_gurobi import maxretpo_gurobi
from .lib.gurobi.minvarpo_gurobi import minvarpo_gurobi
from .lib.gurobi.satp_gurobi import satp_gurobi
from .lib.gurobi.sata_gurobi import sata_gurobi
from .lib.gurobi.lp_gurobi import lp_gurobi
from .lib.gurobi.milp_gurobi import milp_gurobi


[docs]class GurobiSolver(SolverBase): """ Gurobi: https://www.gurobi.com/ Last Update: 2026-05-26 """ def __init__( self, gurobi_time_limit: float = 10.0, gurobi_tsp_use_mtz_or_lazy: str = "lazy", optimizer: OptimizerBase = None ): # Super Initialization super(GurobiSolver, self).__init__( solver_type=SOLVER_TYPE.GUROBI, optimizer=optimizer ) # Set Attributes self.gurobi_time_limit = gurobi_time_limit self.gurobi_tsp_use_mtz_or_lazy = gurobi_tsp_use_mtz_or_lazy def _solve(self, task_data: TaskBase): """Solve the task data using Gurobi Solver.""" if task_data.task_type == TASK_TYPE.ATSP: return atsp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.CVRP: return cvrp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.OP: return op_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.TSP: return tsp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit, gurobi_tsp_use_mtz_or_lazy=self.gurobi_tsp_use_mtz_or_lazy ) elif task_data.task_type == TASK_TYPE.MCL: return mcl_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MCUT: return mcut_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MIS: return mis_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MVC: return mvc_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MAXRETPO: return maxretpo_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MINVARPO: return minvarpo_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MOPO: return mopo_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.SATP: return satp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.SATA: return sata_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.LP: return lp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) elif task_data.task_type == TASK_TYPE.MILP: return milp_gurobi( task_data=task_data, gurobi_time_limit=self.gurobi_time_limit ) else: raise ValueError( f"Solver {self.solver_type} is not supported for {task_data.task_type}." )