buildgraph: build collections matrix for each room and save it

This commit is contained in:
Laura Klünder 2016-12-14 00:39:46 +01:00
parent 2bb89f4c1a
commit a7f85ee2df
3 changed files with 22 additions and 3 deletions

View file

@ -65,7 +65,7 @@ class Graph:
print('%d points' % len(self.points)) print('%d points' % len(self.points))
print('%d rooms' % sum(len(level.rooms) for level in self.levels.values())) print('%d rooms' % sum(len(level.rooms) for level in self.levels.values()))
print('%d level transfer points' % len(self.level_transfer_points)) print('%d level transfer points' % len(self.level_transfer_points))
print('%d connections' % sum(len(point.connections) for point in self.points)) print('%d connections' % sum(level.connection_count() for level in self.levels.values()))
def add_levelconnector_point(self, levelconnector, point): def add_levelconnector_point(self, levelconnector, point):
self._built_levelconnector_points.setdefault(levelconnector.name, []).append(point) self._built_levelconnector_points.setdefault(levelconnector.name, []).append(point)

View file

@ -61,6 +61,9 @@ class GraphLevel():
print('%d points' % len(self._built_points)) print('%d points' % len(self._built_points))
print('%d room transfer points' % len(self._built_room_transfer_points)) print('%d room transfer points' % len(self._built_room_transfer_points))
def connection_count(self):
return sum(room.connection_count() for room in self.rooms)
def collect_rooms(self): def collect_rooms(self):
accessibles = self.level.geometries.accessible accessibles = self.level.geometries.accessible
accessibles = assert_multipolygon(accessibles) accessibles = assert_multipolygon(accessibles)

View file

@ -20,6 +20,7 @@ class GraphRoom():
self.areas = [] self.areas = []
self.points = None self.points = None
self.room_transfer_points = None self.room_transfer_points = None
self.distances = np.zeros((1, ))
def serialize(self): def serialize(self):
return ( return (
@ -27,12 +28,13 @@ class GraphRoom():
[area.serialize() for area in self.areas], [area.serialize() for area in self.areas],
self.points, self.points,
self.room_transfer_points, self.room_transfer_points,
self.distances,
) )
@classmethod @classmethod
def unserialize(cls, level, data): def unserialize(cls, level, data):
room = cls(level) room = cls(level)
room.mpl_clear, areas, room.points, room.room_transfer_points = data room.mpl_clear, areas, room.points, room.room_transfer_points, room.distances = data
room.areas = tuple(GraphArea(room, *area) for area in areas) room.areas = tuple(GraphArea(room, *area) for area in areas)
return room return room
@ -177,13 +179,27 @@ class GraphRoom():
def build_connections(self): def build_connections(self):
for area in self.areas: for area in self.areas:
area.build_connections() pass # area.build_connections()
def connection_count(self):
# print(np.count_nonzero(self.distances != np.inf))
return np.count_nonzero(self.distances != np.inf)
def finish_build(self): def finish_build(self):
self.areas = tuple(self.areas) self.areas = tuple(self.areas)
self.points = np.array(tuple(point.i for point in self._built_points)) self.points = np.array(tuple(point.i for point in self._built_points))
self.room_transfer_points = np.array(tuple(i for i in self.points if i in self.level.room_transfer_points)) self.room_transfer_points = np.array(tuple(i for i in self.points if i in self.level.room_transfer_points))
mapping = {from_i: to_i for to_i, from_i in enumerate(self.points)}
self.distances = np.empty(shape=(len(self.points), len(self.points)), dtype=np.float16)
self.distances[:] = np.inf
for from_point in self._built_points:
for to_point, connection in from_point.connections.items():
if to_point.i in mapping:
self.distances[mapping[from_point.i], mapping[to_point.i]] = connection.distance
for area in self.areas: for area in self.areas:
area.finish_build() area.finish_build()