Browse Source

small changes regarding image bookkeeping

add_velocity_into_framework
sp 7 months ago
parent
commit
37e9675022
  1. 31
      rom_evaluate.py

31
rom_evaluate.py

@ -6,7 +6,6 @@ from collections import defaultdict
from random import randrange from random import randrange
from ale_py import ALEInterface, SDL_SUPPORT, Action from ale_py import ALEInterface, SDL_SUPPORT, Action
#from colors import *
from PIL import Image from PIL import Image
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
import cv2 import cv2
@ -157,7 +156,7 @@ def optimalAction(choices):
def computeStateRanking(mdp_file): def computeStateRanking(mdp_file):
logger.info("Computing state ranking") logger.info("Computing state ranking")
tic() 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) exec(command)
logger.info(f"Computing state ranking - DONE: took {toc()} seconds") logger.info(f"Computing state ranking - DONE: took {toc()} seconds")
@ -239,7 +238,8 @@ def createUnsafeFormula(clusters):
clusterFormula(cluster) clusterFormula(cluster)
disjunction += f" | Unsafe_{i}" disjunction += f" | Unsafe_{i}"
disjunction += ";\n" disjunction += ";\n"
return formulas + "\n" + disjunction
label = "label \"Unsafe\" = Unsafe;\n"
return formulas + "\n" + disjunction + label
def createSafeFormula(clusters): def createSafeFormula(clusters):
formulas = "" formulas = ""
@ -248,7 +248,8 @@ def createSafeFormula(clusters):
formulas += f"formula Safe_{i} = {clusterFormula(cluster)};\n" formulas += f"formula Safe_{i} = {clusterFormula(cluster)};\n"
disjunction += f" | Safe_{i}" disjunction += f" | Safe_{i}"
disjunction += ";\n" disjunction += ";\n"
return formulas + "\n" + disjunction
label = "label \"Safe\" = Safe;\n"
return formulas + "\n" + disjunction + label
def updatePrismFile(newFile, iteration, safeStates, unsafeStates): def updatePrismFile(newFile, iteration, safeStates, unsafeStates):
logger.info("Creating next prism file") 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)} markerList = {ski_position:list() for ski_position in range(1,num_ski_positions + 1)}
for state in states: for state in states:
s = state[0] 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) markerList[s.ski_position].append(marker)
for pos, marker in markerList.items(): 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) exec(command, verbose=False)
def concatImages(prefix, iteration): 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): 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} '" 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) markerList[s.ski_position].append(marker)
for pos, marker in markerList.items(): 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(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") logger.info(f"Drawing {len(states)} states onto {target} - Done: took {toc()} seconds")
def drawClusters(clusterDict, target, iteration, alpha_factor=1.0): def drawClusters(clusterDict, target, iteration, alpha_factor=1.0):
for ski_position in range(1, num_ski_positions + 1): for ski_position in range(1, num_ski_positions + 1):
source = "images/1_full_scaled_down.png" 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(): for _, clusterStates in clusterDict.items():
color = f"{np.random.choice(range(256))}, {np.random.choice(range(256))}, {np.random.choice(range(256))}" 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) 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): def drawResult(clusterDict, target, iteration):
for ski_position in range(1, num_ski_positions + 1): for ski_position in range(1, num_ski_positions + 1):
source = "images/1_full_scaled_down.png" 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(): for _, (clusterStates, result) in clusterDict.items():
color = "100,100,100" color = "100,100,100"
if result == Verdict.GOOD: if result == Verdict.GOOD:
@ -371,7 +373,7 @@ if __name__ == '__main__':
_init_logger() _init_logger()
logger = logging.getLogger('main') logger = logging.getLogger('main')
logger.info("Starting") logger.info("Starting")
n_clusters = 2
n_clusters = 40
testAll = False testAll = False
safeStates = list() safeStates = list()
@ -379,7 +381,7 @@ if __name__ == '__main__':
iteration = 0 iteration = 0
while True: while True:
updatePrismFile(init_mdp, iteration, safeStates, unsafeStates) updatePrismFile(init_mdp, iteration, safeStates, unsafeStates)
#computeStateRanking(f"{init_mdp}_{iteration:03}.prism")
computeStateRanking(f"{init_mdp}_{iteration:03}.prism")
ranking = fillStateRanking("action_ranking") 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) 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) clusters = clusterImportantStates(sorted_ranking, iteration, n_clusters)
@ -388,7 +390,6 @@ if __name__ == '__main__':
clusterResult = dict() clusterResult = dict()
for id, cluster in clusters.items(): for id, cluster in clusters.items():
num_tests = int(factor_tests_per_cluster * len(cluster)) 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}") 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 = np.random.choice(len(cluster), num_tests, replace=False)
randomStates = [cluster[i] for i in randomStates] randomStates = [cluster[i] for i in randomStates]

Loading…
Cancel
Save