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.