| 
					
					
						
							
						
					
					
				 | 
				@ -13,7 +13,7 @@ import pickle | 
			
		
		
	
		
			
				 | 
				 | 
				import queue | 
				 | 
				 | 
				import queue | 
			
		
		
	
		
			
				 | 
				 | 
				from dataclasses import dataclass, field | 
				 | 
				 | 
				from dataclasses import dataclass, field | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				from sklearn.cluster import KMeans | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				from sklearn.cluster import KMeans, DBSCAN | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				from enum import Enum | 
				 | 
				 | 
				from enum import Enum | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -59,8 +59,10 @@ class State: | 
			
		
		
	
		
			
				 | 
				 | 
				    x: int | 
				 | 
				 | 
				    x: int | 
			
		
		
	
		
			
				 | 
				 | 
				    y: int | 
				 | 
				 | 
				    y: int | 
			
		
		
	
		
			
				 | 
				 | 
				    ski_position: int | 
				 | 
				 | 
				    ski_position: int | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    #velocity: int | 
			
		
		
	
		
			
				 | 
				 | 
				def default_value(): | 
				 | 
				 | 
				def default_value(): | 
			
		
		
	
		
			
				 | 
				 | 
				    return {'action' : None, 'choiceValue' : None} | 
				 | 
				 | 
				    return {'action' : None, 'choiceValue' : None} | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				@dataclass(frozen=True) | 
				 | 
				 | 
				@dataclass(frozen=True) | 
			
		
		
	
		
			
				 | 
				 | 
				class StateValue: | 
				 | 
				 | 
				class StateValue: | 
			
		
		
	
		
			
				 | 
				 | 
				    ranking: float | 
				 | 
				 | 
				    ranking: float | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -91,18 +93,6 @@ def input_to_action(char): | 
			
		
		
	
		
			
				 | 
				 | 
				    if char in ["w", "a", "s", "d"]: | 
				 | 
				 | 
				    if char in ["w", "a", "s", "d"]: | 
			
		
		
	
		
			
				 | 
				 | 
				        return char | 
				 | 
				 | 
				        return char | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				def drawImportantStates(important_states): | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				    draw_commands = {1: list(), 2:list(), 3:list(), 4:list(), 5:list(), 6:list(), 7:list(), 8:list(), 9:list(), 10:list(), 11:list(), 12:list(), 13:list(), 14:list()} | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				    for state in important_states: | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        x = state[0].x | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        y = state[0].y | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        markerSize = 2 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        ski_position = state[0].ski_position | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        draw_commands[ski_position].append(f"-fill 'rgba(255,204,0,{state[1].ranking})' -draw 'rectangle {x-markerSize},{y-markerSize} {x+markerSize},{y+markerSize} '") | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				    for i in range(1,15): | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        command = f"convert images/1_full_scaled_down.png {' '.join(draw_commands[i])} first_try_{i:02}.png" | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        exec(command) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				def saveObservations(observations, verdict, testDir): | 
				 | 
				 | 
				def saveObservations(observations, verdict, testDir): | 
			
		
		
	
		
			
				 | 
				 | 
				    testDir = f"images/testing_{experiment_id}/{verdict.name}_{testDir}_{len(observations)}" | 
				 | 
				 | 
				    testDir = f"images/testing_{experiment_id}/{verdict.name}_{testDir}_{len(observations)}" | 
			
		
		
	
		
			
				 | 
				 | 
				    if len(observations) < 20: | 
				 | 
				 | 
				    if len(observations) < 20: | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -114,9 +104,10 @@ def saveObservations(observations, verdict, testDir): | 
			
		
		
	
		
			
				 | 
				 | 
				        img.save(f"{testDir}/{i:003}.png") | 
				 | 
				 | 
				        img.save(f"{testDir}/{i:003}.png") | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				ski_position_counter = {1: (Action.LEFT, 40), 2: (Action.LEFT, 35), 3: (Action.LEFT, 30), 4: (Action.LEFT, 10), 5: (Action.NOOP, 1), 6: (Action.RIGHT, 10), 7: (Action.RIGHT, 30), 8: (Action.RIGHT, 40) } | 
				 | 
				 | 
				ski_position_counter = {1: (Action.LEFT, 40), 2: (Action.LEFT, 35), 3: (Action.LEFT, 30), 4: (Action.LEFT, 10), 5: (Action.NOOP, 1), 6: (Action.RIGHT, 10), 7: (Action.RIGHT, 30), 8: (Action.RIGHT, 40) } | 
			
		
		
	
		
			
				 | 
				 | 
				def run_single_test(ale, nn_wrapper, x,y,ski_position, duration=200): | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#def run_single_test(ale, nn_wrapper, x,y,ski_position, velocity, duration=50): | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				def run_single_test(ale, nn_wrapper, x,y,ski_position, duration=50): | 
			
		
		
	
		
			
				 | 
				 | 
				    #print(f"Running Test from x: {x:04}, y: {y:04}, ski_position: {ski_position}", end="") | 
				 | 
				 | 
				    #print(f"Running Test from x: {x:04}, y: {y:04}, ski_position: {ski_position}", end="") | 
			
		
		
	
		
			
				 | 
				 | 
				    testDir = f"{x}_{y}_{ski_position}" | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    testDir = f"{x}_{y}_{ski_position}"#_{velocity}" | 
			
		
		
	
		
			
				 | 
				 | 
				    for i, r in enumerate(ramDICT[y]): | 
				 | 
				 | 
				    for i, r in enumerate(ramDICT[y]): | 
			
		
		
	
		
			
				 | 
				 | 
				        ale.setRAM(i,r) | 
				 | 
				 | 
				        ale.setRAM(i,r) | 
			
		
		
	
		
			
				 | 
				 | 
				    ski_position_setting = ski_position_counter[ski_position] | 
				 | 
				 | 
				    ski_position_setting = ski_position_counter[ski_position] | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -124,7 +115,7 @@ def run_single_test(ale, nn_wrapper, x,y,ski_position, duration=200): | 
			
		
		
	
		
			
				 | 
				 | 
				        ale.act(ski_position_setting[0]) | 
				 | 
				 | 
				        ale.act(ski_position_setting[0]) | 
			
		
		
	
		
			
				 | 
				 | 
				        ale.setRAM(14,0) | 
				 | 
				 | 
				        ale.setRAM(14,0) | 
			
		
		
	
		
			
				 | 
				 | 
				        ale.setRAM(25,x) | 
				 | 
				 | 
				        ale.setRAM(25,x) | 
			
		
		
	
		
			
				 | 
				 | 
				    ale.setRAM(14,180) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    ale.setRAM(14,180) # TODO | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				    all_obs = list() | 
				 | 
				 | 
				    all_obs = list() | 
			
		
		
	
		
			
				 | 
				 | 
				    speed_list = list() | 
				 | 
				 | 
				    speed_list = list() | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -132,8 +123,6 @@ def run_single_test(ale, nn_wrapper, x,y,ski_position, duration=200): | 
			
		
		
	
		
			
				 | 
				 | 
				    first_action = 0 | 
				 | 
				 | 
				    first_action = 0 | 
			
		
		
	
		
			
				 | 
				 | 
				    for i in range(0,duration): | 
				 | 
				 | 
				    for i in range(0,duration): | 
			
		
		
	
		
			
				 | 
				 | 
				        resized_obs = cv2.resize(ale.getScreenGrayscale(), (84,84), interpolation=cv2.INTER_AREA) | 
				 | 
				 | 
				        resized_obs = cv2.resize(ale.getScreenGrayscale(), (84,84), interpolation=cv2.INTER_AREA) | 
			
		
		
	
		
			
				 | 
				 | 
				        for i in range(0,4): | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            all_obs.append(resized_obs) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        if len(all_obs) >= 4: | 
				 | 
				 | 
				        if len(all_obs) >= 4: | 
			
		
		
	
		
			
				 | 
				 | 
				            stack_tensor = TensorDict({"obs": np.array(all_obs[-4:])}) | 
				 | 
				 | 
				            stack_tensor = TensorDict({"obs": np.array(all_obs[-4:])}) | 
			
		
		
	
		
			
				 | 
				 | 
				            action = nn_wrapper.query(stack_tensor) | 
				 | 
				 | 
				            action = nn_wrapper.query(stack_tensor) | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -178,7 +167,7 @@ def fillStateRanking(file_name, match=""): | 
			
		
		
	
		
			
				 | 
				 | 
				            choices = {key:float(value) for (key,value) in choices.items()} | 
				 | 
				 | 
				            choices = {key:float(value) for (key,value) in choices.items()} | 
			
		
		
	
		
			
				 | 
				 | 
				            #print("choices", choices) | 
				 | 
				 | 
				            #print("choices", choices) | 
			
		
		
	
		
			
				 | 
				 | 
				            #print("ranking_value", ranking_value) | 
				 | 
				 | 
				            #print("ranking_value", ranking_value) | 
			
		
		
	
		
			
				 | 
				 | 
				            state = State(int(stateMapping["x"]), int(stateMapping["y"]), int(stateMapping["ski_position"])) | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            state = State(int(stateMapping["x"]), int(stateMapping["y"]), int(stateMapping["ski_position"]))#, int(stateMapping["velocity"])) | 
			
		
		
	
		
			
				 | 
				 | 
				            value = StateValue(ranking_value, choices) | 
				 | 
				 | 
				            value = StateValue(ranking_value, choices) | 
			
		
		
	
		
			
				 | 
				 | 
				            state_ranking[state] = value | 
				 | 
				 | 
				            state_ranking[state] = value | 
			
		
		
	
		
			
				 | 
				 | 
				        logger.info(f"Parsing state ranking - DONE: took {toc()} seconds") | 
				 | 
				 | 
				        logger.info(f"Parsing state ranking - DONE: took {toc()} seconds") | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -196,12 +185,14 @@ def createDisjunction(formulas): | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				def clusterFormula(cluster): | 
				 | 
				 | 
				def clusterFormula(cluster): | 
			
		
		
	
		
			
				 | 
				 | 
				    formula = "" | 
				 | 
				 | 
				    formula = "" | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    #states = [(s[0].x,s[0].y, s[0].ski_position, s[0].velocity) for s in cluster] | 
			
		
		
	
		
			
				 | 
				 | 
				    states = [(s[0].x,s[0].y, s[0].ski_position) for s in cluster] | 
				 | 
				 | 
				    states = [(s[0].x,s[0].y, s[0].ski_position) for s in cluster] | 
			
		
		
	
		
			
				 | 
				 | 
				    skiPositionGroup = defaultdict(list) | 
				 | 
				 | 
				    skiPositionGroup = defaultdict(list) | 
			
		
		
	
		
			
				 | 
				 | 
				    for item in states: | 
				 | 
				 | 
				    for item in states: | 
			
		
		
	
		
			
				 | 
				 | 
				        skiPositionGroup[item[2]].append(item) | 
				 | 
				 | 
				        skiPositionGroup[item[2]].append(item) | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				    first = True | 
				 | 
				 | 
				    first = True | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    #todo add velocity here | 
			
		
		
	
		
			
				 | 
				 | 
				    for skiPosition, group in skiPositionGroup.items(): | 
				 | 
				 | 
				    for skiPosition, group in skiPositionGroup.items(): | 
			
		
		
	
		
			
				 | 
				 | 
				        formula += f"ski_position={skiPosition} & (" | 
				 | 
				 | 
				        formula += f"ski_position={skiPosition} & (" | 
			
		
		
	
		
			
				 | 
				 | 
				        yPosGroup = defaultdict(list) | 
				 | 
				 | 
				        yPosGroup = defaultdict(list) | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -282,15 +273,11 @@ x = 70 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				nn_wrapper = SampleFactoryNNQueryWrapper() | 
				 | 
				 | 
				nn_wrapper = SampleFactoryNNQueryWrapper() | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				iteration = 0 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				experiment_id = int(time.time()) | 
				 | 
				 | 
				experiment_id = int(time.time()) | 
			
		
		
	
		
			
				 | 
				 | 
				init_mdp = "velocity_safety" | 
				 | 
				 | 
				init_mdp = "velocity_safety" | 
			
		
		
	
		
			
				 | 
				 | 
				exec(f"mkdir -p images/testing_{experiment_id}", verbose=False) | 
				 | 
				 | 
				exec(f"mkdir -p images/testing_{experiment_id}", verbose=False) | 
			
		
		
	
		
			
				 | 
				 | 
				#exec(f"cp 1_full_scaled_down.png images/testing_{experiment_id}/testing_0000.png") | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				#exec(f"cp {init_mdp}.prism {init_mdp}_000.prism") | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				markerSize = 1 | 
				 | 
				 | 
				markerSize = 1 | 
			
		
		
	
		
			
				 | 
				 | 
				#markerList = {1: list(), 2:list(), 3:list(), 4:list(), 5:list(), 6:list(), 7:list(), 8:list()} | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				imagesDir = f"images/testing_{experiment_id}" | 
				 | 
				 | 
				imagesDir = f"images/testing_{experiment_id}" | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -360,8 +347,10 @@ def _init_logger(): | 
			
		
		
	
		
			
				 | 
				 | 
				def clusterImportantStates(ranking, iteration, n_clusters=40): | 
				 | 
				 | 
				def clusterImportantStates(ranking, iteration, n_clusters=40): | 
			
		
		
	
		
			
				 | 
				 | 
				    logger.info(f"Starting to cluster {len(ranking)} states into {n_clusters} cluster") | 
				 | 
				 | 
				    logger.info(f"Starting to cluster {len(ranking)} states into {n_clusters} cluster") | 
			
		
		
	
		
			
				 | 
				 | 
				    tic() | 
				 | 
				 | 
				    tic() | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    #states = [[s[0].x,s[0].y, s[0].ski_position * 10, s[0].velocity * 10, s[1].ranking] for s in ranking] | 
			
		
		
	
		
			
				 | 
				 | 
				    states = [[s[0].x,s[0].y, s[0].ski_position * 10, s[1].ranking] for s in ranking] | 
				 | 
				 | 
				    states = [[s[0].x,s[0].y, s[0].ski_position * 10, s[1].ranking] for s in ranking] | 
			
		
		
	
		
			
				 | 
				 | 
				    kmeans = KMeans(n_clusters, random_state=0, n_init="auto").fit(states) | 
				 | 
				 | 
				    kmeans = KMeans(n_clusters, random_state=0, n_init="auto").fit(states) | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				    #dbscan = DBSCAN().fit(states) | 
			
		
		
	
		
			
				 | 
				 | 
				    logger.info(f"Starting to cluster {len(ranking)} states into {n_clusters} cluster - DONE: took {toc()} seconds") | 
				 | 
				 | 
				    logger.info(f"Starting to cluster {len(ranking)} states into {n_clusters} cluster - DONE: took {toc()} seconds") | 
			
		
		
	
		
			
				 | 
				 | 
				    clusterDict = {i : list() for i in range(0,n_clusters)} | 
				 | 
				 | 
				    clusterDict = {i : list() for i in range(0,n_clusters)} | 
			
		
		
	
		
			
				 | 
				 | 
				    for i, state in enumerate(ranking): | 
				 | 
				 | 
				    for i, state in enumerate(ranking): | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -399,6 +388,7 @@ if __name__ == '__main__': | 
			
		
		
	
		
			
				 | 
				 | 
				                x = state[0].x | 
				 | 
				 | 
				                x = state[0].x | 
			
		
		
	
		
			
				 | 
				 | 
				                y = state[0].y | 
				 | 
				 | 
				                y = state[0].y | 
			
		
		
	
		
			
				 | 
				 | 
				                ski_pos = state[0].ski_position | 
				 | 
				 | 
				                ski_pos = state[0].ski_position | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                #velocity = state[0].velocity | 
			
		
		
	
		
			
				 | 
				 | 
				                result = run_single_test(ale,nn_wrapper,x,y,ski_pos, duration=50) | 
				 | 
				 | 
				                result = run_single_test(ale,nn_wrapper,x,y,ski_pos, duration=50) | 
			
		
		
	
		
			
				 | 
				 | 
				                if result == Verdict.BAD: | 
				 | 
				 | 
				                if result == Verdict.BAD: | 
			
		
		
	
		
			
				 | 
				 | 
				                    if testAll: | 
				 | 
				 | 
				                    if testAll: | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |