101 lines
2.7 KiB
Python
101 lines
2.7 KiB
Python
import abc
|
|
import code
|
|
|
|
|
|
class neighbors:
|
|
class Neighborhood(object, metaclass=abc.ABCMeta):
|
|
def __init__(self, pmin, pmax):
|
|
self.pmin = pmin
|
|
self.pmax = pmax
|
|
|
|
@abc.abstractmethod
|
|
def __call__(self, p):
|
|
raise NotImplementedError
|
|
|
|
|
|
class quad_grid(Neighborhood):
|
|
def __init__(self, grid_step, pmin, pmax):
|
|
super().__init__(pmin, pmax)
|
|
self.grid_step = grid_step
|
|
|
|
def __call__(self, p):
|
|
directions = ((1,0),(0,-1),(-1,0),(0,1))
|
|
return code.neighbors_grid(p, self.grid_step, pmin, pmax, directions)
|
|
|
|
|
|
class octo_grid(Neighborhood):
|
|
def __init__(self, grid_step, pmin, pmax):
|
|
super().__init__(pmin, pmax)
|
|
self.grid_step = grid_step
|
|
|
|
def __call__(self, p):
|
|
directions = ((1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1))
|
|
return code.neighbors_grid(p, self.grid_step, pmin, pmax, directions)
|
|
|
|
|
|
class transit:
|
|
class HopfLax(object, metaclass=abc.ABCMeta):
|
|
|
|
@abc.abstractmethod
|
|
def __call__(self, p, neighbors, costs):
|
|
raise NotImplementedError
|
|
|
|
|
|
class on_edge(HopfLax):
|
|
def __call__(self, p, neighbors, costs):
|
|
return code.transit_on_edge(p, neighbors, costs)
|
|
|
|
|
|
class in_simplex(HopfLax):
|
|
def __init__(self, epsilon):
|
|
self.eps = epsilon
|
|
|
|
def __call__(self, p, neighbors, costs):
|
|
return code.transit_in_simplex(p, neighbors, costs, self.eps)
|
|
|
|
|
|
class algo(object):
|
|
def __init__(self, neighbors, transit):
|
|
self.neighbors = neighbors
|
|
self.transit = transit
|
|
|
|
def __call__(self, seed, iterations):
|
|
return code.algo_run( seed, iterations, self.neighbors, self.transit)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
seed = (0,0)
|
|
pmin = (-5,-5)
|
|
pmax = (15,15)
|
|
step = 1
|
|
maxit = 300
|
|
eps = 1/100
|
|
|
|
four = neighbors.quad_grid(step, pmin, pmax)
|
|
eight = neighbors.octo_grid(step, pmin, pmax)
|
|
|
|
graph = transit.on_edge()
|
|
mesh = transit.in_simplex(epsilon=eps)
|
|
|
|
dijkstra4 = algo(four, graph)
|
|
print("Dijkstra, 4 neighbors")
|
|
cd4 = dijkstra4(seed, maxit)
|
|
code.grid_print(cd4, pmin, pmax, step)
|
|
|
|
fast_marching4 = algo(four, mesh)
|
|
print("Fast marching, 4 neighbors")
|
|
cfm4 = fast_marching4(seed, maxit)
|
|
code.grid_print(cfm4, pmin, pmax, step)
|
|
|
|
dijkstra8 = algo(eight, graph)
|
|
print("Dijkstra, 8 neighbors")
|
|
cd8 = dijkstra8(seed, maxit)
|
|
code.grid_print(cd8, pmin, pmax, step)
|
|
|
|
fast_marching8 = algo(eight, mesh)
|
|
print("Fast marching, 8 neighbors")
|
|
cfm8 = fast_marching8(seed, maxit)
|
|
code.grid_print(cfm8, pmin, pmax, step)
|
|
|
|
|