From 3d3ff55b5b0f6001ef523e4d044a260664576184 Mon Sep 17 00:00:00 2001 From: Nikolaus Krismer <nikolaus.krismer@uibk.ac.at> Date: Mon, 25 Aug 2014 19:39:46 +0200 Subject: [PATCH] not using LinkConnection anymore (needs more memory) reworked addLinks in IOutout interface utilizing jdk8 functionality in isochrone class --- .../inf/isochrone/algorithm/Isochrone.java | 32 ++++++---- .../it/unibz/inf/isochrone/db/Database.java | 58 ++++++------------- .../inf/isochrone/network/LinkCollection.java | 31 ---------- .../inf/isochrone/network/MemoryOutput.java | 21 ++++--- .../inf/isochrone/network/ComparisonTest.java | 4 +- .../isochrone/network/ReachabilityTest.java | 2 +- 6 files changed, 54 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java diff --git a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java index 49c4dfa9..75c98052 100644 --- a/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java +++ b/src/main/java/it/unibz/inf/isochrone/algorithm/Isochrone.java @@ -5,7 +5,6 @@ import it.unibz.inf.isochrone.db.Database; import it.unibz.inf.isochrone.network.AbstractOutput; import it.unibz.inf.isochrone.network.IOutput; import it.unibz.inf.isochrone.network.Link; -import it.unibz.inf.isochrone.network.LinkCollection; import it.unibz.inf.isochrone.network.Location; import it.unibz.inf.isochrone.network.MemoryOutput; import it.unibz.inf.isochrone.network.Node; @@ -22,6 +21,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * The Isochrone algorithm as described in the paper. As the @@ -163,17 +164,22 @@ public abstract class Isochrone { while ((node = nodeQueue.poll()) != null) { final int nodeId = node.getId(); - final LinkCollection links = new LinkCollection(calcAdjLinks(nodeId)); + final Collection<Link> links = calcAdjLinks(nodeId); output.addNode(node); node.close(); cConnections = prepareContinuousLinks(node, links); updateNodeQueue(expandContinuousLinks(cConnections)); + output.addLinks(links.stream().filter(new Predicate<Link>() { + @Override + public boolean test(final Link link) { + return link.isContinuous(); + } + }).collect(Collectors.toList())); dConnections = prepareDiscreteLinks(node, links); updateNodeQueue(expandDiscreteLinks(dConnections)); - output.addLinks(links.getContinuousTargets()); if (qIsExpiring && node.isExpired()) { removeNode(nodeId); } @@ -359,25 +365,27 @@ public abstract class Isochrone { } } - private NodeConnection prepareContinuousLinks(final Node node, final LinkCollection links) { + private NodeConnection prepareContinuousLinks(final Node node, final Collection<Link> links) { final NodeConnection nConnection = new NodeConnection(node); final double nodeDistance = node.getDistance(); - final Collection<Link> cLinks = links.getContinuousTargets(); - for (final Link link : cLinks) { - prepareLinkOffsets(link, nodeDistance); - addTargetNode(nConnection, node, link); + for (final Link link : links) { + if (link.isContinuous()) { + prepareLinkOffsets(link, nodeDistance); + addTargetNode(nConnection, node, link); + } } return nConnection; } - private NodeConnection prepareDiscreteLinks(final Node node, final LinkCollection links) { + private NodeConnection prepareDiscreteLinks(final Node node, final Collection<Link> links) { final NodeConnection nConnection = new NodeConnection(node); - final Collection<Link> dLinks = links.getDiscreteTargets(); - for (final Link link : dLinks) { - addTargetNode(nConnection, node, link); + for (final Link link : links) { + if (!link.isContinuous()) { + addTargetNode(nConnection, node, link); + } } return nConnection; diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java index aff4903a..50fd5d30 100644 --- a/src/main/java/it/unibz/inf/isochrone/db/Database.java +++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java @@ -155,7 +155,15 @@ public class Database { // Public methods - private void addNodesAndLink(final Link link, final short degree, final Map<Integer, Node> nodes, final Map<Integer, Collection<Link>> adjList) { + private void addLink(final int id, final Link link, final Map<Integer, Collection<Link>> adjList) { + if (!adjList.containsKey(id)) { + adjList.put(id, new ArrayList<>()); + } + + adjList.get(id).add(link); + } + + private int addNodes(final Link link, final short degree, final Map<Integer, Node> nodes) { int n1, n2; if (isIncoming) { n1 = link.getStartNode(); @@ -167,11 +175,8 @@ public class Database { addNode(n1, degree, nodes); addNode(n2, nodes); - if (!adjList.containsKey(n2)) { - adjList.put(n2, new ArrayList<Link>()); - } - adjList.get(n2).add(link); + return n2; } /** @@ -354,12 +359,8 @@ public class Database { final int targetId = rs.getInt("TARGET"); final short degree = rs.getShort("NODE_DEGREE"); final double length = rs.getDouble("LENGTH"); - if (isIncoming) { - addNode(sourceId, degree, nodes); - } else { - addNode(targetId, degree, nodes); - } + addNode((isIncoming) ? sourceId : targetId, degree, nodes); link = new Link(linkId, sourceId, targetId, length); } } catch (final SQLException e) { @@ -473,17 +474,9 @@ public class Database { final int sourceId = rs.getInt("SOURCE"); final short degree = rs.getShort("DEGREE"); final int targetId = rs.getInt("TARGET"); - final byte edgeMode = rs.getByte("EDGE_MODE"); - Link l = null; - if (edgeMode == NW_MODE_CONTINUOUS) { - final double length = rs.getDouble("LENGTH"); - l = new Link(linkId, sourceId, targetId, length); - } else { - final short routeId = rs.getShort("ROUTE_ID"); - l = new Link(linkId, sourceId, targetId, routeId); - } - addNodesAndLink(l, degree, nodes, adjList); + final Link link = new Link(linkId, sourceId, targetId, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); + addLink(addNodes(link, degree, nodes), link, adjList); } } catch (final SQLException e) { System.err.println("Problems with node:" + node); @@ -508,12 +501,8 @@ public class Database { try { rs = stmt.executeQuery(); while (rs.next()) { - final int linkId = rs.getInt("ID"); final int startNodeId = rs.getInt("SOURCE"); final int endNodeId = rs.getInt("TARGET"); - final double length = rs.getDouble("LENGTH"); - final short routeId = rs.getShort("ROUTE_ID"); - final byte linkType = rs.getByte("EDGE_MODE"); int start, end; if (isIncoming) { @@ -523,23 +512,21 @@ public class Database { start = endNodeId; end = startNodeId; } - Node node; + + final Node node; if (!nodes.containsKey(end)) { node = new Node(end); nodes.put(end, node); } else { node = nodes.get(end); } + if (node.getAdjLinks() == null) { node.setAdjLinks(new ArrayList<Link>()); } - Link link; - if (linkType == NW_MODE_CONTINUOUS) { - link = new Link(linkId, startNodeId, endNodeId, length); - } else { - link = new Link(linkId, startNodeId, endNodeId, routeId); - } + final int linkId = rs.getInt("ID"); + final Link link = new Link(linkId, startNodeId, endNodeId, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); node.addAdjLink(link); links.put(linkId, link); if (!nodes.containsKey(start)) { @@ -639,14 +626,7 @@ public class Database { end = adjNodeId; } - final int linkId = rs.getInt("ID"); - if (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) { - final double length = rs.getDouble("LENGTH"); - return new Link(linkId, start, end, length); - } - - final short routeId = rs.getShort("ROUTE_ID"); - return new Link(linkId, start, end, routeId); + return new Link(rs.getInt("ID"), start, end, (rs.getByte("EDGE_MODE") == NW_MODE_CONTINUOUS) ? rs.getDouble("LENGTH") : rs.getShort("ROUTE_ID")); } /** diff --git a/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java b/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java deleted file mode 100644 index f8a6f79e..00000000 --- a/src/main/java/it/unibz/inf/isochrone/network/LinkCollection.java +++ /dev/null @@ -1,31 +0,0 @@ -package it.unibz.inf.isochrone.network; - -import java.util.ArrayList; -import java.util.Collection; - -public class LinkCollection { - private final Collection<Link> cTargets; - private final Collection<Link> dTargets; - - public LinkCollection(final Collection<Link> links) { - cTargets = new ArrayList<>(); - dTargets = new ArrayList<>(); - - for (final Link l : links) { - if (l.isContinuous()) { - cTargets.add(l); - } else { - dTargets.add(l); - } - } - } - - public Collection<Link> getContinuousTargets() { - return cTargets; - } - - public Collection<Link> getDiscreteTargets() { - return dTargets; - } - -} diff --git a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java index 0dc0100e..259b0599 100644 --- a/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java +++ b/src/main/java/it/unibz/inf/isochrone/network/MemoryOutput.java @@ -1,33 +1,31 @@ package it.unibz.inf.isochrone.network; +import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; -import java.util.Set; /** * A sample output class, which simply stores all nodes and returns if needed. * This is mainly used for testing purposes. */ public class MemoryOutput extends AbstractOutput { - private final Map<Integer, Link> links; - private final Set<Node> nodes; + private final Collection<Link> links; + private final Collection<Node> nodes; // Constructor public MemoryOutput() { - links = new HashMap<>(); + links = new ArrayList<>(); nodes = new HashSet<>(); } // Getter - public Map<Integer, Link> getLinks() { + public Collection<Link> getLinks() { return links; } - public Set<Node> getNodes() { + public Collection<Node> getNodes() { return nodes; } @@ -35,7 +33,12 @@ public class MemoryOutput extends AbstractOutput { @Override public void addLink(final Link link) { - links.put(link.getId(), link); + links.add(link); + } + + @Override + public void addLinks(final Collection<Link> linkCollection) { + links.addAll(linkCollection); } @Override diff --git a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java index b90ddd17..e0489cb8 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java @@ -158,8 +158,8 @@ public final class ComparisonTest { LOGGER.debug(" - comparing for isochrone duration: " + params.getDuration()); final MemoryOutput o1 = AlgorithmHelper.run(clazz1, params).getOutput(); final MemoryOutput o2 = AlgorithmHelper.run(clazz2, params).getOutput(); - final Map<Integer, Link> l1 = o1.getLinks(); - final Map<Integer, Link> l2 = o2.getLinks(); + final Collection<Link> l1 = o1.getLinks(); + final Collection<Link> l2 = o2.getLinks(); Assert.assertEquals(l1, l2, n1 + " != " + n2); } diff --git a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java index 245facdf..4619ab33 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java @@ -67,7 +67,7 @@ public class ReachabilityTest { LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)"); final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true); - final Collection<Link> resultLinks = result.getOutput().getLinks().values(); + final Collection<Link> resultLinks = result.getOutput().getLinks(); LOGGER.info(" - found " + resultLinks.size() + " links"); boolean foundLink = false; -- GitLab