12#include <QCoreApplication>
38 return ¶meters->at(i);
45 return (&observations->at(i));
52 vector<TimeSeriesSet<double>> res;
57 G1.SetRecordResults(
false);
59 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
60 G1.SetParameterValue(i, par[i]);
64 sum +=G1.GetObjectiveFunctionValue();
66 return G1.Outputs.ObservedOutputs;
74 if (aquiutils::tolower(varname) ==
"number_of_samples") {MCMC_Settings.total_number_of_samples = aquiutils::atoi(value);
return true;}
75 if (aquiutils::tolower(varname) ==
"number_of_chains") {MCMC_Settings.number_of_chains = aquiutils::atoi(value);
return true;}
76 if (aquiutils::tolower(varname) ==
"number_of_burnout_samples") {MCMC_Settings.burnout_samples = aquiutils::atoi(value);
return true;}
77 if (aquiutils::tolower(varname) ==
"initial_purturbation_factor") {MCMC_Settings.purturbation_factor = aquiutils::atof(value);
return true;}
78 if (aquiutils::tolower(varname) ==
"record_interval") {MCMC_Settings.save_interval = aquiutils::atoi(value);
return true;}
79 if (aquiutils::tolower(varname) ==
"initial_purturbation")
81 if (aquiutils::tolower(value)==
"yes")
82 MCMC_Settings.noinipurt =
false;
84 MCMC_Settings.noinipurt =
true;
87 if (aquiutils::tolower(varname) ==
"perform_global_sensitivity")
89 if (aquiutils::tolower(value)==
"yes")
90 MCMC_Settings.global_sensitivity =
true;
92 MCMC_Settings.global_sensitivity =
false;
95 if (aquiutils::tolower(varname) ==
"continue_based_on_file_name")
98 { MCMC_Settings.continue_filename = value;
99 MCMC_Settings.continue_mcmc =
true;
102 MCMC_Settings.continue_mcmc =
false;
105 if (aquiutils::tolower(varname) ==
"samples_filename")
109 if (value.find_first_of(
'/')!=string::npos || value.find_first_of(
'\\')!=string::npos)
110 FileInformation.outputfilename = value;
112 FileInformation.outputfilename = FileInformation.outputpath + value;
118 if (aquiutils::tolower(varname) ==
"number_of_post_estimate_realizations")
120 MCMC_Settings.number_of_post_estimate_realizations = aquiutils::atoi(value);
123 if (aquiutils::tolower(varname) ==
"increment_for_sensitivity_analysis")
125 MCMC_Settings.dp_sens = aquiutils::atof(value);
128 if (aquiutils::tolower(varname) ==
"add_noise_to_realizations")
130 if (aquiutils::tolower(value)==
"yes")
131 MCMC_Settings.noise_realization_writeout =
true;
133 MCMC_Settings.noise_realization_writeout =
false;
137 if (aquiutils::tolower(varname) ==
"number_of_threads")
139 MCMC_Settings.numberOfThreads = aquiutils::atoi(value);
142 if (aquiutils::tolower(varname) ==
"acceptance_rate")
144 MCMC_Settings.acceptance_rate = aquiutils::atof(value);
147 if (aquiutils::tolower(varname) ==
"purturbation_change_scale")
149 MCMC_Settings.purt_change_scale = aquiutils::atof(value);
152 if (aquiutils::tolower(varname) ==
"dissolve_chains")
154 if (aquiutils::tolower(value)==
"true")
155 MCMC_Settings.dissolve_chains =
true;
157 MCMC_Settings.dissolve_chains =
false;
161 last_error =
"Property '" + varname +
"' was not found!";
171 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
172 CopiedModels[chain_counter].SetParameterValue(i, par[i]);
174 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
175 sum+=parameter(i)->CalcLogPriorProbability(par[i]);
178 sum+= -CopiedModels[chain_counter].GetObjectiveFunctionValue();
179 temp_predicted[chain_counter] = CopiedModels[chain_counter].GetPredictedValues();
188 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
190 Model1->SetSilent(
true);
191 Model1->SetRecordResults(
false);
192 Model1->SetNumThreads(1);
193 for (
unsigned int i = 0; i < MCMC_Settings.number_of_parameters; i++)
194 Model1->SetParameterValue(i, par[i]);
195 Model1->ApplyParameters();
205 parameters = &Model->Parameters();
206 Params.resize(MCMC_Settings.total_number_of_samples);
207 logp.resize(MCMC_Settings.total_number_of_samples);
208 logp1.resize(MCMC_Settings.total_number_of_samples);
209 pertcoeff.resize(parameters->size());
210 MCMC_Settings.number_of_parameters = Model->Parameters().size();
212 for (
unsigned int i=0; i<MCMC_Settings.total_number_of_samples; i++)
213 Params[i].resize(MCMC_Settings.number_of_parameters);
215 results->resize(MCMC_Settings.number_of_parameters);
216 results->SetAllSeriesSize(MCMC_Settings.total_number_of_samples);
217 predicted.resize(Model->ObservationsCount());
218 predicted.SetAllSeriesSize(MCMC_Settings.total_number_of_samples);
219 temp_predicted.resize(MCMC_Settings.number_of_chains);
220 CopiedModels.resize(MCMC_Settings.number_of_chains);
221 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
223 CopiedModels[i] = *Model;
226 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
228 if (parameter(j)->GetPriorDistribution()==
"normal" || parameter(j)->GetPriorDistribution()==
"uniform")
230 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-parameter(j)->GetRange(
_range::low) + parameter(j)->GetRange(
_range::high));
232 if (parameter(j)->GetPriorDistribution()==
"log-normal")
239 {
for (
int j=0; j<MCMC_Settings.number_of_chains; j++)
241 double posterior_value = -2e6;
242 while (posterior_value<-1e6)
243 {
for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
244 {
if (parameter(i)->GetPriorDistribution()==
"log-normal")
248 if (parameter(i)->GetPriorDistribution()==
"log-normal")
249 pp +=
log(Params[j][i]);
252 logp[j] = posterior(Params[j],j);
253 posterior_value = logp[j];
254 logp1[j] = logp[j]+pp;
256 results->SetRow(j,j,Params[j]);
258 predicted.SetRow(j,j,CopiedModels[j].GetPredictedValues().vec);
259 temp_predicted[j] = CopiedModels[j].GetPredictedValues();
265 for (
int j=0; j<MCMC_Settings.number_of_chains; j++)
266 {
for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
267 { Params[j][i] = parameter(i)->GetValue();
268 if (parameter(i)->GetPriorDistribution()==
"log-normal")
269 pp +=
log(Params[j][i]);
271 logp[j] = posterior(Params[j],j);
272 logp1[j] = logp[j]+pp;
284 if (MCMC_Settings.sensbasedpurt ==
true)
286 CVector X = sensitivity(1e-4, par);
288 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
290 if (parameter(j).Get_Distribution()==
"normal" || parameter(j).Get_Distribution()==
"uniform")
292 pertcoeff[j] = MCMC_Settings.purturbation_factor / fabs(X[getparamno(j, 0)]);
294 if (parameter(j).Get_Distribution()==
"log-normal")
296 pertcoeff[j] = MCMC_Settings.purturbation_factor / fabs(sqrt(par[j])*X[getparamno(j, 0)]);
302 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
304 if (parameter(j).Get_Distribution()==
"normal" || parameter(j).Get_Distribution()==
"uniform")
306 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-parameter(j)->GetRange().low + -parameter(j)->GetRange().high);
308 if (parameter(j).Get_Distribution()==
"log-normal")
310 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-
log(parameter(j)->GetRange().
low) +
log(parameter(j)->GetRange().
high));
314 if (MCMC_Settings.noinipurt ==
true) alpha = 0;
else alpha = 1;
317 for (
int j = 0; j<MCMC_Settings.number_of_chains; j++)
319 Params[j].resize(MCMC_Settings.number_of_parameters);
321 for (
int i = 0; i<MCMC_Settings.number_of_parameters; i++)
323 if (parameter(i).Get_Distribution()==
"normal" || parameter(i).Get_Distribution()==
"uniform")
324 Params[j][i] = par[i] + alpha*getnormalrand(0, pertcoeff[i]);
326 { Params[j][i] = par[i] * exp(alpha*getnormalrand(0, pertcoeff[i]));
329 if (parameter(i).Get_Distribution()==
"uniform")
330 while ((Params[j][i]<parameter(i).GetRange().
low) || (Params[j][i]>parameter(i).GetRange(
_range::high)))
331 Params[j][i] = par[i] + alpha*getnormalrand(0, pertcoeff[i]);
334 logp[j] = posterior(Params[j]);
335 logp1[j] = logp[j] + pp;
343 vector<double> X = purturb(k-MCMC_Settings.number_of_chains);
345 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
347 if (parameter(i)->GetPriorDistribution()==
"log-normal")
350 double logp_0 = posterior(X,chain_counter) + pp;
353 double logp_1 = logp_0;
357 if (unitrandom() <exp(logp_0-logp[k-MCMC_Settings.number_of_chains]) && !isnan(logp_0))
363 predicted.SetRow(k,k,temp_predicted[chain_counter].vec);
370 Params[k] = Params[k-MCMC_Settings.number_of_chains];
371 logp[k] = logp[k-MCMC_Settings.number_of_chains];
373 predicted.SetRow(k,k,predicted.getrow(k-MCMC_Settings.number_of_chains));
383 X.resize(MCMC_Settings.number_of_parameters);
384 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
386 if (parameter(i)->GetPriorDistribution() ==
"log-normal")
387 X[i] = Params[k][i]*exp(pertcoeff[i]*getstdnormalrand());
389 X[i] = Params[k][i]+pertcoeff[i]*getstdnormalrand();
399 if (!MCMC_Settings.continue_mcmc)
405 file = fopen(filename.c_str(),
"w");
408 std::cerr <<
"MCMC: could not open '" << filename
409 <<
"' to write the sample output." << std::endl;
415 if (!MCMC_Settings.continue_mcmc)
417 file = fopen(filename.c_str(),
"a");
420 std::cerr <<
"MCMC: could not append to '" << filename
421 <<
"' to write the sample output." << std::endl;
424 fprintf(file,
"%s, ",
"no.");
425 for (
unsigned int i=0; i<MCMC_Settings.number_of_parameters; i++)
426 { fprintf(file,
"%s, ", parameter(i)->Name().c_str());
427 results->setname(i,parameter(i)->Name());
429 fprintf(file,
"%s, %s, %s,",
"logp",
"logp_1",
"stuck_counter");
430 for (
unsigned int j=0; j<pertcoeff.size(); j++) fprintf(file,
"%s,",
string(
"purt_coeff_" + QString(
"%1").arg(j).toStdString()).c_str());
435 CVector stuckcounter(MCMC_Settings.number_of_chains);
436 CVector accepted(MCMC_Settings.number_of_chains);
438 MCMC_Settings.ini_purt_fact = pertcoeff[0];
441 for (
unsigned int kk=k; kk<k+nsamps+MCMC_Settings.number_of_chains; kk+=MCMC_Settings.number_of_chains)
443 QCoreApplication::processEvents(QEventLoop::AllEvents,10*1000);
446 omp_set_num_threads(MCMC_Settings.numberOfThreads);
453 srand(
int(time(NULL)) ^ omp_get_thread_num() + kk);
457#pragma omp parallel for
458 for (
int jj = kk; jj < min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples); jj++)
460 qDebug() <<
"Starting step: " + QString::number(jj);
461 bool stepstuck = !step(jj,jj-kk);
462 qDebug() <<
"Step: " + QString::number(jj) +
"Done!";
464 { stuckcounter[jj - kk]++;
468 { stuckcounter[jj - kk] = 0;
474 accepted_count += accepted.sum();
475 total_count += accepted.num;
476 QCoreApplication::processEvents(QEventLoop::AllEvents,100*1000);
478 if ((kk-k_0) % (50 * MCMC_Settings.number_of_chains) == 0 || kk == k + nsamps + MCMC_Settings.number_of_chains - 1)
481 if (MCMC_Settings.dissolve_chains)
482 {
int_value_pair minchain = Min(logp,min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples),MCMC_Settings.number_of_chains);
483 int_value_pair maxchain = Max(logp,min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples),MCMC_Settings.number_of_chains);
485 qDebug()<<
"Ratio:"<<ratio;
493 file = fopen(filename.c_str(),
"a");
494 for (
int jj = max(
int(min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples) - 50 * MCMC_Settings.number_of_chains), k_0); jj < min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples); jj++)
496 if (jj%MCMC_Settings.save_interval == 0)
500 fprintf(file,
"%i, ", jj);
501 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
502 fprintf(file,
"%le, ", Params[jj][i]);
503 if (!results->SetRow(jj, jj,Params[jj]))
505 cout<<
"not enough room!";
508 fprintf(file,
"%le, %le, %f,", logp[jj], logp1[jj], stuckcounter[jj%MCMC_Settings.number_of_chains]);
509 for (
int j = 0; j < pertcoeff.size(); j++) fprintf(file,
"%le,", pertcoeff[j]);
521 if ((kk-k_0) % (50*MCMC_Settings.number_of_chains) == 0)
524 if (
double(accepted_count) /
double(total_count)>MCMC_Settings.acceptance_rate)
525 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++) pertcoeff[i] /= MCMC_Settings.purt_change_scale;
527 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++) pertcoeff[i] *= MCMC_Settings.purt_change_scale;
536 double average_log_p = CVector::Extract(logp,kk-100,kk).mean();
537 double progress = double(kk) / double(nsamps)*0.98;
539 rtw->
AppendPoint(kk,
double(accepted_count) /
double(total_count),0);
540 rtw->
AppendPoint(kk,
double(pertcoeff[0] / MCMC_Settings.ini_purt_fact),1);
542 QCoreApplication::processEvents();
545 qDebug()<<
"MCMC done!";
559 MCMC_Settings.number_of_parameters = 0;
560 MCMC_Settings.numberOfThreads = 20;
561 FileInformation.outputpath = Model->OutputPath();
563 for (
unsigned int i=0; i<Model->Parameters().size(); i++)
565 MCMC_Settings.number_of_parameters++;
568 parameters = &Model->Parameters();
569 observations = Model->Observations();
570 pertcoeff.resize(parameters->size());
577 double base = posterior(par);
578 CVector X(MCMC_Settings.number_of_parameters);
579 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
581 vector<double> par1 = par;
582 par1[i]=par[i]*(1+d);
583 double base_1 = posterior(par1);
585 X[i] = (sqrt(fabs(base))-sqrt(fabs(base_1)))/(d*par[i]);
595 CVector X = sensitivity(d, par);
596 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
606 ifstream file(filename);
608 s = aquiutils::getline(file);
610 while (file.eof() ==
false)
612 s = aquiutils::getline(file);
613 if (s.size() == 2*MCMC_Settings.number_of_parameters+4)
614 { Params[jj].resize(MCMC_Settings.number_of_parameters);
615 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
617 Params[jj][i] = atof(s[i+1].c_str());
618 pertcoeff[i] = atof(s[MCMC_Settings.number_of_parameters+i+4].c_str());
620 logp[jj] = atof(s[MCMC_Settings.number_of_parameters+1].c_str());
621 logp1[jj] = atof(s[MCMC_Settings.number_of_parameters+2].c_str());
632 TimeSeriesSet<double> prior_dist(MCMC_Settings.number_of_parameters);
633 TimeSeries<double> B(n_bins);
635 double min_range , max_range;
637 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
639 if (parameter(i).GetDistribution() !=
"log-normal")
641 min_range = parameter(i)->mean() - 4*parameter(i)->std();
642 max_range = parameter(i)->mean() + 4*parameter(i)->std();;
644 if (parameter(i).GetDistribution() ==
"log-normal")
646 min_range = parameter(i)->mean() * exp(-4*parameter(i)->std());
647 max_range = parameter(i)->mean() * exp(4*parameter(i)->std());
651 double dp = abs(max_range - min_range) / n_bins;
653 B.setTime(0, min_range + dp/2);
654 for (
int j=0; j<n_bins-1; j++)
655 B.setTime(j+1, B.getTime(j) + dp);
657 if (parameter(i).GetDistribution() !=
"log-normal")
658 for (
int j=0; j<n_bins; j++)
659 B.setValue(j , exp(-pow(B.getTime(j)-parameter(i)->mean(),2)/(2.0*pow(parameter(i)->std(),2)))/(parameter(i)->std()*pow(6.28,0.5)));
661 if (parameter(i).GetDistribution() ==
"log-normal")
662 for (
int j=0; j<n_bins; j++)
663 B.setValue(j, exp(-pow(
log(B.getTime(j))-
log(parameter(i)->mean()),2)/(2.0*pow(parameter(i)->std(),2)))/(B.getTime(j)*parameter(i)->std()*pow(6.28,0.5)));
665 prior_dist.at(i) = B;
675 vector<TimeSeriesSet<double>> realized_timeseries(observations->size());
676 vector<TimeSeriesSet<double>> predicted_percentiles(observations->size());
678 for (
unsigned int jj = 0; jj <=MCMC_Settings.number_of_post_estimate_realizations/MCMC_Settings.numberOfThreads; jj++)
680 vector<T> Sys1(MCMC_Settings.numberOfThreads);
682 omp_set_num_threads(MCMC_Settings.numberOfThreads);
684#pragma omp parallel for
685 for (
int j = 0; j < min(MCMC_Settings.numberOfThreads, MCMC_Settings.number_of_post_estimate_realizations - jj*MCMC_Settings.numberOfThreads); j++)
688 vector<double> sampled_parameters = MCMCout.getrandom(MCMC_Settings.burnout_samples);
689 model(&Sys1[j],sampled_parameters);
692 for (
unsigned int j = 0; j < min(MCMC_Settings.numberOfThreads, MCMC_Settings.number_of_post_estimate_realizations - jj*MCMC_Settings.numberOfThreads); j++)
693 for (
unsigned int i=0; i<observations->size(); i++)
694 realized_timeseries[i].append(*(Sys1[j].observation(i)->GetModeledTimeSeries()));
698 double progress = double(jj*MCMC_Settings.numberOfThreads) / double(MCMC_Settings.number_of_post_estimate_realizations);
702 vector<double> percents; percents.push_back(0.025); percents.push_back(0.5); percents.push_back(0.975);
703 for (
unsigned int i=0; i<observations->size(); i++)
705 realized_timeseries[i].write(FileInformation.outputpath +
"Realizations_" + observation(i)->GetName() +
".txt");
706 predicted_percentiles[i] = realized_timeseries[i].getpercentiles(percents);
707 observation(i)->SetPercentile95(predicted_percentiles[i]);
708 predicted_percentiles[i].write(FileInformation.outputpath +
"Predicted_95p_Bracket" + observation(i)->GetName() +
".txt");
709 observation(i)->SetRealizations(realized_timeseries[i]);
719 ProduceRealizations(MCMCout);
720 int n_BTCout_obs = Model->ObservationsCount();
722 BTCout_obs_prcntle.resize(1);
for (
int j = 0; j < 1; j++) BTCout_obs_prcntle[j].resize(n_BTCout_obs);
723 BTCout_obs_prcntle_noise.resize(1);
for (
int j = 0; j < 1; j++) BTCout_obs_prcntle_noise[j].resize(n_BTCout_obs);
725 if (calc_output_percentiles.size()>0)
726 for (
int i = 0; i < n_BTCout_obs; i++)
728 for (
int j = 0; j < 1; j++)
730 BTCout_obs_prcntle[j][i] = BTCout_obs[j][i].getpercentiles(calc_output_percentiles);
732 BTCout_obs_prcntle[j][i].write(FileInformation.outputpath +
"BTC_obs_prcntl_" + Model->Observation(i)->GetName() +
".txt");
734 if (MCMC_Settings.noise_realization_writeout)
735 BTCout_obs_prcntle_noise[j][i] = BTCout_obs_noise[j][i].getpercentiles(calc_output_percentiles);
737 BTCout_obs_prcntle_noise[j][i].write(FileInformation.outputpath +
"BTC_obs_prcntl_noise_" + Model->Observation(i)->GetName() +
".txt");
748 int mcmcstart = MCMC_Settings.number_of_chains;
749 if (MCMC_Settings.continue_mcmc)
752 mcmcstart = readfromfile(MCMC_Settings.continue_filename);
755 step(mcmcstart,
int((MCMC_Settings.total_number_of_samples - mcmcstart) / MCMC_Settings.number_of_chains)*MCMC_Settings.number_of_chains, FileInformation.outputfilename , rtw);
757 TimeSeriesSet<double> all_posterior_distributions;
758 TimeSeriesSet<double> parameter_samples;
759 for (
unsigned int i=0; i<parameters->size(); i++)
761 TimeSeriesSet<double> chain_values(MCMC_Settings.number_of_chains);
762 TimeSeries<double> all_samples;
763 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
765 chain_values.setname(i,
"Chain_" + aquiutils::numbertostring(i));
767 for (
unsigned int j=MCMC_Settings.burnout_samples; j<MCMC_Settings.total_number_of_samples; j++)
768 chain_values[j%MCMC_Settings.number_of_chains].append(j,Params[j][i]);
770 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
772 all_samples.append(chain_values[i]);
776 parameter(i)->SetMCMCSamples(chain_values);
778 TimeSeries<double> posterior_distribution = all_samples.distribution(all_samples.size()/100,0);
779 all_posterior_distributions.append(posterior_distribution,parameter(i)->GetName());
780 posterior_distribution.setName(
"Posterior density");
781 parameter(i)->SetPosteriorDistribution(posterior_distribution);
782 parameter_samples.append(all_samples);
785 all_posterior_distributions.write(FileInformation.outputpath +
"Posterior_distributions.txt");
787 ProduceRealizations(parameter_samples);
795 for (
unsigned int i=max(current_counter-n_chains,0); i<current_counter; i++)
797 if (vec[i]<out.
value)
811 for (
unsigned int i=max(current_counter-n_chains,0); i<current_counter; i++)
813 if (vec[i]>out.
value)
Collection of time series with labels and observed values.
void model(T *Model1, vector< double > par)
Evaluate model with given parameters.
bool SetProperty(const string &varname, const string &value)
Set MCMC properties from string key-value pairs.
TimeSeriesSet< double > prior_distribution(int n_bins)
Generate histogram of prior distributions.
void ProduceRealizations(TimeSeriesSet< double > &MCMCout)
Generate posterior predictive realizations.
Observation * observation(int i)
Get pointer to specific observation.
vector< double > purturb(int k)
Generate proposed parameter values by perturbing current state.
CMCMC(void)
Default constructor.
bool step(int k, int chain_counter)
Perform single MCMC step for one chain.
Parameter * parameter(int i)
Get pointer to specific parameter.
int_value_pair Max(const vector< double > &vec, int current_counter, int n_chains)
Find maximum value and its chain index.
double posterior(vector< double > par, int chain_counter)
Calculate log-posterior probability for given parameters.
void Perform()
Main entry point to run complete MCMC analysis.
void initialize(CMBTimeSeriesSet *results, bool random=false)
Initialize MCMC chains with starting parameter values.
int_value_pair Min(const vector< double > &vec, int current_counter, int n_chains)
Find minimum value and its chain index.
CVector sensitivity(double d, vector< double > par)
Calculate sensitivity of model output to parameters.
void get_outputpercentiles(TimeSeriesSet< double > &MCMCout)
Calculate percentiles of model outputs from MCMC samples.
CVector sensitivity_ln(double d, vector< double > par)
Calculate log-space sensitivity (for lognormal parameters)
int readfromfile(string filename)
Read MCMC state from file to continue previous run.
void SetRunTimeWindow(ProgressReporter *_rtw)
Set progress window for GUI updates.
Represents a model parameter with prior distribution and constraints.
Abstract sink for progress information produced by a running analysis.
virtual void SetProgress(const double &prog)=0
Sets the primary progress fraction.
virtual void AppendPoint(const double &x, const double &y, int chart=0)=0
Adds a point to one of the progress charts.
@ low
Lower bound of the parameter range.
@ high
Upper bound of the parameter range.
Utility structure pairing an integer counter with a double value.
double value
Associated value (likelihood, parameter, etc.)
int counter
Chain or sample index.