mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-09-24 06:54:59 +02:00
157 lines
4.4 KiB
C
157 lines
4.4 KiB
C
|
|
||
|
/**
|
||
|
* \file prob_distr.h
|
||
|
*
|
||
|
* \brief Header for prob_distr.c
|
||
|
**/
|
||
|
|
||
|
#ifndef TOR_PROB_DISTR_H
|
||
|
#define TOR_PROB_DISTR_H
|
||
|
|
||
|
#include "lib/cc/compat_compiler.h"
|
||
|
#include "lib/cc/torint.h"
|
||
|
#include "lib/testsupport/testsupport.h"
|
||
|
|
||
|
/**
|
||
|
* Container for distribution parameters for sampling, CDF, &c.
|
||
|
*/
|
||
|
struct dist {
|
||
|
const struct dist_ops *ops;
|
||
|
};
|
||
|
|
||
|
#define DIST_BASE(OPS) { .ops = (OPS) }
|
||
|
|
||
|
struct dist_ops {
|
||
|
const char *name;
|
||
|
double (*sample)(const struct dist *);
|
||
|
double (*cdf)(const struct dist *, double x);
|
||
|
double (*sf)(const struct dist *, double x);
|
||
|
double (*icdf)(const struct dist *, double p);
|
||
|
double (*isf)(const struct dist *, double p);
|
||
|
};
|
||
|
|
||
|
/* Geometric distribution */
|
||
|
|
||
|
double geometric_sample(double p);
|
||
|
|
||
|
/* Pareto distribution */
|
||
|
|
||
|
struct genpareto {
|
||
|
struct dist base;
|
||
|
double mu;
|
||
|
double sigma;
|
||
|
double xi;
|
||
|
};
|
||
|
|
||
|
double genpareto_sample(const struct dist *dist);
|
||
|
double genpareto_cdf(const struct dist *dist, double x);
|
||
|
double genpareto_sf(const struct dist *dist, double x);
|
||
|
double genpareto_icdf(const struct dist *dist, double p);
|
||
|
double genpareto_isf(const struct dist *dist, double p);
|
||
|
|
||
|
extern const struct dist_ops genpareto_ops;
|
||
|
|
||
|
/* Weibull distribution */
|
||
|
|
||
|
struct weibull {
|
||
|
struct dist base;
|
||
|
double lambda;
|
||
|
double k;
|
||
|
};
|
||
|
|
||
|
double weibull_sample(const struct dist *dist);
|
||
|
double weibull_cdf(const struct dist *dist, double x);
|
||
|
double weibull_sf(const struct dist *dist, double x);
|
||
|
double weibull_icdf(const struct dist *dist, double p);
|
||
|
double weibull_isf(const struct dist *dist, double p);
|
||
|
|
||
|
extern const struct dist_ops weibull_ops;
|
||
|
|
||
|
/* Log-logistic distribution */
|
||
|
|
||
|
struct log_logistic {
|
||
|
struct dist base;
|
||
|
double alpha;
|
||
|
double beta;
|
||
|
};
|
||
|
|
||
|
double log_logistic_sample(const struct dist *dist);
|
||
|
double log_logistic_cdf(const struct dist *dist, double x);
|
||
|
double log_logistic_sf(const struct dist *dist, double x);
|
||
|
double log_logistic_icdf(const struct dist *dist, double p);
|
||
|
double log_logistic_isf(const struct dist *dist, double p);
|
||
|
|
||
|
extern const struct dist_ops log_logistic_ops;
|
||
|
|
||
|
/* Logistic distribution */
|
||
|
|
||
|
struct logistic {
|
||
|
struct dist base;
|
||
|
double mu;
|
||
|
double sigma;
|
||
|
};
|
||
|
|
||
|
double logistic_sample(const struct dist *dist);
|
||
|
double logistic_cdf(const struct dist *dist, double x);
|
||
|
double logistic_sf(const struct dist *dist, double x);
|
||
|
double logistic_icdf(const struct dist *dist, double p);
|
||
|
double logistic_isf(const struct dist *dist, double p);
|
||
|
|
||
|
extern const struct dist_ops logistic_ops;
|
||
|
|
||
|
/* Uniform distribution */
|
||
|
|
||
|
struct uniform {
|
||
|
struct dist base;
|
||
|
double a;
|
||
|
double b;
|
||
|
};
|
||
|
|
||
|
double uniform_sample(const struct dist *dist);
|
||
|
double uniform_cdf(const struct dist *dist, double x);
|
||
|
double uniform_sf(const struct dist *dist, double x);
|
||
|
double uniform_icdf(const struct dist *dist, double p);
|
||
|
double uniform_isf(const struct dist *dist, double p);
|
||
|
|
||
|
extern const struct dist_ops uniform_ops;
|
||
|
|
||
|
/** Only by unittests */
|
||
|
|
||
|
#ifdef PROB_DISTR_PRIVATE
|
||
|
|
||
|
STATIC double logithalf(double p0);
|
||
|
STATIC double logit(double p);
|
||
|
|
||
|
STATIC double random_uniform_01(void);
|
||
|
|
||
|
STATIC double logistic(double x);
|
||
|
STATIC double cdf_logistic(double x, double mu, double sigma);
|
||
|
STATIC double sf_logistic(double x, double mu, double sigma);
|
||
|
STATIC double icdf_logistic(double p, double mu, double sigma);
|
||
|
STATIC double isf_logistic(double p, double mu, double sigma);
|
||
|
STATIC double sample_logistic(uint32_t s, double t, double p0);
|
||
|
|
||
|
STATIC double cdf_log_logistic(double x, double alpha, double beta);
|
||
|
STATIC double sf_log_logistic(double x, double alpha, double beta);
|
||
|
STATIC double icdf_log_logistic(double p, double alpha, double beta);
|
||
|
STATIC double isf_log_logistic(double p, double alpha, double beta);
|
||
|
STATIC double sample_log_logistic(uint32_t s, double p0);
|
||
|
|
||
|
STATIC double cdf_weibull(double x, double lambda, double k);
|
||
|
STATIC double sf_weibull(double x, double lambda, double k);
|
||
|
STATIC double icdf_weibull(double p, double lambda, double k);
|
||
|
STATIC double isf_weibull(double p, double lambda, double k);
|
||
|
STATIC double sample_weibull(uint32_t s, double p0, double lambda, double k);
|
||
|
|
||
|
STATIC double sample_uniform_interval(double p0, double a, double b);
|
||
|
|
||
|
STATIC double cdf_genpareto(double x, double mu, double sigma, double xi);
|
||
|
STATIC double sf_genpareto(double x, double mu, double sigma, double xi);
|
||
|
STATIC double icdf_genpareto(double p, double mu, double sigma, double xi);
|
||
|
STATIC double isf_genpareto(double p, double mu, double sigma, double xi);
|
||
|
STATIC double sample_genpareto(uint32_t s, double p0, double xi);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|