CDF *G(Bernouilli_CDF)(int n, double *weight) { int i; double sum; double *tab; Cdf *bin; bin = new_cdf((n+1)*sizeof(double),"Bernouilli_CDF"); bin->kind = BERNOUILLI; bin->low = 0; bin->spn = n; tab = bin->tab; sum = 0.; for (i = 0; i < n; i++) { tab[i] = sum; sum += weight[i]; } for (i = 1; i < n; i++) tab[i] /= sum; tab[n] = 1.; #ifdef DEBUG printf(" CDF:\n"); for (i = 0; i <= n; i++) printf(" %4d: %10.9f\n",i,tab[i]); #endif return ((CDF *) bin); }
CDF *G(FairCoin_CDF)(int n) { Cdf *bin; bin = new_cdf(sizeof(double),"FairCoin_CDF"); bin->kind = FAIRCOIN; bin->parm3 = n; bin->spn = 0; return ((CDF *) bin); }
CDF *G(Exponential_CDF)(double a) { Cdf *bin; bin = new_cdf(sizeof(double),"Exponential_CDF"); bin->kind = EXPONENTIAL; bin->parm1 = a; bin->spn = 0; return ((CDF *) bin); }
CDF *G(Geometric_CDF)(double p) { Cdf *bin; bin = new_cdf(sizeof(double),"Geometric_CDF"); bin->kind = GEOMETRIC; bin->parm1 = p; bin->spn = 0; return ((CDF *) bin); }
static inline Cdf *copy_cdf(Cdf *cdf) { Cdf *copy = new_cdf(cdf_tsize(cdf),"Copy_CDF"); void *_tab = copy->tab; *copy = *cdf; copy->tab = _tab; if (cdf->tab != NULL) memcpy(copy->tab,cdf->tab,cdf_tsize(cdf)); return (copy); }
CDF *G(Uniform_CDF)(double low, double hgh) { Cdf *bin; bin = new_cdf(sizeof(double),"Uniform_CDF"); bin->kind = UNIFORM; bin->parm1 = low; bin->parm2 = hgh - low; bin->spn = 0; return ((CDF *) bin); }
CDF *G(Normal_CDF)(double mean, double stdev) { Cdf *bin; bin = new_cdf(sizeof(double),"Normal_CDF"); bin->kind = NORMAL; bin->parm1 = mean; bin->parm2 = stdev; bin->spn = 1; if (unorm_defined == 0) { unorm_defined = 1; init_unorm(); } return ((CDF *) bin); }
static inline Cdf *read_cdf(FILE *input) { char name[3]; fread(name,3,1,input); if (strncmp(name,"CDF",3) != 0) return (NULL); Cdf *obj = new_cdf(0,"Read_CDF"); fread(obj,sizeof(Cdf),1,input); obj->tab = NULL; if (cdf_tsize(obj) != 0) { allocate_cdf_tab(obj,cdf_tsize(obj),"Read_CDF"); fread(obj->tab,cdf_tsize(obj),1,input); } return (obj); }
int main() { std::cout << "____________________________________" << std::endl << " Testing transformations from cdf to pdf and inversely" <<std::endl; int zval[5] = {1,2,3,4,5}; double prob[5] = {0.2, 0.3, 0.6, 0.8, 1}; typedef Non_param_pdf<int> Pdf; typedef Categ_non_param_cdf<int> Cdf; Cdf categ_cdf( 5, prob); Pdf pdf(zval, zval+5); cdf_to_pdf(pdf, categ_cdf); for(int i=0; i<=4; i++) std::cout << pdf.prob(i) << " " ; std::cout << std::endl; Cdf back(5); pdf_to_cdf(back,pdf); for(int i=0; i<=4; i++) std::cout << back.prob(i) << " " ; std::cout << std::endl; cdf_to_pdf(pdf, back); for(int i=0; i<=4; i++) std::cout << pdf.prob(i) << " " ; std::cout << std::endl; Pdf new_pdf(categ_cdf); for(int i=0; i<=4; i++) std::cout << new_pdf.prob(i) << " " ; std::cout << std::endl; std::cout << std::endl << "____________________________________" << std::endl << " Testing transformations from cdf to pdf and inversely "<<std::endl; Gaussian_cdf normal(0,1); std::vector<double> range(1000); for(std::vector<double>::iterator it=range.begin(); it!=range.end(); it++) *it = drand48()*100; std::ofstream out1( "uniform.dbg" ); std::copy( range.begin(), range.end(), std::ostream_iterator<double>( out1, "\n" ) ); cdf_transform(range.begin(), range.end(), normal); std::ofstream out2( "nscore.dbg" ); std::copy( range.begin(), range.end(), std::ostream_iterator<double>( out2, "\n" ) ); std::cout << std::endl << "____________________________________" << std::endl << " Testing cdf correction "<<std::endl; double order_relation[5] = {0.2, 0.3, -0.2, 0.1, 1.2}; Cdf bad_cdf(5, order_relation); std::cout << "Is bad cdf ok? " << is_valid_cdf(bad_cdf) << std::endl; make_cdf_valid(bad_cdf); std::cout << "Corrected cdf: " << std::endl; for(int i=0; i<bad_cdf.size(); i++) std::cout << bad_cdf.prob(i) << " " ; std::cout << std::endl; std::cout << std::endl << "____________________________________" << std::endl << " Testing cdf construction "<<std::endl; double val_range[9] = {1,1,1,4,7,12,31,55,60}; double z_values[7] = {1,4,7,12,31,55,60}; Non_param_cdf<> new_cdf( z_values, z_values+7); build_cdf( val_range, val_range+9, new_cdf.z_begin(), new_cdf.z_end(), new_cdf.p_begin() ); Non_param_cdf<>::z_iterator z_it = new_cdf.z_begin(); for( ; z_it != new_cdf.z_end(); z_it++ ) { std::cout << "P( " << *z_it << " ) = " << new_cdf.prob( *z_it ) << std::endl; } std::cout << std::endl; build_cdf( val_range, val_range+9, new_cdf, true ); z_it = new_cdf.z_begin(); for( ; z_it != new_cdf.z_end(); z_it++ ) { std::cout << "P( " << *z_it << " ) = " << new_cdf.prob( *z_it ) << std::endl; } }
CDF *G(Poisson_CDF)(double a) { double *tab; double pek, nxt, sum; double nap; int i, k, c; int low, hgh, spn; Cdf *pois; nap = exp(1.); c = i = k = a; pek = 1.; while (i > 0 || c > 0) if (pek < a && c > 0) { pek *= a; c -= 1; } else { pek /= (nap*i); i -= 1; } #ifdef DEBUG printf("Poisson(%g):\n",a); printf(" Peak at %d : %g\n",k,pek); #endif /* Compute length of non-zero tails on either side of peak */ nxt = pek; for (i = k-1; i >= 0; i--) { nxt *= (i+1.)/a; if (nxt < 1e-50) break; } low = i; nxt = pek; for (i = k+1; 1; i++) { nxt *= a/i; if (nxt < 1e-50) break; } hgh = i-1; spn = hgh - low; #ifdef DEBUG printf(" Span is [%d,%d] of length %d\n",low,hgh,spn+1); #endif /* Allocate Poisson data structure */ pois = new_cdf((spn+1)*sizeof(double),"Poisson_CDF"); pois->kind = POISSON; pois->low = low; pois->spn = spn; tab = pois->tab; /* Compute tails again, this time storing them */ tab[k-low] = pek; nxt = pek; for (i = k-1; i > low; i--) tab[i-low] = nxt *= (i+1.)/a; nxt = pek; for (i = k+1; i <= hgh; i++) tab[i-low] = nxt *= a/i; #ifdef DEBUG if (low >= 0) { sum = (low+1)/a; printf(" Low tail truncated < %g (r = %g)\n",tab[1]/(1.-sum),sum); } sum = a/(hgh+1.); printf(" Hgh tail truncated < %g (r = %g)\n",tab[spn]/(1.-sum),sum); printf(" PDF:\n"); for (i = 1; i <= spn; i++) printf(" %4d: %10.9f\n",low+i,tab[i]); #endif /* Compute cdf and normalize sum */ sum = 0.; for (i = 0; i < spn; i++) { tab[i] = sum; sum += tab[i+1]; } for (i = 1; i < spn; i++) tab[i] /= sum; tab[spn] = 1.; #ifdef DEBUG printf(" CDF:\n"); for (i = 0; i <= spn; i++) printf(" %4d: %10.9f\n",low+i,tab[i]); #endif return ((CDF *) pois); }
CDF *G(Binomial_CDF)(int n, double p) { double *tab; double pek, nxt, sum; double pm1, var; int i, k, c; int low, hgh, spn; Cdf *bin; /* Compute p-value at k = pn */ pm1 = 1.-p; var = p*pm1; k = p*n; if (p <= .5) { pek = 1.; c = i = k-1; while (i >= 2*k-n || c >= 0) { if (pek < n && c >= 0) { pek *= (n-c) / (c+1.); c -= 1; } else if (i >= 0) { pek *= var; i -= 1; } else { pek *= pm1; i -= 1; } } } else { if (k < n) k += 1; pek = 1.; c = i = n-k-1; while (i >= n-2*k || c >= 0) { if (pek < n && c >= 0) { pek *= (n-c) / (c+1.); c -= 1; } else if (i >= 0) { pek *= var; i -= 1; } else { pek *= p; i -= 1; } } } #ifdef DEBUG printf("Binomial(%d,%d):\n",n,p); printf(" Peak at %d : %g\n",k,pek); #endif /* Compute length of non-zero tails on either side of peak */ nxt = pek; for (i = k-1; i >= 0; i--) { nxt *= ((i+1)*pm1)/((n-i)*p); if (nxt < 1e-50) break; } low = i; nxt = pek; for (i = k+1; i <= n; i++) { nxt *= (((n-i)+1)*p)/(i*pm1); if (nxt < 1e-50) break; } hgh = i-1; spn = hgh - low; #ifdef DEBUG printf(" Span is [%d,%d] of length %d\n",low,hgh,spn+1); #endif /* Allocate binomial data structure */ bin = new_cdf((spn+1)*sizeof(double),"Binomial_CDF"); bin->kind = BINOMIAL; bin->low = low; bin->spn = spn; tab = bin->tab; /* Compute tails again, this time storing them */ tab[k-low] += pek; nxt = pek; for (i = k-1; i > low; i--) tab[i-low] = nxt *= ((i+1)*pm1)/((n-i)*p); nxt = pek; for (i = k+1; i <= hgh; i++) tab[i-low] = nxt *= (((n-i)+1)*p)/(i*pm1); #ifdef DEBUG if (low >= 0) { sum = ((low+1)*pm1)/((n-low)*p); printf(" Low tail truncated < %g (r = %g)\n",tab[1]/(1.-sum),sum); } if (hgh < n) { sum = ((n-hgh)*p)/((hgh+1)*pm1); printf(" Hgh tail truncated < %g (r = %g)\n",tab[spn]/(1.-sum),sum); } printf(" PDF:\n"); for (i = 1; i <= spn; i++) printf(" %4d: %10.9f\n",low+i,tab[i]); #endif /* Compute cdf and normalize sum */ sum = 0.; for (i = 0; i < spn; i++) { tab[i] = sum; sum += tab[i+1]; } for (i = 1; i < spn; i++) tab[i] /= sum; tab[spn] = 1.; #ifdef DEBUG printf(" CDF:\n"); for (i = 0; i <= spn; i++) printf(" %4d: %10.9f\n",low+i,tab[i]); #endif return ((CDF *) bin); }