Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 075fe0e

Browse files
Add solution evaluation: check if given .sol file
1 parent 3f1ca20 commit 075fe0e

File tree

3 files changed

+53
-15
lines changed

3 files changed

+53
-15
lines changed

‎ks.py‎

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
def parse_args():
1010
parser = ArgumentParser()
1111
parser.add_argument("mps", help="Instance MPS file")
12-
parser.add_argument("-c", "--config", help="YAML Configuration File")
1312

14-
returnparser.parse_args()
13+
exclusive_group=parser.add_mutually_exclusive_group(required=True)
1514

15+
exclusive_group.add_argument("-e", "--eval", default=None, help="Evaluate if given solution file is feasible for the given instance")
16+
exclusive_group.add_argument("-c", "--config", default=None, help="YAML Configuration File")
1617

17-
def main():
18-
args = parse_args()
19-
conf = load_config(args.config)
18+
return parser.parse_args()
19+
20+
def run_kernel_search(mps, config):
21+
conf = load_config(config)
2022
bucket_gen = bucket_builders.get_algorithm(conf["BUCKET"])
2123
bucket_sort = bucket_sorters.get_algorithm(conf["BUCKET_SORTER"])
2224

@@ -30,7 +32,7 @@ def main():
3032
kernel_sort=kernel_sort,
3133
)
3234
try:
33-
sol = kernel_search(args.mps, conf, algo)
35+
sol = kernel_search(mps, conf, algo)
3436
except ValueError as err:
3537
print(err)
3638
except RuntimeError as err:
@@ -45,6 +47,24 @@ def main():
4547

4648
print("Solution:", sol.value)
4749
sol.debug.export_csv(conf["DEBUG"], False)
50+
51+
52+
def evaluate_solution(mps, solution):
53+
if sol := eval_model(mps, solution):
54+
print(f"Solution file {solution} is a valid solution for {mps}")
55+
print(f"Objective value: {sol}")
56+
else:
57+
print(f"Solution file {solution} is NOT a valid solution for {mps}")
58+
59+
60+
def main():
61+
args = parse_args()
62+
if args.config is not None:
63+
run_kernel_search(args.mps, args.config)
64+
else:
65+
evaluate_solution(args.mps, args.eval)
66+
67+
4868

4969

5070
if __name__ == "__main__":

‎ks_engine/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@
3434
from .kernel_search import kernel_search, KernelMethods
3535
from .config_loader import load_config
3636
from .kernel_algorithms import *
37+
from .model import eval_model

‎ks_engine/model.py‎

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,31 @@ def model_loarder(mps_file, config):
6161

6262
return output
6363

64+
def eval_model(mps_file, solution):
65+
model = gurobipy.read(mps_file)
66+
model.read(solution)
67+
model.setParam('SolutionLimit', 1)
68+
model.setParam('TimeLimit', 1)
69+
model.optimize()
70+
71+
if model.NodeCount == 0 and model.SolCount == 1:
72+
output = model.getObjective().getValue()
73+
else:
74+
output = None
75+
return output
76+
77+
78+
def model_has_solution(model):
79+
obj = model.getObjective()
80+
try:
81+
obj.getValue()
82+
except AttributeError:
83+
output = False
84+
else:
85+
output = True
86+
return output
87+
88+
6489

6590
class Model:
6691
def __init__(self, model, config, linear_relax=False, one_solution=False):
@@ -94,15 +119,7 @@ def run(self):
94119
self.model.optimize()
95120
stat = self.model.status
96121
self.stat = stat
97-
obj = self.model.getObjective()
98-
try:
99-
obj.getValue()
100-
except AttributeError:
101-
output = False
102-
else:
103-
output = True
104-
105-
return output
122+
return model_has_solution(self.model)
106123

107124
def disable_variables(self, base_kernel, value=0):
108125
for name, _ in filter(lambda x: not x[1], base_kernel.items()):

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /