82 lines
1.9 KiB
Python
82 lines
1.9 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import random
|
||
|
import math
|
||
|
import sys
|
||
|
import subprocess
|
||
|
import json
|
||
|
from pprint import pprint as pprint
|
||
|
|
||
|
def generate_random_set(f, s, g):
|
||
|
for i in range(1,s):
|
||
|
f.write(f"schedule('sched{i}').\n")
|
||
|
|
||
|
for j in range(1,g):
|
||
|
r = math.floor(random.gauss(4, 2))
|
||
|
f.write(f"group('group{j}', {r}).\n")
|
||
|
|
||
|
for group in range(1,g):
|
||
|
for sched in range(1,s):
|
||
|
rank = random.randrange(s)
|
||
|
if rank == 0:
|
||
|
break
|
||
|
f.write(f"rank('group{group}', 'sched{sched}', {rank}).\n")
|
||
|
|
||
|
def parse_counts(counts):
|
||
|
ret = {}
|
||
|
for count in counts:
|
||
|
c = count[6:-2]
|
||
|
g, s = c.split(',\'')
|
||
|
ret[g] = s
|
||
|
return ret
|
||
|
|
||
|
|
||
|
def parse_matchings(matchings):
|
||
|
ret = {}
|
||
|
for match in matchings:
|
||
|
c = match[10:-2]
|
||
|
g, s = c.split('\',\'')
|
||
|
ret[g] = s
|
||
|
return ret
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
schedules = int(sys.argv[1])
|
||
|
groups = int(sys.argv[2])
|
||
|
max = sys.argv[3]
|
||
|
mode = sys.argv[4]
|
||
|
f = open('.rules.pl', 'w')
|
||
|
if mode == 'random':
|
||
|
generate_random_set(f, schedules, groups)
|
||
|
|
||
|
base = open('rules.pl', 'r').read()
|
||
|
f.write(base.replace("{max}", max))
|
||
|
f.close()
|
||
|
# create subprocess definition
|
||
|
process = ['clingo', ".rules.pl", '--outf=2', '-n 3', '-t 3', '--configuration=tweety'] # output json, n number of schedules, t threads
|
||
|
|
||
|
# run subprocess, not sure, if busy-waiting..
|
||
|
completed_process = subprocess.run(process, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
|
||
|
|
||
|
output = completed_process.stdout
|
||
|
|
||
|
open('solver_output_simple.json', 'w').write(output)
|
||
|
|
||
|
results = json.loads(output)
|
||
|
|
||
|
matchings = []
|
||
|
counts = []
|
||
|
|
||
|
for r in results["Call"]:
|
||
|
w = r["Witnesses"][-1]
|
||
|
for m in w["Value"]:
|
||
|
if 'count' in m:
|
||
|
counts.append(m)
|
||
|
if 'matching' in m:
|
||
|
matchings.append(m)
|
||
|
|
||
|
matchings = parse_matchings(matchings)
|
||
|
counts = parse_counts(counts)
|
||
|
pprint(counts)
|