You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.7 KiB
99 lines
3.7 KiB
import time, re, sys, csv, os
|
|
|
|
from subprocess import call
|
|
from os import listdir, system
|
|
from os.path import isfile, join, getctime
|
|
from dataclasses import dataclass, field
|
|
|
|
ski_position_to_rgb_map = {1: "230, 138, 0", 2: "255,153,0", 3: "255, 184, 77", 4: "255, 194, 100", 5: "255, 194, 120", 6: "255, 210, 130", 7: "255, 210, 140", 8: "230, 204, 255", 9: "204, 153, 255", 10: "255, 102, 179", 11: "255, 51, 153", 12: "255, 0, 255", 13: "179, 0, 179", 14: "102, 0, 102"}
|
|
|
|
def importance_color(ranking_value):
|
|
low = 0x00ff00
|
|
high = 0xff0000
|
|
result = int(ranking_value * high + (1-ranking_value) * low)
|
|
return f"#{result:06x}"
|
|
|
|
def model_to_actual(ski_position):
|
|
if ski_position == 1:
|
|
return 1
|
|
elif ski_position in [2,3]:
|
|
return 2
|
|
elif ski_position in [4,5]:
|
|
return 3
|
|
elif ski_position in [6,7]:
|
|
return 4
|
|
elif ski_position in [8,9]:
|
|
return 5
|
|
elif ski_position in [10,11]:
|
|
return 6
|
|
elif ski_position in [12,13]:
|
|
return 7
|
|
elif ski_position == 14:
|
|
return 8
|
|
|
|
def convert(tuples):
|
|
return dict(tuples)
|
|
@dataclass(frozen=True)
|
|
class State:
|
|
x: int
|
|
y: int
|
|
ski_position: int
|
|
|
|
def default_value():
|
|
return {'action' : None, 'choiceValue' : None}
|
|
|
|
@dataclass(frozen=True)
|
|
class StateValue:
|
|
ranking: float
|
|
choices: dict = field(default_factory=default_value)
|
|
def exec(command, verbose=True):
|
|
if verbose: print(f"Executing {command}")
|
|
system(f"echo {command} >> list_of_exec")
|
|
return system(command)
|
|
|
|
def fillStateRanking(file_name, match=""):
|
|
state_ranking = dict()
|
|
try:
|
|
with open(file_name, "r") as f:
|
|
file_content = f.readlines()
|
|
for line in file_content:
|
|
if match and skip_line.match(line): continue
|
|
stateMapping = convert(re.findall(r"([a-zA-Z_]*[a-zA-Z])=(\d+)?", line))
|
|
#print("stateMapping", stateMapping)
|
|
choices = convert(re.findall(r"[a-zA-Z_]*(left|right|noop)[a-zA-Z_]*:(-?\d+\.?\d*)", line))
|
|
#print("choices", choices)
|
|
ranking_value = float(re.search(r"Value:([+-]?(\d*\.\d+)|\d+)", line)[0].replace("Value:",""))
|
|
#print("ranking_value", ranking_value)
|
|
state = State(int(stateMapping["x"]), int(stateMapping["y"]), int(stateMapping["ski_position"]))
|
|
value = StateValue(ranking_value, choices)
|
|
state_ranking[state] = value
|
|
return state_ranking
|
|
|
|
except EnvironmentError:
|
|
print("TODO file not available. Exiting.")
|
|
sys.exit(1)
|
|
|
|
ranking = fillStateRanking("action_ranking_simplified")
|
|
sorted_ranking = sorted(ranking.items(), key=lambda x: x[1].ranking)
|
|
|
|
draw_commands = {1: list(), 2:list(), 3:list(), 4:list(), 5:list(), 6:list(), 7:list(), 8:list()}
|
|
exec(f"cp images/empty_scaled_down.png full_first_try_safety.png")
|
|
markerSize = 1
|
|
for state in sorted_ranking[-500000:-1]:
|
|
if state[1].ranking < 0.09: continue
|
|
x = state[0].x
|
|
y = state[0].y
|
|
ski_position = state[0].ski_position
|
|
draw_commands[ski_position].append(f"-fill '{importance_color(state[1].ranking)}' -draw 'rectangle {x-markerSize},{y-markerSize} {x+markerSize},{y+markerSize}'") # {state[1].ranking}
|
|
for pos, marker in draw_commands.items():
|
|
destination = f"first_try_{pos:02}.png"
|
|
exec(f"cp images/empty_scaled_down.png {destination}")
|
|
i=0
|
|
while i < len(marker):
|
|
batch = marker[i:i+1000]
|
|
command = f"convert {destination} {' '.join(batch)} {destination}"
|
|
exec(command, verbose=False)
|
|
command = f"convert full_first_try_safety.png {' '.join(batch)} full_first_try_safety.png"
|
|
exec(command, verbose=False)
|
|
i = i+1000
|
|
exec(f"montage first_try*.png -geometry +0+0 -tile x1 tiled_first_try.png")
|