#include #include #include double rtrun(double mu, double sigma,double trunpt, int above) { /* function to draw truncated normal above=1 means from above b=trunpt, a=-inf above=0 means from below a=trunpt, b= +inf */ double FA,FB,rnd,result ; if (above) { FA=0.0; FB=pnorm(((trunpt-mu)/(sigma)),0.0,1.0,1,0); } else { FB=1.0; FA=pnorm(((trunpt-mu)/(sigma)),0.0,1.0,1,0); } GetRNGstate(); rnd=unif_rand(); result = mu + sigma*qnorm((rnd*(FB-FA)+FA),0.0,1.0,1,0); PutRNGstate(); return result; } void choiceset(int *natvar_i, int *nsize_i , int *nset_i, double *xatt, double *gamma, int *cset) { int natvar = *natvar_i; int nsize = *nsize_i; int nset = *nset_i; int i,j,k; int cst; for(i=0;i gamma[k]) k++; else cst = 0; } if(j == (nsize-1)) cst=1; *(cset + i*nsize + j) = cst; } } } void testgam(int *natvar_i, int *nsize_i , int *nset_i, double *xatt, int *y, double *z,double *gamma, int *test) { int natvar = *natvar_i; int nsize = *nsize_i; int nset = *nset_i; int i,j,k; double zmax; int cset; double zz; int yy; *test = 1; i=0; while((i gamma[k]) k++; else cset=0; } yy = *(y+j+i*nsize); if(!cset && yy) *test = 0; zz = *(z+j+i*nsize); if(cset && (zz>zmax)) *test = 0; if(j==(nsize-1)) *test = 1; j++; } i++; } } void getbounds(int n,double *z, int *c, int *y, double *zc, double *zy) { *zc = -1000; int k; for(k=0;k (*zc))) *zc = z[k]; } } } void drawz(int *nsize_i, int *nset_i, double *v, int *y, int *c, double *z) { int nsize = *nsize_i; int nset = *nset_i; int j,k; double *vt; double *zt; int *ct; int *yt; double zc,zy,zold; GetRNGstate(); for(j=0;jzc) zc = zt[k]; else { if(zold == zc) getbounds(nsize,zt,ct,yt,&zc,&zy); } } } else { zt[k] = vt[k] + norm_rand(); } } } PutRNGstate(); }