From 49c8ade5c42842c87038a63367f4f19a21aa8216 Mon Sep 17 00:00:00 2001 From: oblonski Date: Wed, 28 Jun 2017 23:30:14 +0200 Subject: [PATCH 1/3] continuous delivery of snapshots --- .travis.settings.xml | 27 +++++++++++++++++++++++++++ .travis.yml | 17 +++++++++++++++++ pom.xml | 18 ++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 .travis.settings.xml diff --git a/.travis.settings.xml b/.travis.settings.xml new file mode 100644 index 00000000..fd37913e --- /dev/null +++ b/.travis.settings.xml @@ -0,0 +1,27 @@ + + + + + + packagecloud-graphhopper + ${env.PACKAGECLOUD_TOKEN} + + + diff --git a/.travis.yml b/.travis.yml index 2406cbd9..40e6f9fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,3 +4,20 @@ jdk: - oraclejdk7 - oraclejdk8 +deploy: + provider: script + script: "cp .travis.settings.xml $HOME/.m2/settings.xml && mvn deploy" + skip_cleanup: true + on: + tags: true + +# do not install anything instead return true via unix command true +install: true +script: mvn clean test +notifications: + email: + - github@graphhopper.com + +# enable container-based stack +sudo: false + diff --git a/pom.xml b/pom.xml index 2a1147c0..7b669fe8 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ HEAD + github https://github.com/graphhopper/jsprit/issues @@ -81,6 +82,15 @@ + + + + io.packagecloud.maven.wagon + maven-packagecloud-wagon + 0.0.4 + + + src/main/java src/test/java target @@ -180,9 +190,13 @@ + + packagecloud-graphhopper + packagecloud+https://packagecloud.io/graphhopper/jsprit + - ossrh - https://oss.sonatype.org/content/repositories/snapshots + packagecloud-graphhopper + packagecloud+https://packagecloud.io/graphhopper/jsprit From f647884184e7f686870979cf7259cc0587177c08 Mon Sep 17 00:00:00 2001 From: oblonski Date: Thu, 29 Jun 2017 09:58:38 +0200 Subject: [PATCH 2/3] make getMostLikely a static method --- .../core/util/UnassignedJobReasonTracker.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java index 0a999953..65ce40fb 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java @@ -29,6 +29,21 @@ import java.util.*; */ public class UnassignedJobReasonTracker implements JobUnassignedListener { + public static String getMostLikely(Frequency reasons) { + if (reasons == null) return "no reason found"; + Iterator, Long>> entryIterator = reasons.entrySetIterator(); + int maxCount = 0; + String mostLikely = null; + while (entryIterator.hasNext()) { + Map.Entry, Long> entry = entryIterator.next(); + if (entry.getValue() > maxCount) { + Comparable key = entry.getKey(); + mostLikely = key.toString(); + } + } + return mostLikely; + } + Map reasons = new HashMap<>(); Map codesToReason = new HashMap<>(); @@ -141,20 +156,5 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { else return -1; } - private String getMostLikely(Frequency reasons) { - if (reasons == null) return "no reason found"; - Iterator, Long>> entryIterator = reasons.entrySetIterator(); - int maxCount = 0; - String mostLikely = null; - while (entryIterator.hasNext()) { - Map.Entry, Long> entry = entryIterator.next(); - if (entry.getValue() > maxCount) { - Comparable key = entry.getKey(); - mostLikely = key.toString(); - } - } - return mostLikely; - } - } From ecea356c5458c885cf47619b847c201b58136e69 Mon Sep 17 00:00:00 2001 From: oblonski Date: Thu, 29 Jun 2017 12:31:54 +0200 Subject: [PATCH 3/3] improve unassigned reason tracker --- .../core/util/UnassignedJobReasonTracker.java | 71 ++++++++++++------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java index 65ce40fb..03bf7d1d 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java @@ -29,9 +29,9 @@ import java.util.*; */ public class UnassignedJobReasonTracker implements JobUnassignedListener { - public static String getMostLikely(Frequency reasons) { - if (reasons == null) return "no reason found"; - Iterator, Long>> entryIterator = reasons.entrySetIterator(); + public static String getMostLikelyFailedConstraintName(Frequency failedConstraintNamesFrequency) { + if (failedConstraintNamesFrequency == null) return "no reason found"; + Iterator, Long>> entryIterator = failedConstraintNamesFrequency.entrySetIterator(); int maxCount = 0; String mostLikely = null; while (entryIterator.hasNext()) { @@ -44,19 +44,19 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { return mostLikely; } - Map reasons = new HashMap<>(); + Map failedConstraintNamesFrequencyMapping = new HashMap<>(); - Map codesToReason = new HashMap<>(); + Map codesToHumanReadableReason = new HashMap<>(); Map failedConstraintNamesToCode = new HashMap<>(); - Set constraintsToBeIgnored = new HashSet<>(); + Set failedConstraintNamesToBeIgnored = new HashSet<>(); public UnassignedJobReasonTracker() { - codesToReason.put(1, "cannot serve required skill"); - codesToReason.put(2, "cannot be visited within time window"); - codesToReason.put(3, "does not fit into any vehicle due to capacity"); - codesToReason.put(4, "cannot be assigned due to max distance constraint of vehicle"); + codesToHumanReadableReason.put(1, "cannot serve required skill"); + codesToHumanReadableReason.put(2, "cannot be visited within time window"); + codesToHumanReadableReason.put(3, "does not fit into any vehicle due to capacity"); + codesToHumanReadableReason.put(4, "cannot be assigned due to max distance constraint of vehicle"); failedConstraintNamesToCode.put("HardSkillConstraint", 1); failedConstraintNamesToCode.put("VehicleDependentTimeWindowConstraints", 2); @@ -67,24 +67,24 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { } public void ignore(String simpleNameOfConstraint) { - constraintsToBeIgnored.add(simpleNameOfConstraint); + failedConstraintNamesToBeIgnored.add(simpleNameOfConstraint); } @Override public void informJobUnassigned(Job unassigned, Collection failedConstraintNames) { - if (!this.reasons.containsKey(unassigned.getId())) { - this.reasons.put(unassigned.getId(), new Frequency()); + if (!this.failedConstraintNamesFrequencyMapping.containsKey(unassigned.getId())) { + this.failedConstraintNamesFrequencyMapping.put(unassigned.getId(), new Frequency()); } for (String r : failedConstraintNames) { - if (constraintsToBeIgnored.contains(r)) continue; - this.reasons.get(unassigned.getId()).addValue(r); + if (failedConstraintNamesToBeIgnored.contains(r)) continue; + this.failedConstraintNamesFrequencyMapping.get(unassigned.getId()).addValue(r); } } public void put(String simpleNameOfFailedConstraint, int code, String reason) { if (code <= 20) throw new IllegalArgumentException("first 20 codes are reserved internally. choose a code > 20"); - codesToReason.put(code, reason); + codesToHumanReadableReason.put(code, reason); if (failedConstraintNamesToCode.containsKey(simpleNameOfFailedConstraint)) { throw new IllegalArgumentException(simpleNameOfFailedConstraint + " already assigned to code and reason"); } else failedConstraintNamesToCode.put(simpleNameOfFailedConstraint, code); @@ -95,8 +95,18 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { * * @return */ + @Deprecated public Map getReasons() { - return Collections.unmodifiableMap(reasons); + return Collections.unmodifiableMap(failedConstraintNamesFrequencyMapping); + } + + /** + * For each job id, it returns frequency distribution of failed constraints (simple name of constraint) in an unmodifiable map. + * + * @return + */ + public Map getFailedConstraintNamesFrequencyMapping() { + return Collections.unmodifiableMap(failedConstraintNamesFrequencyMapping); } /** @@ -105,7 +115,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { * @return */ public Map getCodesToReason() { - return Collections.unmodifiableMap(codesToReason); + return Collections.unmodifiableMap(codesToHumanReadableReason); } /** @@ -117,6 +127,17 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { return Collections.unmodifiableMap(failedConstraintNamesToCode); } + public int getCode(String failedConstraintName) { + return toCode(failedConstraintName); + } + + public String getHumanReadableReason(int code) { + return getCodesToReason().get(code); + } + + public String getHumanReadableReason(String failedConstraintName) { + return getCodesToReason().get(getCode(failedConstraintName)); + } /** * Returns the most likely reason code i.e. the reason (failed constraint) being observed most often. * @@ -129,9 +150,9 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { * @return */ public int getMostLikelyReasonCode(String jobId) { - if (!this.reasons.containsKey(jobId)) return -1; - Frequency reasons = this.reasons.get(jobId); - String mostLikelyReason = getMostLikely(reasons); + if (!this.failedConstraintNamesFrequencyMapping.containsKey(jobId)) return -1; + Frequency reasons = this.failedConstraintNamesFrequencyMapping.get(jobId); + String mostLikelyReason = getMostLikelyFailedConstraintName(reasons); return toCode(mostLikelyReason); } @@ -142,12 +163,12 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener { * @return */ public String getMostLikelyReason(String jobId) { - if (!this.reasons.containsKey(jobId)) return "no reason found"; - Frequency reasons = this.reasons.get(jobId); - String mostLikelyReason = getMostLikely(reasons); + if (!this.failedConstraintNamesFrequencyMapping.containsKey(jobId)) return "no reason found"; + Frequency reasons = this.failedConstraintNamesFrequencyMapping.get(jobId); + String mostLikelyReason = getMostLikelyFailedConstraintName(reasons); int code = toCode(mostLikelyReason); if (code == -1) return mostLikelyReason; - else return codesToReason.get(code); + else return codesToHumanReadableReason.get(code); } private int toCode(String mostLikelyReason) {