9.1 KiB
9.1 KiB
In [2]:
import numpy as np
In [4]:
class Walker:
""" The Walker knows how to walk at random on a context map. """
def __init__(self, sigma_i, sigma_j, size, map_type='flat'):
self.sigma_i = sigma_i
self.sigma_j = sigma_j
self.size = size
if map_type == 'flat':
context_map = np.ones((size, size))
elif map_type == 'hills':
grid_ii, grid_jj = np.mgrid[0:size, 0:size]
i_waves = np.sin(grid_ii / 130) + np.sin(grid_ii / 10)
i_waves /= i_waves.max()
j_waves = np.sin(grid_jj / 100) + np.sin(grid_jj / 50) + \
np.sin(grid_jj / 10)
j_waves /= j_waves.max()
context_map = j_waves + i_waves
elif map_type == 'labyrinth':
context_map = np.ones((size, size))
context_map[50:100, 50:60] = 0
context_map[20:89, 80:90] = 0
context_map[90:120, 0:10] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
context_map[50:60, 50:200] = 0
context_map[179:189, 80:130] = 0
context_map[110:120, 0:190] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
context_map /= context_map.sum()
self.context_map = context_map
# Pre-compute a 2D grid of coordinates for efficiency
self._grid_ii, self._grid_jj = np.mgrid[0:size, 0:size]
walker = Walker(sigma_i=3, sigma_j=4, size=200, map_type='hills')
In [6]:
class Walker:
""" The Walker knows how to walk at random on a context map. """
def __init__(self, sigma_i, sigma_j, size, context_map):
self.sigma_i = sigma_i
self.sigma_j = sigma_j
self.size = size
self.context_map = context_map
# Pre-compute a 2D grid of coordinates for efficiency
self._grid_ii, self._grid_jj = np.mgrid[0:size, 0:size]
@classmethod
def from_context_map_type(cls, sigma_i, sigma_j, size, map_type):
""" Create an instance of Walker with a context map defined by type."""
if map_type == 'flat':
context_map = np.ones((size, size))
elif map_type == 'hills':
grid_ii, grid_jj = np.mgrid[0:size, 0:size]
i_waves = np.sin(grid_ii / 130) + np.sin(grid_ii / 10)
i_waves /= i_waves.max()
j_waves = np.sin(grid_jj / 100) + np.sin(grid_jj / 50) +\
np.sin(grid_jj / 10)
j_waves /= j_waves.max()
context_map = j_waves + i_waves
elif map_type == 'labyrinth':
context_map = np.ones((size, size))
context_map[50:100, 50:60] = 0
context_map[20:89, 80:90] = 0
context_map[90:120, 0:10] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
context_map[50:60, 50:200] = 0
context_map[179:189, 80:130] = 0
context_map[110:120, 0:190] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
context_map /= context_map.sum()
return cls(sigma_i, sigma_j, size, context_map)
In [7]:
walker = Walker.from_context_map_type(sigma_i=3, sigma_j=4, size=200, map_type='hills')
In [8]:
def flat_context_map_builder(size):
""" A context map where all positions are equally likely. """
return np.ones((size, size))
def hills_context_map_builder(size):
""" A context map with bumps and valleys. """
grid_ii, grid_jj = np.mgrid[0:size, 0:size]
i_waves = np.sin(grid_ii / 130) + np.sin(grid_ii / 10)
i_waves /= i_waves.max()
j_waves = np.sin(grid_jj / 100) + np.sin(grid_jj / 50) + \
np.sin(grid_jj / 10)
j_waves /= j_waves.max()
context_map = j_waves + i_waves
return context_map
def labyrinth_context_map_builder(size):
""" A context map that looks like a labyrinth. """
context_map = np.ones((size, size))
context_map[50:100, 50:60] = 0
context_map[20:89, 80:90] = 0
context_map[90:120, 0:10] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
context_map[50:60, 50:200] = 0
context_map[179:189, 80:130] = 0
context_map[110:120, 0:190] = 0
context_map[120:size, 30:40] = 0
context_map[180:190, 50:60] = 0
return context_map
In [10]:
class Walker:
def __init__(self, sigma_i, sigma_j, size, context_map):
self.sigma_i = sigma_i
self.sigma_j = sigma_j
self.size = size
self.context_map = context_map
# Pre-compute a 2D grid of coordinates for efficiency
self._grid_ii, self._grid_jj = np.mgrid[0:size, 0:size]
@classmethod
def from_context_map_builder(cls, sigma_i, sigma_j, size, context_map_builder):
"""Initialize the context map from an external builder.
`builder` is a callable that takes a `size` as input parameter
and outputs a `size` x `size` numpy array of positive values.
"""
context_map = context_map_builder(size)
context_map /= context_map.sum()
return cls(sigma_i, sigma_j, size, context_map)
In [11]:
walker = Walker.from_context_map_builder(
sigma_i=3,
sigma_j=4,
size=200,
context_map_builder=hills_context_map_builder,
)
In [ ]:
a