A set of benchmarks to compare a new prototype MiniZinc implementation
1#!/usr/bin/env python3
2import minizinc
3import sys
4import csv
5import os
6import time
7import subprocess
8import re
9from tqdm import tqdm
10from pathlib import Path
11from datetime import timedelta
12
13# Instances Selection (File location)
14if len(sys.argv) < 3:
15 print("Usage: new_flatstats.py <instances> <library>")
16 exit(1)
17
18REPEATS = 10
19
20instances_location = sys.argv[1]
21library = sys.argv[2]
22
23
24def parse_statistics(stdout: bytes, stderr: bytes):
25 statistics: Dict[str, StatisticsType] = {}
26 matches = re.findall(rb"%%%mzn-stat:? (\w*)=([^\r\n]*)", stdout)
27 for m in matches:
28 minizinc.result.set_stat(statistics, m[0].decode(), m[1].decode())
29
30 matches = re.findall(rb"([A-Z].*): (.*)\n", stderr)
31 for m in matches:
32 statistics[m[0].decode()] = m[1].decode()
33 return statistics
34
35
36writer = None
37num_lines = sum(1 for line in open(instances_location)) - 1
38with open(instances_location) as instances_file:
39 with tqdm(total=num_lines*REPEATS, file=sys.stderr) as pbar:
40 reader = csv.reader(instances_file, dialect="unix")
41 next(reader, None) # Skip the header line
42 mem = ""
43 for row in reader:
44 assert len(row) == 3
45 pbar.set_description(
46 "Flattening %s - %s"
47 % (row[1].split(os.sep)[-1], row[2].split(os.sep)[-1])
48 )
49
50 # Flatten instance
51 cmd = [
52 '/usr/bin/time',
53 '-v',
54 'minizinc',
55 "--solver",
56 "org.minizinc.mzn-fzn",
57 "-c",
58 "-s",
59 row[1],
60 ]
61 if row[2]:
62 cmd.append(row[2])
63 for i in range(REPEATS):
64 output = subprocess.run(cmd, capture_output=True,)
65
66 if output.returncode != 0:
67 print(
68 f"mznasm ERROR {output.returncode}: {row[1].split(os.sep)[-1]} - {row[2].split(os.sep)[-1]}:\n{output.stderr}",
69 file=sys.stderr,
70 )
71 break
72 else:
73 stats = parse_statistics(output.stdout, output.stderr)
74 stats["problem"] = row[0]
75 stats["model"] = row[1]
76 stats["data_file"] = row[2]
77 stats["iteration"] = i + 1
78 if writer is None:
79 keys = list(
80 set(
81 ["problem", "model", "data_file", "status"]
82 + list(minizinc.result.StdStatisticTypes.keys())
83 + list(stats.keys())
84 )
85 )
86 writer = csv.DictWriter(
87 sys.stdout, keys, dialect="unix", extrasaction="ignore"
88 )
89 writer.writeheader()
90 writer.writerow(stats)
91 pbar.update(1)
92 sys.stdout.flush()