/* This will be used by apop_update to send to apop_mcmc below. To set it up, add a more pointer to an array of two models, the prior and likelihood. */ static long double product_ll(apop_data *d, apop_model *m){ apop_model **pl = m->more; gsl_vector *v = apop_data_pack(m->parameters); apop_data_unpack(v, pl[1]->parameters); gsl_vector_free(v); return apop_log_likelihood(m->parameters, pl[0]) + apop_log_likelihood(d, pl[1]); }
static long double product_constraint(apop_data *data, apop_model *m){ apop_model **pl = m->more; gsl_vector *v = apop_data_pack(m->parameters); apop_data_unpack(v, pl[1]->parameters); gsl_vector_free(v); return pl[1]->constraint(data, pl[1]); }
static double one_wishart_row(gsl_vector *in, void *ws_in){ wishartstruct_t *ws = ws_in; gsl_matrix *invparams_dot_data = gsl_matrix_alloc(ws->len, ws->len); apop_data *square= apop_data_alloc(ws->len, ws->len); apop_data_unpack(in, square); double datadet = apop_matrix_determinant(square->matrix); assert(datadet); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1, ws->paraminv, square->matrix, 0, invparams_dot_data); gsl_vector_view diag = gsl_matrix_diagonal(invparams_dot_data); double trace = apop_sum(&diag.vector); gsl_matrix_free(invparams_dot_data); apop_data_free(square); double out= log(datadet) * (ws->df - ws->len -1.)/2. - trace*ws->df/2.; assert(isfinite(out)); return out; }