void test_multinomial(void){ double p[SIZE] = { .1, .2, .3, .4 }; int n[SIZE] = { 0, 0, 0, 0 }; int numdraws = 100; double prob; gsl_ran_multinomial(rng, SIZE, numdraws, p, n); printf("gsl_ran_multinomial\t%d\t", numdraws); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\n"); prob = gsl_ran_multinomial_pdf(SIZE, p, n); printf("gsl_ran_multinomial_pdf\t"); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\t%.12f\n", prob); prob = gsl_ran_multinomial_lnpdf(SIZE, p, n); printf("gsl_ran_multinomial_lnpdf\t"); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\t%.12f\n", prob); }
double multinomial_ll(gsl_vector *v, void *params){ double *pv = ((apop_model*)params)->parameters->vector->data; size_t size = ((apop_model*)params)->parameters->vector->size; unsigned int hv[v->size]; //The GSL wants our hit count in an int*. for (size_t i=0; i < v->size; i ++) hv[i] = gsl_vector_get(v, i); return gsl_ran_multinomial_lnpdf(size, pv, hv); }
CAMLprim value ml_gsl_ran_multinomial_lnpdf(value p, value n) { const size_t K = Double_array_length(p); LOCALARRAY(unsigned int, N, K); double r; register int i; for(i=0; i<K; i++) N[i] = Int_val(Field(n, i)); r = gsl_ran_multinomial_lnpdf(K, Double_array_val(p), N); return copy_double(r); }
double gsl_ran_multinomial_pdf (const size_t K, const double p[], const unsigned int n[]) { return exp (gsl_ran_multinomial_lnpdf (K, p, n)); }