25 #include <queso/GPMSA.h> 
   26 #include <queso/GslVector.h> 
   27 #include <queso/GslMatrix.h> 
   31 template <
class V, 
class M>
 
   38     const unsigned int m_numSimulations,
 
   39     const unsigned int m_numExperiments,
 
   40     const std::vector<V *> & m_simulationScenarios,
 
   41     const std::vector<V *> & m_simulationParameters,
 
   42     const std::vector<V *> & m_simulationOutputs,
 
   43     const std::vector<V *> & m_experimentScenarios,
 
   44     const std::vector<V *> & m_experimentOutputs,
 
   45     const std::vector<V>   & m_discrepancyBases,
 
   46     const std::vector<M>   & m_observationErrorMatrices,
 
   47     const M & m_experimentErrors,
 
   49     const V & residual_in,
 
   50     const M & BT_Wy_B_inv_in,
 
   51     const M & KT_K_inv_in)
 
   54   m_scenarioSpace(m_scenarioSpace),
 
   55   m_parameterSpace(m_parameterSpace),
 
   56   m_simulationOutputSpace(m_simulationOutputSpace),
 
   57   m_experimentOutputSpace(m_experimentOutputSpace),
 
   58   m_numSimulations(m_numSimulations),
 
   59   m_numExperiments(m_numExperiments),
 
   60   m_simulationScenarios(m_simulationScenarios),
 
   61   m_simulationParameters(m_simulationParameters),
 
   62   m_simulationOutputs(m_simulationOutputs),
 
   63   m_experimentScenarios(m_experimentScenarios),
 
   64   m_experimentOutputs(m_experimentOutputs),
 
   65   m_discrepancyBases(m_discrepancyBases),
 
   66   m_observationErrorMatrices(m_observationErrorMatrices),
 
   67   m_experimentErrors(m_experimentErrors),
 
   68   m_totalPrior(m_totalPrior),
 
   69   residual(residual_in),
 
   70   BT_Wy_B_inv(BT_Wy_B_inv_in),
 
   76     (m_simulationOutputs[0]->map().Comm().NumProc(), 1);
 
   78   const unsigned int numOutputs =
 
   79     this->m_experimentOutputSpace.
dimLocal();
 
   81   const unsigned int MAX_SVD_TERMS =
 
   82     std::min(m_numSimulations,(
unsigned int)(5));
 
   86 template <
class V, 
class M>
 
   92 template <
class V, 
class M>
 
  149   const unsigned int totalRuns = this->m_numExperiments + this->m_numSimulations;
 
  150   const unsigned int numOutputs = this->m_experimentOutputSpace.dimLocal();
 
  151   const unsigned int totalOutputs = totalRuns * numOutputs;
 
  152   const unsigned int num_discrepancy_bases = m_discrepancyBases.size();
 
  153   const unsigned int residualSize = (numOutputs == 1) ?  totalOutputs :
 
  154     totalRuns * num_svd_terms + m_numExperiments * num_discrepancy_bases;
 
  156   double prodScenario = 1.0;
 
  157   double prodParameter = 1.0;
 
  158   double prodDiscrepancy = 1.0;
 
  159   unsigned int dimScenario = (this->m_scenarioSpace).dimLocal();
 
  160   unsigned int dimParameter = (this->m_parameterSpace).dimLocal();
 
  163   unsigned int dimSum = 3 +
 
  164                         (numOutputs > 1) * 2 +
 
  172   const unsigned int offset1 = (numOutputs == 1) ?
 
  173     0 : m_numExperiments * num_discrepancy_bases;
 
  176   const unsigned int offset1b = offset1 +
 
  177     m_numExperiments * num_svd_terms;
 
  180   const unsigned int offset2 = (numOutputs == 1) ?
 
  181     0 : m_numExperiments * (num_discrepancy_bases + num_svd_terms);
 
  185   Map z_map(residualSize, 0, comm);
 
  186   M covMatrix(this->m_env, z_map, residualSize);
 
  188   V domainVectorParameter(*(this->m_simulationParameters[0]));
 
  189   for (
unsigned int k = 0; 
k < dimParameter; 
k++) {
 
  191     domainVectorParameter[
k] = domainVector[
k];
 
  195   for (
unsigned int i = 0; i < totalRuns; i++) {
 
  202     if (i < this->m_numExperiments) {
 
  204       scenario1 = (this->m_experimentScenarios)[i];
 
  207       parameter1 = &domainVectorParameter;
 
  211         (this->m_simulationScenarios)[i-this->m_numExperiments];
 
  213         (this->m_simulationParameters)[i-this->m_numExperiments];
 
  216     for (
unsigned int j = 0; j < totalRuns; j++) {
 
  221       if (j < this->m_numExperiments) {
 
  222         scenario2 = (this->m_experimentScenarios)[j];
 
  223         parameter2 = &domainVectorParameter;
 
  227           (this->m_simulationScenarios)[j-this->m_numExperiments];
 
  229           (this->m_simulationParameters)[j-this->m_numExperiments];
 
  234       unsigned int emulatorCorrStrStart =
 
  235         dimParameter + 1 + num_svd_terms;
 
  236       for (
unsigned int k = 0; 
k < dimScenario; 
k++) {
 
  237         const double & emulator_corr_strength =
 
  238           domainVector[emulatorCorrStrStart+
k];
 
  239         prodScenario *= std::pow(emulator_corr_strength,
 
  240                                  4.0 * ((*scenario1)[
k] - (*scenario2)[
k]) *
 
  241                                        ((*scenario1)[k] - (*scenario2)[k]));
 
  248       for (
unsigned int k = 0; 
k < dimParameter; 
k++) {
 
  252         const double & emulator_corr_strength =
 
  253           domainVector[emulatorCorrStrStart+dimScenario+
k];
 
  254         prodParameter *= std::pow(
 
  255             emulator_corr_strength,
 
  256             4.0 * ((*parameter1)[k] - (*parameter2)[k]) *
 
  257                   ((*parameter1)[k] - (*parameter2)[k]));
 
  264       for (
unsigned int basis = 0; basis != num_svd_terms; ++basis)
 
  269           const double relevant_precision =
 
  270             domainVector[dimParameter+basis+1+(numOutputs>1)];
 
  273           const unsigned int stridei =
 
  274             (i < this->m_numExperiments) ? m_numExperiments : m_numSimulations;
 
  275           const unsigned int offseti =
 
  276             (i < this->m_numExperiments) ? offset1 : offset1b - m_numExperiments;
 
  277           const unsigned int stridej =
 
  278             (j < this->m_numExperiments) ? m_numExperiments : m_numSimulations;
 
  279           const unsigned int offsetj =
 
  280             (j < this->m_numExperiments) ? offset1 : offset1b - m_numExperiments;
 
  282           covMatrix(offseti+basis*stridei+i,
 
  283                     offsetj+basis*stridej+j) =
 
  284             prodScenario * prodParameter / relevant_precision;
 
  289       if (i < this->m_numExperiments && j < this->m_numExperiments) {
 
  290         V* cross_scenario1 = (this->m_simulationScenarios)[i];
 
  291         V* cross_scenario2 = (this->m_simulationScenarios)[j];
 
  292         prodDiscrepancy = 1.0;
 
  293         unsigned int discrepancyCorrStrStart = dimParameter +
 
  298         for (
unsigned int k = 0; 
k < dimScenario; 
k++) {
 
  299           const double & discrepancy_corr_strength =
 
  300             domainVector[discrepancyCorrStrStart+
k];
 
  302             std::pow(discrepancy_corr_strength, 4.0 *
 
  303                      ((*cross_scenario1)[
k] - (*cross_scenario2)[
k]) *
 
  304                      ((*cross_scenario1)[k] - (*cross_scenario2)[k]));
 
  307         const double discrepancy_precision =
 
  308           domainVector[discrepancyCorrStrStart-1];
 
  314         const double R_v = prodDiscrepancy / discrepancy_precision;
 
  315         for (
unsigned int disc = 0; disc != num_discrepancy_bases;
 
  317           covMatrix(disc*m_numExperiments+i,
 
  318                     disc*m_numExperiments+j) += R_v;
 
  325             const double experimentalError =
 
  326               (this->m_experimentErrors)(i,j);
 
  330             covMatrix(i,j) += experimentalError;
 
  337     const double emulator_data_precision = domainVector[dimSum-1-(numOutputs>1)];
 
  339     double nugget = 1.0 / emulator_data_precision;
 
  341     for (
unsigned int disc = 0; disc != num_discrepancy_bases;
 
  343       covMatrix(disc*m_numExperiments+i,
 
  344                 disc*m_numExperiments+i) += nugget;
 
  351       const double lambda_y = domainVector[dimSum-1];
 
  352       const double inv_lambda_y = 1.0/lambda_y;
 
  354       unsigned int BT_Wy_B_size = BT_Wy_B_inv.numCols();
 
  355       for (
unsigned int i=0; i != BT_Wy_B_size; ++i)
 
  356         for (
unsigned int j=0; j != BT_Wy_B_size; ++j)
 
  357           covMatrix(i,j) += BT_Wy_B_inv(i,j) * inv_lambda_y;
 
  359       const double emulator_precision =
 
  360         domainVector[dimParameter+1];
 
  361       const double inv_emulator_precision = 1.0/emulator_precision;
 
  363       unsigned int KT_K_size = KT_K_inv.numCols();
 
  364       for (
unsigned int i=0; i != KT_K_size; ++i)
 
  365         for (
unsigned int j=0; j != KT_K_size; ++j)
 
  366           covMatrix(i+offset2,j+offset2) +=
 
  367             KT_K_inv(i,j) * inv_emulator_precision;
 
  373   V sol(covMatrix.invertMultiply(residual));
 
  376   double minus_2_log_lhd = 0.0;
 
  378   for (
unsigned int i = 0; i < residualSize; i++) {
 
  379     minus_2_log_lhd += sol[i] * residual[i];
 
  383   for (
unsigned int i = 0; i < residualSize; i++) {
 
  385       std::cout << 
"NaN sol[" << i << 
']' << std::endl;
 
  387       std::cout << 
"NaN residual[" << i << 
']' << std::endl;
 
  389     std::cout << 
"Covariance Matrix:" << std::endl;
 
  390     covMatrix.print(std::cout);
 
  397   double cov_det = covMatrix.determinant();
 
  401       std::cout << 
"Non-positive determinant for covMatrix = " << std::endl;
 
  402       covMatrix.print(std::cout);
 
  406   minus_2_log_lhd += std::log(covMatrix.determinant());
 
  409   return -0.5 * minus_2_log_lhd;
 
  412 template <
class V, 
class M>
 
  424 template <
class V, 
class M>
 
  433     unsigned int numSimulations,
 
  434     unsigned int numExperiments)
 
  437     m_parameterPrior(parameterPrior),
 
  438     m_scenarioSpace(scenarioSpace),
 
  439     m_parameterSpace(parameterSpace),
 
  440     m_simulationOutputSpace(simulationOutputSpace),
 
  441     m_experimentOutputSpace(experimentOutputSpace),
 
  442     m_numSimulations(numSimulations),
 
  443     m_numExperiments(numExperiments),
 
  444     m_simulationScenarios(numSimulations, (V *)NULL),
 
  445     m_simulationParameters(numSimulations, (V *)NULL),
 
  446     m_simulationOutputs(numSimulations, (V *)NULL),
 
  447     m_experimentScenarios(numExperiments, (V *)NULL),
 
  448     m_experimentOutputs(numExperiments, (V *)NULL),
 
  449     m_numSimulationAdds(0),
 
  450     m_numExperimentAdds(0),
 
  452     m_constructedGP(false)
 
  460     const unsigned int numOutputs =
 
  462     const Map & output_map = experimentOutputSpace.
map();
 
  465     V all_ones_basis(env, output_map);
 
  466     for (
unsigned int i=0; i != numOutputs; ++i)
 
  467       all_ones_basis[i] = 1;
 
  472     M identity_matrix(env, output_map, 1.0);
 
  497 template <
class V, 
class M>
 
  500   if (this->allocated_m_opts)
 
  504 template <
class V, 
class M>
 
  508   return this->m_numSimulations;
 
  511 template <
class V, 
class M>
 
  515   return this->m_numExperiments;
 
  518 template <
class V, 
class M>
 
  522   return this->m_scenarioSpace;
 
  525 template <
class V, 
class M>
 
  529   return this->m_parameterSpace;
 
  532 template <
class V, 
class M>
 
  536   return this->m_simulationOutputSpace;
 
  539 template <
class V, 
class M>
 
  543   return this->m_experimentOutputSpace;
 
  546 template <
class V, 
class M>
 
  549     unsigned int simulationId)
 const 
  555   return *(this->m_simulationScenarios[simulationId]);
 
  558 template <
class V, 
class M>
 
  559 const std::vector<V *> &
 
  562   return this->m_simulationScenarios;
 
  565 template <
class V, 
class M>
 
  568     unsigned int simulationId)
 const 
  574   return *(this->m_simulationParameters[simulationId]);
 
  577 template <
class V, 
class M>
 
  578 const std::vector<V *> &
 
  581   return this->m_simulationParameters;
 
  584 template <
class V, 
class M>
 
  587     unsigned int simulationId)
 const 
  593   return *(this->m_simulationOutputs[simulationId]);
 
  596 template <
class V, 
class M>
 
  597 const std::vector<V *> &
 
  600   return this->m_simulationOutputs;
 
  603 template <
class V, 
class M>
 
  606     unsigned int experimentId)
 const 
  612   return *(this->m_experimentScenarios[experimentId]);
 
  615 template <
class V, 
class M>
 
  616 const std::vector<V *> &
 
  619   return this->m_experimentScenarios;
 
  622 template <
class V, 
class M>
 
  625     unsigned int experimentId)
 const 
  631   return *(this->m_experimentOutputs[experimentId]);
 
  634 template <
class V, 
class M>
 
  635 const std::vector<V *> &
 
  638   return this->m_experimentOutputs;
 
  641 template <
class V, 
class M>
 
  645   return *(this->m_experimentErrors);
 
  648 template <
class V, 
class M>
 
  655 template <
class V, 
class M>
 
  659   return *(this->gpmsaEmulator);
 
  662 template <
class V, 
class M>
 
  665                                             V & simulationParameter,
 
  666                                             V & simulationOutput)
 
  670   this->m_simulationScenarios[this->m_numSimulationAdds] = &simulationScenario;
 
  671   this->m_simulationParameters[this->m_numSimulationAdds] = &simulationParameter;
 
  672   this->m_simulationOutputs[this->m_numSimulationAdds] = &simulationOutput;
 
  673   this->m_numSimulationAdds++;
 
  675   if ((this->m_numSimulationAdds == this->m_numSimulations) &&
 
  676       (this->m_numExperimentAdds == this->m_numExperiments) &&
 
  677       (this->m_constructedGP == 
false)) {
 
  678     this->setUpEmulator();
 
  682 template <
class V, 
class M>
 
  685     const std::vector<V *> & simulationScenarios,
 
  686     const std::vector<V *> & simulationParameters,
 
  687     const std::vector<V *> & simulationOutputs)
 
  689   for (
unsigned int i = 0; i < this->m_numSimulations; i++) {
 
  690     this->addSimulation(*(simulationScenarios[i]), *(simulationParameters[i]),
 
  691         *(simulationOutputs[i]));
 
  697 template <
class V, 
class M>
 
  701   const unsigned int numOutputs =
 
  702     this->m_experimentOutputSpace.dimLocal();
 
  703   const unsigned int MAX_SVD_TERMS =
 
  704     std::min(m_numSimulations,(
unsigned int)(5));
 
  705   const unsigned int num_svd_terms =
 
  706     std::min(MAX_SVD_TERMS, numOutputs);
 
  708   const Map & output_map = m_simulationOutputs[0]->map();
 
  712   Map serial_map(m_numSimulations, 0, comm);
 
  716   simulationOutputMeans.reset
 
  717     (
new V (env, output_map));
 
  719   for (
unsigned int i=0; i != m_numSimulations; ++i)
 
  720     for (
unsigned int j=0; j != numOutputs; ++j)
 
  721       (*simulationOutputMeans)[j] += (*m_simulationOutputs[i])[j];
 
  723   for (
unsigned int j=0; j != numOutputs; ++j)
 
  724     (*simulationOutputMeans)[j] /= m_numSimulations;
 
  726   M simulation_matrix(env, serial_map, numOutputs);
 
  728   for (
unsigned int i=0; i != m_numSimulations; ++i)
 
  729     for (
unsigned int j=0; j != numOutputs; ++j)
 
  730       simulation_matrix(i,j) =
 
  731         (*m_simulationOutputs[i])[j] - (*simulationOutputMeans)[j];
 
  736   M S_trans(simulation_matrix.transpose());
 
  738   M SM_squared(S_trans*simulation_matrix);
 
  740   M SM_singularVectors(env, SM_squared.map(), numOutputs);
 
  741   V SM_singularValues(env, SM_squared.map());
 
  743   SM_squared.eigen(SM_singularValues, &SM_singularVectors);
 
  746   m_TruncatedSVD_simulationOutputs.reset
 
  747     (
new M(env, output_map, num_svd_terms));
 
  749   for (
unsigned int i=0; i != numOutputs; ++i)
 
  750     for (
unsigned int k = 0; 
k != num_svd_terms; ++
k)
 
  751       (*m_TruncatedSVD_simulationOutputs)(i,
k) = SM_singularVectors(i,
k);
 
  753   Map copied_map(numOutputs * m_numSimulations, 0, comm);
 
  756     (
new M(env, copied_map, m_numSimulations * num_svd_terms));
 
  757   for (
unsigned int k=0; 
k != num_svd_terms; ++
k)
 
  758     for (
unsigned int i1=0; i1 != m_numSimulations; ++i1)
 
  759       for (
unsigned int i2=0; i2 != numOutputs; ++i2)
 
  761           const unsigned int i = i1 * numOutputs + i2;
 
  762           const unsigned int j = 
k * m_numSimulations + i1;
 
  763           (*K)(i,j) = SM_singularVectors(i2,
k);
 
  767     (
new M((K->transpose() * *K).inverse()));
 
  769   Map serial_output_map(numOutputs, 0, comm);
 
  771   for (
unsigned int i = 0; i != m_numExperiments; ++i)
 
  773       M D_i(env, serial_output_map,
 
  774             (
unsigned int)(m_discrepancyBases.size()));
 
  776       for (
unsigned int j=0; j != numOutputs; ++j)
 
  777         for (
unsigned int k=0; 
k != m_discrepancyBases.size(); ++
k)
 
  778           D_i(j,
k) = m_discrepancyBases[
k][j];
 
  780       m_discrepancyMatrices.push_back(D_i);
 
  796   const unsigned int num_discrepancy_bases = m_discrepancyBases.size();
 
  797   const unsigned int Brows = m_numExperiments * numOutputs;
 
  798   const unsigned int Bcols =
 
  799     m_numExperiments * (num_discrepancy_bases + num_svd_terms);
 
  801   const Map B_row_map(Brows, 0, comm);
 
  804     (
new M(env, B_row_map, Bcols));
 
  806   const unsigned int Wyrows = m_numExperiments * numOutputs;
 
  808   const Map Wy_row_map(Wyrows, 0, comm);
 
  810   m_observationErrorMatrix.reset
 
  811     (
new M(env, Wy_row_map, Wyrows));
 
  814   M& Wy = *m_observationErrorMatrix;
 
  816   for (
unsigned int ex = 0; ex != m_numExperiments; ++ex)
 
  818       const M & D_i = m_discrepancyMatrices[ex];
 
  827       for (
unsigned int outi = 0; outi != numOutputs; ++outi)
 
  829           unsigned int i = ex*numOutputs+outi;
 
  830           for (
unsigned int outj = 0; outj != num_discrepancy_bases; ++outj)
 
  832               unsigned int j = ex + m_numExperiments * outj;
 
  834               B(i,j) = D_i(outi,outj);
 
  837           for (
unsigned int outj = 0; outj != num_svd_terms; ++outj)
 
  839               unsigned int j = ex +
 
  840                 m_numExperiments * (num_discrepancy_bases + outj);
 
  842               B(i,j) = (*m_TruncatedSVD_simulationOutputs)(outi,outj);
 
  845           for (
unsigned int outj = 0; outj != numOutputs; ++outj)
 
  848               unsigned int j = ex*numOutputs+outj;
 
  850               Wy(i,j) = m_observationErrorMatrices[ex](outi,outj);
 
  855   M BT_Wy_B (B.transpose() * Wy * B);
 
  859   for (
unsigned int i=0; i != Brows; ++i)
 
  860     BT_Wy_B(i,i) += 1.e-4;
 
  862   BT_Wy_B_inv.reset(
new M(BT_Wy_B.inverse()));
 
  864   this->setUpHyperpriors();
 
  866   this->m_constructedGP = 
true;
 
  867   this->gpmsaEmulator.reset
 
  869       this->prior().imageSet(),
 
  870       this->m_scenarioSpace,
 
  871       this->m_parameterSpace,
 
  872       this->m_simulationOutputSpace,
 
  873       this->m_experimentOutputSpace,
 
  874       this->m_numSimulations,
 
  875       this->m_numExperiments,
 
  876       this->m_simulationScenarios,
 
  877       this->m_simulationParameters,
 
  878       this->m_simulationOutputs,
 
  879       this->m_experimentScenarios,
 
  880       this->m_experimentOutputs,
 
  881       this->m_discrepancyBases,
 
  882       this->m_observationErrorMatrices,
 
  883       *(this->m_experimentErrors),
 
  884       *(this->m_totalPrior),
 
  892 template <
class V, 
class M>
 
  895     const std::vector<V *> & experimentScenarios,
 
  896     const std::vector<V *> & experimentOutputs,
 
  897     const M * experimentErrors)
 
  901   for (
unsigned int i = 0; i < this->m_experimentScenarios.size(); i++) {
 
  902     this->m_experimentScenarios[i] = experimentScenarios[i];
 
  903     this->m_experimentOutputs[i] = experimentOutputs[i];
 
  905   this->m_experimentErrors = experimentErrors;
 
  906   this->m_numExperimentAdds += experimentScenarios.size();
 
  908   if ((this->m_numSimulationAdds == this->m_numSimulations) &&
 
  909       (this->m_numExperimentAdds == this->m_numExperiments) &&
 
  910       (this->m_constructedGP == 
false)) {
 
  911     this->setUpEmulator();
 
  916 template <
class V, 
class M>
 
  919     const std::vector<V *> & discrepancyBases)
 
  921   m_discrepancyBases.clear();
 
  923   for (
unsigned int i = 0; i < discrepancyBases.size(); i++) {
 
  924     m_discrepancyBases.push_back(*(discrepancyBases[i]));
 
  933 template <
class V, 
class M>
 
  936   (
unsigned int simulationNumber)
 
  941   return m_observationErrorMatrices[simulationNumber];
 
  945 template <
class V, 
class M>
 
  948   (
unsigned int simulationNumber) 
const 
  953   return m_observationErrorMatrices[simulationNumber];
 
  958 template <
class V, 
class M>
 
  962   return *(this->m_totalPrior);
 
  965 template <
class V, 
class M>
 
  973 template <
class V, 
class M>
 
  977   const unsigned int numOutputs =
 
  978     this->m_experimentOutputSpace.dimLocal();
 
  979   const unsigned int MAX_SVD_TERMS =
 
  980     std::min(m_numSimulations,(
unsigned int)(5));
 
  981   const unsigned int num_svd_terms =
 
  982     std::min(MAX_SVD_TERMS, numOutputs);
 
  983   const unsigned int num_discrepancy_bases = m_discrepancyBases.size();
 
  985   const MpiComm & comm = m_simulationOutputs[0]->map().
Comm();
 
  988   if (m_BMatrix->numRowsGlobal() > m_BMatrix->numCols())
 
  989     rank_B = m_BMatrix->rank(0, 1.e-4);
 
  991     rank_B = m_BMatrix->transpose().rank(0, 1.e-4);
 
  993   double emulatorPrecisionShape = this->m_opts->m_emulatorPrecisionShape;
 
  994   double emulatorPrecisionScale = this->m_opts->m_emulatorPrecisionScale;
 
  996   double observationalPrecisionShape = this->m_opts->m_observationalPrecisionShape;
 
  997   double observationalPrecisionScale = this->m_opts->m_observationalPrecisionScale;
 
 1001       Map y_map(m_numExperiments * numOutputs, 0, comm);
 
 1002       Map eta_map(m_numSimulations * numOutputs, 0, comm);
 
 1004       const unsigned int yhat_size =
 
 1005         m_numExperiments * (num_discrepancy_bases + num_svd_terms);
 
 1007       const unsigned int etahat_size =
 
 1008         m_numSimulations * num_svd_terms;
 
 1010       Map zhat_map(yhat_size + etahat_size, 0, comm);
 
 1012       V y(this->m_env, y_map);
 
 1013       V eta(this->m_env, eta_map);
 
 1015       for (
unsigned int i = 0; i < this->m_numExperiments; i++) {
 
 1016         for (
unsigned int k = 0; 
k != numOutputs; ++
k)
 
 1018             (*((this->m_experimentOutputs)[i]))[
k] -
 
 1019             (*simulationOutputMeans)[
k];
 
 1022       for (
unsigned int i = 0; i < this->m_numSimulations; i++) {
 
 1023         for (
unsigned int k = 0; 
k != numOutputs; ++
k)
 
 1024           eta[i*numOutputs+
k] =
 
 1025             (*((this->m_simulationOutputs)[i]))[
k] -
 
 1026             (*simulationOutputMeans)[
k];
 
 1030       M& Wy = *m_observationErrorMatrix;
 
 1032       V yhat(*BT_Wy_B_inv * (B.transpose() * (Wy * y)));
 
 1036       V etahat(*KT_K_inv * (K->transpose() * eta));
 
 1038       residual.reset(
new V(this->m_env, zhat_map));
 
 1039       for (
unsigned int i = 0; i < yhat_size; ++i)
 
 1040         (*residual)[i] = yhat[i];
 
 1042       for (
unsigned int i = 0; i < etahat_size; ++i)
 
 1043         (*residual)[yhat_size+i] = etahat[i];
 
 1045       emulatorPrecisionShape +=
 
 1046         (this->m_numSimulations * (numOutputs - num_svd_terms)) / 2.0;
 
 1049       eta_temp -= *K * etahat;
 
 1051       emulatorPrecisionScale +=
 
 1054       observationalPrecisionShape +=
 
 1055         (this->m_numExperiments * numOutputs - rank_B) / 2.0;
 
 1058       y_temp -= Wy * B * yhat;
 
 1060       observationalPrecisionScale +=
 
 1065       const unsigned int totalRuns = this->m_numExperiments + this->m_numSimulations;
 
 1066       Map z_map(totalRuns, 0, comm);
 
 1067       residual.reset(
new V (this->m_env, z_map));
 
 1072       for (
unsigned int i = 0; i < this->m_numExperiments; i++) {
 
 1073         (*residual)[i] = (*((this->m_experimentOutputs)[i]))[0] -
 
 1074                          (*simulationOutputMeans)[0];
 
 1076       for (
unsigned int i = 0; i < this->m_numSimulations; i++) {
 
 1077         (*residual)[i+this->m_numExperiments] =
 
 1078           (*((this->m_simulationOutputs)[i]))[0] -
 
 1079           (*simulationOutputMeans)[0];
 
 1084   double emulatorCorrelationStrengthAlpha = this->m_opts->m_emulatorCorrelationStrengthAlpha;
 
 1085   double emulatorCorrelationStrengthBeta = this->m_opts->m_emulatorCorrelationStrengthBeta;
 
 1086   double discrepancyPrecisionShape = this->m_opts->m_discrepancyPrecisionShape;
 
 1087   double discrepancyPrecisionScale = this->m_opts->m_discrepancyPrecisionScale;
 
 1088   double discrepancyCorrelationStrengthAlpha = this->m_opts->m_discrepancyCorrelationStrengthAlpha;
 
 1089   double discrepancyCorrelationStrengthBeta = this->m_opts->m_discrepancyCorrelationStrengthBeta;
 
 1090   double emulatorDataPrecisionShape = this->m_opts->m_emulatorDataPrecisionShape;
 
 1091   double emulatorDataPrecisionScale = this->m_opts->m_emulatorDataPrecisionScale;
 
 1093   this->oneDSpace.reset
 
 1097   this->emulatorMeanMin.reset(
new V(this->oneDSpace->zeroVector()));
 
 1098   this->emulatorMeanMax.reset(
new V(this->oneDSpace->zeroVector()));
 
 1099   this->emulatorMeanMin->cwSet(-INFINITY);
 
 1100   this->emulatorMeanMax->cwSet(INFINITY);
 
 1102   this->emulatorMeanDomain.reset
 
 1106        *(this->emulatorMeanMin),
 
 1107        *(this->emulatorMeanMax)));
 
 1109   this->m_emulatorMean.reset
 
 1112       *(this->emulatorMeanDomain)));
 
 1115   this->emulatorPrecisionSpace.reset
 
 1119       num_svd_terms + (numOutputs > 1),
 
 1122   this->emulatorPrecisionMin.reset
 
 1123     (
new V(this->emulatorPrecisionSpace->zeroVector()));
 
 1124   this->emulatorPrecisionMax.reset
 
 1125     (
new V(this->emulatorPrecisionSpace->zeroVector()));
 
 1126   this->m_emulatorPrecisionShapeVec.reset
 
 1127     (
new V(this->emulatorPrecisionSpace->zeroVector()));
 
 1128   this->m_emulatorPrecisionScaleVec.reset
 
 1129     (
new V(this->emulatorPrecisionSpace->zeroVector()));
 
 1130   this->emulatorPrecisionMin->cwSet(0.3);
 
 1131   this->emulatorPrecisionMax->cwSet(INFINITY);
 
 1132   this->m_emulatorPrecisionShapeVec->cwSet(emulatorPrecisionShape);
 
 1133   this->m_emulatorPrecisionScaleVec->cwSet(emulatorPrecisionScale);
 
 1135   this->emulatorPrecisionDomain.reset
 
 1138       *(this->emulatorPrecisionSpace),
 
 1139       *(this->emulatorPrecisionMin),
 
 1140       *(this->emulatorPrecisionMax)));
 
 1142   this->m_emulatorPrecision.reset
 
 1145       *(this->emulatorPrecisionDomain),
 
 1146       *(this->m_emulatorPrecisionShapeVec),
 
 1147       *(this->m_emulatorPrecisionScaleVec)));
 
 1150   unsigned int dimScenario = (this->scenarioSpace()).dimLocal();
 
 1151   unsigned int dimParameter = (this->parameterSpace()).dimLocal();
 
 1152   this->emulatorCorrelationSpace.reset
 
 1156       dimScenario + dimParameter,
 
 1159   this->emulatorCorrelationMin.reset
 
 1160     (
new V(this->emulatorCorrelationSpace->zeroVector()));
 
 1161   this->emulatorCorrelationMax.reset
 
 1162     (
new V(this->emulatorCorrelationSpace->zeroVector()));
 
 1163   this->m_emulatorCorrelationStrengthAlphaVec.reset
 
 1164     (
new V(this->emulatorCorrelationSpace->zeroVector()));
 
 1165   this->m_emulatorCorrelationStrengthBetaVec.reset
 
 1166     (
new V(this->emulatorCorrelationSpace->zeroVector()));
 
 1167   this->emulatorCorrelationMin->cwSet(0);
 
 1168   this->emulatorCorrelationMax->cwSet(1);
 
 1169   this->m_emulatorCorrelationStrengthAlphaVec->cwSet(emulatorCorrelationStrengthAlpha);
 
 1170   this->m_emulatorCorrelationStrengthBetaVec->cwSet(emulatorCorrelationStrengthBeta);
 
 1172   this->emulatorCorrelationDomain.reset
 
 1175       *(this->emulatorCorrelationSpace),
 
 1176       *(this->emulatorCorrelationMin),
 
 1177       *(this->emulatorCorrelationMax)));
 
 1179   this->m_emulatorCorrelationStrength.reset
 
 1182       *(this->emulatorCorrelationDomain),
 
 1183       *(this->m_emulatorCorrelationStrengthAlphaVec),
 
 1184       *(this->m_emulatorCorrelationStrengthBetaVec)));
 
 1187   this->observationalPrecisionSpace.reset
 
 1194   this->observationalPrecisionMin.reset
 
 1195     (
new V(this->observationalPrecisionSpace->zeroVector()));
 
 1196   this->observationalPrecisionMax.reset
 
 1197     (
new V(this->observationalPrecisionSpace->zeroVector()));
 
 1198   this->m_observationalPrecisionShapeVec.reset
 
 1199     (
new V(this->observationalPrecisionSpace->zeroVector()));
 
 1200   this->m_observationalPrecisionScaleVec.reset
 
 1201     (
new V(this->observationalPrecisionSpace->zeroVector()));
 
 1202   this->observationalPrecisionMin->cwSet(0.3);
 
 1203   this->observationalPrecisionMax->cwSet(INFINITY);
 
 1204   this->m_observationalPrecisionShapeVec->cwSet
 
 1205     (this->m_opts->m_observationalPrecisionShape);
 
 1206   this->m_observationalPrecisionScaleVec->cwSet
 
 1207     (this->m_opts->m_observationalPrecisionScale);
 
 1209   this->observationalPrecisionDomain.reset
 
 1212       *(this->observationalPrecisionSpace),
 
 1213       *(this->observationalPrecisionMin),
 
 1214       *(this->observationalPrecisionMax)));
 
 1216   this->m_observationalPrecision.reset
 
 1219       *(this->observationalPrecisionDomain),
 
 1220       *(this->m_observationalPrecisionShapeVec),
 
 1221       *(this->m_observationalPrecisionScaleVec)));
 
 1224   this->discrepancyPrecisionMin.reset
 
 1225     (
new V(this->oneDSpace->zeroVector()));
 
 1226   this->discrepancyPrecisionMax.reset
 
 1227     (
new V(this->oneDSpace->zeroVector()));
 
 1228   this->m_discrepancyPrecisionShapeVec.reset
 
 1229     (
new V(this->oneDSpace->zeroVector()));
 
 1230   this->m_discrepancyPrecisionScaleVec.reset
 
 1231     (
new V(this->oneDSpace->zeroVector()));
 
 1232   this->discrepancyPrecisionMin->cwSet(0);
 
 1233   this->discrepancyPrecisionMax->cwSet(INFINITY);
 
 1234   this->m_discrepancyPrecisionShapeVec->cwSet(discrepancyPrecisionShape);
 
 1235   this->m_discrepancyPrecisionScaleVec->cwSet(discrepancyPrecisionScale);
 
 1237   this->discrepancyPrecisionDomain.reset
 
 1241       *(this->discrepancyPrecisionMin),
 
 1242       *(this->discrepancyPrecisionMax)));
 
 1244   this->m_discrepancyPrecision.reset
 
 1247       *(this->discrepancyPrecisionDomain),
 
 1248       *(this->m_discrepancyPrecisionShapeVec),
 
 1249       *(this->m_discrepancyPrecisionScaleVec)));
 
 1252   this->discrepancyCorrelationSpace.reset
 
 1259   this->discrepancyCorrelationMin.reset
 
 1260     (
new V(this->discrepancyCorrelationSpace->zeroVector()));
 
 1261   this->discrepancyCorrelationMax.reset
 
 1262     (
new V(this->discrepancyCorrelationSpace->zeroVector()));
 
 1263   this->m_discrepancyCorrelationStrengthAlphaVec.reset
 
 1264     (
new V(this->discrepancyCorrelationSpace->zeroVector()));
 
 1265   this->m_discrepancyCorrelationStrengthBetaVec.reset
 
 1266     (
new V(this->discrepancyCorrelationSpace->zeroVector()));
 
 1267   this->discrepancyCorrelationMin->cwSet(0);
 
 1268   this->discrepancyCorrelationMax->cwSet(1);
 
 1269   this->m_discrepancyCorrelationStrengthAlphaVec->cwSet(discrepancyCorrelationStrengthAlpha);
 
 1270   this->m_discrepancyCorrelationStrengthBetaVec->cwSet(discrepancyCorrelationStrengthBeta);
 
 1272   this->discrepancyCorrelationDomain.reset
 
 1275       *(this->discrepancyCorrelationSpace),
 
 1276       *(this->discrepancyCorrelationMin),
 
 1277       *(this->discrepancyCorrelationMax)));
 
 1279   this->m_discrepancyCorrelationStrength.reset
 
 1282       *(this->discrepancyCorrelationDomain),
 
 1283       *(this->m_discrepancyCorrelationStrengthAlphaVec),
 
 1284       *(this->m_discrepancyCorrelationStrengthBetaVec)));
 
 1287   this->emulatorDataPrecisionMin.reset
 
 1288     (
new V(this->oneDSpace->zeroVector()));
 
 1289   this->emulatorDataPrecisionMax.reset
 
 1290     (
new V(this->oneDSpace->zeroVector()));
 
 1291   this->m_emulatorDataPrecisionShapeVec.reset
 
 1292     (
new V(this->oneDSpace->zeroVector()));
 
 1293   this->m_emulatorDataPrecisionScaleVec.reset
 
 1294     (
new V(this->oneDSpace->zeroVector()));
 
 1295   this->emulatorDataPrecisionMin->cwSet(60.0);
 
 1296   this->emulatorDataPrecisionMax->cwSet(1e5);
 
 1297   this->m_emulatorDataPrecisionShapeVec->cwSet(emulatorDataPrecisionShape);
 
 1298   this->m_emulatorDataPrecisionScaleVec->cwSet(emulatorDataPrecisionScale);
 
 1300   this->emulatorDataPrecisionDomain.reset
 
 1304       *(this->emulatorDataPrecisionMin),
 
 1305       *(this->emulatorDataPrecisionMax)));
 
 1307   this->m_emulatorDataPrecision.reset
 
 1310       *(this->emulatorDataPrecisionDomain),
 
 1311       *(this->m_emulatorDataPrecisionShapeVec),
 
 1312       *(this->m_emulatorDataPrecisionScaleVec)));
 
 1315   unsigned int dimSum = 3 +
 
 1316                         (numOutputs > 1) * 2 +
 
 1323   this->totalSpace.reset
 
 1329   this->totalMins.reset(
new V(this->totalSpace->zeroVector()));
 
 1330   this->totalMaxs.reset(
new V(this->totalSpace->zeroVector()));
 
 1333   this->totalMins->cwSet(0);
 
 1334   this->totalMaxs->cwSet(1);
 
 1336   (*(this->totalMins))[dimParameter] = -INFINITY;  
 
 1337   (*(this->totalMaxs))[dimParameter] = INFINITY;  
 
 1340   (*(this->totalMins))[dimParameter+1] = 0.3;
 
 1342   (*(this->totalMaxs))[dimParameter+1] = INFINITY;
 
 1345     for (
unsigned int basis = 0; basis != num_svd_terms; ++basis)
 
 1348         (*(this->totalMins))[dimParameter+2+basis] = 0.3;
 
 1350         (*(this->totalMaxs))[dimParameter+2+basis] = INFINITY;
 
 1355   (*(this->totalMins))[dimParameter+1+(numOutputs>1)+num_svd_terms+dimScenario+dimParameter] = 0;
 
 1357   (*(this->totalMaxs))[dimParameter+1+(numOutputs>1)+num_svd_terms+dimScenario+dimParameter] = INFINITY;
 
 1359   (*(this->totalMins))[dimSum-1-(numOutputs>1)] = 60.0;  
 
 1360   (*(this->totalMaxs))[dimSum-1-(numOutputs>1)] = 1e5;   
 
 1363     (*(this->totalMins))[dimSum-1] = 0.3;      
 
 1364     (*(this->totalMaxs))[dimSum-1] = INFINITY; 
 
 1367   this->totalDomain.reset
 
 1370       *(this->totalSpace),
 
 1372       *(this->totalMaxs)));
 
 1374   this->priors[0] = &(this->m_parameterPrior);
 
 1375   this->priors[1] = this->m_emulatorMean.get();
 
 1376   this->priors[2] = this->m_emulatorPrecision.get();
 
 1377   this->priors[3] = this->m_emulatorCorrelationStrength.get();
 
 1378   this->priors[4] = this->m_discrepancyPrecision.get();
 
 1379   this->priors[5] = this->m_discrepancyCorrelationStrength.get();
 
 1380   this->priors[6] = this->m_emulatorDataPrecision.get();
 
 1382     this->priors.push_back(this->m_observationalPrecision.get());
 
 1385   this->m_totalPrior.reset
 
 1389       *(this->totalDomain)));
 
void print(std::ostream &os) const 
 
const Map & map() const 
Map. 
 
RawType_MPI_Comm Comm() const 
Extract MPI Communicator from a MpiComm object. 
 
M & getObservationErrorCovariance(unsigned int simulationNumber)
 
A templated (base) class for handling scalar functions. 
 
std::vector< V > m_discrepancyBases
 
const ConcatenatedVectorRV< V, M > & prior() const 
 
A class representing a vector RV constructed via Beta distribution. 
 
std::string optionsInputFileName() const 
Access to the attribute m_optionsInputFileName, which stores the name of the input file passed by the...
 
A class representing a vector space. 
 
unsigned int numSimulations() const 
Return number of simulations. 
 
A class representing concatenated vector RVs. 
 
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
 
#define queso_assert_greater(expr1, expr2)
 
A templated base class for handling vector RV. 
 
unsigned int numExperiments() const 
Return number of experiments. 
 
const V & simulationParameter(unsigned int simulationId) const 
Return the point in parameterSpace for simulation simulationId. 
 
A class representing a vector RV constructed via Gamma distribution. 
 
void setDiscrepancyBases(const std::vector< V * > &discrepancyBases)
Add all discrepancy bases to this. 
 
virtual double lnValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const 
Logarithm of the value of the scalar function. 
 
#define queso_assert_greater_equal(expr1, expr2)
 
#define queso_require_less_msg(expr1, expr2, msg)
 
GPMSAEmulator(const VectorSet< V, M > &domain, const VectorSpace< V, M > &m_scenarioSpace, const VectorSpace< V, M > &m_parameterSpace, const VectorSpace< V, M > &m_simulationOutputSpace, const VectorSpace< V, M > &m_experimentOutputSpace, const unsigned int m_numSimulations, const unsigned int m_numExperiments, const std::vector< V * > &m_simulationScenarios, const std::vector< V * > &m_simulationParameters, const std::vector< V * > &m_simulationOutputs, const std::vector< V * > &m_experimentScenarios, const std::vector< V * > &m_experimentOutputs, const std::vector< V > &m_discrepancyBases, const std::vector< M > &m_observationErrorMatrices, const M &m_experimentErrors, const ConcatenatedVectorRV< V, M > &m_totalPrior, const V &residual_in, const M &BT_Wy_B_inv_in, const M &KT_K_inv_in)
 
A class for partitioning vectors and matrices. 
 
const V & simulationOutput(unsigned int simulationId) const 
Return the simulation output for simulation simulationId. 
 
const VectorSpace< V, M > & m_experimentOutputSpace
 
Class representing a subset of a vector space shaped like a hypercube. 
 
void addSimulation(V &simulationScenario, V &simulationParameter, V &simulationOutput)
Add a simulation to this. 
 
const BaseEnvironment & m_env
 
const std::vector< V * > & simulationScenarios() const 
Return all points in scenarioSpace for all simulations. 
 
const VectorSpace< V, M > & simulationOutputSpace() const 
Return the vector space in which simulations live. 
 
virtual double actualValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const 
Actual value of the scalar function. 
 
GPMSAFactory(const BaseEnvironment &env, GPMSAOptions *opts, const BaseVectorRV< V, M > ¶meterPrior, const VectorSpace< V, M > &scenarioSpace, const VectorSpace< V, M > ¶meterSpace, const VectorSpace< V, M > &simulationOutputSpace, const VectorSpace< V, M > &experimentOutputSpace, unsigned int numSimulations, unsigned int numExperiments)
Constructor. 
 
#define queso_assert_equal_to(expr1, expr2)
 
A templated class for handling sets. 
 
const VectorSpace< V, M > & scenarioSpace() const 
Return the vector space in which scenarios live. 
 
#define queso_assert(asserted)
 
const V & experimentScenario(unsigned int experimentId) const 
Return the point in scenarioSpace for experiment experimentId. 
 
This class defines the options that specify the behaviour of the Gaussian process emulator...
 
const std::vector< V * > & experimentScenarios() const 
Return all points in scenarioSpace for all experiments. 
 
const V & simulationScenario(unsigned int simulationId) const 
Return the point in scenarioSpace for simulation simulationId. 
 
unsigned int num_svd_terms
 
const BaseEnvironment & env() const 
Return the QUESO environment. 
 
double scalarProduct(const GslVector &x, const GslVector &y)
 
const M & experimentErrors() const 
Return all observation error covarince matrices for all experiments. 
 
#define queso_require_less_equal_msg(expr1, expr2, msg)
 
A class representing a uniform vector RV. 
 
const std::vector< V * > & simulationParameters() const 
Return all points in parameterSpace for all simulations. 
 
#define queso_require_msg(asserted, msg)
 
unsigned int dimGlobal() const 
 
The QUESO MPI Communicator Class. 
 
void addExperiments(const std::vector< V * > &experimentScenarios, const std::vector< V * > &experimentOutputs, const M *experimentErrors)
Add all experiments to this. 
 
const std::vector< V * > & experimentOutputs() const 
Return all points in experimentOutputSpace for all experiments. 
 
#define queso_assert_less(expr1, expr2)
 
~GPMSAFactory()
Destructor. 
 
void addSimulations(const std::vector< V * > &simulationScenarios, const std::vector< V * > &simulationParameters, const std::vector< V * > &simulationOutputs)
Adds multiple simulations to this. 
 
#define queso_error_msg(msg)
 
const MpiComm & Comm() const 
Access function for MpiComm communicator. 
 
const std::vector< V * > & simulationOutputs() const 
Return all points in simulationOutputSpace for all simulations. 
 
const GPMSAEmulator< V, M > & getGPMSAEmulator() const 
Return the GPMSAEmulator likelihood object. 
 
const VectorSpace< V, M > & parameterSpace() const 
Return the vector space in which parameters live. 
 
const VectorSpace< V, M > & experimentOutputSpace() const 
Return the vector space in which experiments live. 
 
std::vector< M > m_observationErrorMatrices
 
unsigned int dimLocal() const 
 
const V & experimentOutput(unsigned int experimentId) const 
Return the experiment output for experiment experimentId.