Use medians
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
use crate::constants;
 | 
			
		||||
use crate::energy::consumption::EnergyConsumption;
 | 
			
		||||
use crate::utils::math_utils::median;
 | 
			
		||||
 | 
			
		||||
pub struct ConsumptionCache {
 | 
			
		||||
    nb_vals: usize,
 | 
			
		||||
@@ -27,13 +28,7 @@ impl ConsumptionCache {
 | 
			
		||||
            return constants::FALLBACK_PRODUCTION_VALUE;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut clone = self.values.clone();
 | 
			
		||||
        clone.sort();
 | 
			
		||||
        let median = clone[clone.len() / 2];
 | 
			
		||||
 | 
			
		||||
        log::info!("Cached consumption: {:?} / Median: {}", self.values, median);
 | 
			
		||||
 | 
			
		||||
        median
 | 
			
		||||
        median(&self.values)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
use crate::app_config::{AppConfig, ConsumptionHistoryType};
 | 
			
		||||
use crate::energy::consumption::EnergyConsumption;
 | 
			
		||||
use crate::utils::math_utils::median;
 | 
			
		||||
use crate::utils::time_utils::day_number;
 | 
			
		||||
 | 
			
		||||
const TIME_INTERVAL: usize = 10;
 | 
			
		||||
@@ -109,14 +110,20 @@ impl ConsumptionHistoryFile {
 | 
			
		||||
        let mut file = Self::open(from, r#type)?;
 | 
			
		||||
        let mut curr_time = from;
 | 
			
		||||
 | 
			
		||||
        let mut intermediate_values = Vec::new();
 | 
			
		||||
        while curr_time < to {
 | 
			
		||||
            if !file.contains_time(curr_time) {
 | 
			
		||||
                file = Self::open(curr_time, r#type)?;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            res.push(file.get_consumption(curr_time)?);
 | 
			
		||||
            intermediate_values.push(file.get_consumption(curr_time)?);
 | 
			
		||||
 | 
			
		||||
            curr_time += interval;
 | 
			
		||||
            if curr_time % interval == from % interval {
 | 
			
		||||
                res.push(median(&intermediate_values));
 | 
			
		||||
                intermediate_values = Vec::new();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            curr_time += TIME_INTERVAL as u64;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Ok(res)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								central_backend/src/utils/math_utils.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								central_backend/src/utils/math_utils.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
use std::ops::Div;
 | 
			
		||||
 | 
			
		||||
pub fn median<E: Div + Copy + Ord>(numbers: &[E]) -> E {
 | 
			
		||||
    let mut numbers = numbers.to_vec();
 | 
			
		||||
    numbers.sort();
 | 
			
		||||
    let mid = numbers.len() / 2;
 | 
			
		||||
    numbers[mid]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,2 +1,3 @@
 | 
			
		||||
pub mod files_utils;
 | 
			
		||||
 pub mod math_utils;
 | 
			
		||||
pub mod time_utils;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user