diff options
Diffstat (limited to 'sleepingcelldetector/src/main/java/org/onap/rapp/sleepingcelldetector/service/scd/CalculationUtil.java')
-rw-r--r-- | sleepingcelldetector/src/main/java/org/onap/rapp/sleepingcelldetector/service/scd/CalculationUtil.java | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/sleepingcelldetector/src/main/java/org/onap/rapp/sleepingcelldetector/service/scd/CalculationUtil.java b/sleepingcelldetector/src/main/java/org/onap/rapp/sleepingcelldetector/service/scd/CalculationUtil.java new file mode 100644 index 0000000..95aecae --- /dev/null +++ b/sleepingcelldetector/src/main/java/org/onap/rapp/sleepingcelldetector/service/scd/CalculationUtil.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package org.onap.rapp.sleepingcelldetector.service.scd; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.List; +import java.util.Objects; +import java.util.OptionalDouble; +import java.util.stream.Collectors; + +public class CalculationUtil { + + private static final Logger logger = LoggerFactory.getLogger(CalculationUtil .class); + public static final int MIN_PERCENTAGE_OF_DATA_FILLING = 30; + + private CalculationUtil(){ + } + + public static Integer calculateAverage(List<Integer> values){ + OptionalDouble average = values.stream().mapToDouble(l -> l).average(); + + if (average.isPresent()) { + return (int) average.getAsDouble(); + } else { + throw new ArithmeticException("Can't calculate average"); + } + } + + public static List<Integer> fillGaps(List<Integer> values){ + verifyDataFilling(values); + Integer average = calculateAverage(values.stream().filter(Objects::nonNull).collect(Collectors.toList())); + + for (int i=0; i<values.size(); i++){ + if(values.get(i) == null){ + values.set(i, average); + } + } + return values; + } + + public static void verifyDataFilling(List<Integer> values) { + double measurementsNumber = values.stream().filter(Objects::nonNull).count(); + double listSize = values.size(); + double dataFillingPercentage = measurementsNumber/listSize * 100; + if (dataFillingPercentage < MIN_PERCENTAGE_OF_DATA_FILLING){ + logger.warn("Not enough data to make prediction, must be at least 30%; Data filling: {}%", dataFillingPercentage); + throw new ArithmeticException("Not enough performance data for prediction, data filling: " + dataFillingPercentage + "%"); + } + } + +} |