diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java index e239471..e0f4510 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java @@ -6,26 +6,49 @@ import java.util.Optional; import org.lucares.recommind.logs.AxisSettings; import org.lucares.recommind.logs.DataSeries; +import org.lucares.recommind.logs.GnuplotAxis; import org.lucares.recommind.logs.GnuplotSettings; import org.lucares.recommind.logs.LineStyle; -public interface AggregateHandler extends Appender { +public abstract class AggregateHandler implements Appender { + + private GnuplotAxis xAxis = GnuplotAxis.X1; - Aggregate getAggregateType(); + private GnuplotAxis yAxis = GnuplotAxis.Y1; + + public GnuplotAxis getxAxis() { + return xAxis; + } - AxisSettings createXAxisSettings(GnuplotSettings settings, Collection dataSeries); + public void setxAxis(GnuplotAxis xAxis) { + this.xAxis = xAxis; + } + + public GnuplotAxis getyAxis() { + return yAxis; + } + + public void setyAxis(GnuplotAxis yAxis) { + this.yAxis = yAxis; + } + + protected String gnuplotXYAxis() { + return xAxis.getAxisNameForPlots()+yAxis.getAxisNameForPlots(); + } + + abstract Aggregate getAggregateType(); + + abstract AxisSettings createXAxisSettings(GnuplotSettings settings, Collection dataSeries); + + abstract AxisSettings createYAxisSettings(GnuplotSettings settings, Collection dataSeries); + + abstract void addPlot(StringBuilder result, AggregatedData aggregatedData, LineStyle lineStyle, Optional title); + + abstract CustomAggregator createCustomAggregator(Path tmpDir, PlotSettings plotSettings, long fromEpochMilli, + long toEpochMilli); + + protected String gnuplotTitle(Optional title) { - AxisSettings createYAxisSettings(GnuplotSettings settings, Collection dataSeries); - - - - default String gnuplotTitle(Optional title) { - - return title.isPresent() ? "title '"+title.get()+"'": "notitle"; - } - - void addPlot(StringBuilder result, AggregatedData aggregatedData, LineStyle lineStyle, Optional title); - - CustomAggregator createCustomAggregator(Path tmpDir, PlotSettings plotSettings, long fromEpochMilli, long toEpochMilli); - + return title.isPresent() ? "title '" + title.get() + "'" : "notitle"; + } } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java index 7e05411..0dc35b8 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java @@ -9,10 +9,12 @@ import java.util.List; import java.util.Optional; import org.lucares.recommind.logs.DataSeries; +import org.lucares.recommind.logs.GnuplotAxis; import org.lucares.recommind.logs.GnuplotSettings; import org.lucares.recommind.logs.AxisSettings; import org.lucares.utils.CollectionUtils; import org.lucares.utils.CollectionUtils.Compare; +import org.lucares.utils.Preconditions; public class AggregateHandlerCollection { private static final Comparator COMPARATOR = Comparator.comparing(AggregateHandler::getAggregateType); @@ -29,13 +31,23 @@ public class AggregateHandlerCollection { public List getXAxisDefinitions(GnuplotSettings settings, Collection dataSeries) { List result = new ArrayList<>(); for (AggregateHandler handler : aggregateHandlers) { - AxisSettings xaxis = handler.createXAxisSettings(settings, dataSeries); + AxisSettings axis = handler.createXAxisSettings(settings, dataSeries); - final Compare compare = Compare.compare(AxisSettings::getType, xaxis.getType()) - .thenCompare(AxisSettings::getLabel, xaxis.getLabel()); - - if (!CollectionUtils.contains(result, compare)) { - result.add(xaxis); + if (result.isEmpty()) { + result.add(axis); + }else { + final Compare compare = Compare.compare(AxisSettings::getType, axis.getType()); + long count = CollectionUtils.count(result, compare); + if (count == 0) { + Preconditions.checkSmaller(result.size(), 2, "at most two different x-axis are supported"); + final GnuplotAxis mirrorAxis = axis.getAxis().mirrorAxis(); + axis.setAxis(mirrorAxis); + handler.setxAxis(mirrorAxis); + result.add(axis); + } else if (count == 1){ + // already has an axis of this type + // TODO merge axis definitions and use the greater values for: range, ticsIncrement + } } } return result; @@ -44,13 +56,23 @@ public class AggregateHandlerCollection { public List getYAxisDefinitions(GnuplotSettings settings, Collection dataSeries) { List result = new ArrayList<>(); for (AggregateHandler handler : aggregateHandlers) { - AxisSettings axis = handler.createYAxisSettings(settings, dataSeries); + final AxisSettings axis = handler.createYAxisSettings(settings, dataSeries); - final Compare compare = Compare.compare(AxisSettings::getType, axis.getType()) - .thenCompare(AxisSettings::getLabel, axis.getLabel()); - - if (!CollectionUtils.contains(result, compare)) { + if (result.isEmpty()) { result.add(axis); + }else { + final Compare compare = Compare.compare(AxisSettings::getType, axis.getType()); + long count = CollectionUtils.count(result, compare); + if (count == 0) { + Preconditions.checkSmaller(result.size(), 2, "at most two different y-axis are supported"); + final GnuplotAxis mirrorAxis = axis.getAxis().mirrorAxis(); + axis.setAxis(mirrorAxis); + handler.setyAxis(mirrorAxis); + result.add(axis); + } else if (count == 1){ + // already has an axis of this type + // TODO merge axis definitions and use the greater values for: range, ticsIncrement + } } } return result; diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java index a99e7d2..fe23452 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java @@ -12,7 +12,7 @@ import org.lucares.recommind.logs.LineStyle; import org.lucares.recommind.logs.AxisSettings; import org.lucares.recommind.logs.AxisSettings.Type; -public class CumulativeDistributionHandler implements AggregateHandler { +public class CumulativeDistributionHandler extends AggregateHandler { @Override public CustomAggregator createCustomAggregator(final Path tmpDir, PlotSettings plotSettings, @@ -33,7 +33,7 @@ public class CumulativeDistributionHandler implements AggregateHandler { AxisSettings result = new AxisSettings(); result.setLabel("Cumulative Distribution"); result.setType(Type.Number); - result.setAxis(GnuplotAxis.X2); // TODO determine automatically + result.setAxis(GnuplotAxis.X1); // TODO determine automatically result.setFormat("%.0f%%"); result.setTicIncrement(computeTicIncrement(settings)); result.setFrom("0"); @@ -55,9 +55,10 @@ public class CumulativeDistributionHandler implements AggregateHandler { @Override public void addPlot(StringBuilder result, AggregatedData aggregatedData, LineStyle lineStyle, Optional title) { - appendfln(result, "'%s' using 1:2 %s with lines axes x2y1 lw 2 %s, \\", // + appendfln(result, "'%s' using 1:2 %s with lines axes %s lw 2 %s, \\", // aggregatedData.getDataFile().getAbsolutePath(), // gnuplotTitle(title), // + gnuplotXYAxis(), // lineStyle.darker()// ); } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java index 2af4cd3..d2de722 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java @@ -9,17 +9,20 @@ import org.lucares.recommind.logs.GnuplotAxis; import org.lucares.recommind.logs.GnuplotSettings; import org.lucares.recommind.logs.LineStyle; import org.lucares.recommind.logs.AxisSettings; +import org.lucares.recommind.logs.AxisSettings.Type; import org.lucares.recommind.logs.AxisTime; import org.lucares.recommind.logs.DataSeries; -public class ParallelRequestsAggregate implements AggregateHandler { +public class ParallelRequestsAggregate extends AggregateHandler { @Override public AxisSettings createYAxisSettings(GnuplotSettings settings, Collection dataSeries) { final AxisSettings result = new AxisSettings(); result.setLabel("Parallel Requests"); - result.setAxis(GnuplotAxis.Y2); + result.setType(Type.Number); + result.setAxis(GnuplotAxis.Y1); result.setTicsEnabled(true); + result.setFrom("0"); return result; } @@ -31,9 +34,10 @@ public class ParallelRequestsAggregate implements AggregateHandler { @Override public void addPlot(StringBuilder result, AggregatedData aggregatedData, LineStyle lineStyle, Optional title) { - appendfln(result, "'%s' using 1:2 %s with filledcurve axes x1y2 lw 1 %s, \\", // + appendfln(result, "'%s' using 1:2 %s with filledcurve axes %s lw 1 %s, \\", // aggregatedData.getDataFile().getAbsolutePath(), // gnuplotTitle(title), // + gnuplotXYAxis(), // lineStyle.brighter().asGnuplotLineStyle()// ); } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java index 19b7390..95f93d2 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java @@ -11,7 +11,7 @@ import org.lucares.recommind.logs.GnuplotLineType; import org.lucares.recommind.logs.GnuplotSettings; import org.lucares.recommind.logs.LineStyle; -public class ScatterAggregateHandler implements AggregateHandler { +public class ScatterAggregateHandler extends AggregateHandler { @Override public AxisSettings createYAxisSettings(GnuplotSettings settings, Collection dataSeries) { @@ -27,10 +27,11 @@ public class ScatterAggregateHandler implements AggregateHandler { public void addPlot(StringBuilder result, AggregatedData aggregatedData, LineStyle lineStyle, Optional title) { - appendfln(result, "'%s' using 1:2 %s with %s %s, \\", // + appendfln(result, "'%s' using 1:2 %s with %s axes %s %s, \\", // aggregatedData.getDataFile(), // gnuplotTitle(title), // GnuplotLineType.Points, // + gnuplotXYAxis(),// lineStyle// ); } diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java index c80f2ed..b08d72a 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class AxisSettings { public enum Type { - Number, Time + Number, Time, Duration } private String format = ""; @@ -179,7 +179,5 @@ public class AxisSettings { } catch (JsonProcessingException e) { return e.getMessage(); } - } - - + } } diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java index 0a5f290..fde734b 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java @@ -40,6 +40,7 @@ public class AxisTime { public static AxisSettings createYAxis(GnuplotSettings settings, Collection dataSeries) { AxisSettings result = new AxisSettings(); result.setLabel("Duration"); + result.setType(Type.Duration); result.setAxis(GnuplotAxis.Y1); result.setTicsEnabled(true); diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotAxis.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotAxis.java index 4c27581..b60d2c5 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotAxis.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotAxis.java @@ -1,28 +1,43 @@ package org.lucares.recommind.logs; public enum GnuplotAxis { - X1("x", ""), - - X2("x2", "x2"), - - Y1("y", "y"), - - Y2("y2", "y2"); - - private String axis; - private String axisNameForTics; + X1("x", "x1"), - private GnuplotAxis(String axis, String axisNameForTics) { - this.axis = axis; - this.axisNameForTics = axisNameForTics; - } - - @Override - public String toString() { - return axis; - } - - public String getAxisNameForTics() { - return axisNameForTics; + X2("x2", "x2"), + + Y1("y", "y1"), + + Y2("y2", "y2"); + + private String axis; + private String axisNameForPlots; + + private GnuplotAxis(String axis, String axisNameForPlots) { + this.axis = axis; + this.axisNameForPlots = axisNameForPlots; + } + + @Override + public String toString() { + return axis; + } + + public String getAxisNameForPlots() { + return axisNameForPlots; + } + + public GnuplotAxis mirrorAxis() { + switch (this) { + case X1: + return X2; + case X2: + return X1; + case Y1: + return Y2; + case Y2: + return Y1; + default: + throw new IllegalArgumentException("Unexpected value: " + this); } + } } diff --git a/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java b/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java index ad0129a..c1056e3 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java +++ b/pdb-utils/src/main/java/org/lucares/utils/CollectionUtils.java @@ -117,6 +117,17 @@ public class CollectionUtils { } return false; } + + public static long count(Collection collection, final Compare compare) { + long count = 0; + for (T t : collection) { + boolean found = compare.test(t); + if (found ) { + count++; + } + } + return count; + } public static > T removeAll(final T collection, final T remove, final Supplier generator) {