1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/include/matstat.h
2018-08-24 18:14:03 +02:00

119 lines
3.0 KiB
C

/*
* Copyright (C) 2018 Eistec AB
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup sys_matstat
*
* The Matstat library uses single pass algorithms to compute statistic measures
* such as mean and variance over many values. The values can be immediately
* discarded after processing, keeping the memory requirement constant
* regardless of how many values need to be processed.
*
* The design goal is to provide basic mathematical statistics operations on
* constrained devices with a "good enough" accuracy to be able to provide some
* descriptive measures of data. For more accurate measures of statistics, use a
* fancier library, or copy the data to a PC.
*
* It is important to know that using integer operations will result in lower
* precision in the computed measures because of truncation.
*
* @{
* @file
* @brief Matstat library declarations
*
* @author Joakim Nohlgård <joakim.nohlgard@eistec.se>
*/
#ifndef MATSTAT_H
#define MATSTAT_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Internal state for computing running statistics
*/
typedef struct {
int64_t sum; /**< Sum of values added */
uint64_t sum_sq; /**< Sum of squared differences */
uint32_t count; /**< Number of values added */
int32_t mean; /**< Mean value */
int32_t min; /**< Minimum value seen */
int32_t max; /**< Maximum value seen */
} matstat_state_t;
/**
* @brief Empty state initializer
*/
#define MATSTAT_STATE_INIT (const matstat_state_t) { \
.sum = 0, \
.sum_sq = 0, \
.count = 0, \
.mean = 0, \
.min = INT32_MAX, \
.max = INT32_MIN, \
}
/**
* @brief Reset state
*
* @param[in] state State struct to clear
*/
void matstat_clear(matstat_state_t *state);
/**
* @brief Add a sample to state
*
* @param[in] state State struct to operate on
* @param[in] value Value to add to the state
*/
void matstat_add(matstat_state_t *state, int32_t value);
/**
* @brief Return the computed mean value of all samples so far
*
* @param[in] state State struct to operate on
*
* @return arithmetic mean
*/
static inline int32_t matstat_mean(const matstat_state_t *state)
{
return state->mean;
}
/**
* @brief Compute the sample variance of all samples so far
*
* @param[in] state State struct to operate on
*
* @return sample variance
*/
uint64_t matstat_variance(const matstat_state_t *state);
/**
* @brief Combine two states
*
* Add the sums and count of @p src and @p dest, take the maximum of the max
* values and minimum of the min values. The result is written to @p dest.
*
* @param[inout] dest destination state struct
* @param[out] src source state struct
*/
void matstat_merge(matstat_state_t *dest, const matstat_state_t *src);
#ifdef __cplusplus
}
#endif
#endif /* MATSTAT_H */
/** @} */