99import net .laprun .sustainability .power .SensorMetadata ;
1010
1111public class OngoingPowerMeasure implements PowerMeasure {
12+ private static final int DEFAULT_SIZE = 32 ;
1213 private final SensorMetadata sensorMetadata ;
13- private final ComponentMeasure [] measures ;
1414 private final long startedAt ;
1515 private final double [] averages ;
1616 private final Set <Integer > nonZeroComponents ;
@@ -20,18 +20,18 @@ public class OngoingPowerMeasure implements PowerMeasure {
2020 private double maxTotal ;
2121 private double accumulatedTotal ;
2222 private int samples ;
23+ private final double [][] measures ;
24+ private long [] timestamps ;
2325
24- public OngoingPowerMeasure (SensorMetadata sensorMetadata , ComponentMeasure . Factory <?> componentMeasureFactory ) {
26+ public OngoingPowerMeasure (SensorMetadata sensorMetadata ) {
2527 this .sensorMetadata = sensorMetadata ;
2628 startedAt = System .currentTimeMillis ();
2729
2830 final var numComponents = sensorMetadata .componentCardinality ();
2931 // we also record the aggregated total for each component participating in the aggregated value
3032 final var measuresNb = numComponents + 1 ;
31- measures = new ComponentMeasure [measuresNb ];
32- for (int i = 0 ; i < measuresNb ; i ++) {
33- measures [i ] = componentMeasureFactory .create ();
34- }
33+ measures = new double [measuresNb ][DEFAULT_SIZE ];
34+ timestamps = new long [DEFAULT_SIZE ];
3535 totalIndex = numComponents ;
3636 averages = new double [measuresNb ];
3737 // we don't need to record the total component as a non-zero component since it's almost never zero and we compute the std dev separately
@@ -58,14 +58,14 @@ public void recordMeasure(double[] components) {
5858 if (componentValue != 0 ) {
5959 nonZeroComponents .add (component );
6060 }
61- measures [ component ]. recordComponentValue (componentValue );
61+ recordComponentValue (component , componentValue );
6262 averages [component ] = averages [component ] == 0 ? componentValue
6363 : (previousSize * averages [component ] + componentValue ) / samples ;
6464 }
6565
6666 // record min / max totals
6767 final var recordedTotal = PowerMeasure .sumOfSelectedComponents (components , totalComponents );
68- measures [ totalIndex ]. recordComponentValue (recordedTotal );
68+ recordComponentValue (totalIndex , recordedTotal );
6969 accumulatedTotal += recordedTotal ;
7070 averages [components .length ] = averages [components .length ] == 0 ? recordedTotal
7171 : (previousSize * averages [components .length ] + recordedTotal ) / samples ;
@@ -77,6 +77,23 @@ public void recordMeasure(double[] components) {
7777 }
7878 }
7979
80+ private void recordComponentValue (int component , double value ) {
81+ final var currentSize = measures [component ].length ;
82+ if (currentSize <= samples ) {
83+ final var newSize = currentSize * 2 ;
84+ for (int index = 0 ; index < measures .length ; index ++) {
85+ final var newArray = new double [newSize ];
86+ System .arraycopy (measures [index ], 0 , newArray , 0 , currentSize );
87+ measures [index ] = newArray ;
88+ }
89+ final var newTimestamps = new long [newSize ];
90+ System .arraycopy (timestamps , 0 , newTimestamps , 0 , currentSize );
91+ timestamps = newTimestamps ;
92+ }
93+ timestamps [component ] = System .currentTimeMillis ();
94+ measures [component ][samples - 1 ] = value ;
95+ }
96+
8097 @ Override
8198 public double total () {
8299 return accumulatedTotal ;
@@ -113,21 +130,23 @@ public StdDev standardDeviations() {
113130 }
114131
115132 private double standardDeviation (int component ) {
116- final var values = measures [component ]. getComponentRawValues () ;
133+ final var values = measures [component ];
117134 if (samples <= 1 ) {
118135 return 0.0 ;
119136 }
120137 final double mean = averages [component ];
121- double geometric_deviation_total = 0.0 ;
122- for (double value : values ) {
123- double deviation = value - mean ;
124- geometric_deviation_total += (deviation * deviation );
138+ double geometricDeviationTotal = 0.0 ;
139+ for (int index = 0 ; index < samples ; index ++ ) {
140+ double deviation = values [ index ] - mean ;
141+ geometricDeviationTotal += (deviation * deviation );
125142 }
126- return FastMath .sqrt (geometric_deviation_total / (samples - 1 ));
143+ return FastMath .sqrt (geometricDeviationTotal / (samples - 1 ));
127144 }
128145
129146 @ Override
130147 public double [] getMeasuresFor (int component ) {
131- return measures [component ].getComponentRawValues ();
148+ final var dest = new double [samples ];
149+ System .arraycopy (measures [component ], 0 , dest , 0 , samples );
150+ return dest ;
132151 }
133152}
0 commit comments