diff --git a/home.md b/home.md
index fcf92b4e25f..e9f66c2858d 100644
--- a/home.md
+++ b/home.md
@@ -134,7 +134,6 @@ SAP is at the center of today’s technology revolution, developing innovations
## Projects
* [[Analytics on a stick|wiki/projects/analytics-on-a-stick]]
-* [[Cloud Orchestrator|wiki/projects/cloud-orchestrator]]
## Events and Planning
* [[Project Planning (bigger development)|wiki/events/planning]]
diff --git a/java/com.sap.sailing.dashboards.gwt/GWT Dashboards DevMode.launch b/java/com.sap.sailing.dashboards.gwt/GWT Dashboards DevMode.launch
index 5f6bb31e343..a5d93d85fd1 100644
--- a/java/com.sap.sailing.dashboards.gwt/GWT Dashboards DevMode.launch
+++ b/java/com.sap.sailing.dashboards.gwt/GWT Dashboards DevMode.launch
@@ -1,51 +1,51 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/com.sap.sailing.dashboards.gwt/GWT Dashboards SDM.launch b/java/com.sap.sailing.dashboards.gwt/GWT Dashboards SDM.launch
index 4763ab7a0dc..bdcd731ab96 100644
--- a/java/com.sap.sailing.dashboards.gwt/GWT Dashboards SDM.launch
+++ b/java/com.sap.sailing.dashboards.gwt/GWT Dashboards SDM.launch
@@ -1,52 +1,52 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/streamlets/Swarm.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/streamlets/Swarm.java
index fca73c5dab8..c3315dc9a95 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/streamlets/Swarm.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/streamlets/Swarm.java
@@ -72,6 +72,12 @@ public class Swarm implements TimeListener {
private final ColorMapper colorMapper;
private boolean clearNextFrame = false;
+
+ /**
+ * For a windfield that has no wind speed spread, e.g. only one wind speed source, this value will be used to define
+ * a {@link ValueRangeFlexibleBoundaries} for this swarm.
+ */
+ private static double WINDSPEED_DEFAULT_SPREAD_IN_KNOTS = 0.1;
public Swarm(FullCanvasOverlay fullcanvas, MapWidget map, com.sap.sse.gwt.client.player.Timer timer,
VectorField vectorField, StreamletParameters streamletPars) {
@@ -346,10 +352,12 @@ public class Swarm implements TimeListener {
}
}
}
- if (Math.abs(maxSpeedInKnots - minSpeedInKnots) <= 0.01 && minSpeedInKnots < maxSpeedInKnots) {
- valueRange.setMinMax(minSpeedInKnots - 0.1, maxSpeedInKnots + 0.1);
- } else if (minSpeedInKnots <= maxSpeedInKnots) {
- valueRange.setMinMax(minSpeedInKnots, maxSpeedInKnots);
+ if (minSpeedInKnots <= maxSpeedInKnots) {
+ if (Math.abs(maxSpeedInKnots - minSpeedInKnots) <= WINDSPEED_DEFAULT_SPREAD_IN_KNOTS) {
+ valueRange.setMinMax(minSpeedInKnots - WINDSPEED_DEFAULT_SPREAD_IN_KNOTS, maxSpeedInKnots + WINDSPEED_DEFAULT_SPREAD_IN_KNOTS);
+ } else {
+ valueRange.setMinMax(minSpeedInKnots, maxSpeedInKnots);
+ }
}
drawSwarm();
return true;
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMarkPassings.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMarkPassings.java
index aa1b8bc9972..602faa6733e 100755
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMarkPassings.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateMarkPassings.java
@@ -1,5 +1,6 @@
package com.sap.sailing.server.operationaltransformation;
+import java.util.ArrayList;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.Competitor;
@@ -8,6 +9,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
+import com.sap.sse.common.Util;
public class UpdateMarkPassings extends AbstractRaceOperation {
private static final long serialVersionUID = 8462323149468755367L;
@@ -19,7 +21,11 @@ public class UpdateMarkPassings extends AbstractRaceOperation {
Iterable markPassings) {
super(raceIdentifier);
this.competitor = competitor;
- this.markPassings = markPassings;
+ // ensure that markPassings is a serializable collection; Iterable could, e.g., also
+ // be a TreeMap.Values collection or similar. See also bug 4746.
+ final ArrayList markPassingsList = new ArrayList<>();
+ Util.addAll(markPassings, markPassingsList);
+ this.markPassings = markPassingsList;
}
@Override
diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/css/CommonControls.css b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/css/CommonControls.css
index ba62f6e3b00..c5c1199b9a4 100644
--- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/css/CommonControls.css
+++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/css/CommonControls.css
@@ -682,7 +682,7 @@ body ::-webkit-scrollbar-track {
}
.gwt-Button, .gwt-Button:visited {
- font-size: 0, 9rem;
+ font-size: 0.9rem;
display: inline-block;
color: #fff;
border: none;
diff --git a/java/com.sap.sse.security.ui/GWT Security DevMode.launch b/java/com.sap.sse.security.ui/GWT Security DevMode.launch
index 8154a68dd9d..18e9479fd03 100644
--- a/java/com.sap.sse.security.ui/GWT Security DevMode.launch
+++ b/java/com.sap.sse.security.ui/GWT Security DevMode.launch
@@ -1,111 +1,111 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/com.sap.sse.security.ui/GWT Security SDM.launch b/java/com.sap.sse.security.ui/GWT Security SDM.launch
index f7b277131fe..c8b77e31b45 100644
--- a/java/com.sap.sse.security.ui/GWT Security SDM.launch
+++ b/java/com.sap.sse.security.ui/GWT Security SDM.launch
@@ -1,112 +1,112 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/CommonPrefixStatsTest.java b/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/CommonPrefixStatsTest.java
new file mode 100755
index 00000000000..79e6a871cc3
--- /dev/null
+++ b/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/CommonPrefixStatsTest.java
@@ -0,0 +1,118 @@
+package com.sap.see.pairinglist.test;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.logging.Logger;
+
+import org.junit.Test;
+
+/**
+ * Constructs randomized number sequences of equal length, for each element in the sequence using a random number
+ * between 0 and a given limit, say {@code c}. The sequences are then ordered numerically, such that two sequences are
+ * equal if all their elements are equal, and with s1 being less than s2 if the first element where s1 and s2 differ is
+ * less for s1. Then, by enumerating the sorted list of sequences, the number of changed elements between the previous
+ * and the next element is counted. This number is then related to the total number of sequence elements produced in the
+ * process. In addition to the {@code c} parameter the process is parameterized by the number of sequences to generate
+ * ({@code i}) and the length of each sequence ({@code f}).
+ *
+ * @author Axel Uhl (d043530)
+ *
+ */
+public class CommonPrefixStatsTest {
+ private static final Logger logger = Logger.getLogger(CommonPrefixStatsTest.class.getName());
+
+ private final Random random = new Random();
+
+ private final Comparator sequenceComparator = (s1, s2)->{
+ for (int i=0; is2[i]) {
+ return 1;
+ } else if (s1[i] generateSeedSequences(int howMany, int maxNumberPlusOne, int sequenceLength) {
+ final List result = new ArrayList<>(howMany);
+ for (int i=0; i generateSortedSeedSequences(int howMany, int maxNumberPlusOne, int sequenceLength) {
+ final List result = generateSeedSequences(howMany, maxNumberPlusOne, sequenceLength);
+ Collections.sort(result, sequenceComparator);
+ return result;
+ }
+
+ private int countChanges(List sequences) {
+ int count;
+ if (sequences.isEmpty()) {
+ count = 0;
+ } else {
+ final Iterator iterator = sequences.iterator();
+ int[] previous = iterator.next();
+ count = previous.length; // the first sequence is all new
+ while (iterator.hasNext()) {
+ final int[] next = iterator.next();
+ count += countChanges(previous, next);
+ previous = next;
+ }
+ }
+ return count;
+ }
+
+ private int countChanges(int[] previous, int[] next) {
+ assert previous.length == next.length;
+ int changesCount = previous.length;
+ while (previous[previous.length-changesCount] == next[next.length-changesCount]) {
+ changesCount--;
+ }
+ return changesCount;
+ }
+
+ private int totalSeeds(List sequences) {
+ return sequences.isEmpty() ? 0 : sequences.size() * sequences.iterator().next().length;
+ }
+
+ public double computeSavingRatio(int howMany, int maxNumberPlusOne, int sequenceLength) {
+ final List sequences = generateSortedSeedSequences(howMany, maxNumberPlusOne, sequenceLength);
+ final int changesInSortedSequences = countChanges(sequences);
+ final int totalSeeds = totalSeeds(sequences);
+ final double savingRatio = 1.-((double) changesInSortedSequences) / (double) totalSeeds;
+ return savingRatio;
+ }
+
+ @Test
+ public void testOneMillionSequencesForFifteenFlightsWithEighteenCompetitors() {
+ final int runs = 3;
+ double savingRatioSum = 0.0;
+ for (int i=0; i0.2);
+ }
+}