Skip to content

Commit 76c2bb0

Browse files
committed
feat: add Recorder concept for components that record values
1 parent 9e6af47 commit 76c2bb0

File tree

7 files changed

+54
-77
lines changed

7 files changed

+54
-77
lines changed

analysis/src/main/java/net/laprun/sustainability/power/analysis/Compute.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,32 @@ public enum Compute {
88
;
99

1010
public static double standardDeviation(PowerMeasure measure, int componentIndex) {
11-
return measure.getMeasuresFor(componentIndex).map(values -> {
12-
final var samples = values.length;
13-
if (samples <= 1) {
14-
return 0.0;
15-
}
16-
final double mean = average(measure, componentIndex);
17-
double geometricDeviationTotal = 0.0;
18-
for (double value : values) {
19-
double deviation = value - mean;
20-
geometricDeviationTotal += (deviation * deviation);
21-
}
22-
return FastMath.sqrt(geometricDeviationTotal / (samples - 1));
23-
}).orElse(0.0);
11+
final var measures = measure.getMeasuresFor(componentIndex).toArray();
12+
final var samples = measures.length;
13+
if (samples <= 1) {
14+
return 0.0;
15+
}
16+
final double mean = average(measures);
17+
double geometricDeviationTotal = 0.0;
18+
for (double value : measures) {
19+
double deviation = value - mean;
20+
geometricDeviationTotal += (deviation * deviation);
21+
}
22+
return FastMath.sqrt(geometricDeviationTotal / (samples - 1));
23+
}
24+
25+
public static double average(double[] values) {
26+
if (values == null || values.length == 0) {
27+
return 0.0;
28+
}
29+
double sum = 0.0;
30+
for (double value : values) {
31+
sum += value;
32+
}
33+
return sum / values.length;
2434
}
2535

2636
public static double average(PowerMeasure measure, int componentIndex) {
27-
return measure.getMeasuresFor(componentIndex).map(values -> {
28-
double sum = 0.0;
29-
for (double value : values) {
30-
sum += value;
31-
}
32-
return sum / values.length;
33-
}).orElse(0.0);
37+
return measure.getMeasuresFor(componentIndex).average().orElse(0.0);
3438
}
3539
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.laprun.sustainability.power.analysis;
2+
3+
import java.util.stream.DoubleStream;
4+
5+
public interface Recorder {
6+
DoubleStream measures();
7+
}

measure/src/main/java/net/laprun/sustainability/power/analysis/RegisteredSyntheticComponent.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ public double synthesizeFrom(double[] components, long timestamp) {
2424
public int computedIndex() {
2525
return computedIndex;
2626
}
27+
28+
public SyntheticComponent syntheticComponent() {
29+
return syntheticComponent;
30+
}
2731
}

measure/src/main/java/net/laprun/sustainability/power/measure/OngoingPowerMeasure.java

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
import java.util.Arrays;
55
import java.util.BitSet;
66
import java.util.List;
7-
import java.util.Optional;
87
import java.util.stream.DoubleStream;
9-
import java.util.stream.IntStream;
10-
import java.util.stream.Stream;
118

129
import net.laprun.sustainability.power.SensorMetadata;
1310
import net.laprun.sustainability.power.analysis.Processors;
11+
import net.laprun.sustainability.power.analysis.Recorder;
1412
import net.laprun.sustainability.power.analysis.RegisteredSyntheticComponent;
1513
import net.laprun.sustainability.power.analysis.SyntheticComponent;
1614

@@ -102,40 +100,24 @@ public Duration duration() {
102100
}
103101

104102
@Override
105-
public Optional<double[]> getMeasuresFor(int component) {
106-
return measuresFor(component, samples);
107-
}
108-
109-
Optional<double[]> measuresFor(int component, int upToIndex) {
103+
public DoubleStream getMeasuresFor(int component) {
110104
if (nonZeroComponents.get(component)) {
111-
final var dest = new double[upToIndex];
112-
System.arraycopy(measures[component], 0, dest, 0, upToIndex);
113-
return Optional.of(dest);
105+
return Arrays.stream(measures[component], 0, samples);
114106
} else {
115-
return Optional.empty();
107+
final var match = syntheticComponents.stream()
108+
.filter(rsc -> targetComponentExistsAndIsRecorder(component, rsc))
109+
.map(rsc -> (Recorder) rsc.syntheticComponent())
110+
.findFirst()
111+
.orElse(null);
112+
if (match != null) {
113+
return match.measures();
114+
}
116115
}
116+
return DoubleStream.empty();
117117
}
118118

119-
@Override
120-
public Stream<TimestampedValue> streamTimestampedMeasuresFor(int component, int upToIndex) {
121-
final var componentMeasures = measures[component];
122-
return indicesFor(component, upToIndex)
123-
.mapToObj(index -> new TimestampedValue(timestamps[index], componentMeasures[index]));
124-
}
125-
126-
@Override
127-
public DoubleStream streamMeasuresFor(int component, int upToIndex) {
128-
final var componentMeasures = measures[component];
129-
return indicesFor(component, upToIndex).mapToDouble(index -> componentMeasures[index]);
130-
}
131-
132-
IntStream indicesFor(int component, int upToIndex) {
133-
upToIndex = Math.min(upToIndex, samples - 1);
134-
if (upToIndex >= 0 && nonZeroComponents.get(component)) {
135-
return IntStream.range(0, upToIndex);
136-
} else {
137-
return IntStream.empty();
138-
}
119+
private static boolean targetComponentExistsAndIsRecorder(int component, RegisteredSyntheticComponent rsc) {
120+
return component == rsc.computedIndex() && rsc.syntheticComponent() instanceof Recorder;
139121
}
140122

141123
@Override

measure/src/main/java/net/laprun/sustainability/power/measure/PowerMeasure.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package net.laprun.sustainability.power.measure;
22

33
import java.time.Duration;
4-
import java.util.Optional;
54
import java.util.stream.DoubleStream;
6-
import java.util.stream.Stream;
75

86
import net.laprun.sustainability.power.SensorMetadata;
97
import net.laprun.sustainability.power.analysis.ComponentProcessor;
@@ -26,14 +24,10 @@ static String asString(PowerMeasure measure) {
2624

2725
SensorMetadata metadata();
2826

29-
Optional<double[]> getMeasuresFor(int component);
27+
DoubleStream getMeasuresFor(int component);
3028

3129
TimestampedMeasures getNthTimestampedMeasures(int n);
3230

33-
Stream<TimestampedValue> streamTimestampedMeasuresFor(int component, int upToIndex);
34-
35-
DoubleStream streamMeasuresFor(int component, int upToIndex);
36-
3731
record TimestampedValue(long timestamp, double value) {
3832
}
3933

measure/src/main/java/net/laprun/sustainability/power/measure/StoppedPowerMeasure.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package net.laprun.sustainability.power.measure;
22

33
import java.time.Duration;
4-
import java.util.Optional;
54
import java.util.stream.DoubleStream;
6-
import java.util.stream.Stream;
75

86
import net.laprun.sustainability.power.SensorMetadata;
97

@@ -38,20 +36,8 @@ public SensorMetadata metadata() {
3836
}
3937

4038
@Override
41-
public Optional<double[]> getMeasuresFor(int component) {
42-
return measure.measuresFor(component, samples);
43-
}
44-
45-
@Override
46-
public Stream<TimestampedValue> streamTimestampedMeasuresFor(int component, int upToIndex) {
47-
upToIndex = ensureIndex(upToIndex);
48-
return measure.streamTimestampedMeasuresFor(component, upToIndex);
49-
}
50-
51-
@Override
52-
public DoubleStream streamMeasuresFor(int component, int upToIndex) {
53-
upToIndex = ensureIndex(upToIndex);
54-
return measure.streamMeasuresFor(component, upToIndex);
39+
public DoubleStream getMeasuresFor(int component) {
40+
return measure.getMeasuresFor(component).limit(samples);
5541
}
5642

5743
@Override

measure/src/test/java/net/laprun/sustainability/power/measure/OngoingPowerMeasureTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ void testBasics() {
5252
components[2] = m3c3;
5353
measure.recordMeasure(components);
5454

55-
assertThat(measure.getMeasuresFor(0)).hasValue(new double[] { m1c1, m2c1, m3c1 });
56-
assertThat(measure.getMeasuresFor(1)).hasValue(new double[] { m1c2, m2c2, m3c2 });
55+
assertThat(measure.getMeasuresFor(0)).contains(m1c1, m2c1, m3c1);
56+
assertThat(measure.getMeasuresFor(1)).contains(m1c2, m2c2, m3c2);
5757
assertThat(measure.getMeasuresFor(2)).isEmpty();
5858

5959
var measures = measure.getNthTimestampedMeasures(0);

0 commit comments

Comments
 (0)