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); + } +}