A set of benchmarks to compare a new prototype MiniZinc implementation
at develop 3.1 kB view raw
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()