35 return ¶meters->at(i);
42 return (&observations->at(i));
49 vector<TimeSeriesSet<double>> res;
54 G1.SetRecordResults(
false);
56 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
57 G1.SetParameterValue(i, par[i]);
61 sum +=G1.GetObjectiveFunctionValue();
63 return G1.Outputs.ObservedOutputs;
71 if (aquiutils::tolower(varname) ==
"number_of_samples") {MCMC_Settings.total_number_of_samples = aquiutils::atoi(value);
return true;}
72 if (aquiutils::tolower(varname) ==
"number_of_chains") {MCMC_Settings.number_of_chains = aquiutils::atoi(value);
return true;}
73 if (aquiutils::tolower(varname) ==
"number_of_burnout_samples") {MCMC_Settings.burnout_samples = aquiutils::atoi(value);
return true;}
74 if (aquiutils::tolower(varname) ==
"initial_purturbation_factor") {MCMC_Settings.purturbation_factor = aquiutils::atof(value);
return true;}
75 if (aquiutils::tolower(varname) ==
"record_interval") {MCMC_Settings.save_interval = aquiutils::atoi(value);
return true;}
76 if (aquiutils::tolower(varname) ==
"initial_purturbation")
78 if (aquiutils::tolower(value)==
"yes")
79 MCMC_Settings.noinipurt =
false;
81 MCMC_Settings.noinipurt =
true;
84 if (aquiutils::tolower(varname) ==
"perform_global_sensitivity")
86 if (aquiutils::tolower(value)==
"yes")
87 MCMC_Settings.global_sensitivity =
true;
89 MCMC_Settings.global_sensitivity =
false;
92 if (aquiutils::tolower(varname) ==
"continue_based_on_file_name")
95 { MCMC_Settings.continue_filename = value;
96 MCMC_Settings.continue_mcmc =
true;
99 MCMC_Settings.continue_mcmc =
false;
102 if (aquiutils::tolower(varname) ==
"samples_filename")
106 if (value.find_first_of(
'/')!=string::npos || value.find_first_of(
'\\')!=string::npos)
107 FileInformation.outputfilename = value;
109 FileInformation.outputfilename = FileInformation.outputpath + value;
115 if (aquiutils::tolower(varname) ==
"number_of_post_estimate_realizations")
117 MCMC_Settings.number_of_post_estimate_realizations = aquiutils::atoi(value);
120 if (aquiutils::tolower(varname) ==
"increment_for_sensitivity_analysis")
122 MCMC_Settings.dp_sens = aquiutils::atof(value);
125 if (aquiutils::tolower(varname) ==
"add_noise_to_realizations")
127 if (aquiutils::tolower(value)==
"yes")
128 MCMC_Settings.noise_realization_writeout =
true;
130 MCMC_Settings.noise_realization_writeout =
false;
134 if (aquiutils::tolower(varname) ==
"number_of_threads")
136 MCMC_Settings.numberOfThreads = aquiutils::atoi(value);
139 if (aquiutils::tolower(varname) ==
"acceptance_rate")
141 MCMC_Settings.acceptance_rate = aquiutils::atof(value);
144 if (aquiutils::tolower(varname) ==
"purturbation_change_scale")
146 MCMC_Settings.purt_change_scale = aquiutils::atof(value);
149 if (aquiutils::tolower(varname) ==
"dissolve_chains")
151 if (aquiutils::tolower(value)==
"true")
152 MCMC_Settings.dissolve_chains =
true;
154 MCMC_Settings.dissolve_chains =
false;
158 last_error =
"Property '" + varname +
"' was not found!";
168 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
169 CopiedModels[chain_counter].SetParameterValue(i, par[i]);
171 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
172 sum+=parameter(i)->CalcLogPriorProbability(par[i]);
175 sum+= -CopiedModels[chain_counter].GetObjectiveFunctionValue();
176 temp_predicted[chain_counter] = CopiedModels[chain_counter].GetPredictedValues();
185 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
187 Model1->SetSilent(
true);
188 Model1->SetRecordResults(
false);
189 Model1->SetNumThreads(1);
190 for (
unsigned int i = 0; i < MCMC_Settings.number_of_parameters; i++)
191 Model1->SetParameterValue(i, par[i]);
192 Model1->ApplyParameters();
202 parameters = &Model->Parameters();
203 Params.resize(MCMC_Settings.total_number_of_samples);
204 logp.resize(MCMC_Settings.total_number_of_samples);
205 logp1.resize(MCMC_Settings.total_number_of_samples);
206 pertcoeff.resize(parameters->size());
207 MCMC_Settings.number_of_parameters = Model->Parameters().size();
209 for (
unsigned int i=0; i<MCMC_Settings.total_number_of_samples; i++)
210 Params[i].resize(MCMC_Settings.number_of_parameters);
212 results->resize(MCMC_Settings.number_of_parameters);
213 results->SetAllSeriesSize(MCMC_Settings.total_number_of_samples);
214 predicted.resize(Model->ObservationsCount());
215 predicted.SetAllSeriesSize(MCMC_Settings.total_number_of_samples);
216 temp_predicted.resize(MCMC_Settings.number_of_chains);
217 CopiedModels.resize(MCMC_Settings.number_of_chains);
218 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
220 CopiedModels[i] = *Model;
223 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
225 if (parameter(j)->GetPriorDistribution()==
"normal" || parameter(j)->GetPriorDistribution()==
"uniform")
227 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-parameter(j)->GetRange(
_range::low) + parameter(j)->GetRange(
_range::high));
229 if (parameter(j)->GetPriorDistribution()==
"log-normal")
236 {
for (
int j=0; j<MCMC_Settings.number_of_chains; j++)
238 double posterior_value = -2e6;
239 while (posterior_value<-1e6)
240 {
for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
241 {
if (parameter(i)->GetPriorDistribution()==
"log-normal")
245 if (parameter(i)->GetPriorDistribution()==
"log-normal")
246 pp +=
log(Params[j][i]);
249 logp[j] = posterior(Params[j],j);
250 posterior_value = logp[j];
251 logp1[j] = logp[j]+pp;
253 results->SetRow(j,j,Params[j]);
255 predicted.SetRow(j,j,CopiedModels[j].GetPredictedValues().vec);
256 temp_predicted[j] = CopiedModels[j].GetPredictedValues();
262 for (
int j=0; j<MCMC_Settings.number_of_chains; j++)
263 {
for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
264 { Params[j][i] = parameter(i)->GetValue();
265 if (parameter(i)->GetPriorDistribution()==
"log-normal")
266 pp +=
log(Params[j][i]);
268 logp[j] = posterior(Params[j],j);
269 logp1[j] = logp[j]+pp;
281 if (MCMC_Settings.sensbasedpurt ==
true)
283 CVector X = sensitivity(1e-4, par);
285 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
287 if (parameter(j).Get_Distribution()==
"normal" || parameter(j).Get_Distribution()==
"uniform")
289 pertcoeff[j] = MCMC_Settings.purturbation_factor / fabs(X[getparamno(j, 0)]);
291 if (parameter(j).Get_Distribution()==
"log-normal")
293 pertcoeff[j] = MCMC_Settings.purturbation_factor / fabs(sqrt(par[j])*X[getparamno(j, 0)]);
299 for (
int j = 0; j<MCMC_Settings.number_of_parameters; j++)
301 if (parameter(j).Get_Distribution()==
"normal" || parameter(j).Get_Distribution()==
"uniform")
303 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-parameter(j)->GetRange().low + -parameter(j)->GetRange().high);
305 if (parameter(j).Get_Distribution()==
"log-normal")
307 pertcoeff[j] = MCMC_Settings.purturbation_factor*(-
log(parameter(j)->GetRange().
low) +
log(parameter(j)->GetRange().
high));
311 if (MCMC_Settings.noinipurt ==
true) alpha = 0;
else alpha = 1;
314 for (
int j = 0; j<MCMC_Settings.number_of_chains; j++)
316 Params[j].resize(MCMC_Settings.number_of_parameters);
318 for (
int i = 0; i<MCMC_Settings.number_of_parameters; i++)
320 if (parameter(i).Get_Distribution()==
"normal" || parameter(i).Get_Distribution()==
"uniform")
321 Params[j][i] = par[i] + alpha*getnormalrand(0, pertcoeff[i]);
323 { Params[j][i] = par[i] * exp(alpha*getnormalrand(0, pertcoeff[i]));
326 if (parameter(i).Get_Distribution()==
"uniform")
327 while ((Params[j][i]<parameter(i).GetRange().
low) || (Params[j][i]>parameter(i).GetRange(
_range::high)))
328 Params[j][i] = par[i] + alpha*getnormalrand(0, pertcoeff[i]);
331 logp[j] = posterior(Params[j]);
332 logp1[j] = logp[j] + pp;
340 vector<double> X = purturb(k-MCMC_Settings.number_of_chains);
342 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
344 if (parameter(i)->GetPriorDistribution()==
"log-normal")
347 double logp_0 = posterior(X,chain_counter) + pp;
350 double logp_1 = logp_0;
354 if (unitrandom() <exp(logp_0-logp[k-MCMC_Settings.number_of_chains]) && !isnan(logp_0))
360 predicted.SetRow(k,k,temp_predicted[chain_counter].vec);
367 Params[k] = Params[k-MCMC_Settings.number_of_chains];
368 logp[k] = logp[k-MCMC_Settings.number_of_chains];
370 predicted.SetRow(k,k,predicted.getrow(k-MCMC_Settings.number_of_chains));
380 X.resize(MCMC_Settings.number_of_parameters);
381 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
383 if (parameter(i)->GetPriorDistribution() ==
"log-normal")
384 X[i] = Params[k][i]*exp(pertcoeff[i]*getstdnormalrand());
386 X[i] = Params[k][i]+pertcoeff[i]*getstdnormalrand();
396 if (!MCMC_Settings.continue_mcmc)
397 { file = fopen(filename.c_str(),
"w");
401 if (!MCMC_Settings.continue_mcmc)
403 file = fopen(filename.c_str(),
"a");
404 fprintf(file,
"%s, ",
"no.");
405 for (
unsigned int i=0; i<MCMC_Settings.number_of_parameters; i++)
406 { fprintf(file,
"%s, ", parameter(i)->Name().c_str());
407 results->setname(i,parameter(i)->Name());
409 fprintf(file,
"%s, %s, %s,",
"logp",
"logp_1",
"stuck_counter");
410 for (
unsigned int j=0; j<pertcoeff.size(); j++) fprintf(file,
"%s,",
string(
"purt_coeff_" + QString(
"%1").arg(j).toStdString()).c_str());
415 CVector stuckcounter(MCMC_Settings.number_of_chains);
416 CVector accepted(MCMC_Settings.number_of_chains);
418 MCMC_Settings.ini_purt_fact = pertcoeff[0];
421 for (
unsigned int kk=k; kk<k+nsamps+MCMC_Settings.number_of_chains; kk+=MCMC_Settings.number_of_chains)
423 QCoreApplication::processEvents(QEventLoop::AllEvents,10*1000);
426 omp_set_num_threads(MCMC_Settings.numberOfThreads);
433 srand(
int(time(NULL)) ^ omp_get_thread_num() + kk);
437#pragma omp parallel for
438 for (
int jj = kk; jj < min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples); jj++)
440 qDebug() <<
"Starting step: " + QString::number(jj);
441 bool stepstuck = !step(jj,jj-kk);
442 qDebug() <<
"Step: " + QString::number(jj) +
"Done!";
444 { stuckcounter[jj - kk]++;
448 { stuckcounter[jj - kk] = 0;
454 accepted_count += accepted.sum();
455 total_count += accepted.num;
456 QCoreApplication::processEvents(QEventLoop::AllEvents,100*1000);
458 if ((kk-k_0) % (50 * MCMC_Settings.number_of_chains) == 0 || kk == k + nsamps + MCMC_Settings.number_of_chains - 1)
461 if (MCMC_Settings.dissolve_chains)
462 {
int_value_pair minchain = Min(logp,min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples),MCMC_Settings.number_of_chains);
463 int_value_pair maxchain = Max(logp,min(kk + MCMC_Settings.number_of_chains, MCMC_Settings.total_number_of_samples),MCMC_Settings.number_of_chains);
465 qDebug()<<
"Ratio:"<<ratio;
473 file = fopen(filename.c_str(),
"a");
474 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++)
476 if (jj%MCMC_Settings.save_interval == 0)
480 fprintf(file,
"%i, ", jj);
481 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++)
482 fprintf(file,
"%le, ", Params[jj][i]);
483 if (!results->SetRow(jj, jj,Params[jj]))
485 cout<<
"not enough room!";
488 fprintf(file,
"%le, %le, %f,", logp[jj], logp1[jj], stuckcounter[jj%MCMC_Settings.number_of_chains]);
489 for (
int j = 0; j < pertcoeff.size(); j++) fprintf(file,
"%le,", pertcoeff[j]);
501 if ((kk-k_0) % (50*MCMC_Settings.number_of_chains) == 0)
504 if (
double(accepted_count) /
double(total_count)>MCMC_Settings.acceptance_rate)
505 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++) pertcoeff[i] /= MCMC_Settings.purt_change_scale;
507 for (
int i = 0; i < MCMC_Settings.number_of_parameters; i++) pertcoeff[i] *= MCMC_Settings.purt_change_scale;
516 double average_log_p = CVector::Extract(logp,kk-100,kk).mean();
517 double progress = double(kk) / double(nsamps)*0.98;
519 rtw->
AppendPoint(kk,
double(accepted_count) /
double(total_count),0);
520 rtw->
AppendPoint(kk,
double(pertcoeff[0] / MCMC_Settings.ini_purt_fact),1);
522 QCoreApplication::processEvents();
525 qDebug()<<
"MCMC done!";
539 MCMC_Settings.number_of_parameters = 0;
540 MCMC_Settings.numberOfThreads = 20;
541 FileInformation.outputpath = Model->OutputPath();
543 for (
unsigned int i=0; i<Model->Parameters().size(); i++)
545 MCMC_Settings.number_of_parameters++;
548 parameters = &Model->Parameters();
549 observations = Model->Observations();
550 pertcoeff.resize(parameters->size());
557 double base = posterior(par);
558 CVector X(MCMC_Settings.number_of_parameters);
559 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
561 vector<double> par1 = par;
562 par1[i]=par[i]*(1+d);
563 double base_1 = posterior(par1);
565 X[i] = (sqrt(fabs(base))-sqrt(fabs(base_1)))/(d*par[i]);
575 CVector X = sensitivity(d, par);
576 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
586 ifstream file(filename);
588 s = aquiutils::getline(file);
590 while (file.eof() ==
false)
592 s = aquiutils::getline(file);
593 if (s.size() == 2*MCMC_Settings.number_of_parameters+4)
594 { Params[jj].resize(MCMC_Settings.number_of_parameters);
595 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
597 Params[jj][i] = atof(s[i+1].c_str());
598 pertcoeff[i] = atof(s[MCMC_Settings.number_of_parameters+i+4].c_str());
600 logp[jj] = atof(s[MCMC_Settings.number_of_parameters+1].c_str());
601 logp1[jj] = atof(s[MCMC_Settings.number_of_parameters+2].c_str());
612 TimeSeriesSet<double> prior_dist(MCMC_Settings.number_of_parameters);
613 TimeSeries<double> B(n_bins);
615 double min_range , max_range;
617 for (
int i=0; i<MCMC_Settings.number_of_parameters; i++)
619 if (parameter(i).GetDistribution() !=
"log-normal")
621 min_range = parameter(i)->mean() - 4*parameter(i)->std();
622 max_range = parameter(i)->mean() + 4*parameter(i)->std();;
624 if (parameter(i).GetDistribution() ==
"log-normal")
626 min_range = parameter(i)->mean() * exp(-4*parameter(i)->std());
627 max_range = parameter(i)->mean() * exp(4*parameter(i)->std());
631 double dp = abs(max_range - min_range) / n_bins;
633 B.setTime(0, min_range + dp/2);
634 for (
int j=0; j<n_bins-1; j++)
635 B.setTime(j+1, B.getTime(j) + dp);
637 if (parameter(i).GetDistribution() !=
"log-normal")
638 for (
int j=0; j<n_bins; j++)
639 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)));
641 if (parameter(i).GetDistribution() ==
"log-normal")
642 for (
int j=0; j<n_bins; j++)
643 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)));
645 prior_dist.at(i) = B;
655 vector<TimeSeriesSet<double>> realized_timeseries(observations->size());
656 vector<TimeSeriesSet<double>> predicted_percentiles(observations->size());
658 for (
unsigned int jj = 0; jj <=MCMC_Settings.number_of_post_estimate_realizations/MCMC_Settings.numberOfThreads; jj++)
660 vector<T> Sys1(MCMC_Settings.numberOfThreads);
662 omp_set_num_threads(MCMC_Settings.numberOfThreads);
664#pragma omp parallel for
665 for (
int j = 0; j < min(MCMC_Settings.numberOfThreads, MCMC_Settings.number_of_post_estimate_realizations - jj*MCMC_Settings.numberOfThreads); j++)
668 vector<double> sampled_parameters = MCMCout.getrandom(MCMC_Settings.burnout_samples);
669 model(&Sys1[j],sampled_parameters);
672 for (
unsigned int j = 0; j < min(MCMC_Settings.numberOfThreads, MCMC_Settings.number_of_post_estimate_realizations - jj*MCMC_Settings.numberOfThreads); j++)
673 for (
unsigned int i=0; i<observations->size(); i++)
674 realized_timeseries[i].append(*(Sys1[j].observation(i)->GetModeledTimeSeries()));
678 double progress = double(jj*MCMC_Settings.numberOfThreads) / double(MCMC_Settings.number_of_post_estimate_realizations);
682 vector<double> percents; percents.push_back(0.025); percents.push_back(0.5); percents.push_back(0.975);
683 for (
unsigned int i=0; i<observations->size(); i++)
685 realized_timeseries[i].write(FileInformation.outputpath +
"Realizations_" + observation(i)->GetName() +
".txt");
686 predicted_percentiles[i] = realized_timeseries[i].getpercentiles(percents);
687 observation(i)->SetPercentile95(predicted_percentiles[i]);
688 predicted_percentiles[i].write(FileInformation.outputpath +
"Predicted_95p_Bracket" + observation(i)->GetName() +
".txt");
689 observation(i)->SetRealizations(realized_timeseries[i]);
699 ProduceRealizations(MCMCout);
700 int n_BTCout_obs = Model->ObservationsCount();
702 BTCout_obs_prcntle.resize(1);
for (
int j = 0; j < 1; j++) BTCout_obs_prcntle[j].resize(n_BTCout_obs);
703 BTCout_obs_prcntle_noise.resize(1);
for (
int j = 0; j < 1; j++) BTCout_obs_prcntle_noise[j].resize(n_BTCout_obs);
705 if (calc_output_percentiles.size()>0)
706 for (
int i = 0; i < n_BTCout_obs; i++)
708 for (
int j = 0; j < 1; j++)
710 BTCout_obs_prcntle[j][i] = BTCout_obs[j][i].getpercentiles(calc_output_percentiles);
712 BTCout_obs_prcntle[j][i].write(FileInformation.outputpath +
"BTC_obs_prcntl_" + Model->Observation(i)->GetName() +
".txt");
714 if (MCMC_Settings.noise_realization_writeout)
715 BTCout_obs_prcntle_noise[j][i] = BTCout_obs_noise[j][i].getpercentiles(calc_output_percentiles);
717 BTCout_obs_prcntle_noise[j][i].write(FileInformation.outputpath +
"BTC_obs_prcntl_noise_" + Model->Observation(i)->GetName() +
".txt");
728 int mcmcstart = MCMC_Settings.number_of_chains;
729 if (MCMC_Settings.continue_mcmc)
732 mcmcstart = readfromfile(MCMC_Settings.continue_filename);
735 step(mcmcstart,
int((MCMC_Settings.total_number_of_samples - mcmcstart) / MCMC_Settings.number_of_chains)*MCMC_Settings.number_of_chains, FileInformation.outputfilename , rtw);
737 TimeSeriesSet<double> all_posterior_distributions;
738 TimeSeriesSet<double> parameter_samples;
739 for (
unsigned int i=0; i<parameters->size(); i++)
741 TimeSeriesSet<double> chain_values(MCMC_Settings.number_of_chains);
742 TimeSeries<double> all_samples;
743 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
745 chain_values.setname(i,
"Chain_" + aquiutils::numbertostring(i));
747 for (
unsigned int j=MCMC_Settings.burnout_samples; j<MCMC_Settings.total_number_of_samples; j++)
748 chain_values[j%MCMC_Settings.number_of_chains].append(j,Params[j][i]);
750 for (
unsigned int i=0; i<MCMC_Settings.number_of_chains; i++)
752 all_samples.append(chain_values[i]);
756 parameter(i)->SetMCMCSamples(chain_values);
758 TimeSeries<double> posterior_distribution = all_samples.distribution(all_samples.size()/100,0);
759 all_posterior_distributions.append(posterior_distribution,parameter(i)->GetName());
760 posterior_distribution.setName(
"Posterior density");
761 parameter(i)->SetPosteriorDistribution(posterior_distribution);
762 parameter_samples.append(all_samples);
765 all_posterior_distributions.write(FileInformation.outputpath +
"Posterior_distributions.txt");
767 ProduceRealizations(parameter_samples);
775 for (
unsigned int i=max(current_counter-n_chains,0); i<current_counter; i++)
777 if (vec[i]<out.
value)
791 for (
unsigned int i=max(current_counter-n_chains,0); i<current_counter; i++)
793 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(ProgressWindow *_rtw)
Set progress window for GUI updates.
Represents a model parameter with prior distribution and constraints.
void AppendPoint(const double &x, const double &y, int chart=0)
void SetProgress(const double &prog)
@ 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.