|
@ -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] |
|
|