示例#1
0
文件: gaussian.c 项目: farr/interp
double
gaussian_sample(gsl_rng *rng, double x) {
    double y = x + gsl_rng_uniform(rng) - 0.5;
    double lgx = log_gaussian(x);
    double lgy = log_gaussian(y);
    double log_accept = lgy - lgx; /* Jump distribution is symmetric. */

    if (log(gsl_rng_uniform(rng)) < log_accept) {
        return y;
    } else {
        return x;
    }
}
示例#2
0
文件: dpeta.c 项目: juapebe/HPC
void DP_eta_theta(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r, int pid, int *inuse) {
  int i, j, id, accept, pass;
  float Delta, mhratio, newval, scale, tmp_lambda, tmp;
  scale = prior->gamma_eta[pid] / (1.0 - prior->gamma_eta[pid]);
  if(inuse[pid] == 0) {
    pass = 0;
    while(!pass) {
      newval = 1.0 / gsl_ran_gamma(r, 100.0, 1.0);
      if(newval < 2.0) pass = 1;
    }
    Delta = newval - prior->theta_eta[pid];
    prior->theta_eta[pid] = newval;
  }
  else {
    /* metropolis-hastings */
    mhratio = 0.0;
    Delta = gsl_ran_gaussian(r, 0.1);
    if(prior->theta_eta[pid] + Delta <= 0.0 || prior->theta_eta[pid] + Delta > 2.0) {
      accept = 0;
    }
    else {
      for(i=0;i<data->nprey;i++) {
        if(prior->w_eta[i] == pid) {
          for(j=0;j<data->preyNinter[i];j++) {
            id = data->p2i[i][j];
            if(param->Z[data->a2u[id]] && data->miss[id] == 0) {
              tmp_lambda = param->lambda_true[id];
              tmp = data->d[id];
              mhratio += log_gaussian(tmp, (tmp_lambda), prior->theta_eta[pid]+Delta)
                       - log_gaussian(tmp, (tmp_lambda), prior->theta_eta[pid]);
            }
          }
        }
      }
      mhratio += log_inv_gamma( (prior->theta_eta[pid]+Delta), prior->shape_eta, prior->scale_eta)
               - log_inv_gamma( prior->theta_eta[pid], prior->shape_eta, prior->scale_eta);
      accept = gsl_ran_flat(r, 0.0, 1.0) <= GSL_MIN(1.0, exp(mhratio)) ? 1 : 0 ;
    }

    /* if accepted, update param and lambda */
    if(accept) {
      prior->theta_eta[pid] += Delta;
      for(i=0;i<data->nprey;i++) {
        if(prior->w_eta[i] == pid) {
          param->eta[i] += Delta;
        }
      }
    }
  }
}
示例#3
0
文件: dpalphaIP.c 项目: juapebe/HPC
void DP_alpha_IP_w(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r, int pid) {
  int i,j,id;
  float cur_alpha_IP, tmp_lambda, maxl;
  float prob[_MAX_COMP_];
  for(i=0;i<_MAX_COMP_;i++) prob[i] = log(prior->gamma_alpha_IP[i]);
  cur_alpha_IP = param->alpha_IP[pid];
  for(i=0;i<_MAX_COMP_;i++) {
    for(j=0;j<data->IPNinter[pid];j++) {
      id = data->IP2i[pid][j];
      if(param->Z[data->a2u[id]]) {
        tmp_lambda = param->lambda_true[id] + prior->theta_alpha_IP[i] - cur_alpha_IP;
        prob[i] += log_gaussian(data->d[id], (tmp_lambda), param->eta[data->i2p[id]]);
      }
    }
  }
  maxl = vec_max(prob, _MAX_COMP_);
  for(i=0;i<_MAX_COMP_;i++) prob[i] -= maxl;
  for(i=0;i<_MAX_COMP_;i++) prob[i] = exp(prob[i]);
  prior->w_alpha_IP[pid] = ranMultinom(r, prob, _MAX_COMP_);
  param->alpha_IP[pid] = prior->theta_alpha_IP[prior->w_alpha_IP[pid]];

  for(j=0;j<data->IPNinter[pid];j++) {
    id = data->IP2i[pid][j];
    param->lambda_true[id] += param->alpha_IP[pid] - cur_alpha_IP;
  }
}
示例#4
0
文件: dpmu.c 项目: juapebe/HPC
void DP_mu_theta(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r, int pid, int *inuse) {
  int i, j, id, accept;
  float Delta, mhratio, newval, scale, tmp;
  scale = prior->gamma_mu[pid] / (1.0 - prior->gamma_mu[pid]);
  if(inuse[pid] == 0) {
    newval = gsl_ran_gaussian(r, sqrt(prior->v_mu)) + prior->m_mu;
    Delta = newval - prior->theta_mu[pid];
    prior->theta_mu[pid] = newval;
  }
  else {
    /* metropolis-hastings */
    mhratio = 0.0;
    Delta = gsl_ran_gaussian(r, 1.0);
    for(i=0;i<data->nprey;i++) {
      if(prior->w_mu[i] == pid) {
        for(j=0;j<data->preyNinter[i];j++) {
          id = data->p2i[i][j];
          if(data->ctrl[data->i2IP[id]]) {
            tmp = data->d[id];
            param->lambda_false_tmp[id] = param->lambda_false[id] + Delta;
            mhratio += log_poisson_g_prop(tmp, exp(param->lambda_false_tmp[id]), param->eta0[i]) 
                     - log_poisson_g_prop(tmp, exp(param->lambda_false[id]), param->eta0[i]);
          }
        }
      }
    }
    mhratio += log_gaussian(prior->theta_mu[pid] + Delta, prior->m_mu, prior->v_mu) 
             - log_gaussian(prior->theta_mu[pid], prior->m_mu, prior->v_mu); 
    accept = gsl_ran_flat(r, 0.0, 1.0) <= GSL_MIN(1.0, exp(mhratio)) ? 1 : 0 ;

    /* if accepted, update param and lambda */
    if(accept) {
      prior->theta_mu[pid] += Delta;
      for(i=0;i<data->nprey;i++) {
        if(prior->w_mu[i] == pid) {
          param->mu[i] += Delta;
          for(j=0;j<data->preyNinter[i];j++) {
            id = data->p2i[i][j];
            param->lambda_false[id] += Delta; 
          }
        }
      }
    }
  }
}
示例#5
0
文件: dpalphaIP.c 项目: juapebe/HPC
void DP_alpha_IP_theta(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r, int pid, int *inuse) {
  int i, j, id, accept;
  float Delta, mhratio, newval, scale;
  scale = prior->gamma_alpha_IP[pid] / (1.0 - prior->gamma_alpha_IP[pid]);
  if(inuse[pid] == 0) {
    newval = gsl_ran_gaussian(r, sqrt(prior->v_alpha_IP)) + prior->m_alpha_IP;
    Delta = newval - prior->theta_alpha_IP[pid];
    prior->theta_alpha_IP[pid] = newval;
  }
  else {
    /* metropolis-hastings */
    mhratio = 0.0;
    Delta = gsl_ran_gaussian(r, 0.25);
    for(i=0;i<data->nIP;i++) {
      if(prior->w_alpha_IP[i] == pid) {
        for(j=0;j<data->IPNinter[i];j++) {
          id = data->IP2i[i][j];
          if(param->Z[data->a2u[id]] && data->miss[id] == 0) {
            param->lambda_true_tmp[id] = param->lambda_true[id] + Delta;
            mhratio += log_gaussian(data->d[id], (param->lambda_true_tmp[id]), param->eta[data->i2p[id]]) 
                     - log_gaussian(data->d[id], (param->lambda_true[id]), param->eta[data->i2p[id]]);
          }
        }
      }
    }
    mhratio += log_gaussian(prior->theta_alpha_IP[pid] + Delta, prior->m_alpha_IP, prior->v_alpha_IP) 
             - log_gaussian(prior->theta_alpha_IP[pid], prior->m_alpha_IP, prior->v_alpha_IP); 
    accept = gsl_ran_flat(r, 0.0, 1.0) <= GSL_MIN(1.0, exp(mhratio)) ? 1 : 0 ;

    /* if accepted, update param and lambda */
    if(accept) {
      prior->theta_alpha_IP[pid] += Delta;
      for(i=0;i<data->nIP;i++) {
        if(prior->w_alpha_IP[i] == pid && data->ctrl[i] == 0) {
          param->alpha_IP[i] += Delta;
          for(j=0;j<data->IPNinter[i];j++) {
            id = data->IP2i[i][j];
            param->lambda_true[id] += Delta; 
          }
        }
      }
    }
  }
}
示例#6
0
文件: dpeta.c 项目: juapebe/HPC
void DP_eta_w(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r, int pid) {
  int i,j,id;
  float cur_eta, tmp_lambda, maxl;
  float prob[_MAX_COMP_];
  for(i=0;i<_MAX_COMP_;i++) prob[i] = log(prior->gamma_eta[i]);
  cur_eta = param->eta[pid];
  for(i=0;i<_MAX_COMP_;i++) {
    for(j=0;j<data->preyNinter[pid];j++) {
      id = data->p2i[pid][j];
      if(param->Z[data->a2u[id]]) tmp_lambda = param->lambda_true[id];
      else tmp_lambda = param->lambda_false[id];
      prob[i] += log_gaussian(data->d[id], (tmp_lambda), prior->theta_eta[i]);
    }
  }
  maxl = vec_max(prob, _MAX_COMP_);
  for(i=0;i<_MAX_COMP_;i++) prob[i] -= maxl;
  for(i=0;i<_MAX_COMP_;i++) prob[i] = exp(prob[i]);
  prior->w_eta[pid] = ranMultinom(r, prob, _MAX_COMP_);
  param->eta[pid] = prior->theta_eta[prior->w_eta[pid]];
}
示例#7
0
文件: setparam.c 项目: juapebe/HPC
void set_Z(PARAM *param, PRIOR *prior, DATA *data, const gsl_rng *r) {
  /* Z and iZ */
  int i,j,id;
  int indiv, total;
  int isCtrl, isReverse;
  float prob, maxl;
  float posi, negi;
  float pos, neg, tmp;
  for(i=0;i<data->nuinter;i++) {
    isCtrl = 0;
    for(j=0;j<data->n_u2a[i];j++) {
      id = data->u2a[i][j];
      if(data->ctrl[data->i2IP[id]] == 1) {
        isCtrl = 1;
        break;
      }
    }
    isReverse = 0;
    for(j=0;j<data->n_u2a[i];j++) {
      id = data->u2a[i][j];
      if(data->d[id] < param->lambda_false[id]) {
        isReverse = 0;
        break;
      }
    }

    if(isCtrl || isReverse) {
      param->Z[i] = 0;
      for(j=0;j<data->n_u2a[i];j++) {
        id = data->u2a[i][j];
        param->iZ[id] = 0;
      }
    }
    else {
      pos = 0.0; neg = 0.0;
      for(j=0;j<data->n_u2a[i];j++) {
        id = data->u2a[i][j];
        tmp = data->d[id];
        posi = log_gaussian(tmp, param->lambda_true[id], param->eta[data->i2p[id]]);
        negi = log_gaussian(tmp, param->lambda_false[id], param->eta0[data->i2p[id]]);
        pos += posi;
        neg += negi;
        maxl = posi > negi ? posi : negi;
        posi -= maxl;
        negi -= maxl;
        prob = param->ptrue * exp(posi) / (param->ptrue * exp(posi) + (1.0-param->ptrue) * exp(negi));
        param->iZ[id] = gsl_ran_flat(r,0.0,1.0) <= prob ? 1 : 0;
      }
      /* Z */
      if(data->n_u2a[i] == 1) {
        id = data->u2a[i][0];
        param->Z[i] = param->iZ[id];	
      }
      else {
        /* maxl = pos > neg ? pos : neg;
        pos -= maxl;
        neg -= maxl;
        prob = param->ptrue * exp(pos) / (param->ptrue * exp(pos) + (1.0-param->ptrue) * exp(neg));
        param->Z[i] = gsl_ran_flat(r,0.0,1.0) <= prob ? 1 : 0; */
        indiv = 0;
        total = data->n_u2a[i];
        for(j=0;j<data->n_u2a[i];j++) {
          id = data->u2a[i][j];
          if(param->iZ[id]) indiv++;
        }
        pos = ((double) indiv) / ((double) total);
        param->Z[i] = gsl_ran_bernoulli(r, pos);
      }
    }
  }
}