diff --git a/rom_evaluate.py b/rom_evaluate.py index c1fc4d5..cae66b5 100644 --- a/rom_evaluate.py +++ b/rom_evaluate.py @@ -6,7 +6,6 @@ from collections import defaultdict from random import randrange from ale_py import ALEInterface, SDL_SUPPORT, Action -#from colors import * from PIL import Image from matplotlib import pyplot as plt import cv2 @@ -157,7 +156,7 @@ def optimalAction(choices): def computeStateRanking(mdp_file): logger.info("Computing state ranking") tic() - command = f"{tempest_binary} --prism {mdp_file} --buildchoicelab --buildstateval --prop 'Rmax=? [C <= 1000]'" + command = f"{tempest_binary} --prism {mdp_file} --buildchoicelab --buildstateval --build-all-labels --prop 'Rmax=? [C <= 1000]'" exec(command) logger.info(f"Computing state ranking - DONE: took {toc()} seconds") @@ -239,7 +238,8 @@ def createUnsafeFormula(clusters): clusterFormula(cluster) disjunction += f" | Unsafe_{i}" disjunction += ";\n" - return formulas + "\n" + disjunction + label = "label \"Unsafe\" = Unsafe;\n" + return formulas + "\n" + disjunction + label def createSafeFormula(clusters): formulas = "" @@ -248,7 +248,8 @@ def createSafeFormula(clusters): formulas += f"formula Safe_{i} = {clusterFormula(cluster)};\n" disjunction += f" | Safe_{i}" disjunction += ";\n" - return formulas + "\n" + disjunction + label = "label \"Safe\" = Safe;\n" + return formulas + "\n" + disjunction + label def updatePrismFile(newFile, iteration, safeStates, unsafeStates): logger.info("Creating next prism file") @@ -297,16 +298,17 @@ def drawOntoSkiPosImage(states, color, target_prefix="cluster_", alpha_factor=1. markerList = {ski_position:list() for ski_position in range(1,num_ski_positions + 1)} for state in states: s = state[0] - marker = f"-fill 'rgba({color}, {alpha_factor * state[1].ranking})' -draw 'rectangle {s.x-markerSize},{s.y-markerSize} {s.x+markerSize},{s.y+markerSize} '" + #marker = f"-fill 'rgba({color}, {alpha_factor * state[1].ranking})' -draw 'rectangle {s.x-markerSize},{s.y-markerSize} {s.x+markerSize},{s.y+markerSize} '" + marker = f"-fill 'rgba({color}, {alpha_factor * state[1].ranking})' -draw 'point {s.x},{s.y} '" markerList[s.ski_position].append(marker) for pos, marker in markerList.items(): - command = f"convert {imagesDir}/{target_prefix}_{pos:02}.png {' '.join(marker)} {imagesDir}/{target_prefix}_{pos:02}.png" + command = f"convert {imagesDir}/{target_prefix}_{pos:02}_individual.png {' '.join(marker)} {imagesDir}/{target_prefix}_{pos:02}_individual.png" exec(command, verbose=False) def concatImages(prefix, iteration): - exec(f"montage {imagesDir}/{prefix}_*png -geometry +0+0 -tile x1 {imagesDir}/{prefix}_{iteration}.png", verbose=False) - #exec(f"sxiv {imagesDir}/{prefix}.png&", verbose=False) + exec(f"montage {imagesDir}/{prefix}_*_individual.png -geometry +0+0 -tile x1 {imagesDir}/{prefix}_{iteration}.png", verbose=False) + exec(f"sxiv {imagesDir}/{prefix}_{iteration}.png&", verbose=False) def drawStatesOntoTiledImage(states, color, target, source="images/1_full_scaled_down.png", alpha_factor=1.0): """ @@ -320,15 +322,15 @@ def drawStatesOntoTiledImage(states, color, target, source="images/1_full_scaled marker = f"-fill 'rgba({color}, {alpha_factor * state[1].ranking})' -draw 'rectangle {s.x-markerSize},{s.y-markerSize} {s.x+markerSize},{s.y+markerSize} '" markerList[s.ski_position].append(marker) for pos, marker in markerList.items(): - command = f"convert {source} {' '.join(marker)} {imagesDir}/{target}_{pos:02}.png" + command = f"convert {source} {' '.join(marker)} {imagesDir}/{target}_{pos:02}_individual.png" exec(command, verbose=False) - exec(f"montage {imagesDir}/{target}_*png -geometry +0+0 -tile x1 {imagesDir}/{target}.png", verbose=False) + exec(f"montage {imagesDir}/{target}_*_individual.png -geometry +0+0 -tile x1 {imagesDir}/{target}.png", verbose=False) logger.info(f"Drawing {len(states)} states onto {target} - Done: took {toc()} seconds") def drawClusters(clusterDict, target, iteration, alpha_factor=1.0): for ski_position in range(1, num_ski_positions + 1): source = "images/1_full_scaled_down.png" - exec(f"cp {source} {imagesDir}/{target}_{ski_position:02}.png") + exec(f"cp {source} {imagesDir}/{target}_{ski_position:02}_individual.png", verbose=False) for _, clusterStates in clusterDict.items(): color = f"{np.random.choice(range(256))}, {np.random.choice(range(256))}, {np.random.choice(range(256))}" drawOntoSkiPosImage(clusterStates, color, target, alpha_factor=alpha_factor) @@ -337,7 +339,7 @@ def drawClusters(clusterDict, target, iteration, alpha_factor=1.0): def drawResult(clusterDict, target, iteration): for ski_position in range(1, num_ski_positions + 1): source = "images/1_full_scaled_down.png" - exec(f"cp {source} {imagesDir}/{target}_{ski_position:02}.png") + exec(f"cp {source} {imagesDir}/{target}_{ski_position:02}_individual.png") for _, (clusterStates, result) in clusterDict.items(): color = "100,100,100" if result == Verdict.GOOD: @@ -371,7 +373,7 @@ if __name__ == '__main__': _init_logger() logger = logging.getLogger('main') logger.info("Starting") - n_clusters = 2 + n_clusters = 40 testAll = False safeStates = list() @@ -379,7 +381,7 @@ if __name__ == '__main__': iteration = 0 while True: updatePrismFile(init_mdp, iteration, safeStates, unsafeStates) - #computeStateRanking(f"{init_mdp}_{iteration:03}.prism") + computeStateRanking(f"{init_mdp}_{iteration:03}.prism") ranking = fillStateRanking("action_ranking") sorted_ranking = sorted( (x for x in ranking.items() if x[1].ranking > 0.1), key=lambda x: x[1].ranking) clusters = clusterImportantStates(sorted_ranking, iteration, n_clusters) @@ -388,7 +390,6 @@ if __name__ == '__main__': clusterResult = dict() for id, cluster in clusters.items(): num_tests = int(factor_tests_per_cluster * len(cluster)) - num_tests = 1 logger.info(f"Testing {num_tests} states (from {len(cluster)} states) from cluster {id}") randomStates = np.random.choice(len(cluster), num_tests, replace=False) randomStates = [cluster[i] for i in randomStates]