From 1c8f75423265eeda329de6043092a3e488b53f9a Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:47:18 +0100 Subject: [PATCH 01/10] fix: remove output --- .../net/laprun/sustainability/power/measure/Cursor.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java index 9da34d3..bacb995 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java @@ -1,7 +1,6 @@ package net.laprun.sustainability.power.measure; import java.time.Duration; -import java.util.Arrays; public enum Cursor { ; @@ -9,11 +8,8 @@ public enum Cursor { public static PartialCursor cursorOver(long[] timestamps, long timestamp, Duration duration, long initialOffset, long averagePeriodHint) { // adjusted timestamp for modding - System.out.println(Arrays.toString(timestamps)); - System.out.println("timestamp = " + timestamp); final var timestampForDiv = timestamp - initialOffset; final var durationAsMs = duration.toMillis(); - System.out.println("durationAsMs = " + durationAsMs); // cannot find an interval for a timestamp that is before the recording started if (timestampForDiv < 0) { @@ -36,9 +32,7 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati // first, find potential first sample based on timestamp int startIndex = (int) Math.floorDiv(timestampForDiv, averagePeriodHint); - System.out.println("startIndex = " + startIndex); int endIndex = (int) Math.floorDiv(timestampForDiv + durationAsMs, averagePeriodHint); - System.out.println("endIndex = " + endIndex); if (startIndex == endIndex) { final long previousTimestamp = startIndex == 0 ? initialOffset : timestamps[startIndex - 1]; From 1156514c6bcbffa1a2279ceecfd6f3e7d7c3647d Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:48:34 +0100 Subject: [PATCH 02/10] refactor: extract PartialCursor record --- .../sustainability/power/measure/Cursor.java | 40 ------------------ .../power/measure/PartialCursor.java | 41 +++++++++++++++++++ 2 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java index bacb995..7177882 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java @@ -60,44 +60,4 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati return new PartialCursor(startIndex, endIndex, startRatio, endRatio); } - - public record PartialCursor(int startIndex, int endIndex, double firstMeasureRatio, double lastMeasureRatio) { - - public static final PartialCursor empty = new PartialCursor(-1, -1, 0.0, 0.0); - - public double sum(double[] values) { - if (values == null || values.length == 0 || this == empty || values.length < startIndex + endIndex) { - return 0.0; - } - - if (startIndex == endIndex) { - return values[startIndex] * firstMeasureRatio; - } - - double sum = values[startIndex] * firstMeasureRatio; - for (int i = startIndex + 1; i < endIndex; i++) { - sum += values[i]; - } - sum += values[endIndex] * lastMeasureRatio; - - return sum; - } - - public double[] viewOf(double[] values) { - if (values == null || values.length == 0 || this == empty || values.length < startIndex + endIndex) { - return new double[0]; - } - - if (startIndex == endIndex) { - return new double[] { values[startIndex] * firstMeasureRatio }; - } - - final int len = endIndex - startIndex + 1; - final double[] view = new double[len]; - view[0] = values[startIndex] * firstMeasureRatio; - System.arraycopy(values, startIndex + 1, view, 1, len - 1 - 1); - view[len - 1] = values[endIndex] * lastMeasureRatio; - return view; - } - } } diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java new file mode 100644 index 0000000..9dd031c --- /dev/null +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java @@ -0,0 +1,41 @@ +package net.laprun.sustainability.power.measure; + +public record PartialCursor(int startIndex, int endIndex, double firstMeasureRatio, double lastMeasureRatio) { + + public static final PartialCursor empty = new PartialCursor(-1, -1, 0.0, 0.0); + + public double sum(double[] values) { + if (values == null || values.length == 0 || this == empty || values.length <= endIndex) { + return 0.0; + } + + if (startIndex == endIndex) { + return values[startIndex] * firstMeasureRatio; + } + + double sum = values[startIndex] * firstMeasureRatio; + for (int i = startIndex + 1; i < endIndex; i++) { + sum += values[i]; + } + sum += values[endIndex] * lastMeasureRatio; + + return sum; + } + + public double[] viewOf(double[] values) { + if (values == null || values.length == 0 || this == empty || values.length < startIndex + endIndex) { + return new double[0]; + } + + if (startIndex == endIndex) { + return new double[] { values[startIndex] * firstMeasureRatio }; + } + + final int len = endIndex - startIndex + 1; + final double[] view = new double[len]; + view[0] = values[startIndex] * firstMeasureRatio; + System.arraycopy(values, startIndex + 1, view, 1, len - 1 - 1); + view[len - 1] = values[endIndex] * lastMeasureRatio; + return view; + } +} From 90e88e30aef986ed14fad9139df04f6edcc779bd Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:49:01 +0100 Subject: [PATCH 03/10] feat: introduce MeasureBackedCursor record --- .../power/measure/MeasureBackedCursor.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java new file mode 100644 index 0000000..0f0b380 --- /dev/null +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java @@ -0,0 +1,13 @@ +package net.laprun.sustainability.power.measure; + +import net.laprun.sustainability.power.analysis.Recorder; + +public record MeasureBackedCursor(Recorder measure, PartialCursor cursor) { + public double sum() { + return cursor.sum(measure.liveMeasures()); + } + + public double[] view() { + return cursor.viewOf(measure.liveMeasures()); + } +} From 0f59ba2a2a80047a54e337dd9bc778da7bd7c12c Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:49:39 +0100 Subject: [PATCH 04/10] feat: add access to actual measures on Recorder --- .../net/laprun/sustainability/power/analysis/Recorder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/measure/src/main/java/net/laprun/sustainability/power/analysis/Recorder.java b/measure/src/main/java/net/laprun/sustainability/power/analysis/Recorder.java index ac36380..a2169be 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/analysis/Recorder.java +++ b/measure/src/main/java/net/laprun/sustainability/power/analysis/Recorder.java @@ -3,5 +3,9 @@ import java.util.stream.DoubleStream; public interface Recorder { - DoubleStream measures(); + default DoubleStream measures() { + return DoubleStream.of(liveMeasures()); + } + + double[] liveMeasures(); } From 7a650e0513c1262b3c06d3784650e5b65c050a80 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:52:38 +0100 Subject: [PATCH 05/10] feat: add ability to reset the measure --- .../power/measure/OngoingPowerMeasure.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java index fb23065..535bdb5 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java @@ -15,13 +15,13 @@ public class OngoingPowerMeasure extends ProcessorAware implements PowerMeasure { private static final int DEFAULT_SIZE = 32; private final SensorMetadata metadata; - private final long startedAt; private final BitSet nonZeroComponents; - private final double[][] measures; private final List syntheticComponents; + private final long samplePeriod; + private double[][] measures; + private long startedAt; private int samples; private long[] timestamps; - private long samplePeriod; public OngoingPowerMeasure(SensorMetadata metadata, SyntheticComponent... syntheticComponents) { this(metadata, -1, syntheticComponents); @@ -30,11 +30,9 @@ public OngoingPowerMeasure(SensorMetadata metadata, SyntheticComponent... synthe public OngoingPowerMeasure(SensorMetadata metadata, long samplePeriod, SyntheticComponent... syntheticComponents) { super(Processors.empty); - startedAt = System.currentTimeMillis(); - final var numComponents = metadata.componentCardinality(); - measures = new double[numComponents][DEFAULT_SIZE]; - nonZeroComponents = new BitSet(numComponents); - timestamps = new long[DEFAULT_SIZE]; + final int componentCardinality = metadata.componentCardinality(); + nonZeroComponents = new BitSet(componentCardinality); + reset(componentCardinality); this.samplePeriod = samplePeriod; if (syntheticComponents != null) { @@ -52,6 +50,18 @@ public OngoingPowerMeasure(SensorMetadata metadata, long samplePeriod, Synthetic } } + public void reset() { + reset(metadata.componentCardinality()); + } + + private synchronized void reset(int componentCardinality) { + startedAt = System.currentTimeMillis(); + nonZeroComponents.clear(); + measures = new double[componentCardinality][DEFAULT_SIZE]; + timestamps = new long[DEFAULT_SIZE]; + samples = 0; + } + @Override public synchronized int numberOfSamples() { return samples; From 02b66ed49a0857b5f8fdba9268fc6bd3f145523d Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:53:33 +0100 Subject: [PATCH 06/10] feat: add access to underlying measures --- .../power/measure/OngoingPowerMeasure.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java index 535bdb5..97ff9e0 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java @@ -121,8 +121,16 @@ public Duration duration() { @Override public DoubleStream getMeasuresFor(int component) { + final double[] measuresForComponent = getLiveMeasuresFor(component); + if (measuresForComponent == null || measuresForComponent.length == 0) { + return DoubleStream.empty(); + } + return Arrays.stream(measuresForComponent, 0, samples); + } + + public double[] getLiveMeasuresFor(int component) { if (nonZeroComponents.get(component)) { - return Arrays.stream(measures[component], 0, samples); + return measures[component]; } else { final var match = syntheticComponents.stream() .filter(rsc -> targetComponentExistsAndIsRecorder(component, rsc)) @@ -130,10 +138,10 @@ public DoubleStream getMeasuresFor(int component) { .findFirst() .orElse(null); if (match != null) { - return match.measures(); + return match.liveMeasures(); } } - return DoubleStream.empty(); + return new double[0]; } private static boolean targetComponentExistsAndIsRecorder(int component, RegisteredSyntheticComponent rsc) { From 866dd39c44ae853ab986c6dba9dfd24f44e6682f Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:54:22 +0100 Subject: [PATCH 07/10] feat: encapsulate timing information from which to get cursors --- .../power/measure/OngoingPowerMeasure.java | 6 ++++-- .../net/laprun/sustainability/power/measure/Timing.java | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java index 97ff9e0..a16c9d6 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java @@ -158,7 +158,9 @@ public synchronized TimestampedMeasures getNthTimestampedMeasures(int n) { return new TimestampedMeasures(timestamps[n], result); } - public Cursor.PartialCursor getCursorOver(long timestamp, Duration duration) { - return Cursor.cursorOver(timestamps, timestamp, duration, startedAt, samplePeriod); + public Timing timingInfo() { + final var result = new long[timestamps.length]; + System.arraycopy(timestamps, 0, result, 0, timestamps.length); + return new Timing(result, startedAt, samplePeriod); } } diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java new file mode 100644 index 0000000..69c944a --- /dev/null +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java @@ -0,0 +1,9 @@ +package net.laprun.sustainability.power.measure; + +import java.time.Duration; + +public record Timing(long[] timestamps, long startedAt, long samplePeriod) { + public PartialCursor cursorOver(long timestamp, Duration duration) { + return Cursor.cursorOver(timestamps, timestamp, duration, startedAt, samplePeriod); + } +} From 6d36d953cf815cd25c8f40273978d97e4f26d2ff Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:55:14 +0100 Subject: [PATCH 08/10] feat: add access to synthetic components --- .../sustainability/power/measure/OngoingPowerMeasure.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java index a16c9d6..95b19fc 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java @@ -163,4 +163,8 @@ public Timing timingInfo() { System.arraycopy(timestamps, 0, result, 0, timestamps.length); return new Timing(result, startedAt, samplePeriod); } + + public List syntheticComponents() { + return syntheticComponents; + } } From a238924d428c023a9716416809d6fcd965283141 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:56:22 +0100 Subject: [PATCH 09/10] refactor: rename Cursor enum to Cursors --- .../power/measure/{Cursor.java => Cursors.java} | 2 +- .../net/laprun/sustainability/power/measure/Timing.java | 2 +- .../power/measure/{CursorTest.java => CursorsTest.java} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename measure/src/main/java/net/laprun/sustainability/power/measure/{Cursor.java => Cursors.java} (99%) rename measure/src/test/java/net/laprun/sustainability/power/measure/{CursorTest.java => CursorsTest.java} (90%) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java similarity index 99% rename from measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java rename to measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java index 7177882..61f5959 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java @@ -2,7 +2,7 @@ import java.time.Duration; -public enum Cursor { +public enum Cursors { ; public static PartialCursor cursorOver(long[] timestamps, long timestamp, Duration duration, long initialOffset, diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java index 69c944a..7e50d9c 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java @@ -4,6 +4,6 @@ public record Timing(long[] timestamps, long startedAt, long samplePeriod) { public PartialCursor cursorOver(long timestamp, Duration duration) { - return Cursor.cursorOver(timestamps, timestamp, duration, startedAt, samplePeriod); + return Cursors.cursorOver(timestamps, timestamp, duration, startedAt, samplePeriod); } } diff --git a/measure/src/test/java/net/laprun/sustainability/power/measure/CursorTest.java b/measure/src/test/java/net/laprun/sustainability/power/measure/CursorsTest.java similarity index 90% rename from measure/src/test/java/net/laprun/sustainability/power/measure/CursorTest.java rename to measure/src/test/java/net/laprun/sustainability/power/measure/CursorsTest.java index b55f3e1..bc06513 100644 --- a/measure/src/test/java/net/laprun/sustainability/power/measure/CursorTest.java +++ b/measure/src/test/java/net/laprun/sustainability/power/measure/CursorsTest.java @@ -8,14 +8,14 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -class CursorTest { +class CursorsTest { @ParameterizedTest @ValueSource(longs = { -1, 0, 100, 98, 105 }) void cursorOverSimple(long periodHint) { final var timestamps = new long[] { 100, 200, 300, 400, 500, 600, 700, 800, 900 }; - final var cursor = Cursor.cursorOver(timestamps, 225, Duration.ofMillis(540 - 225), 0, + final var cursor = Cursors.cursorOver(timestamps, 225, Duration.ofMillis(540 - 225), 0, periodHint); assertEquals(2, cursor.startIndex()); @@ -37,7 +37,7 @@ void cursorOverSimple(long periodHint) { void cursorOverOneMeasure() { final var timestamps = new long[] { 100, 200, 300, 400, 500, 600, 700, 800, 900 }; - final var cursor = Cursor.cursorOver(timestamps, 1, Duration.ofMillis(10), 0, + final var cursor = Cursors.cursorOver(timestamps, 1, Duration.ofMillis(10), 0, 100); assertEquals(0, cursor.startIndex()); From 9cff8d49cdc26162e56588950fa20cf8504bb61b Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 5 Feb 2025 14:57:03 +0100 Subject: [PATCH 10/10] refactor: rename PartialCursor to simply Cursor --- .../power/measure/{PartialCursor.java => Cursor.java} | 4 ++-- .../laprun/sustainability/power/measure/Cursors.java | 10 +++++----- .../power/measure/MeasureBackedCursor.java | 2 +- .../laprun/sustainability/power/measure/Timing.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename measure/src/main/java/net/laprun/sustainability/power/measure/{PartialCursor.java => Cursor.java} (86%) diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java similarity index 86% rename from measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java rename to measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java index 9dd031c..1e8634f 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/PartialCursor.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursor.java @@ -1,8 +1,8 @@ package net.laprun.sustainability.power.measure; -public record PartialCursor(int startIndex, int endIndex, double firstMeasureRatio, double lastMeasureRatio) { +public record Cursor(int startIndex, int endIndex, double firstMeasureRatio, double lastMeasureRatio) { - public static final PartialCursor empty = new PartialCursor(-1, -1, 0.0, 0.0); + public static final Cursor empty = new Cursor(-1, -1, 0.0, 0.0); public double sum(double[] values) { if (values == null || values.length == 0 || this == empty || values.length <= endIndex) { diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java index 61f5959..9d23e03 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Cursors.java @@ -5,7 +5,7 @@ public enum Cursors { ; - public static PartialCursor cursorOver(long[] timestamps, long timestamp, Duration duration, long initialOffset, + public static Cursor cursorOver(long[] timestamps, long timestamp, Duration duration, long initialOffset, long averagePeriodHint) { // adjusted timestamp for modding final var timestampForDiv = timestamp - initialOffset; @@ -13,7 +13,7 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati // cannot find an interval for a timestamp that is before the recording started if (timestampForDiv < 0) { - return PartialCursor.empty; + return Cursor.empty; } if (timestamps.length < 2) { @@ -22,7 +22,7 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati if (averagePeriodHint > 0) { ratio = (double) durationAsMs / averagePeriodHint; } - return new PartialCursor(0, 0, ratio, ratio); + return new Cursor(0, 0, ratio, ratio); } // estimate sample period based on 2 samples interval @@ -38,7 +38,7 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati final long previousTimestamp = startIndex == 0 ? initialOffset : timestamps[startIndex - 1]; final long slotDuration = timestamps[startIndex] - previousTimestamp; var ratio = (double) durationAsMs / slotDuration; - return new PartialCursor(startIndex, endIndex, ratio, -1); + return new Cursor(startIndex, endIndex, ratio, -1); } // get the index with the timestamp right after the one we're looking for since what we're interested in is the portion of the measure that gets recorded after the timestamp we want @@ -58,6 +58,6 @@ public static PartialCursor cursorOver(long[] timestamps, long timestamp, Durati endRatio = (double) endOffset / slotDuration; } - return new PartialCursor(startIndex, endIndex, startRatio, endRatio); + return new Cursor(startIndex, endIndex, startRatio, endRatio); } } diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java b/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java index 0f0b380..db52d34 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/MeasureBackedCursor.java @@ -2,7 +2,7 @@ import net.laprun.sustainability.power.analysis.Recorder; -public record MeasureBackedCursor(Recorder measure, PartialCursor cursor) { +public record MeasureBackedCursor(Recorder measure, Cursor cursor) { public double sum() { return cursor.sum(measure.liveMeasures()); } diff --git a/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java index 7e50d9c..e3751ed 100644 --- a/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java +++ b/measure/src/main/java/net/laprun/sustainability/power/measure/Timing.java @@ -3,7 +3,7 @@ import java.time.Duration; public record Timing(long[] timestamps, long startedAt, long samplePeriod) { - public PartialCursor cursorOver(long timestamp, Duration duration) { + public Cursor cursorOver(long timestamp, Duration duration) { return Cursors.cursorOver(timestamps, timestamp, duration, startedAt, samplePeriod); } }