From 6ec010d172d609a7d867a6c51b29320cf310b062 Mon Sep 17 00:00:00 2001 From: eladyaniv01 Date: Mon, 28 Sep 2020 20:17:45 +0300 Subject: [PATCH] test: find low cost points is now tested on all grid types --- run.py | 104 ++++++----------------------------------- tests/test_pathihng.py | 37 +++++++++++++++ 2 files changed, 50 insertions(+), 91 deletions(-) diff --git a/run.py b/run.py index 19c78d62..fec1c674 100644 --- a/run.py +++ b/run.py @@ -5,10 +5,11 @@ from typing import List from sc2.position import Point2 - +from loguru import logger from MapAnalyzer.MapData import MapData from MapAnalyzer.utils import import_bot_instance +import matplotlib.pyplot as plt def get_random_point(minx, maxx, miny, maxy): return (random.randint(minx, maxx), random.randint(miny, maxy)) @@ -39,6 +40,7 @@ def get_map_file_list() -> List[str]: map_files = get_map_file_list() for mf in map_files: if 'death' in mf.lower(): + mf = random.choice(map_files) # if 'abys' in mf.lower(): with lzma.open(mf, "rb") as f: raw_game_data, raw_game_info, raw_observation = pickle.load(f) @@ -50,96 +52,16 @@ def get_map_file_list() -> List[str]: p0 = Point2(reg_start.center) p1 = Point2(reg_end.center) influence_grid = map_data.get_air_vs_ground_grid(default_weight=50) - influence_grid = map_data.get_pyastar_grid() - # p = (50, 130) - # influence_grid = map_data.add_cost(grid=influence_grid, position=p, radius=10, initial_default_weights=50) + # influence_grid = map_data.get_pyastar_grid() + cost_point = (50, 130) + influence_grid = map_data.add_cost(position=cost_point, radius=7, grid=influence_grid) + safe_points = map_data.find_lowest_cost_points(from_pos=cost_point, radius=14, grid=influence_grid) + + logger.info(safe_points) + + x, y = zip(*safe_points) + plt.scatter(x, y, s=1) map_data.plot_influenced_path(start=p0, goal=p1, weight_array=influence_grid, allow_diagonal=False) + map_data.show() - # import matplotlib.pyplot as plt - # import numpy as np - # - # print(np.unique(map_data.path_arr)) - # plt.imshow(map_data.path_arr, origin="lower") - # plt.show() - # plt.imshow(map_data.placement_arr, origin="lower") - # plt.show() - # plt.imshow(influence_grid, origin="lower") - # plt.show() break -# if 'dream' in mf.lower(): -# map_file = mf -# break -# -# # noinspection PyUnboundLocalVariable -# with lzma.open(map_file, "rb") as f: -# raw_game_data, raw_game_info, raw_observation = pickle.load(f) -# -# bot = import_bot_instance(raw_game_data, raw_game_info, raw_observation) -# map_data = MapData(bot, loglevel="DEBUG") -# map_data.plot_map() -# map_data.show() -# logger = map_data.logger -# base = map_data.bot.townhalls[0] -# reg_start = map_data.where(base.position_tuple) -# reg_end = map_data.where(map_data.bot.enemy_start_locations[0].position) -# p0 = Point2(reg_start.center) -# p1 = Point2(reg_end.center) -# influence_grid = map_data.get_pyastar_grid() -# ramps = reg_end.region_ramps -# # logger.error(ramps) -# if len(ramps) > 1: -# if map_data.distance(ramps[0].top_center, reg_end.center) < map_data.distance(ramps[1].top_center, -# reg_end.center): -# ramp = ramps[0] -# else: -# ramp = ramps[1] -# else: -# ramp = ramps[0] -# -# # influence_points = [(ramp.top_center, 2), (Point2((66, 66)), 18)] -# -# influence_points = _get_random_influence(25, 5) -# # for tup in influence_points: -# # p = tup[0] -# # r = tup[1] -# # map_data.add_cost(p, r=r, arr=influence_grid) -# map_data.plot_influenced_path(start=p0, goal=p1, weight_array=influence_grid) -# map_data.show() - -# get corner regions centers for start / end points -# base = map_data.bot.townhalls[0] -# reg_start = map_data.where(base.position_tuple) -# reg_end = map_data.where(map_data.bot.enemy_start_locations[0].position) -# p0 = reg_start.center -# p1 = reg_end.center -# for idx in range(8): -# """generate random points for added influence / cost """ -# pts = [] -# if idx > 0: -# NUM_POINTS = idx * 10 -# else: -# NUM_POINTS = 1 -# -# # generating random points for added influence -# for i in range(NUM_POINTS): -# pts.append(get_random_point(50, 130, 25, 175)) -# -# """Requesting a grid and adding influence / cost""" -# # getting the base grid for pathing -# if NUM_POINTS / 10 % 2 == 0: -# # arr = map_data.get_air_vs_ground_grid() -# arr = map_data.get_clean_air_grid() -# grid_name = "AvG_Grid" -# else: -# arr = map_data.get_pyastar_grid(air_pathing=False) -# grid_name = "NormalGrid" -# r = 7 + idx -# # note that we use the default weight of 100, we could pass custom weights for each point though -# for p in pts: -# arr = map_data.add_cost(p, r, arr) -# -# """Plot path on weighted grid""" -# map_data.plot_influenced_path(start=p0, goal=p1, weight_array=arr, -# name=f"{grid_name}{NUM_POINTS} Points of influence") -# map_data.show() -# # map_data.close() diff --git a/tests/test_pathihng.py b/tests/test_pathihng.py index 873f62ac..fdcfe959 100644 --- a/tests/test_pathihng.py +++ b/tests/test_pathihng.py @@ -109,6 +109,43 @@ def test_handle_illegal_values(self, map_data: MapData) -> None: path = map_data.pathfind(p0, p1, grid=arr) assert (path is not None), f"path = {path}" + def test_find_lowest_cost_points(self, map_data: MapData): + influence_grid = map_data.get_air_vs_ground_grid() + cost_point = (50, 130) + influence_grid = map_data.add_cost(position=cost_point, radius=7, grid=influence_grid) + safe_points = map_data.find_lowest_cost_points(from_pos=cost_point, radius=14, grid=influence_grid) + cost = influence_grid[safe_points[0]] + for p in safe_points: + assert (influence_grid[ + p] == cost), f"grid type = air_vs_ground_grid, p = {p}, influence_grid[p] = {influence_grid[p]}, expected cost = {cost}" + + influence_grid = map_data.get_clean_air_grid() + cost_point = (50, 130) + influence_grid = map_data.add_cost(position=cost_point, radius=7, grid=influence_grid) + safe_points = map_data.find_lowest_cost_points(from_pos=cost_point, radius=14, grid=influence_grid) + cost = influence_grid[safe_points[0]] + for p in safe_points: + assert (influence_grid[ + p] == cost), f"grid type = clean_air_grid, p = {p}, influence_grid[p] = {influence_grid[p]}, expected cost = {cost}" + + influence_grid = map_data.get_pyastar_grid() + cost_point = (50, 130) + influence_grid = map_data.add_cost(position=cost_point, radius=7, grid=influence_grid) + safe_points = map_data.find_lowest_cost_points(from_pos=cost_point, radius=14, grid=influence_grid) + cost = influence_grid[safe_points[0]] + for p in safe_points: + assert (influence_grid[ + p] == cost), f"grid type = pyastar_grid, p = {p}, influence_grid[p] = {influence_grid[p]}, expected cost = {cost}" + + influence_grid = map_data.get_climber_grid() + cost_point = (50, 130) + influence_grid = map_data.add_cost(position=cost_point, radius=7, grid=influence_grid) + safe_points = map_data.find_lowest_cost_points(from_pos=cost_point, radius=14, grid=influence_grid) + cost = influence_grid[safe_points[0]] + for p in safe_points: + assert (influence_grid[ + p] == cost), f"grid type = climber_grid, p = {p}, influence_grid[p] = {influence_grid[p]}, expected cost = {cost}" + def test_air_vs_ground(self, map_data: MapData) -> None: default_weight = 99 grid = map_data.get_air_vs_ground_grid(default_weight=default_weight)