Program Listing for File cmb_datasummary.h

Return to documentation for file (include/cmb_datasummary.h)

#ifndef CIMBA_CMB_DATASUMMARY_H
#define CIMBA_CMB_DATASUMMARY_H

#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>

#include "cmb_assert.h"

#include "cmi_memutils.h"

struct cmb_datasummary {
    uint64_t cookie;
    uint64_t count;
    double min;
    double max;
    double m1;
    double m2;
    double m3;
    double m4;
};

extern struct cmb_datasummary *cmb_datasummary_create(void);

extern void cmb_datasummary_destroy(struct cmb_datasummary *dsp);

extern void cmb_datasummary_initialize(struct cmb_datasummary *dsp);

extern void cmb_datasummary_reset(struct cmb_datasummary *dsp);

extern void cmb_datasummary_terminate(struct cmb_datasummary *dsp);

extern uint64_t cmb_datasummary_add(struct cmb_datasummary *dsp, double y);

extern uint64_t cmb_datasummary_merge(struct cmb_datasummary *tgt,
                                      const struct cmb_datasummary *dsp1,
                                      const struct cmb_datasummary *dsp2);

[[maybe_unused]]
static inline uint64_t cmb_datasummary_count(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    return dsp->count;
}

[[maybe_unused]]
static inline double cmb_datasummary_max(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    return dsp->max;
}

[[maybe_unused]]
static inline double cmb_datasummary_min(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    return dsp->min;
}

[[maybe_unused]]
static inline double cmb_datasummary_mean(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    return dsp->m1;
}

[[maybe_unused]]
static inline double cmb_datasummary_variance(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    double r = 0.0;
    if (dsp->count > 1) {
        r = dsp->m2 / (double)(dsp->count - 1u);
    }

    cmb_assert_debug(r >= 0.0);

    return r;
}

[[maybe_unused]]
static inline double cmb_datasummary_stddev(const struct cmb_datasummary *dsp)
{
    cmb_assert_release(dsp != NULL);
    cmb_assert_release(dsp->cookie == CMI_INITIALIZED);

    return sqrt(cmb_datasummary_variance(dsp));
}

extern double cmb_datasummary_skewness(const struct cmb_datasummary *dsp);

extern double cmb_datasummary_kurtosis(const struct cmb_datasummary *dsp);

extern void cmb_datasummary_print(const struct cmb_datasummary *dsp,
                              FILE *fp,
                              bool lead_ins);

#endif /* CIMBA_CMB_DATASUMMARY_H */