From b64e3b849388dc7f69e45c04c06950530b858ee8 Mon Sep 17 00:00:00 2001 From: Nikolaus Krismer <nikolaus.krismer@uibk.ac.at> Date: Tue, 26 Aug 2014 16:39:26 +0200 Subject: [PATCH] introducing AlgorithmConfiguration class -> used for caching (speeds up ComparisonTests) --- .../network/AlgorithmConfiguration.java | 87 +++++++++++++++++++ .../isochrone/network/AlgorithmHelper.java | 11 +-- .../network/AlgorithmRuntimeTest.java | 2 +- .../inf/isochrone/network/AlgorithmTest.java | 2 +- .../inf/isochrone/network/ComparisonTest.java | 21 +++-- .../inf/isochrone/network/ExpirationTest.java | 2 +- .../isochrone/network/ReachabilityTest.java | 4 +- 7 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java new file mode 100644 index 00000000..39c5d70f --- /dev/null +++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmConfiguration.java @@ -0,0 +1,87 @@ +package it.unibz.inf.isochrone.network; + +import it.unibz.inf.isochrone.algorithm.Isochrone; + +public class AlgorithmConfiguration { + private final Class<? extends Isochrone> algorithmClass; + private final TestParameters params; + private final boolean expireNodes; + + public AlgorithmConfiguration(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) { + this.algorithmClass = algorithmClass; + this.params = params; + this.expireNodes = expireNodes; + } + + public AlgorithmConfiguration(final Class<? extends Isochrone> algorithmClass, final TestParameters params) { + this(algorithmClass, params, true); + } + + // Getters + + public Class<? extends Isochrone> getAlgorithmClass() { + return algorithmClass; + } + + public TestParameters getTestParameter() { + return params; + } + + public boolean isExpireNodes() { + return expireNodes; + } + + // Public methods + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + // CHECKSTYLE:OFF MagicNumber + result = prime * result + ((algorithmClass == null) ? 0 : algorithmClass.hashCode()); + result = prime * result + (expireNodes ? 1231 : 1237); + result = prime * result + ((params == null) ? 0 : params.hashCode()); + // CHECKSTYLE:ON MagicNumber + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + + final AlgorithmConfiguration other = (AlgorithmConfiguration) obj; + if (algorithmClass == null) { + if (other.algorithmClass != null) { + return false; + } + } else if (!algorithmClass.equals(other.algorithmClass)) { + return false; + } + if (expireNodes != other.expireNodes) { + return false; + } + if (params == null) { + if (other.params != null) { + return false; + } + } else if (!params.equals(other.params)) { + return false; + } + + return true; + } + + @Override + public String toString() { + return "CachingKey [class=" + algorithmClass.getSimpleName() + ", duration=" + params.getDuration() + ", expireNodes=" + expireNodes + "]"; + } + +} diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java index 62eb2458..d34e73a9 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java +++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmHelper.java @@ -49,22 +49,19 @@ final class AlgorithmHelper { return i1; } - public static AlgorithmResult run(final Class<? extends Isochrone> algorithmClass, final TestParameters params) { - return run(algorithmClass, params, true); - } - - public static AlgorithmResult run(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) { + public static AlgorithmResult run(final AlgorithmConfiguration config) { + final TestParameters params = config.getTestParameter(); final ConfigDataset c = ConfigDataset.getInstance(params.getDataset()); if (c == null) { Assert.fail("Could not create dataset from configuration"); } - final Query query = new Query(params.getDirection(), params.getWalkingSpeed(), params.getDuration(), params.getDate(), expireNodes, params.getMode()); + final Query query = new Query(params.getDirection(), params.getWalkingSpeed(), params.getDuration(), params.getDate(), config.isExpireNodes(), params.getMode()); query.setStartNodeIds(params.getStartNodeId()); Isochrone algorithm = null; try { - algorithm = algorithmClass.getConstructor(ConfigDataset.class, Query.class).newInstance(c, query); + algorithm = config.getAlgorithmClass().getConstructor(ConfigDataset.class, Query.class).newInstance(c, query); } catch (final InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { Assert.fail(e.getMessage()); } diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java index c7c71b09..c6100e99 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmRuntimeTest.java @@ -203,7 +203,7 @@ public final class AlgorithmRuntimeTest { for (final TestParameters params : dsParams) { LOGGER.debug(" - executing for isochrone duration: " + params.getDuration()); final long startTime = Calendar.getInstance().getTimeInMillis(); - AlgorithmHelper.run(clazz, params); + AlgorithmHelper.run(new AlgorithmConfiguration(clazz, params)); final long runTime = Calendar.getInstance().getTimeInMillis() - startTime; LOGGER.debug(" - runtime \"" + params.getDuration() + "\": " + runTime + "msec"); diff --git a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java index 635b4f21..85b40430 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/AlgorithmTest.java @@ -92,7 +92,7 @@ public class AlgorithmTest { private static void run(final Class<? extends Isochrone> algorithmClass, final TestParameters params, final boolean expireNodes) { LOGGER.info("Executing \"" + algorithmClass.getSimpleName() + "\"" + ((expireNodes) ? " (with node expiration)" : "")); final long startTime = Calendar.getInstance().getTimeInMillis(); - AlgorithmHelper.run(algorithmClass, params, expireNodes); + AlgorithmHelper.run(new AlgorithmConfiguration(algorithmClass, params, expireNodes)); final long runTime = Calendar.getInstance().getTimeInMillis() - startTime; LOGGER.info(" - runtime: \"" + params.getDuration() + "\": " + runTime + "msec"); LOGGER.info("-----------------------------"); 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 d55494e2..814fc838 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java @@ -42,6 +42,7 @@ public final class ComparisonTest { 2, // every 2 hours 1 // every day }; + private static Map<AlgorithmConfiguration, Collection<Integer>> cache = new HashMap<>(); private static Map<String, List<TestParameters>> datasets = new HashMap<>(); private static Map<String, InitParams> datasetParams; private static Set<Integer> times; @@ -118,6 +119,18 @@ public final class ComparisonTest { datasets.put(datasetName, dsParams); } + private static Collection<Integer> getResult(final AlgorithmConfiguration key) { + Collection<Integer> result = cache.get(key); + if (result == null) { + final MemoryOutput o1 = AlgorithmHelper.run(key).getOutput(); + result = AlgorithmHelper.getDistinctIds(o1.getLinks()); + + cache.put(key, result); + } + + return result; + } + private static synchronized void initDatasets() { if (datasetParams != null) { return; @@ -171,11 +184,9 @@ public final class ComparisonTest { final Collection<TestParameters> dsParams = datasets.get(dsName); for (final TestParameters params : dsParams) { LOGGER.debug(" - comparing for isochrone duration: " + params.getDuration()); - final MemoryOutput o1 = AlgorithmHelper.run(clazz1, params, expireNodes).getOutput(); - final MemoryOutput o2 = AlgorithmHelper.run(clazz2, params, expireNodes).getOutput(); - final Collection<Integer> l1 = AlgorithmHelper.getDistinctIds(o1.getLinks()); - final Collection<Integer> l2 = AlgorithmHelper.getDistinctIds(o2.getLinks()); - Assert.assertEquals(l1, l2, "Links for class \"" + n1 + "\"" + " != links for class \"" + n2 + "\""); + final Collection<Integer> l1 = getResult(new AlgorithmConfiguration(clazz1, params, expireNodes)); + final Collection<Integer> l2 = getResult(new AlgorithmConfiguration(clazz2, params, expireNodes)); + Assert.assertEquals(l1, l2, "Links from algorithm \"" + n1 + "\"" + " are not equal to links from algorithm \"" + n2 + "\""); } LOGGER.info("-----------------------------"); } diff --git a/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java b/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java index d21771f1..e4d6a105 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/ExpirationTest.java @@ -59,7 +59,7 @@ public class ExpirationTest { private static int run(final Class<? extends Isochrone> algorithmClass, final boolean expireNodes) { LOGGER.info("Executing \"" + algorithmClass.getSimpleName() + "\"" + ((expireNodes) ? " (with node expiration)" : "")); final long startTime = Calendar.getInstance().getTimeInMillis(); - final AlgorithmResult result = AlgorithmHelper.run(algorithmClass, TEST_PARAMETER, expireNodes); + final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(algorithmClass, TEST_PARAMETER, expireNodes)); final long runTime = Calendar.getInstance().getTimeInMillis() - startTime; final int nrNodesMemory = result.getAlgorithm().getNodes().size(); 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 4619ab33..91c0b5d6 100644 --- a/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java +++ b/src/test/java/it/unibz/inf/isochrone/network/ReachabilityTest.java @@ -46,7 +46,7 @@ public class ReachabilityTest { final int nodeIdToCheck = 5117; // bus station id = 5117; Defregger Str./Fagenstraße (reachable by bus route 1) LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)"); - final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true); + final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(MineX.class, PARAM_LOCAL, true)); final Collection<Node> resultNodes = result.getOutput().getNodes(); LOGGER.info(" - found " + resultNodes.size() + " reachable nodes"); @@ -66,7 +66,7 @@ public class ReachabilityTest { final int nodeIdToCheck = 5117; // bus station id = 5117; Defregger Str./Fagenstraße (reachable by bus route 1) LOGGER.info("Checking nodes from FUB (15min isncoming isochrone)"); - final AlgorithmResult result = AlgorithmHelper.run(MineX.class, PARAM_LOCAL, true); + final AlgorithmResult result = AlgorithmHelper.run(new AlgorithmConfiguration(MineX.class, PARAM_LOCAL, true)); final Collection<Link> resultLinks = result.getOutput().getLinks(); LOGGER.info(" - found " + resultLinks.size() + " links"); -- GitLab