#!/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)