Skip to content
Snippets Groups Projects
Commit d82a8a7f authored by Taylor R Campbell's avatar Taylor R Campbell Committed by George Kadianakis
Browse files

Add some more type checking.

NOTE: This commit breaks the build, because there was a mistake in an
earlier change of exactly the sort that this is meant to detect!  I'm
leaving it broken for illustration.
parent 0f8253bd
No related branches found
No related tags found
No related merge requests found
......@@ -541,7 +541,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
// param2 is upper bound, param1 is lower
const struct uniform my_uniform = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(my_uniform),
.a = dist.param1,
.b = dist.param2,
};
......@@ -551,7 +551,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
/* param1 is Mu, param2 is sigma. */
const struct logistic my_logistic = {
.base = DIST_BASE(&uniform_ops),
.base = LOGISTIC(my_uniform),
.mu = dist.param1,
.sigma = dist.param2,
};
......@@ -561,7 +561,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
/* param1 is Alpha, param2 is 1.0/Beta */
const struct log_logistic my_log_logistic = {
.base = DIST_BASE(&log_logistic_ops),
.base = LOG_LOGISTIC(my_log_logistic),
.alpha = dist.param1,
.beta = dist.param2,
};
......@@ -571,7 +571,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
/* param1 is 'p' (success probability) */
const struct geometric my_geometric = {
.base = DIST_BASE(&geometric_ops),
.base = GEOMETRIC(my_geometric),
.p = dist.param1,
};
return dist_sample(&my_geometric.base);
......@@ -580,7 +580,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
/* param1 is k, param2 is Lambda */
const struct weibull my_weibull = {
.base = DIST_BASE(&weibull_ops),
.base = WEIBULL(my_weibull),
.k = dist.param1,
.lambda = dist.param2,
};
......@@ -590,7 +590,7 @@ circpad_distribution_sample(circpad_distribution_t dist)
{
/* param1 is sigma, param2 is xi, no more params for mu so we use 0 */
const struct genpareto my_genpareto = {
.base = DIST_BASE(&weibull_ops),
.base = GENPARETO(my_weibull),
.mu = 0,
.sigma = dist.param1,
.xi = dist.param2,
......
......@@ -20,6 +20,8 @@ struct dist {
};
#define DIST_BASE(OPS) { .ops = (OPS) }
#define DIST_BASE_TYPED(OPS, OBJ, TYPE) \
DIST_BASE((OPS) + 0*sizeof(&(OBJ) - (const TYPE *)&(OBJ)))
const char *dist_name(const struct dist *);
double dist_sample(const struct dist *);
......@@ -46,6 +48,9 @@ struct geometric {
extern const struct dist_ops geometric_ops;
#define GEOMETRIC(OBJ) \
DIST_BASE_TYPED(&geometric_ops, OBJ, struct geometric)
/* Pareto distribution */
struct genpareto {
......@@ -57,6 +62,9 @@ struct genpareto {
extern const struct dist_ops genpareto_ops;
#define GENPARETO(OBJ) \
DIST_BASE_TYPED(&genpareto_ops, OBJ, struct genpareto)
/* Weibull distribution */
struct weibull {
......@@ -67,6 +75,9 @@ struct weibull {
extern const struct dist_ops weibull_ops;
#define WEIBULL(OBJ) \
DIST_BASE_TYPED(&weibull_ops, OBJ, struct weibull)
/* Log-logistic distribution */
struct log_logistic {
......@@ -77,6 +88,9 @@ struct log_logistic {
extern const struct dist_ops log_logistic_ops;
#define LOG_LOGISTIC(OBJ) \
DIST_BASE_TYPED(&log_logistic_ops, OBJ, struct log_logistic)
/* Logistic distribution */
struct logistic {
......@@ -87,6 +101,9 @@ struct logistic {
extern const struct dist_ops logistic_ops;
#define LOGISTIC(OBJ) \
DIST_BASE_TYPED(&logistic_ops, OBJ, struct logistic)
/* Uniform distribution */
struct uniform {
......@@ -97,6 +114,9 @@ struct uniform {
extern const struct dist_ops uniform_ops;
#define UNIFORM(OBJ) \
DIST_BASE_TYPED(&uniform_ops, OBJ, struct uniform)
/** Only by unittests */
#ifdef PROB_DISTR_PRIVATE
......
......@@ -943,7 +943,7 @@ static bool
test_stochastic_geometric_impl(double p)
{
const struct geometric geometric = {
.base = DIST_BASE(&geometric_ops),
.base = GEOMETRIC(geometric),
.p = p,
};
double logP[PSI_DF] = {0};
......@@ -1151,32 +1151,32 @@ test_stochastic_uniform(void *arg)
(void) arg;
const struct uniform uniform01 = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform01),
.a = 0,
.b = 1,
};
const struct uniform uniform_pos = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform_pos),
.a = 1.23,
.b = 4.56,
};
const struct uniform uniform_neg = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform_neg),
.a = -10,
.b = -1,
};
const struct uniform uniform_cross = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform_cross),
.a = -1.23,
.b = 4.56,
};
const struct uniform uniform_subnormal = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform_subnormal),
.a = 4e-324,
.b = 4e-310,
};
const struct uniform uniform_subnormal_cross = {
.base = DIST_BASE(&uniform_ops),
.base = UNIFORM(uniform_subnormal_cross),
.a = -4e-324,
.b = 4e-310,
};
......@@ -1202,7 +1202,7 @@ static bool
test_stochastic_logistic_impl(double mu, double sigma)
{
const struct logistic dist = {
.base = DIST_BASE(&logistic_ops),
.base = LOGISTIC(dist),
.mu = mu,
.sigma = sigma,
};
......@@ -1215,7 +1215,7 @@ static bool
test_stochastic_log_logistic_impl(double alpha, double beta)
{
const struct log_logistic dist = {
.base = DIST_BASE(&log_logistic_ops),
.base = LOG_LOGISTIC(dist),
.alpha = alpha,
.beta = beta,
};
......@@ -1228,7 +1228,7 @@ static bool
test_stochastic_weibull_impl(double lambda, double k)
{
const struct weibull dist = {
.base = DIST_BASE(&weibull_ops),
.base = WEIBULL(dist),
.lambda = lambda,
.k = k,
};
......@@ -1248,7 +1248,7 @@ static bool
test_stochastic_genpareto_impl(double mu, double sigma, double xi)
{
const struct genpareto dist = {
.base = DIST_BASE(&genpareto_ops),
.base = GENPARETO(dist),
.mu = mu,
.sigma = sigma,
.xi = xi,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment