void PCR::initialize_params(){ set_a(1.0); set_b(1.0); Vector h = response_histogram(); Vector b = beta(); b[0] = 0; b.back()=0.001; // a should not be zero for(uint i=1; i<h.size(); ++i) b[i] = log(h[i]/h[0]); set_beta(b); }
/** * needs: * params file * BURN_IN_ITERATIONS * first line in calibration_result * BETA_ALIGNMENT * BETA_0 * SKIP_CALIBRATE_ALLCHAINS ** * does: * calibrate remaining chains (beta < 1) * writes all betas, stepwidths and start values in file calibration_result ** * provides: * stepwidths of first chain (calibration_result) * new params file (params_suggest) * new start values (calibration_result) **/ void calibrate_rest() { int n_beta = N_BETA; const double desired_acceptance_rate = TARGET_ACCEPTANCE_RATE; const double max_ar_deviation = MAX_AR_DEVIATION; double beta_0 = BETA_0; const unsigned long burn_in_iterations = BURN_IN_ITERATIONS; const unsigned long iter_limit = ITER_LIMIT; const double mul = MUL; unsigned int n_par; int i; gsl_vector * stepwidth_factors; mcmc ** chains = setup_chains(); read_calibration_file(chains, 1); printf("Calibrating chains\n"); fflush(stdout); n_par = get_n_par(chains[0]); stepwidth_factors = gsl_vector_alloc(n_par); gsl_vector_set_all(stepwidth_factors, 1); i = 1; if (n_beta > 1) { if (beta_0 < 0) set_beta(chains[i], get_chain_beta(i, n_beta, calc_beta_0( chains[0], stepwidth_factors))); else set_beta(chains[i], get_chain_beta(i, n_beta, beta_0)); gsl_vector_free(get_steps(chains[i])); chains[i]->params_step = dup_vector(get_steps(chains[0])); gsl_vector_scale(get_steps(chains[i]), pow(get_beta(chains[i]), -0.5)); set_params(chains[i], dup_vector(get_params_best(chains[0]))); calc_model(chains[i], NULL); mcmc_check(chains[i]); printf("Calibrating second chain to infer stepwidth factor\n"); printf("\tChain %2d - ", i); printf("beta = %f\tsteps: ", get_beta(chains[i])); dump_vectorln(get_steps(chains[i])); fflush(stdout); markov_chain_calibrate(chains[i], burn_in_iterations, desired_acceptance_rate, max_ar_deviation, iter_limit, mul, DEFAULT_ADJUST_STEP); gsl_vector_scale(stepwidth_factors, pow(get_beta(chains[i]), -0.5)); gsl_vector_mul(stepwidth_factors, get_steps(chains[0])); gsl_vector_div(stepwidth_factors, get_steps(chains[i])); mem_free(chains[i]->additional_data); } printf("stepwidth factors: "); dump_vectorln(stepwidth_factors); if (beta_0 < 0) { beta_0 = calc_beta_0(chains[0], stepwidth_factors); printf("automatic beta_0: %f\n", beta_0); } fflush(stdout); #pragma omp parallel for for (i = 1; i < n_beta; i++) { printf("\tChain %2d - ", i); fflush(stdout); chains[i]->additional_data = mem_malloc(sizeof(parallel_tempering_mcmc)); set_beta(chains[i], get_chain_beta(i, n_beta, beta_0)); gsl_vector_free(get_steps(chains[i])); chains[i]->params_step = dup_vector(get_steps(chains[0])); gsl_vector_scale(get_steps(chains[i]), pow(get_beta(chains[i]), -0.5)); gsl_vector_mul(get_steps(chains[i]), stepwidth_factors); set_params(chains[i], dup_vector(get_params_best(chains[0]))); calc_model(chains[i], NULL); mcmc_check(chains[i]); printf("beta = %f\tsteps: ", get_beta(chains[i])); dump_vectorln(get_steps(chains[i])); fflush(stdout); #ifndef SKIP_CALIBRATE_ALLCHAINS markov_chain_calibrate(chains[i], burn_in_iterations, desired_acceptance_rate, max_ar_deviation, iter_limit, mul, DEFAULT_ADJUST_STEP); #else burn_in(chains[i], burn_in_iterations); #endif } gsl_vector_free(stepwidth_factors); fflush(stdout); printf("all chains calibrated.\n"); for (i = 0; i < n_beta; i++) { printf("\tChain %2d - beta = %f \tsteps: ", i, get_beta(chains[i])); dump_vectorln(get_steps(chains[i])); } write_calibration_summary(chains, n_beta); write_calibrations_file(chains, n_beta); }