Skip to content

Commit 077b664

Browse files
committed
fix: remove total components from metadata
Fixes #163
1 parent 6718903 commit 077b664

File tree

10 files changed

+56
-91
lines changed

10 files changed

+56
-91
lines changed

analysis/src/test/java/ComputeTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Random;
44
import java.util.random.RandomGenerator;
55

6+
import net.laprun.sustainability.power.SensorUnit;
67
import org.junit.jupiter.api.Test;
78

89
import net.laprun.sustainability.power.SensorMetadata;
@@ -13,9 +14,9 @@
1314

1415
public class ComputeTest {
1516
private final static SensorMetadata metadata = SensorMetadata
16-
.withNewComponent("cp1", null, true, "mW", false)
17-
.withNewComponent("cp2", null, true, "mW", false)
18-
.withNewComponent("cp3", null, true, "mW", false)
17+
.withNewComponent("cp1", null, true, SensorUnit.mW)
18+
.withNewComponent("cp2", null, true, SensorUnit.mW)
19+
.withNewComponent("cp3", null, true, "mW")
1920
.build();
2021

2122
@Test

if-manifest-export/src/test/java/net/laprun/sustainability/power/impactframework/export/IFExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ class IFExporterTest {
1313
public static final String COMPONENT2_NAME = "c2";
1414
public static final String COMPONENT3_NAME = "c3";
1515
private final static SensorMetadata metadata = SensorMetadata
16-
.withNewComponent(COMPONENT1_NAME, "component 1", true, "mW", true)
17-
.withNewComponent(COMPONENT2_NAME, "component 2", true, "mW", true)
18-
.withNewComponent(COMPONENT3_NAME, "component 3", true, "mW", true)
16+
.withNewComponent(COMPONENT1_NAME, "component 1", true, "mW")
17+
.withNewComponent(COMPONENT2_NAME, "component 2", true, "mW")
18+
.withNewComponent(COMPONENT3_NAME, "component 3", true, "mW")
1919
.build();
2020

2121
@Test

measure/src/test/java/net/laprun/sustainability/power/analysis/TotalMeasureProcessorTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class TotalMeasureProcessorTest {
1515
void totalShouldFailIfAllComponentsAreNotCommensurable() {
1616
final var inError = "cp2";
1717
final var metadata = SensorMetadata
18-
.withNewComponent("cp1", null, true, "mW", true)
19-
.withNewComponent(inError, null, true, "mJ", true)
18+
.withNewComponent("cp1", null, true, "mW")
19+
.withNewComponent(inError, null, true, "mJ")
2020
.build();
2121

2222
final var expectedResultUnit = SensorUnit.W;
@@ -29,9 +29,9 @@ void totalShouldFailIfAllComponentsAreNotCommensurable() {
2929
@Test
3030
void testTotal() {
3131
final var metadata = SensorMetadata
32-
.withNewComponent("cp1", null, true, "mW", true)
33-
.withNewComponent("cp2", null, true, "mW", true)
34-
.withNewComponent("cp3", null, true, "mW", true)
32+
.withNewComponent("cp1", null, true, "mW")
33+
.withNewComponent("cp2", null, true, "mW")
34+
.withNewComponent("cp3", null, true, "mW")
3535
.build();
3636

3737
final var m1c1 = 10.0;

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

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,11 @@
1414

1515
public class OngoingPowerMeasureTest {
1616
private final static SensorMetadata metadata = SensorMetadata
17-
.withNewComponent("cp1", null, true, "mW", true)
18-
.withNewComponent("cp2", null, true, "mW", true)
19-
.withNewComponent("cp3", null, true, "mW", true)
17+
.withNewComponent("cp1", null, true, "mW")
18+
.withNewComponent("cp2", null, true, "mW")
19+
.withNewComponent("cp3", null, true, "mW")
2020
.build();
2121

22-
@Test
23-
void checkThatTotalComponentIsProperlyAdded() {
24-
final var metadata = SensorMetadata
25-
.withNewComponent("cp1", null, true, "mW", false)
26-
.withNewComponent("cp2", null, true, "mW", false)
27-
.withNewComponent("cp3", null, true, "mW", false)
28-
.build();
29-
var measure = new OngoingPowerMeasure(metadata);
30-
assertThat(measure.metadata().totalComponents()).isEmpty();
31-
}
32-
3322
@Test
3423
void testBasics() {
3524
final var m1c1 = 10.0;

metadata/src/main/java/net/laprun/sustainability/power/SensorMetadata.java

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.laprun.sustainability.power;
22

33
import java.util.ArrayList;
4-
import java.util.Arrays;
54
import java.util.BitSet;
65
import java.util.Collections;
76
import java.util.Comparator;
@@ -22,9 +21,6 @@ public class SensorMetadata {
2221
private final Map<String, ComponentMetadata> components;
2322
@JsonProperty("documentation")
2423
private final String documentation;
25-
// todo: remove
26-
@JsonProperty("totalComponents")
27-
private final int[] totalComponents;
2824

2925
/**
3026
* Initializes sensor metadata information
@@ -36,24 +32,23 @@ public class SensorMetadata {
3632
*/
3733
public SensorMetadata(List<ComponentMetadata> components, String documentation) {
3834
Objects.requireNonNull(components, "Must provide components");
35+
if (components.isEmpty()) {
36+
throw new IllegalArgumentException("Must provide at least one component");
37+
}
38+
3939
final var cardinality = components.size();
4040
this.components = new HashMap<>(cardinality);
4141
this.documentation = documentation;
4242
final var errors = new Errors();
4343
final var indices = new BitSet(cardinality);
44-
final var totalIndices = new BitSet(cardinality);
45-
final var baseUnit = new SensorUnit[1];
4644
components.forEach(component -> {
4745
// check that index is valid
4846
final var index = component.index;
49-
boolean indexValid = true;
5047
if (index < 0 || index >= cardinality) {
5148
errors.addError(index + " is not a valid index: must be between 0 and " + (cardinality - 1));
52-
indexValid = false;
5349
} else if (indices.get(index)) {
5450
errors.addError("Multiple components are using index " + index + ": "
5551
+ components.stream().filter(cm -> index == cm.index).toList());
56-
indexValid = false;
5752
} else {
5853
// record index as known
5954
indices.set(index);
@@ -78,35 +73,29 @@ public SensorMetadata(List<ComponentMetadata> components, String documentation)
7873
if (errors.hasErrors()) {
7974
throw new IllegalArgumentException(errors.formatErrors());
8075
}
81-
82-
this.totalComponents = totalIndices.stream().toArray();
8376
}
8477

8578
@JsonCreator
86-
SensorMetadata(Map<String, ComponentMetadata> components, String documentation, int[] totalComponents) {
79+
SensorMetadata(Map<String, ComponentMetadata> components, String documentation) {
8780
this.components = components;
8881
this.documentation = documentation;
89-
this.totalComponents = totalComponents;
9082
}
9183

9284
public static SensorMetadata.Builder withNewComponent(String name, String description, boolean isAttributed,
93-
String unitSymbol,
94-
boolean participatesInTotal) {
95-
return new SensorMetadata.Builder().withNewComponent(name, description, isAttributed, unitSymbol, participatesInTotal);
85+
String unitSymbol) {
86+
return new SensorMetadata.Builder().withNewComponent(name, description, isAttributed, unitSymbol);
9687
}
9788

9889
public static SensorMetadata.Builder withNewComponent(String name, String description, boolean isAttributed,
99-
SensorUnit unit,
100-
boolean participatesInTotal) {
101-
return new SensorMetadata.Builder().withNewComponent(name, description, isAttributed, unit, participatesInTotal);
90+
SensorUnit unit) {
91+
return new SensorMetadata.Builder().withNewComponent(name, description, isAttributed, unit);
10292
}
10393

10494
public static SensorMetadata.Builder from(SensorMetadata sensorMetadata) {
10595
final var builder = new Builder();
10696
sensorMetadata.components.values().stream().sorted(Comparator.comparing(ComponentMetadata::index))
10797
.forEach(component -> builder.withNewComponent(component.name, component.description, component.isAttributed,
108-
component.unit,
109-
component.isIncludedInTotal));
98+
component.unit));
11099
return builder;
111100
}
112101

@@ -117,8 +106,7 @@ public String toString() {
117106
.forEach(cm -> sb.append("- ").append(cm).append("\n"));
118107
return "components:\n"
119108
+ sb
120-
+ "documentation: " + documentation + "\n"
121-
+ "totalComponents: " + Arrays.toString(totalComponents);
109+
+ "documentation: " + documentation;
122110
}
123111

124112
/**
@@ -174,15 +162,6 @@ public String documentation() {
174162
return documentation;
175163
}
176164

177-
/**
178-
* Retrieves the indices of the components that can be used to compute a total
179-
*
180-
* @return the indices of the components that can be used to compute a total
181-
*/
182-
public int[] totalComponents() {
183-
return totalComponents;
184-
}
185-
186165
/**
187166
* Retrieves the metadata associated with the specified component index if it exists.
188167
*
@@ -203,16 +182,14 @@ public static class Builder {
203182
private int currentIndex = 0;
204183
private String documentation;
205184

206-
public Builder withNewComponent(String name, String description, boolean isAttributed, String unitSymbol,
207-
boolean isIncludedInTotal) {
185+
public Builder withNewComponent(String name, String description, boolean isAttributed, String unitSymbol) {
208186
components
209-
.add(new ComponentMetadata(name, currentIndex++, description, isAttributed, unitSymbol, isIncludedInTotal));
187+
.add(new ComponentMetadata(name, currentIndex++, description, isAttributed, unitSymbol));
210188
return this;
211189
}
212190

213-
public Builder withNewComponent(String name, String description, boolean isAttributed, SensorUnit unit,
214-
boolean isIncludedInTotal) {
215-
components.add(new ComponentMetadata(name, currentIndex++, description, isAttributed, unit, isIncludedInTotal));
191+
public Builder withNewComponent(String name, String description, boolean isAttributed, SensorUnit unit) {
192+
components.add(new ComponentMetadata(name, currentIndex++, description, isAttributed, unit));
216193
return this;
217194
}
218195

@@ -239,12 +216,8 @@ public SensorMetadata build() {
239216
* attributed share for each process needs to be performed. This is needed because some sensors only provide
240217
* system-wide measures instead of on a per-process basis.
241218
* @param unit a textual representation of the unit used for measures associated with this component (e.g. mW)
242-
* @param isIncludedInTotal whether or not this component takes part in the computation to get a total power consumption
243-
* metric for that sensor. Components that take part of the total computation must use a unit commensurable with
244-
* {@link SensorUnit#W}
245219
*/
246-
public record ComponentMetadata(String name, int index, String description, boolean isAttributed, SensorUnit unit,
247-
boolean isIncludedInTotal) {
220+
public record ComponentMetadata(String name, int index, String description, boolean isAttributed, SensorUnit unit) {
248221

249222
public ComponentMetadata {
250223
if (name == null) {
@@ -255,9 +228,8 @@ public record ComponentMetadata(String name, int index, String description, bool
255228
}
256229
}
257230

258-
public ComponentMetadata(String name, int index, String description, boolean isAttributed, String unitSymbol,
259-
boolean isIncludedInTotal) {
260-
this(name, index, description, isAttributed, SensorUnit.of(unitSymbol), isIncludedInTotal);
231+
public ComponentMetadata(String name, int index, String description, boolean isAttributed, String unitSymbol) {
232+
this(name, index, description, isAttributed, SensorUnit.of(unitSymbol));
261233
}
262234
}
263235
}

metadata/src/test/java/net/laprun/sustainability/power/SensorMetadataTest.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ void shouldFailIfTotalComponentsAreOutOfRange() {
1313
final var name = "comp0";
1414
final var e = assertThrows(IllegalArgumentException.class,
1515
() -> new SensorMetadata(
16-
List.of(new SensorMetadata.ComponentMetadata(name, -1, null, true, SensorUnit.W, true)), ""));
16+
List.of(new SensorMetadata.ComponentMetadata(name, -1, null, true, SensorUnit.W)), ""));
1717
final var message = e.getMessage();
1818
assertTrue(message.contains("range"));
1919
assertTrue(message.contains("-1"));
@@ -23,7 +23,7 @@ void shouldFailIfTotalComponentsAreOutOfRange() {
2323
void shouldFailIfComponentHasNullName() {
2424
final var e = assertThrows(IllegalArgumentException.class,
2525
() -> new SensorMetadata(
26-
List.of(new SensorMetadata.ComponentMetadata(null, -1, null, true, (SensorUnit) null, true)), ""));
26+
List.of(new SensorMetadata.ComponentMetadata(null, -1, null, true, (SensorUnit) null)), ""));
2727
final var message = e.getMessage();
2828
assertTrue(message.contains("Component name cannot be null"));
2929
}
@@ -32,7 +32,7 @@ void shouldFailIfComponentHasNullName() {
3232
void shouldFailIfComponentHasNullUnit() {
3333
final var e = assertThrows(IllegalArgumentException.class,
3434
() -> new SensorMetadata(
35-
List.of(new SensorMetadata.ComponentMetadata("invalid", -1, null, true, (SensorUnit) null, true)), ""));
35+
List.of(new SensorMetadata.ComponentMetadata("invalid", -1, null, true, (SensorUnit) null)), ""));
3636
final var message = e.getMessage();
3737
assertTrue(message.contains("Component unit cannot be null"));
3838
}
@@ -42,8 +42,8 @@ void shouldFailOnDuplicatedComponentNames() {
4242
final var name = "component";
4343
final var e = assertThrows(IllegalArgumentException.class,
4444
() -> new SensorMetadata(List.of(
45-
new SensorMetadata.ComponentMetadata(name, 0, null, true, "mW", false),
46-
new SensorMetadata.ComponentMetadata(name, 1, null, true, "mW", false)), ""));
45+
new SensorMetadata.ComponentMetadata(name, 0, null, true, "mW"),
46+
new SensorMetadata.ComponentMetadata(name, 1, null, true, "mW")), ""));
4747
final var message = e.getMessage();
4848
assertTrue(message.contains(name) && message.contains("0") && message.contains("1"));
4949
}
@@ -52,8 +52,8 @@ void shouldFailOnDuplicatedComponentNames() {
5252
void shouldFailIfComponentsDoNotCoverFullRange() {
5353
final var e = assertThrows(IllegalArgumentException.class,
5454
() -> new SensorMetadata(List.of(
55-
new SensorMetadata.ComponentMetadata("foo", 0, null, true, "mW", false),
56-
new SensorMetadata.ComponentMetadata("component2", 0, null, true, "mW", false)), ""));
55+
new SensorMetadata.ComponentMetadata("foo", 0, null, true, "mW"),
56+
new SensorMetadata.ComponentMetadata("component2", 0, null, true, "mW")), ""));
5757
final var message = e.getMessage();
5858
assertTrue(message.contains("Multiple components are using index 0"));
5959
assertTrue(message.contains("foo"));
@@ -64,8 +64,11 @@ void shouldFailIfComponentsDoNotCoverFullRange() {
6464
@Test
6565
void shouldFailIfNoComponentsAreProvided() {
6666
final var e = assertThrows(NullPointerException.class,
67-
() -> new SensorMetadata(null, ""));
68-
final var message = e.getMessage();
69-
assertTrue(message.contains("Must provide components"));
67+
() -> new SensorMetadata((List<SensorMetadata.ComponentMetadata>) null, ""));
68+
assertEquals("Must provide components", e.getMessage());
69+
70+
final var e2 = assertThrows(IllegalArgumentException.class,
71+
() -> new SensorMetadata(List.of(), ""));
72+
assertEquals("Must provide at least one component", e2.getMessage());
7073
}
7174
}

server/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ private IntelRAPLSensor(SortedMap<String, RAPLFile> files) {
6666
final var metadata = new ArrayList<SensorMetadata.ComponentMetadata>(rawOffset * 2);
6767
int fileNb = 0;
6868
for (String name : files.keySet()) {
69-
metadata.add(new SensorMetadata.ComponentMetadata(name, fileNb, name, false, mW, true));
69+
metadata.add(new SensorMetadata.ComponentMetadata(name, fileNb, name, false, mW));
7070
final var rawName = name + "_uj";
7171
metadata.add(new SensorMetadata.ComponentMetadata(rawName, fileNb + rawOffset,
72-
name + " (raw micro Joule data)", false, µJ, false));
72+
name + " (raw micro Joule data)", false, µJ));
7373
fileNb++;
7474
}
7575
this.metadata = new SensorMetadata(metadata,

server/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/AppleSiliconCPU.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
class AppleSiliconCPU extends CPU {
1212
private static final SensorMetadata.ComponentMetadata cpuComponent = new SensorMetadata.ComponentMetadata(CPU, 0,
13-
"CPU power", true, mW, true);
13+
"CPU power", true, mW);
1414
private static final SensorMetadata.ComponentMetadata gpuComponent = new SensorMetadata.ComponentMetadata(GPU, 1,
15-
"GPU power", true, mW, true);
15+
"GPU power", true, mW);
1616
private static final SensorMetadata.ComponentMetadata aneComponent = new SensorMetadata.ComponentMetadata(ANE, 2,
17-
"Apple Neural Engine power", false, mW, true);
17+
"Apple Neural Engine power", false, mW);
1818
private static final SensorMetadata.ComponentMetadata cpuShareComponent = new SensorMetadata.ComponentMetadata(CPU_SHARE, 3,
19-
"Computed share of CPU", false, decimalPercentage, false);
19+
"Computed share of CPU", false, decimalPercentage);
2020
private static final String COMBINED = "Combined";
2121
private static final String POWER_INDICATOR = " Power: ";
2222
private static final int POWER_INDICATOR_LENGTH = POWER_INDICATOR.length();
@@ -44,7 +44,7 @@ private void addComponentTo(String name, List<SensorMetadata.ComponentMetadata>
4444
break;
4545
default:
4646
final var index = components.size();
47-
components.add(new SensorMetadata.ComponentMetadata(name, index, name, false, mW, true));
47+
components.add(new SensorMetadata.ComponentMetadata(name, index, name, false, mW));
4848
}
4949
}
5050

server/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/IntelCPU.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
class IntelCPU extends CPU {
1313

1414
private static final SensorMetadata.ComponentMetadata packageComponent = new SensorMetadata.ComponentMetadata(PACKAGE, 0,
15-
"Intel energy model derived package power (CPUs+GT+SA)", true, W, true);
15+
"Intel energy model derived package power (CPUs+GT+SA)", true, W);
1616
private static final SensorMetadata.ComponentMetadata cpuShareComponent = new SensorMetadata.ComponentMetadata(CPU_SHARE, 1,
17-
"Computed share of CPU", false, decimalPercentage, false);
17+
"Computed share of CPU", false, decimalPercentage);
1818

1919
@Override
2020
public boolean doneExtractingPowerComponents(String line, HashMap<String, Number> powerComponents) {

server/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
public class TestPowerSensor extends AbstractPowerSensor<MapMeasures> {
1515
public static final String CPU = "cpu";
1616
public static final SensorMetadata DEFAULT = new SensorMetadata(
17-
List.of(new SensorMetadata.ComponentMetadata(CPU, 0, "CPU", true, mW, true)),
17+
List.of(new SensorMetadata.ComponentMetadata(CPU, 0, "CPU", true, mW)),
1818
"Test PowerSensor returning random values for a single 'cpu' component");
1919
private final SensorMetadata metadata;
2020
private boolean started;

0 commit comments

Comments
 (0)