Tor
0.4.7.0-alpha-dev
|
Header for prob_distr.c. More...
#include "lib/cc/compat_compiler.h"
#include "lib/cc/torint.h"
#include "lib/testsupport/testsupport.h"
Go to the source code of this file.
Data Structures | |
struct | dist_t |
struct | dist_ops_t |
struct | geometric_t |
struct | genpareto_t |
struct | weibull_t |
struct | log_logistic_t |
struct | logistic_t |
struct | uniform_t |
Macros | |
#define | DIST_BASE(OPS) { .ops = (OPS) } |
#define | TYPE_CHECK_OBJ(OPS, OBJ, TYPE) (0*sizeof(&(OBJ) - (const TYPE *)&(OBJ))) |
#define | DIST_BASE_TYPED(OPS, OBJ, TYPE) DIST_BASE((OPS) + TYPE_CHECK_OBJ(OPS,OBJ,TYPE)) |
#define | GEOMETRIC(OBJ) DIST_BASE_TYPED(&geometric_ops, OBJ, struct geometric_t) |
#define | GENPARETO(OBJ) DIST_BASE_TYPED(&genpareto_ops, OBJ, struct genpareto_t) |
#define | WEIBULL(OBJ) DIST_BASE_TYPED(&weibull_ops, OBJ, struct weibull_t) |
#define | LOG_LOGISTIC(OBJ) DIST_BASE_TYPED(&log_logistic_ops, OBJ, struct log_logistic_t) |
#define | LOGISTIC(OBJ) DIST_BASE_TYPED(&logistic_ops, OBJ, struct logistic_t) |
#define | UNIFORM(OBJ) DIST_BASE_TYPED(&uniform_ops, OBJ, struct uniform_t) |
Functions | |
const char * | dist_name (const struct dist_t *) |
double | dist_sample (const struct dist_t *) |
double | dist_cdf (const struct dist_t *, double x) |
double | dist_sf (const struct dist_t *, double x) |
double | dist_icdf (const struct dist_t *, double p) |
double | dist_isf (const struct dist_t *, double p) |
Variables | |
const struct dist_ops_t | geometric_ops |
const struct dist_ops_t | genpareto_ops |
const struct dist_ops_t | weibull_ops |
const struct dist_ops_t | log_logistic_ops |
const struct dist_ops_t | logistic_ops |
const struct dist_ops_t | uniform_ops |
Header for prob_distr.c.
Definition in file prob_distr.h.
#define DIST_BASE | ( | OPS | ) | { .ops = (OPS) } |
Untyped initializer element for struct dist_t using the specified struct dist_ops_t pointer. Don't actually use this directly – use the type-specific macro built out of DIST_BASE_TYPED below – but if you did use this directly, it would be something like:
struct weibull mydist = { DIST_BASE(&weibull_ops), .lambda = ..., .k = ..., };
Note there is NO COMPILER FEEDBACK if you accidentally do something like
struct geometric mydist = { DIST_BASE(&weibull_ops), ... };
Definition at line 42 of file prob_distr.h.
#define DIST_BASE_TYPED | ( | OPS, | |
OBJ, | |||
TYPE | |||
) | DIST_BASE((OPS) + TYPE_CHECK_OBJ(OPS,OBJ,TYPE)) |
Typed initializer element for struct dist_t using the specified struct dist_ops_t pointer. Don't actually use this directly – use a type-specific macro built out of it – but if you did use this directly, it would be something like:
struct weibull mydist = { DIST_BASE_TYPED(&weibull_ops, mydist, struct weibull_t), .lambda = ..., .k = ..., };
If you want to define a distribution type, define a canonical set of operations and define a type-specific initializer element like so:
struct foo_t { struct dist_t base; int omega; double tau; double phi; }; struct dist_ops_t foo_ops = ...; #define FOO(OBJ) DIST_BASE_TYPED(&foo_ops, OBJ, struct foo_t)
Then users can do:
struct foo_t mydist = { FOO(mydist), .omega = ..., .tau = ..., .phi = ..., };
If you accidentally write
struct bar_t mydist = { FOO(mydist), ... };
then the compiler will report a type mismatch in the sizeof expression, which otherwise evaporates at runtime.
Definition at line 108 of file prob_distr.h.
#define TYPE_CHECK_OBJ | ( | OPS, | |
OBJ, | |||
TYPE | |||
) | (0*sizeof(&(OBJ) - (const TYPE *)&(OBJ))) |
A compile-time type-checking macro for use with DIST_BASE_TYPED.
This macro works by checking that &OBJ is a pointer type that is the same type (except for qualifiers) as (const TYPE *)&OBJ. It's a C constraint violation (which requires a diagnostic) if two pointers are different types and are subtracted. The sizeof() forces compile-time evaluation, and the multiplication by zero is to discard the result of the sizeof() from the expression.
We define this conditionally to suppress false positives from Coverity, which gets confused by the sizeof business.
Definition at line 59 of file prob_distr.h.
double dist_cdf | ( | const struct dist_t * | dist, |
double | x | ||
) |
Compute the CDF of dist at x.
Definition at line 1345 of file prob_distr.c.
double dist_icdf | ( | const struct dist_t * | dist, |
double | p | ||
) |
Compute the iCDF (Inverse CDF) of dist at x.
Definition at line 1359 of file prob_distr.c.
double dist_isf | ( | const struct dist_t * | dist, |
double | p | ||
) |
Compute the iSF (Inverse Survival function) of dist at x.
Definition at line 1366 of file prob_distr.c.
const char* dist_name | ( | const struct dist_t * | dist | ) |
Generic operations on distributions. These simply defer to the corresponding dist_ops_t function. In the parlance of C++, these call virtual member functions.
Public API for probability distributions:
These are wrapper functions on top of the various probability distribution operations using the generic dist structure.
These are the functions that should be used by consumers of this API. Returns the name of the distribution in dist.
Definition at line 1331 of file prob_distr.c.
double dist_sf | ( | const struct dist_t * | dist, |
double | x | ||
) |
Compute the SF (Survival function) of dist at x.
Definition at line 1352 of file prob_distr.c.