mirror of
https://github.com/ANL-CEEESA/MIPLearn.git
synced 2025-12-06 09:28:51 -06:00
Rename solvers to CplexPyomoSolver and GurobyPyomoSolver
This commit is contained in:
@@ -12,7 +12,8 @@ from .components.objective import ObjectiveValueComponent
|
|||||||
from .components.lazy import LazyConstraintsComponent
|
from .components.lazy import LazyConstraintsComponent
|
||||||
from .components.cuts import UserCutsComponent
|
from .components.cuts import UserCutsComponent
|
||||||
from .components.primal import PrimalSolutionComponent
|
from .components.primal import PrimalSolutionComponent
|
||||||
from .components.branching import BranchPriorityComponent, BranchPriorityExtractor
|
from .components.branching import (BranchPriorityComponent,
|
||||||
|
BranchPriorityExtractor)
|
||||||
|
|
||||||
from .classifiers.adaptive import AdaptiveClassifier
|
from .classifiers.adaptive import AdaptiveClassifier
|
||||||
from .classifiers.threshold import MinPrecisionThreshold
|
from .classifiers.threshold import MinPrecisionThreshold
|
||||||
@@ -21,7 +22,8 @@ from .benchmark import BenchmarkRunner
|
|||||||
|
|
||||||
from .instance import Instance
|
from .instance import Instance
|
||||||
|
|
||||||
from .solvers.learning import LearningSolver
|
from .solvers.pyomo.base import BasePyomoSolver
|
||||||
from .solvers.cplex import CPLEXSolver
|
from .solvers.pyomo.cplex import CplexPyomoSolver
|
||||||
from .solvers.gurobi import GurobiSolver
|
from .solvers.pyomo.gurobi import GurobiPyomoSolver
|
||||||
from .solvers.internal import InternalSolver
|
from .solvers.internal import InternalSolver
|
||||||
|
from .solvers.learning import LearningSolver
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import pyomo.environ as pe
|
import pyomo.environ as pe
|
||||||
|
|
||||||
from miplearn import Instance, GurobiSolver, LearningSolver
|
from miplearn import Instance, GurobiPyomoSolver, LearningSolver
|
||||||
from miplearn.problems.knapsack import ChallengeA
|
from miplearn.problems.knapsack import ChallengeA
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ class CutInstance(Instance):
|
|||||||
|
|
||||||
def test_cut():
|
def test_cut():
|
||||||
challenge = ChallengeA()
|
challenge = ChallengeA()
|
||||||
gurobi = GurobiSolver()
|
gurobi = GurobiPyomoSolver()
|
||||||
solver = LearningSolver(solver=gurobi, time_limit=10)
|
solver = LearningSolver(solver=gurobi, time_limit=10)
|
||||||
solver.solve(challenge.training_instances[0])
|
solver.solve(challenge.training_instances[0])
|
||||||
# assert False
|
# assert False
|
||||||
|
|||||||
@@ -5,15 +5,14 @@
|
|||||||
import logging
|
import logging
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from typing import Optional, List
|
from typing import Optional, List
|
||||||
|
|
||||||
from p_tqdm import p_map
|
from p_tqdm import p_map
|
||||||
|
|
||||||
from .cplex import CPLEXSolver
|
|
||||||
from .gurobi import GurobiSolver
|
|
||||||
from .. import (ObjectiveValueComponent,
|
from .. import (ObjectiveValueComponent,
|
||||||
PrimalSolutionComponent,
|
PrimalSolutionComponent,
|
||||||
LazyConstraintsComponent,
|
LazyConstraintsComponent,
|
||||||
UserCutsComponent)
|
UserCutsComponent)
|
||||||
|
from .pyomo.cplex import CplexPyomoSolver
|
||||||
|
from .pyomo.gurobi import GurobiPyomoSolver
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -77,9 +76,9 @@ class LearningSolver:
|
|||||||
def _create_internal_solver(self):
|
def _create_internal_solver(self):
|
||||||
logger.debug("Initializing %s" % self.internal_solver_factory)
|
logger.debug("Initializing %s" % self.internal_solver_factory)
|
||||||
if self.internal_solver_factory == "cplex":
|
if self.internal_solver_factory == "cplex":
|
||||||
solver = CPLEXSolver()
|
solver = CplexPyomoSolver()
|
||||||
elif self.internal_solver_factory == "gurobi":
|
elif self.internal_solver_factory == "gurobi":
|
||||||
solver = GurobiSolver()
|
solver = GurobiPyomoSolver()
|
||||||
elif callable(self.internal_solver_factory):
|
elif callable(self.internal_solver_factory):
|
||||||
solver = self.internal_solver_factory()
|
solver = self.internal_solver_factory()
|
||||||
else:
|
else:
|
||||||
|
|||||||
3
src/python/miplearn/solvers/pyomo/__init__.py
Normal file
3
src/python/miplearn/solvers/pyomo/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
||||||
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
@@ -2,24 +2,27 @@
|
|||||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
# Released under the modified BSD license. See COPYING.md for more details.
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
import logging
|
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import logging
|
||||||
|
import pyomo
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
from pyomo import environ as pe
|
||||||
import pyomo
|
|
||||||
import pyomo.environ as pe
|
|
||||||
from pyomo.core import Var
|
from pyomo.core import Var
|
||||||
|
|
||||||
from . import RedirectOutput
|
from .. import RedirectOutput
|
||||||
from .internal import InternalSolver
|
from ..internal import InternalSolver
|
||||||
from ..instance import Instance
|
from ...instance import Instance
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class PyomoSolver(InternalSolver):
|
class BasePyomoSolver(InternalSolver):
|
||||||
|
"""
|
||||||
|
Base class for all Pyomo solvers.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.instance = None
|
self.instance = None
|
||||||
self.model = None
|
self.model = None
|
||||||
@@ -2,16 +2,16 @@
|
|||||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
# Released under the modified BSD license. See COPYING.md for more details.
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
import pyomo.environ as pe
|
from pyomo import environ as pe
|
||||||
from scipy.stats import randint
|
from scipy.stats import randint
|
||||||
|
|
||||||
from .pyomo import PyomoSolver
|
from .base import BasePyomoSolver
|
||||||
|
|
||||||
|
|
||||||
class CPLEXSolver(PyomoSolver):
|
class CplexPyomoSolver(BasePyomoSolver):
|
||||||
def __init__(self, options=None):
|
def __init__(self, options=None):
|
||||||
"""
|
"""
|
||||||
Creates a new CPLEXSolver.
|
Creates a new CPLEX solver, accessed through Pyomo.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
@@ -47,4 +47,3 @@ class CPLEXSolver(PyomoSolver):
|
|||||||
|
|
||||||
def set_branching_priorities(self, priorities):
|
def set_branching_priorities(self, priorities):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
@@ -2,25 +2,24 @@
|
|||||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||||
# Released under the modified BSD license. See COPYING.md for more details.
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
|
||||||
import logging
|
|
||||||
import sys
|
import sys
|
||||||
|
import logging
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
from pyomo import environ as pe
|
||||||
import pyomo.environ as pe
|
|
||||||
from miplearn.solvers import RedirectOutput
|
|
||||||
from scipy.stats import randint
|
from scipy.stats import randint
|
||||||
|
|
||||||
from .pyomo import PyomoSolver
|
from .base import BasePyomoSolver
|
||||||
|
from .. import RedirectOutput
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class GurobiSolver(PyomoSolver):
|
class GurobiPyomoSolver(BasePyomoSolver):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
use_lazy_callbacks=True,
|
use_lazy_callbacks=True,
|
||||||
options=None):
|
options=None):
|
||||||
"""
|
"""
|
||||||
Creates a new GurobiSolver.
|
Creates a new Gurobi solver, accessed through Pyomo.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
@@ -5,8 +5,7 @@ from io import StringIO
|
|||||||
|
|
||||||
import pyomo.environ as pe
|
import pyomo.environ as pe
|
||||||
from miplearn.solvers import RedirectOutput
|
from miplearn.solvers import RedirectOutput
|
||||||
from miplearn.solvers.cplex import CPLEXSolver
|
from miplearn import CplexPyomoSolver, GurobiPyomoSolver
|
||||||
from miplearn.solvers.gurobi import GurobiSolver
|
|
||||||
|
|
||||||
from . import _get_instance
|
from . import _get_instance
|
||||||
from ...problems.knapsack import ChallengeA
|
from ...problems.knapsack import ChallengeA
|
||||||
@@ -23,7 +22,7 @@ def test_redirect_output():
|
|||||||
|
|
||||||
|
|
||||||
def test_internal_solver_warm_starts():
|
def test_internal_solver_warm_starts():
|
||||||
for solver in [GurobiSolver(), CPLEXSolver()]:
|
for solver in [GurobiPyomoSolver(), CplexPyomoSolver()]:
|
||||||
instance = _get_instance()
|
instance = _get_instance()
|
||||||
model = instance.to_model()
|
model = instance.to_model()
|
||||||
|
|
||||||
@@ -64,7 +63,7 @@ def test_internal_solver_warm_starts():
|
|||||||
|
|
||||||
|
|
||||||
def test_internal_solver():
|
def test_internal_solver():
|
||||||
for solver in [GurobiSolver(), CPLEXSolver()]:
|
for solver in [GurobiPyomoSolver(), CplexPyomoSolver()]:
|
||||||
instance = _get_instance()
|
instance = _get_instance()
|
||||||
model = instance.to_model()
|
model = instance.to_model()
|
||||||
|
|
||||||
@@ -99,9 +98,9 @@ def test_internal_solver():
|
|||||||
|
|
||||||
|
|
||||||
def test_node_count():
|
def test_node_count():
|
||||||
for solver in [GurobiSolver(),
|
for solver in [GurobiPyomoSolver(),
|
||||||
GurobiSolver(use_lazy_callbacks=False),
|
GurobiPyomoSolver(use_lazy_callbacks=False),
|
||||||
CPLEXSolver()]:
|
CplexPyomoSolver()]:
|
||||||
challenge = ChallengeA()
|
challenge = ChallengeA()
|
||||||
solver.set_time_limit(1)
|
solver.set_time_limit(1)
|
||||||
solver.set_instance(challenge.test_instances[0])
|
solver.set_instance(challenge.test_instances[0])
|
||||||
|
|||||||
@@ -5,9 +5,8 @@
|
|||||||
import pickle
|
import pickle
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from miplearn import BranchPriorityComponent
|
from miplearn import BranchPriorityComponent, GurobiPyomoSolver
|
||||||
from miplearn import LearningSolver
|
from miplearn import LearningSolver
|
||||||
from miplearn.solvers.gurobi import GurobiSolver
|
|
||||||
|
|
||||||
from . import _get_instance
|
from . import _get_instance
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ from . import _get_instance
|
|||||||
def test_learning_solver():
|
def test_learning_solver():
|
||||||
instance = _get_instance()
|
instance = _get_instance()
|
||||||
for mode in ["exact", "heuristic"]:
|
for mode in ["exact", "heuristic"]:
|
||||||
for internal_solver in ["cplex", "gurobi", GurobiSolver]:
|
for internal_solver in ["cplex", "gurobi", GurobiPyomoSolver]:
|
||||||
solver = LearningSolver(time_limit=300,
|
solver = LearningSolver(time_limit=300,
|
||||||
gap_tolerance=1e-3,
|
gap_tolerance=1e-3,
|
||||||
threads=1,
|
threads=1,
|
||||||
|
|||||||
Reference in New Issue
Block a user