From 8ffeff179f6fa9c52983167db16d0114f92aa6e1 Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Wed, 22 May 2019 11:28:16 +0430 Subject: [PATCH] fix(map_generator): distance_to_water distribution sync --- biomes/map_generator.py | 52 +++++++++++++++++++++++----------- biomes/random_map_generator.py | 5 ++++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/biomes/map_generator.py b/biomes/map_generator.py index 95d1407..d0d89b1 100644 --- a/biomes/map_generator.py +++ b/biomes/map_generator.py @@ -17,11 +17,11 @@ from utils import * parameters = { 'width': { - 'default': 700, + 'default': 360, 'type': 'int', }, 'height': { - 'default': 450, + 'default': 180, 'type': 'int', }, 'mountain_ratio': { @@ -32,7 +32,7 @@ parameters = { 'step': 0.01 }, 'sharpness': { - 'default': 0.7, + 'default': 0.9, 'type': 'float', 'min': 0, 'max': 1, @@ -57,7 +57,7 @@ parameters = { 'max': 1e5, }, 'water_proportion': { - 'default': 0.8, + 'default': 0.3, 'type': 'float', 'min': 0, 'max': 0.99, @@ -280,13 +280,15 @@ def generate_map(biomes=False, **kwargs): p.update(kwargs) - np.random.seed(p['seed'] or None) + rs = np.random.randint(0, 999) + np.random.seed(p['seed'] or rs) + print('seed', rs) width, height = p['width'], p['height'] continents = p['continents'] ground = np.zeros((width, height)) - ground_size = width * height * (1 - p['water_proportion']) + ground_size = width * height * (1 - p['water_proportion'])**3 print(ground_size / ground.size) # position = (int(width / 2), int(height / 2)) @@ -313,11 +315,11 @@ def generate_map(biomes=False, **kwargs): greys = cm.get_cmap('Greys') greys.set_under(color=SEA_COLOR) - ground = ndimage.gaussian_filter(ground, sigma=4) + # ground = ndimage.gaussian_filter(ground, sigma=4) ground = ndimage.generic_filter(ground, constant_filter, size=1) print(np.min(ground), np.max(ground), p['max_elevation']) - print('water proportion', np.count_nonzero(ground) / ground.size) + print('water proportion', 1 - (np.count_nonzero(ground) / ground.size)) plt.gca().invert_yaxis() plt.imshow(ground.T, cmap=greys, norm=norm) @@ -355,19 +357,33 @@ def generate_biomes(ground): data['latitude'].append(height_to_latitude(y)) data['elevation'].append(v) - print(len(points)) - print('buffering points') points = MultiPoint(points) - boundary = points.buffer(1).boundary + boundary = points.convex_hull.boundary + + # fig = plt.figure() + # ax = fig.add_subplot(111) + # minx, miny, maxx, maxy = boundary.bounds + # w, h = maxx - minx, maxy - miny + # ax.set_xlim(minx - 0.2 * w, maxx + 0.2 * w) + # ax.set_ylim(miny - 0.2 * h, maxy + 0.2 * h) + # ax.set_aspect(1) + + # ax.add_collection(PatchCollection([PolygonPatch(boundary_buf, fc='red', ec='black', zorder=1)], match_original=True)) + # plt.show() for x, y in np.ndindex(ground.shape): - if ground[x,y] > p['water_level']: - data['distance_to_water'].append(Point(x, y).distance(boundary)) + if ground[x, y] > p['water_level']: + d = Point(x, y).distance(boundary) + d = (d - root_df['distance_to_water'].mean()) / root_df['distance_to_water'].std() + d = max(0, d) + + data['distance_to_water'].append(d) df = pd.DataFrame(data) print(df['elevation'].min(), df['elevation'].max()) - print(df['distance_to_water'].min(), df['distance_to_water'].max()) + print('distance_to_water', df['distance_to_water'].min(), df['distance_to_water'].max()) + print('dtw', df['distance_to_water'].mean(), df['distance_to_water'].std()) print(df['latitude'].min(), df['latitude'].max()) print('running prediction models') @@ -387,8 +403,10 @@ def generate_biomes(ground): # plt.show() df = pd.read_pickle('data.p') +root_df = df print(df['elevation'].min(), df['elevation'].max()) -print(df['distance_to_water'].min(), df['distance_to_water'].max()) +print('distance_to_water', df['distance_to_water'].min(), df['distance_to_water'].max()) +print('dtw', df['distance_to_water'].mean(), df['distance_to_water'].std()) print(df['latitude'].min(), df['latitude'].max()) def predict_end_to_end(input_df, checkpoint_temp='checkpoints/temp.h5', checkpoint_precip='checkpoints/precip.h5', checkpoint_biomes='checkpoints/b.h5', year=2000): @@ -489,7 +507,7 @@ def predict_end_to_end(input_df, checkpoint_temp='checkpoints/temp.h5', checkpoi draw(new_data, earth=False, only_draw=True, longitude_max=p['width'], latitude_max=p['height'], alpha=0.7) if __name__ == "__main__": - # p['width'] = 50 - # p['height'] = 50 + # p['width'] = 300 + # p['height'] = 250 generate_map(True) plt.show() diff --git a/biomes/random_map_generator.py b/biomes/random_map_generator.py index 859b928..4614b94 100644 --- a/biomes/random_map_generator.py +++ b/biomes/random_map_generator.py @@ -2,6 +2,11 @@ from map_generator import generate_map from pathlib import Path import matplotlib.pyplot as plt +grid = { + 'water_proportion': (0.3, 0.7), + 'mountain_ratio': () +} + seed = 0 while True: generate_map(biomes=True, seed=seed)