From a7f85ee2df4c76b4bd03d3ecf2c6e516e055161c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 14 Dec 2016 00:39:46 +0100 Subject: [PATCH] buildgraph: build collections matrix for each room and save it --- src/c3nav/routing/graph.py | 2 +- src/c3nav/routing/level.py | 3 +++ src/c3nav/routing/room.py | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/c3nav/routing/graph.py b/src/c3nav/routing/graph.py index 9100e499..0882532a 100644 --- a/src/c3nav/routing/graph.py +++ b/src/c3nav/routing/graph.py @@ -65,7 +65,7 @@ class Graph: print('%d points' % len(self.points)) 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 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): self._built_levelconnector_points.setdefault(levelconnector.name, []).append(point) diff --git a/src/c3nav/routing/level.py b/src/c3nav/routing/level.py index f0b9427d..58cc4831 100644 --- a/src/c3nav/routing/level.py +++ b/src/c3nav/routing/level.py @@ -61,6 +61,9 @@ class GraphLevel(): print('%d points' % len(self._built_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): accessibles = self.level.geometries.accessible accessibles = assert_multipolygon(accessibles) diff --git a/src/c3nav/routing/room.py b/src/c3nav/routing/room.py index de7d9adf..48d7d053 100644 --- a/src/c3nav/routing/room.py +++ b/src/c3nav/routing/room.py @@ -20,6 +20,7 @@ class GraphRoom(): self.areas = [] self.points = None self.room_transfer_points = None + self.distances = np.zeros((1, )) def serialize(self): return ( @@ -27,12 +28,13 @@ class GraphRoom(): [area.serialize() for area in self.areas], self.points, self.room_transfer_points, + self.distances, ) @classmethod def unserialize(cls, level, data): 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) return room @@ -177,13 +179,27 @@ class GraphRoom(): def build_connections(self): 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): self.areas = tuple(self.areas) 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)) + 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: area.finish_build()