From 911d1924cbe8d1a84f3907693f04357a8f86716a Mon Sep 17 00:00:00 2001 From: kohlhaasrebecca <rebecca.kohlhaas@outlook.com> Date: Wed, 24 Jan 2024 15:20:21 +0100 Subject: [PATCH] Added simple constraint and example OLS constraint directly to be set in the MetaModel source code. Small regression comparison as example for the constraint. No unit tests yet for the feature --- .coverage | Bin 53248 -> 0 bytes .coverage.DESKTOP-ATMEKSV.10616.XTfwDWtx | 0 .coverage.DESKTOP-ATMEKSV.12272.XtVlLrXx | 0 .coverage.DESKTOP-ATMEKSV.12632.XFsLVCEx | 0 .coverage.DESKTOP-ATMEKSV.12712.XTfzFmnx | 0 .coverage.DESKTOP-ATMEKSV.12824.XsNQEeax | 0 .coverage.DESKTOP-ATMEKSV.13164.XMerVQGx | 0 .coverage.DESKTOP-ATMEKSV.14180.XbsXbgvx | 0 .coverage.DESKTOP-ATMEKSV.14476.XuUyQWDx | 0 .coverage.DESKTOP-ATMEKSV.14520.XbJgzpTx | 0 .coverage.DESKTOP-ATMEKSV.14712.XMgYrQCx | 0 .coverage.DESKTOP-ATMEKSV.15144.XkcHTkix | 0 .coverage.DESKTOP-ATMEKSV.15284.XMONvZEx | 0 .coverage.DESKTOP-ATMEKSV.15440.XIuChHnx | 0 .coverage.DESKTOP-ATMEKSV.16012.XGeLQTlx | 0 .coverage.DESKTOP-ATMEKSV.17012.XcDINRSx | 0 .coverage.DESKTOP-ATMEKSV.18500.XGbXmSjx | 0 .coverage.DESKTOP-ATMEKSV.18844.XDPLaYqx | 0 .coverage.DESKTOP-ATMEKSV.19440.XUospmUx | 0 .coverage.DESKTOP-ATMEKSV.19500.XYuOMLJx | 0 .coverage.DESKTOP-ATMEKSV.20080.XqjMBHMx | 0 .coverage.DESKTOP-ATMEKSV.20784.XvtbIeRx | 0 .coverage.DESKTOP-ATMEKSV.21516.XyAVyWNx | Bin 8192 -> 0 bytes .coverage.DESKTOP-ATMEKSV.22012.XZkqdGCx | 0 .coverage.DESKTOP-ATMEKSV.22436.XLHoKASx | 0 .coverage.DESKTOP-ATMEKSV.22632.XQfiQacx | 0 .coverage.DESKTOP-ATMEKSV.22836.XaSNeVKx | 0 .coverage.DESKTOP-ATMEKSV.22988.XTBOmFhx | 0 .coverage.DESKTOP-ATMEKSV.23568.XYxMRfbx | 0 .coverage.DESKTOP-ATMEKSV.23860.XYIorGax | 0 .coverage.DESKTOP-ATMEKSV.24016.XyQmgPnx | 0 .coverage.DESKTOP-ATMEKSV.24380.XNVSylrx | 0 .coverage.DESKTOP-ATMEKSV.24560.XYUIvLux | 0 .coverage.DESKTOP-ATMEKSV.24800.XXnYmDJx | 0 .coverage.DESKTOP-ATMEKSV.25428.XVVrZIbx | 0 .coverage.DESKTOP-ATMEKSV.26276.XmpaSHVx | 0 .coverage.DESKTOP-ATMEKSV.26332.XgxWdWdx | 0 .coverage.DESKTOP-ATMEKSV.26388.XIWhjYox | 0 .coverage.DESKTOP-ATMEKSV.26448.XEujWYRx | 0 .coverage.DESKTOP-ATMEKSV.26780.XoqRisNx | 0 .coverage.DESKTOP-ATMEKSV.27032.XbZUsCZx | 0 .coverage.DESKTOP-ATMEKSV.27288.XZlyvVqx | 0 .coverage.DESKTOP-ATMEKSV.27372.XepoDlGx | 0 .coverage.DESKTOP-ATMEKSV.28092.XXuBidHx | 0 .coverage.DESKTOP-ATMEKSV.28420.XDzinShx | 0 .coverage.DESKTOP-ATMEKSV.28452.XeVLFCHx | 0 .coverage.DESKTOP-ATMEKSV.28556.XrWyCSOx | 0 .coverage.DESKTOP-ATMEKSV.28620.XTgkXKsx | 0 .coverage.DESKTOP-ATMEKSV.28764.XdZVRgcx | 0 .coverage.DESKTOP-ATMEKSV.29316.XAELrPgx | 0 .coverage.DESKTOP-ATMEKSV.29508.XebbGpLx | 0 .coverage.DESKTOP-ATMEKSV.29692.XbSwKvzx | 0 .coverage.DESKTOP-ATMEKSV.29708.XxOJAAMx | 0 .coverage.DESKTOP-ATMEKSV.29716.XPHrvILx | 0 .coverage.DESKTOP-ATMEKSV.29800.XEZtVFex | 0 .coverage.DESKTOP-ATMEKSV.30072.XoxDTLSx | 0 .coverage.DESKTOP-ATMEKSV.30104.XgFimZxx | 0 .coverage.DESKTOP-ATMEKSV.30364.XLrThOtx | 0 .coverage.DESKTOP-ATMEKSV.30652.XXqFtKkx | 0 .coverage.DESKTOP-ATMEKSV.32204.XCbTXmgx | Bin 16384 -> 0 bytes .coverage.DESKTOP-ATMEKSV.36684.XKrSwPEx | Bin 53248 -> 0 bytes .coverage.DESKTOP-ATMEKSV.4220.XvYRULHx | 0 .coverage.DESKTOP-ATMEKSV.6072.XZIEcISx | 0 .coverage.DESKTOP-ATMEKSV.6276.XTHKMAtx | 0 .coverage.DESKTOP-ATMEKSV.8092.XHklueAx | 0 .coverage.DESKTOP-ATMEKSV.8348.XnOVMQzx | 0 .coverage.DESKTOP-ATMEKSV.8736.XGwoASwx | 0 Outputs_Bayes_None_Calib/emcee_sampler.h5 | Bin 0 -> 3281440 bytes .../posterior/Z.npy | Bin 0 -> 176 bytes .../convergence_tests/convergence_test.py | 103 + .../example_trainingconvergence.py | 179 ++ examples/convergence_tests/testfunction.py | 17 + .../bayesvalidrox/__init__.py | 25 - .../__pycache__/__init__.cpython-310.pyc | Bin 795 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 968 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 860 -> 0 bytes .../bayesvalidrox/bayes_inference/__init__.py | 9 - .../__pycache__/__init__.cpython-310.pyc | Bin 303 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 354 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 368 -> 0 bytes .../bayes_inference.cpython-310.pyc | Bin 31276 -> 0 bytes .../bayes_inference.cpython-311.pyc | Bin 60952 -> 0 bytes .../bayes_inference.cpython-39.pyc | Bin 31419 -> 0 bytes .../bayes_model_comparison.cpython-310.pyc | Bin 15645 -> 0 bytes .../bayes_model_comparison.cpython-311.pyc | Bin 27157 -> 0 bytes .../bayes_model_comparison.cpython-39.pyc | Bin 15716 -> 0 bytes .../__pycache__/discrepancy.cpython-310.pyc | Bin 3806 -> 0 bytes .../__pycache__/discrepancy.cpython-311.pyc | Bin 4661 -> 0 bytes .../__pycache__/discrepancy.cpython-39.pyc | Bin 3869 -> 0 bytes .../__pycache__/mcmc.cpython-310.pyc | Bin 18924 -> 0 bytes .../__pycache__/mcmc.cpython-311.pyc | Bin 35893 -> 0 bytes .../__pycache__/mcmc.cpython-39.pyc | Bin 18959 -> 0 bytes .../bayes_inference/bayes_inference.py | 1532 ------------ .../bayes_inference/bayes_model_comparison.py | 658 ----- .../bayes_inference/discrepancy.py | 103 - .../bayesvalidrox/bayes_inference/mcmc.py | 909 ------- .../bayesvalidrox/bayesvalidrox.mplstyle | 16 - .../bayesvalidrox/post_processing/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 261 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 295 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 326 -> 0 bytes .../post_processing.cpython-310.pyc | Bin 28679 -> 0 bytes .../post_processing.cpython-311.pyc | Bin 58838 -> 0 bytes .../post_processing.cpython-39.pyc | Bin 28771 -> 0 bytes .../post_processing/post_processing.py | 1338 ---------- .../bayesvalidrox/pylink/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 247 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 281 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 312 -> 0 bytes .../pylink/__pycache__/pylink.cpython-310.pyc | Bin 18654 -> 0 bytes .../pylink/__pycache__/pylink.cpython-311.pyc | Bin 35406 -> 0 bytes .../pylink/__pycache__/pylink.cpython-39.pyc | Bin 18646 -> 0 bytes .../bayesvalidrox/pylink/pylink.py | 799 ------ .../surrogate_models/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 258 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 292 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 323 -> 0 bytes .../__pycache__/adaptPlot.cpython-311.pyc | Bin 4921 -> 0 bytes .../apoly_construction.cpython-310.pyc | Bin 2815 -> 0 bytes .../apoly_construction.cpython-311.pyc | Bin 5228 -> 0 bytes .../apoly_construction.cpython-39.pyc | Bin 2886 -> 0 bytes .../__pycache__/bayes_linear.cpython-310.pyc | Bin 14412 -> 0 bytes .../__pycache__/bayes_linear.cpython-311.pyc | Bin 21706 -> 0 bytes .../__pycache__/bayes_linear.cpython-39.pyc | Bin 14506 -> 0 bytes .../__pycache__/engine.cpython-311.pyc | Bin 84465 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-310.pyc | Bin 5560 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-311.pyc | Bin 8154 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-39.pyc | Bin 5648 -> 0 bytes .../__pycache__/exp_designs.cpython-310.pyc | Bin 17477 -> 0 bytes .../__pycache__/exp_designs.cpython-311.pyc | Bin 19555 -> 0 bytes .../__pycache__/exp_designs.cpython-39.pyc | Bin 17597 -> 0 bytes .../__pycache__/exp_designs_.cpython-311.pyc | Bin 20552 -> 0 bytes .../__pycache__/exploration.cpython-310.pyc | Bin 8154 -> 0 bytes .../__pycache__/exploration.cpython-311.pyc | Bin 12405 -> 0 bytes .../__pycache__/exploration.cpython-39.pyc | Bin 8190 -> 0 bytes .../__pycache__/glexindex.cpython-310.pyc | Bin 7185 -> 0 bytes .../__pycache__/glexindex.cpython-311.pyc | Bin 7952 -> 0 bytes .../__pycache__/glexindex.cpython-39.pyc | Bin 7232 -> 0 bytes .../__pycache__/input_space.cpython-311.pyc | Bin 16785 -> 0 bytes .../__pycache__/inputs.cpython-310.pyc | Bin 2413 -> 0 bytes .../__pycache__/inputs.cpython-311.pyc | Bin 2860 -> 0 bytes .../__pycache__/inputs.cpython-39.pyc | Bin 2474 -> 0 bytes .../__pycache__/loss_function.cpython-311.pyc | Bin 13488 -> 0 bytes .../meta_model_engine.cpython-310.pyc | Bin 42392 -> 0 bytes .../meta_model_engine.cpython-311.pyc | Bin 87304 -> 0 bytes .../meta_model_engine.cpython-39.pyc | Bin 42705 -> 0 bytes ...rthogonal_matching_pursuit.cpython-310.pyc | Bin 8915 -> 0 bytes ...rthogonal_matching_pursuit.cpython-311.pyc | Bin 14832 -> 0 bytes ...orthogonal_matching_pursuit.cpython-39.pyc | Bin 8930 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-310.pyc | Bin 11629 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-311.pyc | Bin 19787 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-39.pyc | Bin 11717 -> 0 bytes .../reg_fast_laplace.cpython-310.pyc | Bin 9509 -> 0 bytes .../reg_fast_laplace.cpython-311.pyc | Bin 19040 -> 0 bytes .../reg_fast_laplace.cpython-39.pyc | Bin 9581 -> 0 bytes .../sequential_design.cpython-311.pyc | Bin 87535 -> 0 bytes .../surrogate_models.cpython-310.pyc | Bin 35103 -> 0 bytes .../surrogate_models.cpython-311.pyc | Bin 61708 -> 0 bytes .../surrogate_models.cpython-39.pyc | Bin 35188 -> 0 bytes .../surrogate_models/adaptPlot.py | 109 - .../surrogate_models/apoly_construction.py | 124 - .../surrogate_models/bayes_linear.py | 523 ---- .../bayesvalidrox/surrogate_models/engine.py | 2195 ----------------- .../surrogate_models/eval_rec_rule.py | 197 -- .../surrogate_models/exp_designs.py | 493 ---- .../surrogate_models/exploration.py | 364 --- .../surrogate_models/glexindex.py | 161 -- .../surrogate_models/input_space.py | 395 --- .../bayesvalidrox/surrogate_models/inputs.py | 76 - .../orthogonal_matching_pursuit.py | 366 --- .../surrogate_models/reg_fast_ard.py | 475 ---- .../surrogate_models/reg_fast_laplace.py | 452 ---- .../surrogate_models/sequential_design.py | 2187 ---------------- .../surrogate_models/surrogate_models.py | 1473 ----------- .../test_umbridge.py | 183 -- .../test_umbridge_testmodel.py | 80 - .../testmodel.py | 18 - .../tsunami_model.py | 18 - .../tsunami_model1.py | 16 - .../bayesvalidrox/__init__.py | 25 - .../__pycache__/__init__.cpython-310.pyc | Bin 795 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 968 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 860 -> 0 bytes .../bayesvalidrox/bayes_inference/__init__.py | 9 - .../__pycache__/__init__.cpython-310.pyc | Bin 303 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 354 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 368 -> 0 bytes .../bayes_inference.cpython-310.pyc | Bin 31276 -> 0 bytes .../bayes_inference.cpython-311.pyc | Bin 60952 -> 0 bytes .../bayes_inference.cpython-39.pyc | Bin 31419 -> 0 bytes .../bayes_model_comparison.cpython-310.pyc | Bin 15645 -> 0 bytes .../bayes_model_comparison.cpython-311.pyc | Bin 27157 -> 0 bytes .../bayes_model_comparison.cpython-39.pyc | Bin 15716 -> 0 bytes .../__pycache__/discrepancy.cpython-310.pyc | Bin 3806 -> 0 bytes .../__pycache__/discrepancy.cpython-311.pyc | Bin 4661 -> 0 bytes .../__pycache__/discrepancy.cpython-39.pyc | Bin 3869 -> 0 bytes .../__pycache__/mcmc.cpython-310.pyc | Bin 18924 -> 0 bytes .../__pycache__/mcmc.cpython-311.pyc | Bin 35893 -> 0 bytes .../__pycache__/mcmc.cpython-39.pyc | Bin 18959 -> 0 bytes .../bayes_inference/bayes_inference.py | 1532 ------------ .../bayes_inference/bayes_model_comparison.py | 658 ----- .../bayes_inference/discrepancy.py | 103 - .../bayesvalidrox/bayes_inference/mcmc.py | 909 ------- .../bayesvalidrox/bayesvalidrox.mplstyle | 16 - .../bayesvalidrox/post_processing/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 261 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 295 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 326 -> 0 bytes .../post_processing.cpython-310.pyc | Bin 28679 -> 0 bytes .../post_processing.cpython-311.pyc | Bin 58838 -> 0 bytes .../post_processing.cpython-39.pyc | Bin 28771 -> 0 bytes .../post_processing/post_processing.py | 1338 ---------- .../bayesvalidrox/pylink/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 247 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 281 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 312 -> 0 bytes .../pylink/__pycache__/pylink.cpython-310.pyc | Bin 18654 -> 0 bytes .../pylink/__pycache__/pylink.cpython-311.pyc | Bin 35776 -> 0 bytes .../pylink/__pycache__/pylink.cpython-39.pyc | Bin 18646 -> 0 bytes .../bayesvalidrox/pylink/pylink.py | 797 ------ .../surrogate_models/__init__.py | 7 - .../__pycache__/__init__.cpython-310.pyc | Bin 258 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 292 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 323 -> 0 bytes .../__pycache__/adaptPlot.cpython-311.pyc | Bin 4921 -> 0 bytes .../apoly_construction.cpython-310.pyc | Bin 2815 -> 0 bytes .../apoly_construction.cpython-311.pyc | Bin 5228 -> 0 bytes .../apoly_construction.cpython-39.pyc | Bin 2886 -> 0 bytes .../__pycache__/bayes_linear.cpython-310.pyc | Bin 14412 -> 0 bytes .../__pycache__/bayes_linear.cpython-311.pyc | Bin 21706 -> 0 bytes .../__pycache__/bayes_linear.cpython-39.pyc | Bin 14506 -> 0 bytes .../__pycache__/engine.cpython-311.pyc | Bin 84465 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-310.pyc | Bin 5560 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-311.pyc | Bin 8154 -> 0 bytes .../__pycache__/eval_rec_rule.cpython-39.pyc | Bin 5648 -> 0 bytes .../__pycache__/exp_designs.cpython-310.pyc | Bin 17477 -> 0 bytes .../__pycache__/exp_designs.cpython-311.pyc | Bin 19555 -> 0 bytes .../__pycache__/exp_designs.cpython-39.pyc | Bin 17597 -> 0 bytes .../__pycache__/exp_designs_.cpython-311.pyc | Bin 20552 -> 0 bytes .../__pycache__/exploration.cpython-310.pyc | Bin 8154 -> 0 bytes .../__pycache__/exploration.cpython-311.pyc | Bin 12405 -> 0 bytes .../__pycache__/exploration.cpython-39.pyc | Bin 8190 -> 0 bytes .../__pycache__/glexindex.cpython-310.pyc | Bin 7185 -> 0 bytes .../__pycache__/glexindex.cpython-311.pyc | Bin 7952 -> 0 bytes .../__pycache__/glexindex.cpython-39.pyc | Bin 7232 -> 0 bytes .../__pycache__/input_space.cpython-311.pyc | Bin 16785 -> 0 bytes .../__pycache__/inputs.cpython-310.pyc | Bin 2413 -> 0 bytes .../__pycache__/inputs.cpython-311.pyc | Bin 2860 -> 0 bytes .../__pycache__/inputs.cpython-39.pyc | Bin 2474 -> 0 bytes .../__pycache__/loss_function.cpython-311.pyc | Bin 13488 -> 0 bytes .../meta_model_engine.cpython-310.pyc | Bin 42392 -> 0 bytes .../meta_model_engine.cpython-311.pyc | Bin 87304 -> 0 bytes .../meta_model_engine.cpython-39.pyc | Bin 42705 -> 0 bytes ...rthogonal_matching_pursuit.cpython-310.pyc | Bin 8915 -> 0 bytes ...rthogonal_matching_pursuit.cpython-311.pyc | Bin 14832 -> 0 bytes ...orthogonal_matching_pursuit.cpython-39.pyc | Bin 8930 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-310.pyc | Bin 11629 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-311.pyc | Bin 19787 -> 0 bytes .../__pycache__/reg_fast_ard.cpython-39.pyc | Bin 11717 -> 0 bytes .../reg_fast_laplace.cpython-310.pyc | Bin 9509 -> 0 bytes .../reg_fast_laplace.cpython-311.pyc | Bin 19040 -> 0 bytes .../reg_fast_laplace.cpython-39.pyc | Bin 9581 -> 0 bytes .../sequential_design.cpython-311.pyc | Bin 87535 -> 0 bytes .../surrogate_models.cpython-310.pyc | Bin 35103 -> 0 bytes .../surrogate_models.cpython-311.pyc | Bin 61708 -> 0 bytes .../surrogate_models.cpython-39.pyc | Bin 35188 -> 0 bytes .../surrogate_models/adaptPlot.py | 109 - .../surrogate_models/apoly_construction.py | 124 - .../surrogate_models/bayes_linear.py | 523 ---- .../bayesvalidrox/surrogate_models/engine.py | 2195 ----------------- .../surrogate_models/eval_rec_rule.py | 197 -- .../surrogate_models/exp_designs.py | 493 ---- .../surrogate_models/exploration.py | 364 --- .../surrogate_models/glexindex.py | 161 -- .../surrogate_models/input_space.py | 395 --- .../bayesvalidrox/surrogate_models/inputs.py | 76 - .../orthogonal_matching_pursuit.py | 366 --- .../surrogate_models/reg_fast_ard.py | 475 ---- .../surrogate_models/reg_fast_laplace.py | 452 ---- .../surrogate_models/sequential_design.py | 2187 ---------------- .../surrogate_models/surrogate_models.py | 1473 ----------- src/bayesvalidrox/pylink/pylink.py | 14 +- .../surrogate_models/surrogate_models.py | 97 +- tests/test_MetaModel.py | 18 + 284 files changed, 416 insertions(+), 30325 deletions(-) delete mode 100644 .coverage create mode 100644 .coverage.DESKTOP-ATMEKSV.10616.XTfwDWtx create mode 100644 .coverage.DESKTOP-ATMEKSV.12272.XtVlLrXx create mode 100644 .coverage.DESKTOP-ATMEKSV.12632.XFsLVCEx create mode 100644 .coverage.DESKTOP-ATMEKSV.12712.XTfzFmnx create mode 100644 .coverage.DESKTOP-ATMEKSV.12824.XsNQEeax create mode 100644 .coverage.DESKTOP-ATMEKSV.13164.XMerVQGx create mode 100644 .coverage.DESKTOP-ATMEKSV.14180.XbsXbgvx create mode 100644 .coverage.DESKTOP-ATMEKSV.14476.XuUyQWDx create mode 100644 .coverage.DESKTOP-ATMEKSV.14520.XbJgzpTx create mode 100644 .coverage.DESKTOP-ATMEKSV.14712.XMgYrQCx create mode 100644 .coverage.DESKTOP-ATMEKSV.15144.XkcHTkix create mode 100644 .coverage.DESKTOP-ATMEKSV.15284.XMONvZEx create mode 100644 .coverage.DESKTOP-ATMEKSV.15440.XIuChHnx create mode 100644 .coverage.DESKTOP-ATMEKSV.16012.XGeLQTlx create mode 100644 .coverage.DESKTOP-ATMEKSV.17012.XcDINRSx create mode 100644 .coverage.DESKTOP-ATMEKSV.18500.XGbXmSjx create mode 100644 .coverage.DESKTOP-ATMEKSV.18844.XDPLaYqx create mode 100644 .coverage.DESKTOP-ATMEKSV.19440.XUospmUx create mode 100644 .coverage.DESKTOP-ATMEKSV.19500.XYuOMLJx create mode 100644 .coverage.DESKTOP-ATMEKSV.20080.XqjMBHMx create mode 100644 .coverage.DESKTOP-ATMEKSV.20784.XvtbIeRx delete mode 100644 .coverage.DESKTOP-ATMEKSV.21516.XyAVyWNx create mode 100644 .coverage.DESKTOP-ATMEKSV.22012.XZkqdGCx create mode 100644 .coverage.DESKTOP-ATMEKSV.22436.XLHoKASx create mode 100644 .coverage.DESKTOP-ATMEKSV.22632.XQfiQacx create mode 100644 .coverage.DESKTOP-ATMEKSV.22836.XaSNeVKx create mode 100644 .coverage.DESKTOP-ATMEKSV.22988.XTBOmFhx create mode 100644 .coverage.DESKTOP-ATMEKSV.23568.XYxMRfbx create mode 100644 .coverage.DESKTOP-ATMEKSV.23860.XYIorGax create mode 100644 .coverage.DESKTOP-ATMEKSV.24016.XyQmgPnx create mode 100644 .coverage.DESKTOP-ATMEKSV.24380.XNVSylrx create mode 100644 .coverage.DESKTOP-ATMEKSV.24560.XYUIvLux create mode 100644 .coverage.DESKTOP-ATMEKSV.24800.XXnYmDJx create mode 100644 .coverage.DESKTOP-ATMEKSV.25428.XVVrZIbx create mode 100644 .coverage.DESKTOP-ATMEKSV.26276.XmpaSHVx create mode 100644 .coverage.DESKTOP-ATMEKSV.26332.XgxWdWdx create mode 100644 .coverage.DESKTOP-ATMEKSV.26388.XIWhjYox create mode 100644 .coverage.DESKTOP-ATMEKSV.26448.XEujWYRx create mode 100644 .coverage.DESKTOP-ATMEKSV.26780.XoqRisNx create mode 100644 .coverage.DESKTOP-ATMEKSV.27032.XbZUsCZx create mode 100644 .coverage.DESKTOP-ATMEKSV.27288.XZlyvVqx create mode 100644 .coverage.DESKTOP-ATMEKSV.27372.XepoDlGx create mode 100644 .coverage.DESKTOP-ATMEKSV.28092.XXuBidHx create mode 100644 .coverage.DESKTOP-ATMEKSV.28420.XDzinShx create mode 100644 .coverage.DESKTOP-ATMEKSV.28452.XeVLFCHx create mode 100644 .coverage.DESKTOP-ATMEKSV.28556.XrWyCSOx create mode 100644 .coverage.DESKTOP-ATMEKSV.28620.XTgkXKsx create mode 100644 .coverage.DESKTOP-ATMEKSV.28764.XdZVRgcx create mode 100644 .coverage.DESKTOP-ATMEKSV.29316.XAELrPgx create mode 100644 .coverage.DESKTOP-ATMEKSV.29508.XebbGpLx create mode 100644 .coverage.DESKTOP-ATMEKSV.29692.XbSwKvzx create mode 100644 .coverage.DESKTOP-ATMEKSV.29708.XxOJAAMx create mode 100644 .coverage.DESKTOP-ATMEKSV.29716.XPHrvILx create mode 100644 .coverage.DESKTOP-ATMEKSV.29800.XEZtVFex create mode 100644 .coverage.DESKTOP-ATMEKSV.30072.XoxDTLSx create mode 100644 .coverage.DESKTOP-ATMEKSV.30104.XgFimZxx create mode 100644 .coverage.DESKTOP-ATMEKSV.30364.XLrThOtx create mode 100644 .coverage.DESKTOP-ATMEKSV.30652.XXqFtKkx delete mode 100644 .coverage.DESKTOP-ATMEKSV.32204.XCbTXmgx delete mode 100644 .coverage.DESKTOP-ATMEKSV.36684.XKrSwPEx create mode 100644 .coverage.DESKTOP-ATMEKSV.4220.XvYRULHx create mode 100644 .coverage.DESKTOP-ATMEKSV.6072.XZIEcISx create mode 100644 .coverage.DESKTOP-ATMEKSV.6276.XTHKMAtx create mode 100644 .coverage.DESKTOP-ATMEKSV.8092.XHklueAx create mode 100644 .coverage.DESKTOP-ATMEKSV.8348.XnOVMQzx create mode 100644 .coverage.DESKTOP-ATMEKSV.8736.XGwoASwx create mode 100644 Outputs_Bayes_None_Calib/emcee_sampler.h5 create mode 100644 Outputs_SeqPosteriorComparison/posterior/Z.npy create mode 100644 examples/convergence_tests/convergence_test.py create mode 100644 examples/convergence_tests/example_trainingconvergence.py create mode 100644 examples/convergence_tests/testfunction.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_inference.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_model_comparison.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/discrepancy.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/mcmc.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayesvalidrox.mplstyle delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/post_processing.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/pylink.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/adaptPlot.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/apoly_construction.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/bayes_linear.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/engine.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/eval_rec_rule.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exp_designs.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exploration.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/glexindex.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/input_space.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/inputs.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_ard.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_laplace.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/sequential_design.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/surrogate_models.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/test_umbridge.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/test_umbridge_testmodel.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/testmodel.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/tsunami_model.py delete mode 100644 examples/umbridge_tsunamitutorial - Copy/tsunami_model1.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_inference.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_model_comparison.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/discrepancy.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/mcmc.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/bayesvalidrox.mplstyle delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/post_processing.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/pylink.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__init__.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/adaptPlot.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/apoly_construction.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/bayes_linear.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/engine.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/eval_rec_rule.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exp_designs.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exploration.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/glexindex.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/input_space.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/inputs.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_ard.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_laplace.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/sequential_design.py delete mode 100644 examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/surrogate_models.py diff --git a/.coverage b/.coverage deleted file mode 100644 index e0d3c5dd968abbcd19e4a6ac381bc5572b7a3059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 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 diff --git a/.coverage.DESKTOP-ATMEKSV.10616.XTfwDWtx b/.coverage.DESKTOP-ATMEKSV.10616.XTfwDWtx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.12272.XtVlLrXx b/.coverage.DESKTOP-ATMEKSV.12272.XtVlLrXx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.12632.XFsLVCEx b/.coverage.DESKTOP-ATMEKSV.12632.XFsLVCEx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.12712.XTfzFmnx b/.coverage.DESKTOP-ATMEKSV.12712.XTfzFmnx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.12824.XsNQEeax b/.coverage.DESKTOP-ATMEKSV.12824.XsNQEeax new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.13164.XMerVQGx b/.coverage.DESKTOP-ATMEKSV.13164.XMerVQGx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.14180.XbsXbgvx b/.coverage.DESKTOP-ATMEKSV.14180.XbsXbgvx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.14476.XuUyQWDx b/.coverage.DESKTOP-ATMEKSV.14476.XuUyQWDx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.14520.XbJgzpTx b/.coverage.DESKTOP-ATMEKSV.14520.XbJgzpTx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.14712.XMgYrQCx b/.coverage.DESKTOP-ATMEKSV.14712.XMgYrQCx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.15144.XkcHTkix b/.coverage.DESKTOP-ATMEKSV.15144.XkcHTkix new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.15284.XMONvZEx b/.coverage.DESKTOP-ATMEKSV.15284.XMONvZEx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.15440.XIuChHnx b/.coverage.DESKTOP-ATMEKSV.15440.XIuChHnx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.16012.XGeLQTlx b/.coverage.DESKTOP-ATMEKSV.16012.XGeLQTlx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.17012.XcDINRSx b/.coverage.DESKTOP-ATMEKSV.17012.XcDINRSx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.18500.XGbXmSjx b/.coverage.DESKTOP-ATMEKSV.18500.XGbXmSjx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.18844.XDPLaYqx b/.coverage.DESKTOP-ATMEKSV.18844.XDPLaYqx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.19440.XUospmUx b/.coverage.DESKTOP-ATMEKSV.19440.XUospmUx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.19500.XYuOMLJx b/.coverage.DESKTOP-ATMEKSV.19500.XYuOMLJx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.20080.XqjMBHMx b/.coverage.DESKTOP-ATMEKSV.20080.XqjMBHMx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.20784.XvtbIeRx b/.coverage.DESKTOP-ATMEKSV.20784.XvtbIeRx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.21516.XyAVyWNx b/.coverage.DESKTOP-ATMEKSV.21516.XyAVyWNx deleted file mode 100644 index 00020484238401dae7e558e5d5f97fb6fd041d2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeI#%WA?v7zN-N5ek7)cU^jxEnYT#0aM9ND7LOEQU90$&A?=;YhSld;h&Uj+;lJJ zFhe-ZCGhR$Yq@YyQ221nBi_uwSZij0F~;ib>Fm<<epmF{^#5YbwD^70UH0kQ=wK*7 z0SZun0u-PC1t>rP3Q&LocPMZf+K1=S$X<S8zB$O&pCsgaS=ZZAj`>aP%|Ekrm0^{> zFEZRL;w6D*GQmeB2>v`q^ay%o*ddkzy}5S2f-l<o_XoI2o2#+gOxyF_E>}g_OGsXu fx4Az0846H<0u-PC1t>rP3Q&Lo6rcbF?pWXo?EXFK diff --git a/.coverage.DESKTOP-ATMEKSV.22012.XZkqdGCx b/.coverage.DESKTOP-ATMEKSV.22012.XZkqdGCx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.22436.XLHoKASx b/.coverage.DESKTOP-ATMEKSV.22436.XLHoKASx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.22632.XQfiQacx b/.coverage.DESKTOP-ATMEKSV.22632.XQfiQacx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.22836.XaSNeVKx b/.coverage.DESKTOP-ATMEKSV.22836.XaSNeVKx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.22988.XTBOmFhx b/.coverage.DESKTOP-ATMEKSV.22988.XTBOmFhx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.23568.XYxMRfbx b/.coverage.DESKTOP-ATMEKSV.23568.XYxMRfbx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.23860.XYIorGax b/.coverage.DESKTOP-ATMEKSV.23860.XYIorGax new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.24016.XyQmgPnx b/.coverage.DESKTOP-ATMEKSV.24016.XyQmgPnx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.24380.XNVSylrx b/.coverage.DESKTOP-ATMEKSV.24380.XNVSylrx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.24560.XYUIvLux b/.coverage.DESKTOP-ATMEKSV.24560.XYUIvLux new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.24800.XXnYmDJx b/.coverage.DESKTOP-ATMEKSV.24800.XXnYmDJx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.25428.XVVrZIbx b/.coverage.DESKTOP-ATMEKSV.25428.XVVrZIbx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.26276.XmpaSHVx b/.coverage.DESKTOP-ATMEKSV.26276.XmpaSHVx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.26332.XgxWdWdx b/.coverage.DESKTOP-ATMEKSV.26332.XgxWdWdx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.26388.XIWhjYox b/.coverage.DESKTOP-ATMEKSV.26388.XIWhjYox new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.26448.XEujWYRx b/.coverage.DESKTOP-ATMEKSV.26448.XEujWYRx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.26780.XoqRisNx b/.coverage.DESKTOP-ATMEKSV.26780.XoqRisNx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.27032.XbZUsCZx b/.coverage.DESKTOP-ATMEKSV.27032.XbZUsCZx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.27288.XZlyvVqx b/.coverage.DESKTOP-ATMEKSV.27288.XZlyvVqx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.27372.XepoDlGx b/.coverage.DESKTOP-ATMEKSV.27372.XepoDlGx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28092.XXuBidHx b/.coverage.DESKTOP-ATMEKSV.28092.XXuBidHx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28420.XDzinShx b/.coverage.DESKTOP-ATMEKSV.28420.XDzinShx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28452.XeVLFCHx b/.coverage.DESKTOP-ATMEKSV.28452.XeVLFCHx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28556.XrWyCSOx b/.coverage.DESKTOP-ATMEKSV.28556.XrWyCSOx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28620.XTgkXKsx b/.coverage.DESKTOP-ATMEKSV.28620.XTgkXKsx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.28764.XdZVRgcx b/.coverage.DESKTOP-ATMEKSV.28764.XdZVRgcx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29316.XAELrPgx b/.coverage.DESKTOP-ATMEKSV.29316.XAELrPgx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29508.XebbGpLx b/.coverage.DESKTOP-ATMEKSV.29508.XebbGpLx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29692.XbSwKvzx b/.coverage.DESKTOP-ATMEKSV.29692.XbSwKvzx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29708.XxOJAAMx b/.coverage.DESKTOP-ATMEKSV.29708.XxOJAAMx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29716.XPHrvILx b/.coverage.DESKTOP-ATMEKSV.29716.XPHrvILx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.29800.XEZtVFex b/.coverage.DESKTOP-ATMEKSV.29800.XEZtVFex new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.30072.XoxDTLSx b/.coverage.DESKTOP-ATMEKSV.30072.XoxDTLSx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.30104.XgFimZxx b/.coverage.DESKTOP-ATMEKSV.30104.XgFimZxx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.30364.XLrThOtx b/.coverage.DESKTOP-ATMEKSV.30364.XLrThOtx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.30652.XXqFtKkx b/.coverage.DESKTOP-ATMEKSV.30652.XXqFtKkx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.32204.XCbTXmgx b/.coverage.DESKTOP-ATMEKSV.32204.XCbTXmgx deleted file mode 100644 index 7bbc0492e89f5b6036087acc5429a3437d52f490..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI%&u`i=6bJAGrgcI>^n%b%dpC+&kfz<X!`5ybrd47;&@PjP40(XHByM9v%dy&F z|LgvW`6UfuOzM5;8z~_#cAlR<@x|iHr%Uaa<|a#&qZh$(5Qf1Uq96!r{(R)m^4O2V zvf+W>S}>UZZnnM#_2wvOeQ%Ch{ReuZ2?7v+00bZa0SG_<0uX?}|0D48TkWXRZil~~ zIyH?sVW;G*zx_Ns9}j7KesMV@c|s=*@<+c<A9&MWt9Zq9rF3S`$QjCbX0j;n7%AUb zP0h-YTQW(QzxjhV<oMQ|<x!EKidU(=_8CunuU<LOM`Nw_MUj7KUzSg)yHs|fvYGAD z)R>r6Duv~xy|;c$ZSz6zYtre0rkP4-OSZ489Cjl)7VB<aQ<0#^G4@5z%$hT`keeh? zX+*J3*{Ak9&SIt<Z6`OVlKPjdHtAkYF_WbCtz_og{DUiRB3Tm^Nq)bt)iLj6yjk); z>54MnDaTGHOwwihD%~hcvy6RXG-&j?^~ar8?J&@3#JBc3_B-c^S~-))6Zx!@=W>-@ z^AlOLchAD3&gp4*x5}48=`gXLFHw78?XN|$*I2EWk*CYd&F(spneK2%Sd2hg<|1Ek zS}2sgbn1A)S)<pKGLPkg0|F3$00bZa0SG_<0uX=z1Rwx`LlwaO|4_dy<^=%=KmY;| ufB*y_009U<00I!G1R8RS|Nkox+(7^W5P$##AOHafKmY;|fB*yzP~Z=)jN9@6 diff --git a/.coverage.DESKTOP-ATMEKSV.36684.XKrSwPEx b/.coverage.DESKTOP-ATMEKSV.36684.XKrSwPEx deleted file mode 100644 index e1f7e6f75f5aa9a7a33884193b67b7cc22082200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI)O>f&a7zc34ZmrmHpcX+O1VIsAHpi&r&d8zIcG$8lhhhb~Zow`C=F&2qXtg9q zlJjyH2DbwO4A?gq_MP?-b}M$-X{TNGJd$YHNnG?+)cXsuElVUt{`iozqqN^Vee5Ml z48q8liP$sl7^Z1_DuiJeReG$^LvI%C+|qC8)tuR1v|BaWgTL17Z;g88SHu2(?TNix z|84F4)j#Tf^_SJ(Em?Kx1U3jj00I#Be+x{W)-7jq(|qw`B6~xXMAB7J_PqA_*9ZHD z2jX!5v&RP_J0^B&g0|gVu`i<VOpH_{2HsE!FX(%&OuXPoB*#jp9>=QB3mqM!rH&J} z)BL>G_4<@6QAbq7DDr$6U5MxEqLn7dua>CuBs)NbDDNoX6k;dO-V~7<s7M8_inChm zc>QLr`SPcl<*cupmnv<Oj9mIzoofvpD4OzUKn1yB)aTmwA{n^HDsBlmZJ`@dJ<pS@ zwNdClNJ266g0z`I>?K|p2z9R9aiaP+Hn7ELdLz8q)=*i`xIxddocXn8bc)P3<jj-j znFmz4Ak?fyM!qy<PU{?u{T`A3F!o2>Ig}&2a1t)cxhQWE=8b*hzPX_<i}ucSrzYnf z&2o(c?_{i|o!=5g&Q{utAZ!V41VzAms}<+Nb<?1zROj)@kUnp9<v0n`_g(7zZik-g zKi^%kob7G%@+1uu=IQplB%bb6=YnQ>ctPm!`NeU=qhvlvcoYqXA{?YchI5Oob10f; z$IJtbAtN4WBFqy~P2Xy?ab>9vqBjhC^RbpjOsr^t&|ILC4aR}XLnY=mxZ$aa<dJIU zXR~SHZ3hyCPN!ON4z?GC&NKwNo#}3EvRSd5tu6CKH4US@xAGTjE`)SX-Y|{oQ@)b% zIMNfz>n2H^qnIW27|G92b9SwYv%j^dIeEHnC*N6_Shp-^W5b+eBZB88e%zjG1Rp7e zz?FsI&8t6>$+5UzcRoxNZ``gpA8#zGI9H+D;pfWB?@DQvFE>+tpC)~Nl;^6<M~W(c zsV;U;<&b8Rk@O-OvNQ*0D}dmHeMyOBFB~Un{PNp0JbCRY>YEi%yw~=Ws+lII;r&$@ z#~v-KylllE>7$}?EMuO9;)dvj;ZVsSTN^0HqnNJg#Uic4^;PMUqKx>0%Q!l1q;=AZ z3s3WhH0bpBq8;CtK|f!wcp1)0rMaI6CtoL<L@1+Z(4dTIh+ZjE7n+~t8B3Sn9+3%` z>dSsM+__U`N<2GO*NV$lqc3El63<tHlcbeN1M5u2!i^N2q_wo!D8DWYxVO3;e&%n< zEBsMzvTa(<{rl!*oDarqp6SN4sQXe^JAYf63z91*i+FiL6E1z)nT->+o8jQM*%f$l z%X+YvDd<%BXPsJ;zu=qpzXttag8&2|009U<00Izz00bZa0SG`~`2@;l$+Y<Uf64yS zu>YnfY!H9|1Rwwb2tWV=5P$##AOHafyqf~`Qu&^(|HR`1+bnN6`5ys1Z11)AYSgNd z{mQUk+5fzo4MeRW009U<00Izz00bZa0SG_<0uayw_3}Ma{}!NBD{ocvUjn56!2ga; zg;xkb00Izz00bZa0SG_<0uX=z1eQ^N@Bh<(`iBhy5P$##AOHafKmY;|fB*y_0D&bI z!2SOv?p!nt0uX=z1Rwwb2tWV=5P$##Adm~-{y#zi0uX=z1Rwwb2tWV=5P$##Ah7%b zxc|TWeT)`D00Izz00bZa0SG_<0uX=z1aSW!F#rJwKmY;|fB*y_009U<00IzLegWM7 zU;aKu3n2gj2tWV=5P$##AOHafKmY=`|Bo1e00bZa0SG_<0uX=z1Rwwb2rRz<?*A`; aAESj3fB*y_009U<00Izz00bZaf&Ty)+a0$6 diff --git a/.coverage.DESKTOP-ATMEKSV.4220.XvYRULHx b/.coverage.DESKTOP-ATMEKSV.4220.XvYRULHx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.6072.XZIEcISx b/.coverage.DESKTOP-ATMEKSV.6072.XZIEcISx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.6276.XTHKMAtx b/.coverage.DESKTOP-ATMEKSV.6276.XTHKMAtx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.8092.XHklueAx b/.coverage.DESKTOP-ATMEKSV.8092.XHklueAx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.8348.XnOVMQzx b/.coverage.DESKTOP-ATMEKSV.8348.XnOVMQzx new file mode 100644 index 000000000..e69de29bb diff --git a/.coverage.DESKTOP-ATMEKSV.8736.XGwoASwx b/.coverage.DESKTOP-ATMEKSV.8736.XGwoASwx new file mode 100644 index 000000000..e69de29bb diff --git a/Outputs_Bayes_None_Calib/emcee_sampler.h5 b/Outputs_Bayes_None_Calib/emcee_sampler.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5f687b4869be7ca86bec96c8a797a2e33b6ffd55 GIT binary patch literal 3281440 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	fZCwBDehy(;%>l-FB35 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Π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%0Ar7K8?;*5UtOKlC^HgrfQkTokT!5i}^qOq(@Z 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%0A<kyK>vhR;#@wUhI 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	&g|x0-ptkJ_vn)! zJbqcR-=lw;-)VMuofh(I&RD$W`OCudQWm#AqIu{Ocg=dYVq?2TS$+BDgSNhF)q7jc zf3kM!BVEFum#gzJ@h5A(*(3a(ve#Q@KR4#7((HxGix2$Wtftx3t0%u+GOo1t_)~6q zWc@cAi}!cXfcKwx=ffu1L5-@feeC^QHs*s)J*r<S%g*~?bF+%>6}9=78~*I94d>RM zf1_1Z%O>GIO3!T9Xa9Ycmu5SSdtl{}HBGacsZT9B>hy3u%1hnKJ6~1&_gCTglWseB zK~;DTM<HJ|cb9y-@bBQCujz5^t|Oae`CgmW4+-}@sPpaTPCxkKRlNt5WS4b5e(BEP z{!l+OzwZ18Tl8#KmQ^48UYC~P`DGIh%RRqtT$Akk9>2c)s-A!O&GWA{%!X~gp#9fN z8`eAj#>G#6b<91vtmF8L`&WhQV49uQZ`a<P!~5aa-uF!VottHiHXpg;_Ups<z1McT z_Fh@M|Hj*od849VMQ#4cGp?C-XSkmAuno)i9^ba4Hs5%gLH(MaSN!`^A^-O5VUKSJ z*URkw+Uiq!Y+IQ<x!Zl8-u`&F?()nfi`GubXFD8l=7^iZdHA~i_2q}pIet~Ie}?N` zul#)M)N9MK>ASvJvSGinqWsOvI=nS2{QP$L_{A?8hV$!%;}`Pp&F(*C>G@5w``7;Z zo^u8j@4t{gvHO%qdWP#9*1h-3nM3Xj*SoLZ{OG$6h3jsP+p6>Lmp89BfB2-GE+5|} zJa6TbhyK1}xUbE;d0kt+x;mGY<ty7)5BYDt$5l6ea!I((qwe?bYXSra5FkK+009C7 z2oNAZ;Quesxns8zO8$MAs&9|=pU=amjlTUd*Y%VG+qG-c_Peigxthw_Pklmw009C7 z2oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk z1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYb zC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N z0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7cs zfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb z009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZ zfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM| zp#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>J zK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&U zAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~Qp zKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C7 z2oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk z1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYb zC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N z0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7cs zfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb z009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZ zfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM| zp#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>J zK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&U zAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~Qp zKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C7 z2oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk z1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYb zC}R>JK!5-N0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N z0t5&UAV7csfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7cs zfd~QpKLSsb009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfd~QpKLSsb s009C72oNAZfB*pk1PCM|p#LYbC}R>JK!5-N0t5&UAV7csfe3+r0r!$8)c^nh literal 0 HcmV?d00001 diff --git a/Outputs_SeqPosteriorComparison/posterior/Z.npy b/Outputs_SeqPosteriorComparison/posterior/Z.npy new file mode 100644 index 0000000000000000000000000000000000000000..8d89efa6714257ec2d867aa5eb95b7f23b915010 GIT binary patch literal 176 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= qXCxM+0{I%oItoUbItsN4WCJb+G%#x>2<)_n2!F7L@J~Yd59|R^<R<I@ literal 0 HcmV?d00001 diff --git a/examples/convergence_tests/convergence_test.py b/examples/convergence_tests/convergence_test.py new file mode 100644 index 000000000..95fded1e4 --- /dev/null +++ b/examples/convergence_tests/convergence_test.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import numpy as np +import math +import os +import matplotlib.pyplot as plt +import time +# Load the mplstyle +#plt.style.use(os.path.join(os.path.split(__file__)[0], +# '../', 'bayesvalidrox.mplstyle')) + + +def convergence_test(engine, steps, error, train_samples, test_samples, test_data, plot = True, write = True, Engine = False): + """ + Tests the convergence for a metamodel over the number of given training + samples in its experimental design. + The results are written out and plotted. + + Conditions: + if data is not given, then arbitrary samples will be chosen to run the model on + + Parameters + ---------- + MetaModel : TYPE + DESCRIPTION. + + model : + + steps : list of ints in increasing order + The number of samples to train on per iteration + + error : function(test_mean, test_std, test_data) + The function ued to calculate the accuracy of the surrogate, e.g. the L2-norm + + Returns + ------- + None. + + """ + print('') + print('STARTING THE CONVERGENCE TEST') + # Define output lists + engines = [] + test_runs = {} + test_runs['mean'] = [] + test_runs['std']=[] + accuracy = {} + + for n in steps: + print('') + print(f'---- {n} TRAINING POINTS ----') + print('') + samples = train_samples[:n] + + # Redo the explerimental design + engine.ExpDesign.method = 'normal' + engine.ExpDesign.n_init_samples = n + engine.ExpDesign.sampling_method = 'user' + engine.ExpDesign.X = samples + engine.ExpDesign.Y = None + engine.start_engine() + + # Train and evaluate + start = time.time() + engine.train_normal() + end = time.time() + + print('') + print('Evaluating the metamodel') + surrogate = engine.MetaModel + test_mean, test_std = surrogate.eval_metamodel(test_samples) + + # Add the results + engines.append(engine) + test_runs['mean'].append(test_mean) + test_runs['std'].append(test_std) + + # Add training time + if 'time' not in accuracy.keys(): + accuracy['time'] = [] + accuracy['time'].append(end-start) + + # Add error measures + er = error(test_mean, test_std, test_data) + for key in er: + if key not in accuracy.keys(): + accuracy[key] = [] + accuracy[key].append(er[key]) + + # Save the results? + if write: + None + + # Plot the results + for key in accuracy: + if plot: + plt.plot(steps, accuracy[key], linestyle = 'dashed') + plt.scatter(steps, accuracy[key], label = key) + plt.legend() + plt.show() + + return engines, accuracy diff --git a/examples/convergence_tests/example_trainingconvergence.py b/examples/convergence_tests/example_trainingconvergence.py new file mode 100644 index 000000000..f9314ab1f --- /dev/null +++ b/examples/convergence_tests/example_trainingconvergence.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import numpy as np +import math +import os +import matplotlib.pyplot as plt +# Load the mplstyle +#plt.style.use(os.path.join(os.path.split(__file__)[0], +# '../', 'bayesvalidrox.mplstyle')) + +#import pandas as pd +import random + +# Import all from the 'original' bvr +import bayesvalidrox as bv +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.engine import Engine +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +import bayesvalidrox.surrogate_models.surrogate_models as sm + +from convergence_test import convergence_test +from testfunction import testfunction + +def error(mean, std, true): + """ + Error function to evaluate the metamodels + Returns a dictionary of measures. + Here: + 'L2': standard L2 error + + Parameters + ---------- + mean : dict + Mean-part of surrogate evaluation + std : dict + Std-part of surrogate evaluation + true : dict + Mean-part of model evaluation + + Returns + ------- + dict + Results of error measures + + """ + m = mean['Z'] + t = true['Z'] + diff = m-t + return {'L2': np.linalg.norm(diff)} + + +if __name__=="__main__": + random.seed(15) + + # Some model properties and settings + t = np.linspace(0,10,10) + ndim = 2 + + # Plot some evaluations of the model + xx, yy = np.meshgrid(np.linspace(0,1,10),np.linspace(0,1,10)) + x = np.swapaxes(np.vstack([ xx.reshape(-1), yy.reshape(-1) ]),0,1) + out_list = [] + for x_ in x: + out_list.append(test_function([x_],t)['Z']) + out = np.array(out_list) + mean_out = np.mean(out, axis = 0) + std_out = np.std(out, axis = 0) + + for i in out: + plt.plot(t,i,alpha = 0.2, color = 'blue') + plt.show() + plt.plot(t, mean_out) + plt.show() + plt.plot(t, std_out) + plt.show() + + # Define the model + Model = PyLinkForwardModel() + Model.link_type = 'Function' + Model.py_file = 'testfunction' + Model.name = 'testfunction' + Model.Output.names = ['Z'] + Model.func_args = {'t':t} + + # Define the uncertain parameters with their mean and + # standard deviation + Inputs = Input() + priors = [] + for i in range(ndim): + Inputs.add_marginals() + Inputs.Marginals[i].name = "$\\theta_{"+str(i+1)+"}$" + Inputs.Marginals[i].dist_type = 'uniform' + Inputs.Marginals[i].parameters = [0, 1] + priors.append(np.random.uniform(0,1,1000)) + priors= np.swapaxes(np.array(priors),0,1) + + + # Parameters for the convergence test + mini = 2**ndim + steps = [10,20,50] + steps = [mini, 6, 8, 10, 15,20,25,30,35,40,50] + + # Get the samples and model evaluations + train_samples = priors[:steps[-1]] + test_samples = priors[steps[-1]:] + test_data, test_std = Model.run_model_parallel(test_samples, mp = False) + +#%% RUN THE SURROGATES ON THE FIRST BVR CODE + + # Set the surrogate parameters + MetaMod = sm.MetaModel(Inputs) + MetaMod.meta_model_type = 'aPCE' + MetaMod.pce_reg_method = 'FastARD' + MetaMod.bootstrap_method = 'fast' + MetaMod.n_bootstrap_itrs = 1 + MetaMod.pce_deg = np.arange(1,2) + MetaMod.pce_q_norm = 0.85 if ndim < 5 else 0.5 + + # Properties for Physics-informed training + #MetaMod.LAR = True + MetaMod.apply_constraints = False + + # Init ExpDesign + ExpDesign = ExpDesigns(Inputs) + + # Start engine + engine = Engine(MetaMod, Model, ExpDesign) + + # Run the convergence test + results_FastArd = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Change the loss function base-type + new_type = 'ols' + engine.MetaModel.pce_reg_method = new_type + results_OLS = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Do OLS with Constraints + # The actual constraints can be found and changed in bayesvalidrox.surrogate_models.MetaModel.regression() + engine.MetaModel.apply_constraints = True + engine.MetaModel.init_type = 'zeros' + results_PI_0rand = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Plot all the results + # Plot the results + for key in results_FastArd[1]: + plt.plot(steps, results_OLS[1][key], linestyle = 'dashdot') + plt.scatter(steps, results_OLS[1][key], label = 'OLS') + plt.plot(steps, results_FastArd[1][key], linestyle = 'dashed') + plt.scatter(steps, results_FastArd[1][key], label = 'FastARD') + plt.plot(steps, results_PI_0rand[1][key], linestyle = 'dotted') + plt.scatter(steps, results_PI_0rand[1][key], label = 'constrained') + plt.legend() + plt.title(f'Results for {key}') + plt.show() + + # Test statistics + meanOLS, test_std = results_OLS[0][-1].eval_metamodel(test_samples) + meanARD, test_std = results_FastArd[0][-1].eval_metamodel(test_samples) + meanPI, test_std = results_PI_0rand[0][-1].eval_metamodel(test_samples) + + # Plot test statistics + plt.plot(t, np.mean(meanOLS['Z'], axis = 0), label = 'OLS', linestyle = 'dashdot') + plt.plot(t, np.mean(meanARD['Z'], axis = 0), label = 'FastARD', linestyle = 'dashed') + plt.plot(t, np.mean(meanPI['Z'], axis = 0), label = 'constrained', linestyle = 'dotted') + plt.plot(t, mean_out, label = 'data') + plt.title('Approximation of mean') + plt.legend() + plt.show() + plt.plot(t, np.std(meanOLS['Z'], axis = 0), label = 'OLS', linestyle = 'dashdot') + plt.plot(t, np.std(meanARD['Z'], axis = 0), label = 'FastARD', linestyle = 'dashed') + plt.plot(t, np.std(meanPI['Z'], axis = 0), label = 'constrained', linestyle = 'dotted') + plt.plot(t, std_out, label = 'data') + plt.title('Approximation of std') + plt.legend() + plt.show() + + \ No newline at end of file diff --git a/examples/convergence_tests/testfunction.py b/examples/convergence_tests/testfunction.py new file mode 100644 index 000000000..9b79f62ec --- /dev/null +++ b/examples/convergence_tests/testfunction.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Nov 28 14:33:57 2023 + +@author: rkohlhaas +""" +import numpy as np + +def testfunction(x, t): + def sig(x): + return 1/(1 + np.exp(-x)) + # X is 2d array + x = x[0] + out = 30-np.sqrt(t*(x[1]+0.00000001))-x[0]*t-2*np.log(t+1)+x[0]/3-10*x[1]*np.tanh(t-5) -7/(x[0]+0.1)*x[1]*sig(t-9) + #out = -10*sig(t-8) + out /= 40 + return {'x_values': t, 'Z': out} \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__init__.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__init__.py deleted file mode 100644 index 8e865af80..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -__version__ = "0.0.5" - -from .pylink.pylink import PyLinkForwardModel -from .surrogate_models.surrogate_models import MetaModel -#from .surrogate_models.meta_model_engine import MetaModelEngine -from .surrogate_models.engine import Engine -from .surrogate_models.inputs import Input -from .post_processing.post_processing import PostProcessing -from .bayes_inference.bayes_inference import BayesInference -from .bayes_inference.bayes_model_comparison import BayesModelComparison -from .bayes_inference.discrepancy import Discrepancy - -__all__ = [ - "__version__", - "PyLinkForwardModel", - "Input", - "Discrepancy", - "MetaModel", - #"MetaModelEngine", - "Engine", - "PostProcessing", - "BayesInference", - "BayesModelComparison" - ] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index beaab3c798a63fcfbc361982388fdf10830a787e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmZWn%Wl*#6m>Gm%w#4reNc%7iwY!=W|MT&9YUy-LJ>tHAvWGvZenJv`VrYl%kVku z_$5oMSn&(2uy5%A!BI}mJ-L3IBkS30g8WGCJ!aoxguaL3@8LD{+`qQ*P$P`$sE$P> zV;o0;55zzwI02rBR1WbFcq&G6jK{!-B9jw50X`B_nd2PzSj^-c&w*!RNABX?2(3^( z`4Zv1diowM^3Ul}aa0`ti2Ux0$n7sTZ@IcU)8>Yn`a;)Ccs09VExjvtw#7@e;)?nI z>A7mU)|2^C+jePm#jNFO6_gXYVfI{oWQM6KG#`KhtG&>&p@v(nygohUwlb`ts@g0v zHznkn8OyaI#DtJc8XyZW2#^FA1{ehxdw93lHz92|Yc|5$C~iM6-95COF?vN?Mr811 zi@pHsx<`Gvkly|69Kygd?CtLV*T_Q*77pqT8y^K}wpkRt8jkJ`FGD<p-{n*EYVhWs z^wi&7V1rcK5FrEipx<2o$ra*rBSNSUgnUKjAVe47=bKWhwyeqz)~8;YE4>zLN^N<n zt4=c2+VT}|Uw4<~nb0>&+OA93=b8#$8~v#y-UM$6@tM2vQ-8EhuxH^`*|2;P<#8VU H^TfXZNO$QO diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 522dab9e775d3ce6f28ac1ac7102d1843b71523e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmZuvO>5LZ7@q7$vb)(`Yw-(uC|-nB3_U1_iU(V@1uF~UB?N}qWV#(XA7Lh`T~GTj zyn7KZ`d4yXa$4}@ZK1cGoEf{7geEV~Jnxe?Gw=H(-v@&p(AQ-C6K^#E_-&H))wm?* zQj@PB0U=17q(L3l2pf*!P1<Cwuw{9RwwW8cmba<LI$_6hmv&h%>{;$npY_AO<sCX; z!*FPMm)>9-;f4dIAnAQ`!kdZz5sdm@+B?Bc@br(P&mTGE=6Lp=@RPSfenv7m6bYtU z?H=L`trPbRpAwF>+&<uGo@p{13zdzfh_O<HPmS^#&9FM)M_6JWo8ntmv777)mLf@% z;9B?hh>9gn5szo1Zs|jKilrigLnyUdK)MEugR*6yZNM|oG0@fUVYDfIy_SP?Ms@eW zzs0^@-dDMlVu~^hnHfg~b;0gi-mS|4wsYD8uX#$$?8<gmZl`*Fm|htW)N<QzxjiwS zK(aO^sO5H`@<C0#tg^ks_{upuc)3+CPX3!|Ju5v35v36R0O#5vaKUz;N1v2-IFcvg zm>wgfqCFAk4D(Dy??|?vPa?bPDWW8i;w-{vh@}*(C}$H%k|~Cn$~j^r%QGPfqP2Rc zM<f}9`ZHW~Uh2kkieJfl`gHS?sb3maO~-MT!`pLz2_6^KSb%3mHJ0E}QH=$7SX5&H gUKG{1PT4O&B^KaGQH@p0_uUm(!`w5syrX;m3*dMy2><{9 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index d5ebaedb4c8b77b5d7dbd0a6945f09079d8b10e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmZWm&x_MQ6i(8gY18gn1P>k-JqSG{?6T}dM8vK_!Ae02G6aU%%(M=jnS`07Zujif zf5Mypf>*&mqE}D;3!Z#4b*sh+`SQIlZ{E!N9vKXJ9;^>vzS3`j=Y6-q-wQPF8N8+d zpdRw5PXpo000q9~4bhNI)O5TlTC$DWj<-Zdc2U>ywg_bp^&IbrzKl@hcvlSM5Dgs< z#gRNl$G*4nXz!Dc?$G`lZyepUPLtE*;)f5XkNw?fzJ0~j`em-)6HRA1WdhW2#!7M< z936reYQ+_U|E;MisuIX>o||&6^Nbn8)ygW*$(EU^S~AU4W|Qwa#Z{Z+vLKq9T!G%d z<R;UsAS&CA!(AWa4bz6_3S(_e(k%<2g@%Qug|>x`g)YGB@km>@(V*B0Xd~Hw+;;T9 zR9fdNQZg)UUnZ#wt}c35mlFxy@AqKlT6Slnd;cYJYlCqYMJEMVfs2C|NiB9)M<-X- z9?Wn3Nouj{4Lz!<zq4E$I6Ii=JV5vB$@Gt}&c0m-V<H5`pFJH}>n!~IIC-2d3^<-@ zw$9H|TFL5qkFkU?Ya;j!DPbP*l995~ES^s0@#SK+czd2)q*oOeG|nVhvy>EtNO@MI z3?P=vbjcMFnwd(JW^?uq+bmtF)LnH0m8s6JQw%=v5@Q(KuKNVKs|0&$M{h;|%^>ps Gd4gX;Q2|8& diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__init__.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__init__.py deleted file mode 100644 index df8d93568..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- - -from .bayes_inference import BayesInference -from .mcmc import MCMC - -__all__ = [ - "BayesInference", - "MCMC" - ] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 430b9885a8c8bd658da24bbc4ac1a6a0a74f69e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmYjNJ5B>J5cMx4LJ1UHffU=|3m}9D;!`9-LNwc0j&0Z#_8Qq<AV=W{T*)mJSD-+Q z7ez4AJilkZnbFwKX1fT29n8%eoF7H}4+7#8G9ChGq_IT~*BBR0EOE4^z^P^rq-J__ zi>jSZ4Au(gy)(Hn@w&S=!F0;N4O=dji%?ny3b3k1d4F9@qTRZN*UX%9YVhQ-5Yk#9 z-ccBr!UA74cU|I&-$fH550AdFjg*m}d(}JBrN}Sabk(o<h4n8tGBtb{^DJ$vgMa;1 ie?z$d-X<ZAo;G=M?7Z%+IVo$z@;g&9#e@<(`ThY0HBIvX diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b22adcbe445e7b81edc8dac6cb9ba03678c61ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmZ3^%ge<81T4a;sWXA}V-N=hn4pZ$YCy(xh7^Vr#vF!R#wbQc5SuB7DVI5l8OUZ% zVM%9-Vo6~QX3%7N$p}=e$#{#;DX}uO*fTFJwJ0?&ITa|v;_K||T*M5NE@A-^ewwVe z_>(}2;xl2Yz_Pbka+7nD!D?=?$Hyn;<iy9XWcUo!!tg81*(xTqIJKxarYJi<BPSy< zu{g#hKe;qFHLs*N#yzvdqckbTEhoP`Ah9GP25fp+VoqjCQGNx4hp;Oq9>~rtiI3MS zsQkrYlbfGXnv-f*#0|6t<b`58An}2jk&*EO8v~=x1qN+obb~?c0xANkVimo?!u5fb PnVYSF9R!OwfkprT7ZzXr diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 287257c1ca9b3f3a6d7e176e006ad432f8c685bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmYk1K}rKL6ow}=(^{m}OStJ`3Ps$Ah&XP#s0cD3Lm;G+HyWDE49TRlE<J%4@Bm)H zt+$x1E3e=}d}$GVkT3tA{CT|a(P%%wdU|^o&$xeh^S?qg7r5*ZLIi@SK$DyhuR|5; zD34G_BEApvSoCg#asQKGbWFN~OTGa+t4c6X6@Vx4Je{Y;w=@yrdfe*{7e2(~Z)$s+ z$GXtPHq-4f#+731H86eu(BtbRJ*AliW2u2<J*C2Fx85<)vI4`EeB`aHtE2?pIs?fp zy-BXJd3JX^IiU+Dl}HNBmq2;bC@PDF0wU2REoH@(0qaz2SJMaPQ^r+vJLw8L3sbLm h?r(0&P|KFFNwet&XSx<n!MXpX9Uz8e7=<MK{sG1iY1;q* diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc deleted file mode 100644 index e89dfb5e6b3a873ac2f40dcc2084aa52caaedcd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31276 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc deleted file mode 100644 index f059bde3e71ad6231b8a26e02849bd6298052797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60952 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc deleted file mode 100644 index a37330680c29bbfdba5a1bfd98041dda24957604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31419 zcmb__3y>VgdEU<K?DO{S_MW&qJh&tQ0*A-p!50XD1W7z3N&pCxuuQH%F7|Hr?sl=a zd+415aI0BS5-1C_1qqhRiY<l7p6rw($K|A4E>~W*729!D630=wDlU6cQMvqx#Mn+b zj$GxiBqHDU_ss0>-GQX!9I(AT{rtP9`|q#+|L@*ne}6iHzcW+G(y#taB=V<x=>Ci1 z;c0vt--KgFY@-^<8}e=DP5F-Iqw;O#WB4|!@uhe^ZZK`MnpjHalj1k3sikzj&-Z8Y z8OhV1ACT|C{Gfbi^I7>G$`8r+aDEuyR&``)G(WmDmLHS+vFiBJmi!j+$Ey=dlle)% z+^MCl`EBA)RJSkf$nWsO?_0{{?}tBWr>YMuJ(z#ch<q?&r|rJiBX-|SGr!X|UW`m< z-a;EA=cf(Na<1A-_>MK4qSKf*z2T)&u~ukYT`8)PT_`D4S6)&bDKzHls)U67%c``j z>T{(=qg-2H&I?6nZV{g31$+KNaiP?B%Ru1>u+E)4cXEz3b^ndw;c0vtzW}EseT@D! z(6^=?wJke_Z~lwplfWltCl?}i3g77k11Vy5pPiW>v-|CV*Nwbo58Bz+BX}c2_AtKV z_J}=-?}WX_9=Eq3Mbe(IClQjer|l_wD?-xtHhVil`s^L{efZAUIs1Nm_uCKH58`{k z-f8c`_n`fdy&K<I+eDx3^#-0Tu9h0l)#gj8RGTXmUl@u+(mDJ+lbfp+8;zV(&n=hK zd|fT&Bx$)=%RN&oR#zM4#!Nb`(>jhS&#pM7hCCh!|K#yp$tj+z+ofvmSgt->kucW4 z@Z6F_Ah<N=%t(}7Zp`6z6l-&<>oQziEakdmb*>y}%Q=W@loytYM;iNc<(blqgxKZc zLLIc`N;MGZQ^%_7^AdlpsL-6bQf{e;_#09ZNLr~nWr=c1xf&Xd0;=UJrD}PxUbi)o zwc=6<)HNKnKUZIN%B&@980mCYmrJas=y%orT&WBqRc@|WEzhbVv*h+%KFO!c(>XNZ z8oaiIhXw7q{80v8o}S4`+e`CB(3UGVa+h~Y&fS+aIVI3sbWq5#+-$vG-Grv#mF2F3 zj9i$0Pxx{+spFzrDftzkR0oYMF5kO`XTv0X89}=@QhugbZ3M-t($zwJ#aUi)8YsA0 zZaABe&ZaYp-H8k<rG`_ob2=M`=WHpr(m+Ts4#KL#eq7&q=j%04kb7=EN8kQjv0ByR zr8Hlzg=IIw5@nEvrTN1SZ-Le77tknGF@V8b$~C(TK7!WZd$ZO&BM}@hYE{1sc2|%; z7vx7<OU1dxV17s+NneI!*j=Nc)1b@Z)lCA|Ypkf!5=MV+xn8cJlfeLWXO(MgaadSy zpEZh0%T;MaQK{l8JHD}4#DLxdE~?}9=W2!JqAD&mrtk5}f<n69kgoJy#zxqVkT8bG zy9tV83v5-qUdzp^`jSL}b<Y-OIYi2H=s=97oRC&>N-8YKe`{z8`#T)=<VYdw30sHP zhwj>>VdqztW-*D`A$}iyKh1me5dZusMLvWP7?gwIRI59=;Qcv^2q>zB6?uEt%NU^; z=U~X?1&+|!B1b$}NcT&uZ6I!;e63W|Bh()Zb^$!5_&$f{T)pNL%QdWt(rNYCMoC@M ztc#^=oZI^Sg?(P0?`jX&VRwFis`*1guMa)%C@iJ(u6m|iIasp_OC@KqZlg_`v*TxS zegZOx;xb0djWQU1(5mG+_=zeb4r_~E$H<#~!h$s~q$aEuwUw4PcEN5{;($UCyD#t0 zU0*C?5(9_SY+)y1F<~k_06@$PmfUkib)|kScXAQEo;!!$FXc`aRkiMq60ROKj)O)S z6Ld8!EaV=us~GtLVz5FGsRRqe(%jOVKVRSHyO(tW1F#`Hw+!GEvcsTH&__OO5Jnb~ zbD1@Rzh1;d+sLIfWZ>w(Aov1_x~bzzE2C|`Uai)zqhpSBaxm9ZPd(M0;n>H+dKt^V z-59b?z^HZ~^O=0^LC{-v%2>_)Ikz!mt#G|qy;4#Q<T`xl(Ec1Ub!L?xm)kSP_cOg& zc8&=@GiLg_{7Xd)yp<&xI2tKwdbPW|R+wE;HPn1$Lrz8<z>tvQH`cpUzgA+coPJX0 zIR=F9tF$y%!k7_;)nSN1-Ma<vbl@+_ktJFRS{Jvm>T4x6TW^$tOz1BiQg%ASGpMN* zX6MK#JEf%t)|EO~d2tp5%i=`l9E=$tA}sc@P8Vw&*$NXG+_&86JhDtA=c>J5Momv% z49j(V6WqG&<IGtC-$J!spSy-BaSzxO4)wF8;<eHN^zQ)xkK9RB2Q(INChTzISocv5 zIDFXX%YvsgnP;DW{^Un<(&;vqXhJ%{FrW|chU`gC0wI!+TNq?m)ah$wn{Yk1=h<_o zr+r9T2tit*>?lHz_gcfk415_HlWuIuVU3i!yQ}L3bQ*;w;6L_QK&WU2U!+rah@DHd z1z=8p<?UGnu!w|hYLxsJgYAa1qGkc6{H1Cm2nh+7mJ*Ag*v){*4`am&1_<{ty5QXA ztJlX~S&w!LwR*Whpg&)&7dOKL&tTDJifZW^_BUv@UxyxxTxr>?4V>`M%%Mm9x+*IT zrx3uedk@49BUyRAT%0XeF}3aup=8|Y0U;X-E{>`^_b%}ItPidE!X%4c;Qf4>_K+8I zDV5>~!x}5g%XJ0R+r^;|&*ZB0g#v~p+5#VTSkB^7@bbgyq_=$~e;9{j;K)qwBWF(` z=SNnm)!E|Ql>=u><=HCU;VB>)wZJhSCVqH^3s8Z3yZZ9#vD|Yt?ou`NeqflE3@2a> z7^Rm#w%ez2cks@at97S9EKq<jfMDVt9N_}e0Zj*(fr$b1L0yg|fLpDvs%sY|bu1N^ z-%k~M9lDo-4bnAi#u<ohvyKSruGc!e-d|(Fh8H`umUDZ2RtX%LyNr~DqO@4hPZ_(= z5H*LRHY}&R^SXC%>q|k$ZH~gu`HNpSK{G%p6wU0ui~())0nz|IU~m<$70XqidTiyp zdNibmFVWAdM>|A0wUR10Wv5yy%r80jB;+DfaBaj;375#u3+(}cd|`T%w!8|ASqrOQ z#@K{dD0f*`y9wCYJ#z$2frNys-}#GPOg8Li%IzODB3>$le<}ru(YL<*GyMD72``F? z<5}#JW)ua?Z9#1CN56^BNqic&;JAhxDMVZouHi=Enyv*m>c-$&ZX9mRO~8%2Nw^6& z1vlxY;ilX^xM?>7x6d7fn{oT$_PYac2iz>&L3apl)*XgB<c`1{c1PikxMOff-Ep{M zb_8N1<NWlvmpT{7dAz<;9T|?741^7yMX8CG3YoXp*R}umvH^+>_RwC!$7x<F+?aX& zJ^L6h8$wWj7vS}Efk|&5Wcjj|czs=~n3o0M3S<_tj(CHeXJPAJe-C%|`g>R^O7Gzr z5F_$AnBQJ@{oL@f>j&xd7SBSn=M|)G5wEXHxTQuAqDJXZxTwbIa0I9cI+Jv!=xn94 zjm{1__tDu-Cr9UgIuFo!kj_pzyXZUw=W7u)jjy*qck<XJE|iT+s&u7(_|o&W(kTUw zcIi~9amA@GUwUx`BGUz6lE$Soz~swCXR!duf)2YB`U-P%1-;lmQK*%!FLP6MNqSuR z4f`(rgct1Z8`eM1EU$XW0^)(+3!emSjs0*U>A3NJ|24PB8iTb!3p8hf(&i|@4gMa1 zXAmFC#~Z&78TzegCDJlnqhhp7xMnNrnw4n9dV^1~O1xzuMZz{#BI;>|w3B#F+2)#g zD_Tg@KHSVOzLIXmek4+xup&<1s%=F0kKwJ@%aNLSDB{L!!!|wx$*>#!j5%*kBDRo_ zoEbYRPbob0OFcga3I^~rXj``pr0aLGjB|!6!#B;w*PWsEFrU{Xj_KMXYY{tk#Z-TY zoTJDwR!hP+PM@>oR@9E)H18OVSEZZ@XOd4Uj+_&AVlwhZq$d71B8ZPvru_KFJ{y@g zD0zQ9$<X%JwaBT+P1d=swx>DlY;W&ixKObTZ68J3@4I8HUec}C?M7LVR=iVh3q9FN zI=NfsP2*JLl|Q*;wo<LMn*cpucav;AeRjIVUKZ+Fed6nrKAJ$S_q%<SDK|YCSu<Lh z+Uv-bzQWf1A=6c+P=;~GRGA=LeP=_SaXSMVP?F9OmUUFqS$V*D5ItlzPTBpfq$`vZ zb|P&*Q&!TIOsgNcce(w1bEE>yH14L4M}oAj^k?CrJH}PFiT6>NXzzxblD^u5zRGm> z5n`rM+n4dZ*Z<ykC!t22{Rla56Iuea&s6{RR<u2Xkp5eG>>a3Of)scs2jx8vfbOW; zi&TgF?_g|1{pUpGFtiSXw~h7@JL^X0P0&Apas9A6U=Q6k@ID4xSv)_2G9GmY;SSov zx1*@xF=u;a7oIsz56+u-dfXnlZMKHk7Ysv592J3oq{~0r<sU=ZqoC&7tQG!*U+;Kp zi^~!Fgo_bdIM&sk-$N?4hu@F2KLGbpe4bb{LG1)`O?2mS4SQ62;ZIQh@z!L`!ibx! zq2$Vw_$2Hxd;B)%?o$kRPS~iea-fp=O5{z9Nh9JsjnOIn4)-9nE%wxH>r~{9`AQS@ zO}&8`0QxQUEWV#;ZI!w6RBJ1q_TI4?FX4M1Vi(ckXKop5czZH(pLI?mroVk^4I{|T zk{3*3Hnp}nCz0~ByKT+D({?<av7-xyyM0T<-F_1kwRU{g_$)Yvy_GZ3$+<f?a}a(X zMtDC)hSm6n^wl=B+EU*^Egy8Zy7$Q#+~ZE#+i%C*A<cc<sd@8wq_(4z2Jt&?TfOn1 z=R^2Bhd2D;?wH94LO#NGzJ_)I7EB!{k2`uNrY>P@o@Jd3#hi!&Iw01*5A8YUJXje) zy7O$!waA^gGVR>v;VA$4_63{VF0}^z*<_@Z+mwnQl96}6dq3!W!M%UY*cx$jS7NOP zkTc;vfP4=k=5R0d496JV>F(52PDB7|Nag0#e93vyzTdgn{^7OADEoUC{2z69tr=f9 z-g=0o<MSi#L+x`IXR*plm6t(j-hHt0F?Sc<@8Ip|n)Fj^_m4pPYDKKb&8QKn4If4i zG;SP{6~c(TjBibiyBqZE#Al2&IhQK0P=9wDBl3=Qb&orQ5&No(ek>HE&*R{iSOp4~ z@6pHKbh!=`@6opJx|oH9St$ve=2p~-R9Noi$AL4YhB;YNc4B-b)KiXqD~cZ2<L+sf zkgDH}%j!2@BR|p{W|yR#<r;;sglpLk$t;_%r7<=Z*0|oyW47&<Id;O{!*AO_`o&7Q zPzilkoD;}D->$Bq&oLWM*wgaORgBy%sV*S?kpCTUw;;Tm>OXV$R31aEkJYM}DH);f z?^rh0>gn1x?F(0Bv$E6|(JOOn+MV8nOYSAVa`(O$mqcr8Yj~^nUaY`_Uy0cJP!qo2 zv|9U|dS%(&2adA;wu$#ns-kGgFSu6w>Sv=^Z4cNpnBz+L`b6b{O5-ND0%!Xg`@*R> zq`JMb7I7_Tkq>^=uqP36%|3)O58Fq|hW#-9P1=v(-=nwtTl@W%r_?M)>;3Nj%JnsH zerLaH-88f-E5HHP$uL=!&$njW1MZAFL!8n&=pJm}K-*W{8O|Tjq1+is_dx5Aq&u`O z-65UsPU`A0e1@H7`{V2p){ZqlD<!)2!z>H&%V@#TJ1O;L`!T=A9)C01I$X;H&u^No z!|wie%Rb5+DCHCO6YjpRMBKyZ-D7WB_6O|a>`#>Q8p`qT20qF9@H~Adt$yA4ROQo^ zn|R{NQ>X~uvY(XE`8sI(%vuC|{YdMe^P`o|BE{?OLHjB6;fdQ8+N#3}2zwe~&)Co2 zj)8`Q?OXOqq2^%w4f_;*&W|D2Q}${5%<U-rPvhS+^e>pLhuwpfA9o+NKgijP8jgah zTlR<6wbp-TYn|r3+6a0-$F>E1iqdYQG^~v6&+9g0Q}$f*^Wk>&MW?8s{iFCG#NPha zG>5+zN|1}yI#N|%e;;P=h1A$tLs1h(vH<STB~hpNP_Y&!JnzL7w)yoXMJWC?*iy_v zi{-^cBkm3P8$0T|w24MOcBKa4a1U_j{x^XScSj9wc*+qs^2#`&yAx>}fT95G9C$xz zUbSA-`<v;gXV#Xn(YmS}FCEG_Xc%J79P*4SH0zKZD|bU`FB~s@oKl^+`qJ`K{|(Ro z2cJmu;og3jftdpKM4jEt%<*a+jcGhJ)5+}_&v-HEbI*9zGfsMaVt!H(2@d-JVv&Xj z0lsF)){exS$37WxF`HHdo~4!=rF`lFw^J7&Zu*)j3BBl*(rPms?r=q@c`Vn=JzIx# z3aa`*!9`gd$eN>x0Mt^Ai|CM;h-N*@E;Z)7Sg|ozF8B1ah4#krk$&c0QTllYrU=0y zwnw+n<A5}jK42>|8R_b8*;GzjikmFYD0@alJqj<n+oIgn%V>dCfzp76B$hr`kFy#K zjRs$G+`#r<8+0IJTzkD}!?C9gbpZ+T(JNKk>qFND62Jw7;_oj{yu|{hVG{#+p)b~k zOa&S+FD4sNbZug;UR_zLH9RBTJQ$j*XwQXExYt-&T7sH>U3~M%x`6lb=nXut%^V6c zh6<ih02Rp+UcOVPU+L+4QqTUEzUR(<fn$8M#nBz9U~|fzuS9>MYlK^B80oy!b5wqF zC_@?p-CY^RCk+uIOq=pL)Q6D_9k?4`ou0>Nr}A7zJ0(o&D5Afg(H`cWj(+Q5`TMOC z-$EJq`{NS}I^-`-ENCg$e>mYK=b_qcl$)iu*t|39GTiBm7l*vBRBd=EC=qH-85Rg$ zAN508sE6=SxaTD$>2lG|_d{<2nF}NmPU(i@WptV=*QvV94~j&FqfXmD<TE;;RBJ$r zp6{QBeyBh#cYQ@QFv^x74_eG8_4i@BnLQW|h61|PDR`+uAkLaL-=Zkytt_0k&6$I5 zTQke{JZ4sTVbQ_M?VFvg-vD!%TP!uEF{#;JFSejcr5ZU>@dh|wy$VaT7;GzSO!HZ2 zyPBzUVh}~Oj-?zFtybt<gX6`d(ak}Ku6Gtbe)v#pr>K9LBNxN~LTd(~7h>C*iHpyl z%dwcKmzpomm2_RHlD(k4>IRAgU5Q2TWOQ{ieGsV&FgtJx(_hd6siY9|{A|Tb2G$;4 zTn}U~CeznToxZUQF%hg1ycAfgKdIR<Ue=#}r9c%cQY$ZxIS93$H}FhgHFjDI^4JYv zW)y09S#VaHI-S7YKnAgwF2g>L%JjLCXD-`b>J;AW85p6UV<DF+p)W-f<PFsdU~mu# zh6XTRpTrb|0kF}HBC6NZ#v-p*53^zmJhh<?!K)6_Il{oyMX+H_WU2&pFnJ1U6t$GP z#1!C5%1glztRRfai#1Eo5MnS=0j9%_kR1hDX?323i(pTrb`;ZjQOM3jbm#RKe6B81 zOD)rTk~uimyo4%AS9t>^w1#p|tq<^q{RK(Z7T?UVZ?;@)U=-5C${W;cPe)Lj5WUvn z$3)ub?bOUEl${mWfq3zAB`7Sg_=wuV8!3PZuMf;>QaE;X#p)DE?JIP`z56#7FX_9= zj=>Lg4mqHgsMTxiMv;1Y7I_S3%u3Di;&UrY;LTpNSzcy3wZxeh#k{~%u|}%BXz9i> z7!CDyhmRcfavLg#ELIgTGhjAHb(I%|;8u%DDRacCi+SPc4tnen#@_IvAkG_HrxW*5 zbIU7WA|%YZ0P8!i4;*C<L!>6d<ilhfUX&E}$&e{DmZ8J*jEkPRFefV!ZO6P6HBz*G zXm|-<Ih7yrJt#gT){8<#rhW)CYS}NOmoWQOD}jt$d6`g~Q9z|5g;3d`Cn9ixm(WIw zsLC#boZ>3v=FkTPt74K5s(!uUC5aGV+zGioCXimkys?hjNXCR#fO#f{JaS%vMvUAP z?6`z3jG-eJO6nDMYFrDzy`)nwU?MHAiX56C2(3;+Ra&@FEiZYQS@fn|a8_uAhOVpf z%~xS&;8_c*Y<q)DNq*|HS858b!3tnO1l-<u!575$D!3G-y#Sqy<s)8HU2Ej~g5GuN zOQ?Nimf28W1Gpe@#V+yDOKYmQGHL&+aA8FhiWRE_CTD}WW0?{WJNu?bE1>&k`Vqb6 zikv?tY*n>Tg8CF4vP<<3;N%BF9#WXE78le{F)#t9R4Cgw)EPbv2`Vn&y#;2n>Uo5F z{k3j>mrtF0=0X90-znx}s|7sdQ>!v_=^a4J&xR(gjeL@<|0Kqk`gbTw{U#lbFb`Q5 zi|BpHnorA<490wlVt-+Z`2@@jNMF9s=R9Cb4QPA7zcC-hC=DLpve8R%IR^O{^43bN zj9Jk|iI*(S&6Sp+Q^s-<;4p8PUMw_S3G-NyoJB4Zp0TV)JQ4^-&L?SqRKT*Oev55L zQ6nQgfnmSmplVDJ43=<dSHI6>=4x3MT+h5w_L6*wqOOV}r8lVGa{*SK+@EOFiUs;H zcGOuq=jaHmlKn$={odfKh;NLNv1PO>BWWa~X{t5uCZnd2;lJp3bihg*S#!V`hz%HN zGa1bo14hP-!%Z8>yJ@5xhCgn_k=`=0(X449CSwen6J{E&WsI5(OCr^PnKY9q)ig#~ zPhtWkTddE@L`RLxT`M|aWuwS{H<=tTth;ejs4y~C615-)QpHhgGD?5ONSbj=@<%Om z*fddxWmw<KCeRWy9?gQ93Di1jf!=rG@o~f=-#eoTew*(MCoKbEcTs<wIZ<nD!Wab= zqtRiheb`8Yn&G=vj3s5!DyB;s*>}vl4<*uu3CgopJQ|NCjkr01Qt^SGy}*=gS=Jo2 z(g;hUSJI#+satAhQ8q%%ZPD?d&9P*B)EGc0doX*~LcJNoB&`TBeILK^?>q59_VNIz zC0+bvP&?lsdKvwiVef;&IQlLbWseQ8pV9Ly-FzpG_nJl@X5O*TKRU-0s6<-4rRII_ zv9p{b>k9t*;pxNYBtDH<Y?xf^3!tzvT<pW3z_MJcLZNu96?ZKs+Q##mF&IIdX=CRA ztu6G!l{gexkqR}%&=BM4)5w+7sVhmHzLjtwf<+iqGZ6Jgr~tFg+fk@ZqU}Bim5enJ zV7(Z@Gc?H%_@P7*B_%hO#`F+rLS4d?H%$nE+AWrzfxbE}xeTY@8E_#W7QxbDD~;Ge z2odq`Gp3uSfC-}8KDW;{pyv9n9i!ikjz(G;q|ElF1np3ff#N9pgDr<ZIx`ws!~UsL z;_=AUKY&<Ew;bQP<<OU>5c4nH<cm1K0%1zLn8w@<MH#-p1Xc^MRiK5mSWB+gC+E0= z!tAMci>}QT0;$P7mP&^SAvu|=u3)tlDNS9KW%t%=GYiJq$qn1#%hVmu%ytafF4F{y z1}888&mFN31jK18I3;2p7`Kqxuq`-iK{19c)QTMjQ5TG1d(TdEiHk1K?wgi)8ze^9 z35Vs9%|ld#gB&)@O+us|#<K^W?;w0_lNH8lsG+wLD23=RjAPET2nei-blRM3NV>>; zFR2!+1_7UaGNq?_YPis2EhZK*9Ya(RVX3Du14VXoe&M@c``^ERZuY{7=@FG<=uJAG zp~HOyL_iGyQ}sCpboBJU#;CY{0baTYyObh!Uq@_DZ%l(%puWUx|Ao#^OAZtT4DLmX zwygxL#`Q6k>3+Qgg)0(vJv2{)RvzYQUJ?tk-ckGy6qAn&pab4Pa6aAXjeH#I`Exem zE-(jWE!bAE7%edfg=Fey5cLwKMdLU;k<qyD+zG5!<bR{!lHi9}Q!H6yu-YJG0H1N6 zuUmMUcxN~^Wj431<9|K-pE(Lcf<K~NLN8%{3LXa{C}<@thk}u)FetD-umiF_e#hO| z8YJgn9C5P9iAXEqCfW(dXeX(UpEtqWsQ*lYQ6xtrZXDVdFr2MqYB3unR8n9X#%KgN zQ*KI_!E4~U;b5WMglC^*;u65?gF?B`Mt}1oMF4Q2wRzX5eSeed2Ij=YmoJ<SiQt?# zb^67VFFbeQ;&acR@30AOhLBkAJV;$nmU~aYIoP4Y6xr4}dorD@uRl2D+jicgN$)ig z3By4ds*~+nPhDs03z+;tpLX@rMToI}4DWvdAN>9CZ+uI8B2TLq;G0hCxngm5<0a=7 z>)1+MS=F;Kip`_?MWlj65^T<k+5q|~q$xD&)oYY3l#!ok&NFW4O?MRi;Tbj0I151y zKsEA|u0aM+U0y8e{TirTH$l7v%!?PW@%tht$pGmaAu!_v7&mqr&GGfaUMKgW!00_o zeiB(Jj+IgWd3dmda><X%a&L&e$R0eIZ7!}B?NYeR*Pz4aw}X*?lRiQNS)^$+R!MHb zDbL$JRA}zyk_}x7Ovv~R?F;6K9orItMU2%>!H^848j<yO3vNti#9H@^I86}`)|5u> zOkF_|XKVB2uDAF8MtN{H#vi_N?B@GAhs0SCRz()R(LR$l^PSm(ofd}S<`#@B>?4Th zwB?ByIeEt87FaudgJ<r-^&V&$Yh<+wn_w)IIGoa{fu&Gg(q&M&8?SqJSLeLfe9<-d zn{klKy;RSnk^QBALXL+tSttL_%W6TPA9s{!hnm7`Q!iscVZ3v1s$4psr1NPyVrM4X zQ(1Y2H#Sg9=K3Isfl1gbcmC5!y$VS-ZdrB7e-0na_eA95(=Ihb#8B39!*$a~{Va0) z5~t2icp}5tO#nH=l^sbMdzsALbc{P9;Aw`N&8hVhsv~~tnNOUH;VRO`1J{jeWXWhj zJMUl?twji<0iC&S#GII{F>zO5B<6*-N=U-!GC}JstP22)ZtNyj3D_~kVTEO>e~45u zJ5J?DtIvtI6K<OD60mm$;2hRNFvNt><-8dKG^Y=c_KQdd)66xahMFFSc^W`y)lFlD zC5q>xU2D#BjXJHKao){8)trO43nLj~b6DKt1WT<{?RxPaf=n7l)KwaIL-q=Db=m~r zSdj?45i`G1lQT;=a|T0PY?f6C7P7S9&&}0~3TuBjh`LTt(eT)3{ZKgRgJQ%}Gr6;r z#&+tXP^eQ!Skw}$xL#gZsQL){I*v8uKnkE2ii4fIDlJfDg)>jibqLOLJ=OS!8oSyl z($~T~Xr@tk)i;>-H6ducf7}-|&+fS~-I*96k9b!^`x53F!0f$_L>6A+L4<jLX`JY2 zbd|mc@v$O9(4ZNmoLWC)&lZ<v?P3lGixec1Fvym(jM|to>@H5>@3V!>68!0`htR(u z59=I_t8*d|#u=vt2&Z$XcnQa+aqLXNww!wcAa|{^?I9v4QD=4_A>zR_p2guA#Xzht zBdkjVuj}e?!uMixcwG=RU88b`hqK?S?*sW~qwrGi(X5ZiY{*^NgZJ|i4$Fj15fBe< z7=7W{GXmq`&*(nK)c{2tJ0OxcKb_9!8dor7RBdLVxPs$#6pHKX0%r77Yp5I<DVJz3 zbFN%FSG@6}6hI{J6fkOQ4O*NFCeauqfrG*|yL3Zu5?~4#nI7;V$4lPex*;RQ=LeR` zSY9BR)x_nKFBK4i07%(nctPl@2NG0RqB|`>Dz0Yd^XX1MhEaz^8K^!2n%6O2i0yT= z3ds9MWWZF)L?$Vafl!M7AkM%O1RA5po=w<pC;J@xB>3ZMLIAH}3<@TU0fdRe2#>G? zS0uo|Hs{7^dfQ6Y(qOy@1-wrJ!XzmbfC1h`uuqzc8e)i<z*Ao<)7$|_L&MCZlY+cL z{Js>UACP6QnB;!ZfYAgDHzamrI^S58`J>t#bT9(5Nb$P^leiwk%?LY(y?iC3{s7wt zbH%{-AS4*5+m4Pz9*?vJQF6aKh=n8Dgf)F-fN`xMP%)wFcVf<<o1v7WH5As_51acT zcgUA<P?mwdfEnxyPL^^E-CA57VL}ojsbH@^goPu!7Htg!oDHMq#ML9HdxQ%}YXo)l zNsk$?OteOI{?=HBHmQL|vO67E_1hNAstomQ@yF<Id>d(D>0cQq{V+%yos6`%;0g<D zmqc1Kj?)ICZp!ASDP<=BCgJmqr?$9}_5@A{Y*{l~+1l|Y+QYPBA~eCC!26iIW3Fa( zkKp}J_$Ja>cLMcJxfyP`(5AmnA4b|+N%#8xf~no;arEs~8~rw-`^`;YkxdoHvDXaw z!%5$0V&m2h3kZ(j`UVvN(88*-glV{5zJlF#pvClM9AO3TZ`pYlpx1Mmz`E1gn-B<Y z-n)8*l#rwM9`5gA+|zPQX5)1PVeUY#uo)KZCh;J_!93SNS)qNz0JQNgVy<o#YH+PW zSTV`&u0YG-L_rcj9Uq^70S2poAXW)(1=-(ITyf^gOi?ehuO8_vR+^upfzpAS+zcS3 z1mZxyQpxn{k(|Ge;c;+c7_@g2a(bxX`88Zvg4&3Obc2Y@_&i(U_M^fJ9e|s}wg`i+ z=a^LY5m^$}yUBs<$bVD!YDf1S73+qTf{6q+H4rL<$dl@OB86aV^|WNOizD90*y`RR z^^^wzr*2Ic`d&B!o9eS7T?pvgaG6CfUO-}Bgwwru3d9SM^MVT0n^?!xlW^X;i$8%6 zZvml4rnhx%q{f-(6Lemq^Ye7RNJk`tH|e8zP<@Zi>vU-JqxuOZ<gkwj{aCCwB5G$D z#IQNj@;>MvMZTZ~gp><-@kQ82%w5sseVK*rWnn+TxM*p$q;T0%WO`B~4XVRv7@%Oy zh`m|QR1>A5NdJ`V+*lQQMju2<FntucVHgq|(t^Hk#SvwgHwe`|M7K4lXR$Yh3b&8e z7<vl9j0c1NoM1Zj7a%L2gcy@{8I3&k-VmcSU=pMCiOd$z$PV}78t3G-ZCK&RI^?4M z84{(@Uk#ehM0P+eM8%7lwuY?%%QSWXwd}C6#wY}oR2)&E26Y;?ki*e*B5q7U36!)< zs&$~mK|Y8tlTiAILhY`3*Rr-D#uPzj+8joSL2fFpGFIB$Ak*=!6MBT0e908)@WnP> zMPFi-l?^AYyWW8Ku@c3m(`v^c(urd&hxo=xKwOE<DD^n7b~NP~VoQ1EQ;M5Yl#?bx zK_22M=t+R57Ts7SQ^6q?;3?t}paS5jM0-$<_FyafI*zx{yx6v|TH}mhB@1+AftDfY zSFFk~^er(S3VFl8aVVZ1%t~%!-T)dv?pwfRe(sFKn21S8475CcOuwCM4LHCiTDJq# zh9f3IH?R`0Q)<Mgx(%Gb5NwI*CV+2-kZ#P4x5r%^na~HQG)}_7iX{4D*d2Bfl`Vad zD^c~=IKepN4sRiL7`Tcjtn2BwkB8i1-J(vz3VmHiPTPXWS_gGF<~}(m|IXjrJZ}_l zP|Wi(G|!`9UYA*(3{F^U(hyP&ao!o;;PcSzh<xUGnR|KwQ)jGRh4U*I659Ok@%5sN zE)x*is}$;0yUXA-G{F;2q@G4ue;=yVQ<~hQrt*as*U|YK0iFLpD(S<5bdP$z9@L{1 zE+W~T&<ysIXrgDltR+^QNnR%0oxylR{ThP0xU29~(Z6iQl>ZeIi?C}K8m_*=M`6@t zmm(@w|Atk-0%#s8p563Y)M=@Qnc%OPUgT%wmH8y?6;4sUe+;qtv~C=&$nu$sGzrrI zjePdJs?W=deo<d1lurbnK}mSw<mn*oND$D~TX`A{T`$q%P<C@LVbr&LJR<dSbpRz~ z+tk`jN7V^Z`!t<r=y2S5qutg;!O;3?^l0M<q9d?1fYdFT5e@$+SR>eCe9ELOE(=}! zlraTKT-F>m#?2hq>wwXG@O=#39)7qT)r9-PZ-X%KppYN7V#14})MjH>m;g6}+6J>e z=_V?19Ii|uoT?mC4z8skY~v0NqBdxS17E+>=cfGKkPY55&>F-sCGeL@3{TnC5cZFT zJTp(f_WRs**xx@6tp00%|0pRprt8|vnJkO>TO-(Ql8=pWf9MX${&5s}2i;LnI0m{P zHiS^{cR>dazX?_DINCP>Udx>HPa;Rw8FD9XVhymZQ5^JiQkCJ+$ks?}N_LqeOxxPp zwaXlJ#@r#<Wo`{A8+4~|ENrX4%bXHA#=1hrz;(w(AQ=I-opiUN{$X*))}mS<iGAn# z6cdtSDoAnlZ?5K1PV^}C@~QR~d?t`9vjshZHgCi8B#*jLaiE^$IK&6T63%(ezGR+H zb>_K}S@|rJihx?+QwLYcbQK^ano^m#H(6u{SIP80%mOILR@is?2um=Tz$}^SS;qbn z9qNasw`);0@sZ4QL0sUznlzDc?_eCKz2+Zc2o%mRk2YqQf1-AUa7jOi5L^*NsYmHN zM(1%lqPaav-xF}Wfe<Qbz3qot%^Ai-R|`vC0uJr7gv|(;@)DXG_;&T7uGSkWte@q- z#~FSe1?m}2$vP}&U`xXpJ{%>?5x9hTk6CYK!2vSSZ5_Y_$V4j`^POZ|e`jFVGiu`e zLC=knIDoxw<?2~7*x#XM>!L3bY8g$MlK>30ObqCbkihf@GVaxM&ETviQd&H(4X|UV z^G*yJUp$G3LQG8>myjX};YJSMDLV>1F7&&U>Vr)PNFt<gEq_wP9h~C@XrT=Mp9X&9 ziMh<dQ*Xu-d<t{g$SG4Mc2p$xP7ETSFjkj~ut7VHbFwh0apTakfsIkeCa2n>Hm+x= z^abs4qBcPoz*~o|Ag<OV<(*j8jcK2hwvgq;;mZp1qfP>vh=~ZMA<SEB(MwE3f|3x@ zCzNE|6vA-o3z`p7j<Pzm+Wjtdfe^tVcF0WtI>H!8YJ*7-m`@+d8E_L}8i=Co!7E6Q z{{G7ibV8#j^aXiim67%+*kT&zJT0^XOalfznJY2)`%!Y%?XQdlWy4Hoys`xXIeF6% zT%AGrMr8ubGYfV;0Hy+=8%~p%S08bvDqF#FOq|o>J*UIXzY5VD>^dll<-KP9MQwV2 z?(6hcmLa5o;scv>F--2g6>i;)d+RP6?A|ZF*RGTcv%YpNu#uSwr6VD&IsAoYikeIa z1$^nkyHtL@nUUR=wBT4yGgYvSNcrDmim7Med)qkB<dqxqGhj;E?ih!Mrg}p@c8ux( zNU2{zT#DC>;p)NFTr(jyy$G|YA!?3q%yo!4`mvb{w$h+tA1G)J2L_(OsQ^U$Fz5;P z&BO3}n))N!>|Fg51Zf*t;qix1jK0`HENKMO{R)$OomrzrSe@dq#X?Q9@qaFXkdteB zfGD)Gq6JmI%q+5ye3HIT(HVu~#i8MXQLo|^E9wn6(^<U=2*CRx)=tLHV_oPO>{Ti0 z_YxG$V;2jK-)XcaDM7hCqGW-{V{@#Q3SDXb3Wepf>${~xkcQqND_6gb^plWNHeP~< z=A<+q1@krs#58iiqOqt2^F*@c0b>emd>A{{9e`;tv7{Ly3@%5LS&OEN118hMs5CkZ zbHyx7C&kdwY(B7_jfc}Ev?A|e<h*z!#Bdj5K8EwJ)WFWvtbk#IZ9|?<cGHT&u*QPH z4z5R*W3WJCb_}~!9)QHnHP8jbZ)@WPF<5Ytl@zYMu$?4!x=2fVMA$JJxQL;zWyx~E zJua``2$qXjc<lyc@Ia3&-%#IZ?gYky{JsLlSs4VLj8|~m4WF@RO@c+oQO2;3^di^; zCw$3tq%sVqHifh!b_&YcZ^JhV6bf3~W4L-FjbpsHP(wmV<9I7wgWSFXOb3SAC+HM< zi`uh@lM;}6Kl~FL$~en1=BZZJrI5Z!DJ5g~gTj;pD&!!vp+1kettg4#+uGaV?r?Ez z9%vF;5i(N~W=mk&Y~g)isyQ40#uXIUi$8##ez3CBN5xg-;EsHk^APsmSzb%v$DD5s z=@9B0u-AsB0+#^nZtu}PA0>~tBfz8&xx+W*QiIkgQcP=%t9u>{`<I38L1-6DrNTCt z4TZFOg>sba4!8H==zK@ZkidR^&>n)8VNkRT@O5b!_WN3fvD(wnGDuok5(6#60caV% z>}wf@LoLG?v<$o3Gn!ss(?DIvFev*jC^PI4q4Jw}e+M~k5H5bU9T!PtfXzuOdt}lb zleSLUqm*Gl?ttgYAzVB#?2e%wQAi{tt>_$n2YQEJL`@?yW-yL$rNy7QQOu1o9QvKY ztT@ts*u{k^E#P#-y#O<`NBE2d_|f)b?vy<aDa|(LaXGww6gr})`l`FF{e-;*dA4`I z)mOIZcj|7h9D{brA{F)oXWO0V)lb(3+-;R(_9XN`5+-G^-W{8ku|vv8_LT8En7>=M zU<a~}YD>|c_T8zr)Jxwt)z;OcKM>V2p8b|vS6xuOZBwd${XMCUDfHU++1J+9|Mde= zEu+S#I(GGlO+%~g#b3qx6XJsxad^qsPRUY#K+HEf&?2}Y4!6_!Vp{)pblHJ~#n4Iy z_F7_TvBE3x1^#q$;Cy6m(Vl-ahx3xSkh7yfmr8jiS)X#5kwnLG7vwtKjg@yqY9z6f zuW%j5foNeG77&7?jfIGgr@qp$cp_AT2pLzqqM5pwuw}jVyzk<r{Xv;wVSd@+^Ls(O zb$SZL^;*3Q=c3BPJ+BThAO#1<bLZ$kL8qV2K{`*v$tMW_*;nc`!=9w`CY}96A_wT~ zqjQR3+&I5Ic5t)z;u*!aQvy+70dx@7liX{1$spuy>-4FY4>q?S?CrANSM&Dhx@hUq z=@01bux!l<q15lv`OkD{IiP-&&S&X_m`dB26-YP{pAuO0Tl8_`4!cZPH|bN7q7m83 zm^Pgsqq9awcKts`-_O#a`a}25KcerebflknunNb%a7QFhvz3<V)55)u1VID<Kg}!x zF-2}5A_D=Ny?PWSVg%{#{me0gMtBx4MdO(_Nc~`jfm_!BmOX3nQPgUk!L-4zQqT<O z3nV7vpAK43^_698^7TCeg#R#6oW8FMZT>kc_***CRh?eq#yy{w_bf;7@^V~Cd;9qc z#mfU<>RZhIZ943U{75I3=Ky3-^H8of`Np@FBwCz#`OF;bUSL@x)+G5f^)cG7fROzD zJx<^AEIN+rAhGn4<OAdtUYfpw^onOmNM=DT7lJ{@^L)!MuLrpQ31wX;!2O@_M22A5 zhf_Q}sUs(&aAL*>yaIQrf`NJlXQOZ?O5kf;tO1jNyVl(d&h+q^XOwtCC~nDFC|D5k zlu#OGxZ}u0%XFL%3Y9&>uv_m^^hC!2ltmGQb3PfUeQ1L?8l$8{fHz7Y<Q_F90Kxe^ zj#EJ2cZ}KGxgK)!P01cnUZ&=;J)oNs>kK|8@o9W1l%4>z;2yipKsSH~O>1c53poiu zD{d82pP;=vzCVP}L?zjZ)wXFL>=$FWtq#_Yl~i~y4&)%Xy9#C?xIL^7k_)4f5m`&T zHtO_4eh{l9B^Cf4;3)14LYfh$|0WL$835aHJ1t;1K@l!s{17A+yj&8XNXG&A0{Y^L z$&`&7-&$$ha+CQg4*uXKwv00dc?01Rjc~Z7$i4{yDuC^Hdkd^K2b>8|J6W0X!Rrkl z0to~FkWCQ40K^KAfsxEO<OFE|Ok9EqIG5osuHaTF`~r?2Gc4f}YY!oQRBjG~=nnDQ zkW=FAEifrTex4CnAA%dabZ*=s##>{Y?Etua_|=vqY_x|0-%S&Mc}M#`-0U?Bp)JoN zjG;yM!@P&UZ@m40z18<UXm4|~l!@@!9jNS-ejaznE4%FN{Ph=X5Vj!vq4w@I8ar)i z?^%lgijP<JqEr~=RQ9<OmHkwl**VZVQ8^&~`zIpy0|2ZKe#NqPx}*Gl(_$`rmotN3 zjoD@Iw)fnQ+S9ss+6Sfd{>mZT8MoKoM_36u4>J@Hcfjp$AE94h%l_u?g{$TT9<r4M z7SIJYtGGSc7ib7534Yk4xB&AIobeIs!XQC#)E!2KVR>BsvG<mn)w?g3^$|~Qj~FY! zLV?Azs&H1#blGVBz-zf24^SV#1U#?B*iXSLi+Xc7eSt<A!HwQ^bu2AQy6|$G9(@!k zJ!9507Cb|Vf>13XC_e;y@B;W~;aa0`PVA*sO$r60ZT9bcx$to$XubOJbFG~yWrd~0 zaZd@1?mV-4T`qQLng<Rv2Rlho8WP9!WfH4o*f-$d%sFmOZ#b(kb-aOMzIEvfzxlU& zF5Nw$3V4F%l4UFWRFei9ZznI7VY>6N#w*Pcp(}?giNnhTay%H(a4zDy7M#S#!FDn9 zsn^s13R%Dhf8RLKOuTUJ#nZVbbGYC3;rV7Nz4L`vkL<*=7n`lZaDm5$Yo%r%R>qpW z9~XQ)c^GP|RpeDoI9?K$Y6!u+*P>%rDV<==B2v|vb{Wp}!|P#*AdR15{4P2IB|^-h z{v*REk5;nYx9E$)!QC-<30ew8%z>Yi!hvGg^6G0B<dOtjU(^%Eb(g5b8(=t3^XYQ| zifVuLUl|j}!D1K+uR|gL5<GQ|^U1iG#J74@kf!*+<OqFO8j)R}L-*o0<UBg>9l`lA zIm)d5L=wyuYuAd9h4I%?ydl{47Vv8dHm*~VgZYj(Qm)}nZJZ7ZyOF1^<>48g$G7A{ z6?6Fz&chrQ;G+JN)&CJokIv!N+CPBLw<XbC-GM9Y<$UHsxPaO7>O0K*Sq`RKbl#vt zRD-LL<sOtcuB^cr7DcOin~6V6=L{SkK*t`1N7#8A1-<>DmmtS8UpS%>u*2k0oYz)= z!`vb^>&VVLgdIb7Hi%UteOSn`Tqhv`qh;$hS>ypWAQQt8;JaxYW#hqT95M!2-~l$A z+W{0Hn8@<TGVDTd@Zg<z49Bh^LrZ=yo|pnifs9RDf&!$2Bu<V~qeSbw@kA1;m5kZk zwPCU6wE+|&c3;Zfv)U5`b8~PKpT;sq0aidrz*`1Zdgw}e#A_z>3`WJOh;s3c^~%#& z2ctM8hjR#P5%_U9n4&a0x@O$5zAymZExHgIYhZn($SuRWWFhwWC9bpWeqe<-1YCG_ z2B5rTZHYHcu41iZbHd5Cv5I4*x41Hi0ZIyDG#oGCKR*^`q*#Gcz78h~qgJf%$e%7l zkAStb&rRTfur4XnDG9%d)<?Bzd&C}q*bgQtNHq$B5SqF6*@Fv)GfuM-9s_p!pl-xd z1&UH=53ruE;r=!^*`DND6jDAMP>$L_#l|{ugDm>Nr;R5y`ZuS|r>Q@r3HR}~`t1>+ zso$rmUuf#zoF=rVAGgB|pha6<v=8RPNgxZ{od|JP)*b~S8bS~7zS5NR<aRgZQ-{9n zd219C_O*AwNM=i!iq;{NbRPvj`u<XTD{xNS-gX<m=?7tA4j605MJp@!+Y}o<KtB}A z6T}d9j;lOOZXT4;G7L5LNPDM!zhIDEm4_C<(Rni^e^m~5JjP*QJlqCq5KI!U>;{S% zAzlFO(?mUYjM_^Zd;bR;H<djb-xm&a?*;A|gR%7VJ!8k6cx5kIJ!bE-_w$xT!DDgY zA%<;t#|6LnKA1D_w-4Hf<fcEJ554R67j9X^4U3OR9OvNv$^pgzcWr?-YN9pa*EC^2 zDrH~{Lge-(%)S}>G3mp2`yh|y_x7=K$gk6cP;nT>){ncBJadP>haWc|(%<RbA^Qp5 zPKbAR7<azzu#fp%-~%|jH-(!M{b!05fy$5A$2n`=Dd7{Cr}mR?#&K8S2_iS#PTC*b zPI`3@ZYQ-Gmk-I@H6py7^y(hFAL6H{o3DkqtApc0Kn0CiAPRytXb9joGw%(H`GJ8K zSG>6^4Gp?PW^xgHQC-4{(lpgRMY}p#U&`6t@Lk5^dCxfG@s6Ro%3BwU3yq7a$W(ug zjAxqW%+cwjXRK<$NOW<fBnzp&6eOlE?Sak*SIP-4dW&jnb&dIl;CK;LMF0-J@ky=G z5mb`U(5&I5L$HP0Q09uuyud~){JCbSk0Zz1Moz>!)0St!R#QQspzrO9;uj6Pc(bkm zMAT_khYOLGN^cwca9bb%(_3lQt-+u`JJn>Ov|l%C`UC@Tg&2NC13>WOta6UdYY10G z`aVe?;j3rV)e0V(W9Mk-%T;^^LcQSK0+10sYII24C~#4^2=mM<b=`l)bqKW>i3^it zT@P;_<EFo~s#+|9!mnofiAQrgFYVfyJNX=%u#Pek)f|$0*a{+7EI@&47gUAy5-w|O z{4S{Pi%irJ^$>ii|4!$daB%D%SO*Y-82INIIz@*|t;UCoB$L+?YRS+~GU6RLyc!Be zop5DWN2Wyqk{8Fe1?Sh)N12icNtBGd`iPf8dFgBAItGHEyf{vK;cg^ckwmo18*i{( zkeDQ1b6w3s7;}>)9Ad$fgmC^vH2$S+1;Ks|^-<7=J%9`_oB;x;KXOVBUcs{$SjLaD z4WFa)Nj^SH-{<MvrjuZph}sD6rnhPtREX#Da&r#u1HdH$xI%|lEog`)a4U8L2ZmNX zV?GaY;#?i06jutpM3@FqV;;Y*8eATR`>66M2NO>&kiu<zp`Z#ERmEk)fNPncqSewX zqy`Yi1sR1!99Tq`h#gKiK=5Oy5Salp>8;PwioO^!C2;%nslv-%9K^!F8FQY$=c@iM z8@Ub<{u#plF%jWk!V^i;gaslY2$g`+cu5YBU>X*{CNG;oTn1t!UN)1ti>qSp5+x>K zB}@?%O<^n`MP9-KJ7TdJW;#g&;S$r}0vWlKhZo%tN18y4`cedW#x*g#E(VD6dvO@m z@QABi9s^+&G`cwK%4>Ht9XpI2QU<P;!S@8Om;nk!PJ9#1ibyOb+FpIF4@%J2)9|ty zq`$j~xQPffd?i}kG;N-jL&EqzKRv`BXW+Xp6udNUhpXEw__39OmnjtZyH9>hqEN8w zbA^K1$L{_vou8p2_EkSipO~c6R9k(JWA9(k_uF(R`BTK`im#>XRdo=2A0nu0ZXAV! zc3zfihR|MO`8dAKze_)md@aI%Pb7~ex25+b52s&?3??5-ekA!SVoqUlv6SguxYt51 zArqPJ?;=PMZ_~(}cb4dh4WSy?CN4;Y&^SteM*K6FYsKmU?7`$)r6psfj-R2N#dTyQ z{Gyqv35QYNV8OyhewDsoXCZ^ZfkJE}`Fl#Tr;~jiGV8O3`ZOW-n!*uK?2HUzT$#$b zn#Zq;gb{k)$K*@>HYmy8*A>g(QGz`~0~f`Jr+^y?WFN|3C<)70=6(_rg<nc|<cp-1 q>x%T&W-r4_9@k^wDQrd}jXiK=cZBgr+XJ2#?EKT0CP}!NN&G+E=U!I; diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc deleted file mode 100644 index 57322b839ff7d50ea32d3b36ce011c09cf91e232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15645 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc deleted file mode 100644 index 37d75830876e7d6e44eb45cc242d1f6636c8d2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27157 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%0A5<{ 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 Kk9o_6!v6ugi7!zA diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc deleted file mode 100644 index b58f792ac36504c702205afc34228600f9bbba77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15716 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc deleted file mode 100644 index bc71688a4cae4f74ec3a67838fca659881c520c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3806 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 I`#)>`7Zrzs-v9sr diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc deleted file mode 100644 index 4f1c5c8635a64bcf45f856426c8597e67374b985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4661 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 BCMo~` diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc deleted file mode 100644 index f154800917aeaef9c499abf13d47fcca6ffc639b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3869 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 C(w;v6 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc deleted file mode 100644 index 1d2122246d54ec5697803cbce28900e077b2306a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18924 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 W6YnAs1G%l!A8`@AH@FHoxc@Kt+VTSc diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc deleted file mode 100644 index 4e0ec7bf61abc72bc8218d603f606f1eca2cc9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35893 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 IcNqr$ACvc7^8f$< diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc deleted file mode 100644 index b9fe4689524895c2149048d489b22b08e85026df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18959 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	o4MB>fKYEXpNq!HIDoLFs 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_inference.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_inference.py deleted file mode 100644 index 1898a8ae6..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_inference.py +++ /dev/null @@ -1,1532 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import os -import copy -import pandas as pd -from tqdm import tqdm -from scipy import stats -import scipy.linalg as spla -import joblib -import seaborn as sns -import corner -import h5py -import multiprocessing -import gc -from sklearn.metrics import mean_squared_error, r2_score -from sklearn import preprocessing -from matplotlib.patches import Patch -import matplotlib.lines as mlines -from matplotlib.backends.backend_pdf import PdfPages -import matplotlib.pylab as plt - -from .mcmc import MCMC - -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class BayesInference: - """ - A class to perform Bayesian Analysis. - - - Attributes - ---------- - MetaModel : obj - Meta model object. - discrepancy : obj - The discrepancy object for the sigma2s, i.e. the diagonal entries - of the variance matrix for a multivariate normal likelihood. - name : str, optional - The type of analysis, either calibration (`Calib`) or validation - (`Valid`). The default is `'Calib'`. - emulator : bool, optional - Analysis with emulator (MetaModel). The default is `True`. - bootstrap : bool, optional - Bootstrap the analysis. The default is `False`. - req_outputs : list, optional - The list of requested output to be used for the analysis. - The default is `None`. If None, all the defined outputs for the model - object is used. - selected_indices : dict, optional - A dictionary with the selected indices of each model output. The - default is `None`. If `None`, all measurement points are used in the - analysis. - samples : array of shape (n_samples, n_params), optional - The samples to be used in the analysis. The default is `None`. If - None the samples are drawn from the probablistic input parameter - object of the MetaModel object. - n_samples : int, optional - Number of samples to be used in the analysis. The default is `500000`. - If samples is not `None`, this argument will be assigned based on the - number of samples given. - measured_data : dict, optional - A dictionary containing the observation data. The default is `None`. - if `None`, the observation defined in the Model object of the - MetaModel is used. - inference_method : str, optional - A method for approximating the posterior distribution in the Bayesian - inference step. The default is `'rejection'`, which stands for - rejection sampling. A Markov Chain Monte Carlo sampler can be simply - selected by passing `'MCMC'`. - mcmc_params : dict, optional - A dictionary with args required for the Bayesian inference with - `MCMC`. The default is `None`. - - Pass the mcmc_params like the following: - - >>> mcmc_params:{ - 'init_samples': None, # initial samples - 'n_walkers': 100, # number of walkers (chain) - 'n_steps': 100000, # number of maximum steps - 'n_burn': 200, # number of burn-in steps - 'moves': None, # Moves for the emcee sampler - 'multiprocessing': False, # multiprocessing - 'verbose': False # verbosity - } - The items shown above are the default values. If any parmeter is - not defined, the default value will be assigned to it. - bayes_loocv : bool, optional - Bayesian Leave-one-out Cross Validation. The default is `False`. If - `True`, the LOOCV procedure is used to estimate the bayesian Model - Evidence (BME). - n_bootstrap_itrs : int, optional - Number of bootstrap iteration. The default is `1`. If bayes_loocv is - `True`, this is qualt to the total length of the observation data - set. - perturbed_data : array of shape (n_bootstrap_itrs, n_obs), optional - User defined perturbed data. The default is `[]`. - bootstrap_noise : float, optional - A noise level to perturb the data set. The default is `0.05`. - just_analysis : bool, optional - Justifiability analysis. The default is False. - valid_metrics : list, optional - List of the validation metrics. The following metrics are supported: - - 1. log_BME : logarithm of the Bayesian model evidence - 2. KLD : Kullback-Leibler Divergence - 3. inf_entropy: Information entropy - The default is `['log_BME']`. - plot_post_pred : bool, optional - Plot posterior predictive plots. The default is `True`. - plot_map_pred : bool, optional - Plot the model outputs vs the metamodel predictions for the maximum - a posteriori (defined as `max_a_posteriori`) parameter set. The - default is `False`. - max_a_posteriori : str, optional - Maximum a posteriori. `'mean'` and `'mode'` are available. The default - is `'mean'`. - corner_title_fmt : str, optional - Title format for the posterior distribution plot with python - package `corner`. The default is `'.2e'`. - - """ - - def __init__(self, engine, MetaModel = None, discrepancy=None, emulator=True, - name='Calib', bootstrap=False, req_outputs=None, - selected_indices=None, samples=None, n_samples=100000, - measured_data=None, inference_method='rejection', - mcmc_params=None, bayes_loocv=False, n_bootstrap_itrs=1, - perturbed_data=[], bootstrap_noise=0.05, just_analysis=False, - valid_metrics=['BME'], plot_post_pred=True, - plot_map_pred=False, max_a_posteriori='mean', - corner_title_fmt='.2e'): - - self.engine = engine - self.MetaModel = engine.MetaModel - self.Discrepancy = discrepancy - self.emulator = emulator - self.name = name - self.bootstrap = bootstrap - self.req_outputs = req_outputs - self.selected_indices = selected_indices - self.samples = samples - self.n_samples = n_samples - self.measured_data = measured_data - self.inference_method = inference_method - self.mcmc_params = mcmc_params - self.perturbed_data = perturbed_data - self.bayes_loocv = bayes_loocv - self.n_bootstrap_itrs = n_bootstrap_itrs - self.bootstrap_noise = bootstrap_noise - self.just_analysis = just_analysis - self.valid_metrics = valid_metrics - self.plot_post_pred = plot_post_pred - self.plot_map_pred = plot_map_pred - self.max_a_posteriori = max_a_posteriori - self.corner_title_fmt = corner_title_fmt - - # ------------------------------------------------------------------------- - def create_inference(self): - """ - Starts the inference. - - Returns - ------- - BayesInference : obj - The Bayes inference object. - - """ - - # Set some variables - MetaModel = self.MetaModel - Model = self.engine.Model - n_params = MetaModel.n_params - output_names = Model.Output.names - par_names = self.engine.ExpDesign.par_names - - # If the prior is set by the user, take it. - if self.samples is None: - self.samples = self.engine.ExpDesign.generate_samples( - self.n_samples, 'random') - else: - try: - samples = self.samples.values - except AttributeError: - samples = self.samples - - # Take care of an additional Sigma2s - self.samples = samples[:, :n_params] - - # Update number of samples - self.n_samples = self.samples.shape[0] - - # ---------- Preparation of observation data ---------- - # Read observation data and perturb it if requested. - if self.measured_data is None: - self.measured_data = Model.read_observation(case=self.name) - # Convert measured_data to a data frame - if not isinstance(self.measured_data, pd.DataFrame): - self.measured_data = pd.DataFrame(self.measured_data) - - # Extract the total number of measurement points - if self.name.lower() == 'calib': - self.n_tot_measurement = Model.n_obs - else: - self.n_tot_measurement = Model.n_obs_valid - - # Find measurement error (if not given) for post predictive plot - if not hasattr(self, 'measurement_error'): - if isinstance(self.Discrepancy, dict): - Disc = self.Discrepancy['known'] - else: - Disc = self.Discrepancy - if isinstance(Disc.parameters, dict): - self.measurement_error = {k: np.sqrt(Disc.parameters[k]) for k - in Disc.parameters.keys()} - else: - try: - self.measurement_error = np.sqrt(Disc.parameters) - except TypeError: - pass - - # ---------- Preparation of variance for covariance matrix ---------- - # Independent and identically distributed - total_sigma2 = dict() - opt_sigma_flag = isinstance(self.Discrepancy, dict) - opt_sigma = None - for key_idx, key in enumerate(output_names): - - # Find opt_sigma - if opt_sigma_flag and opt_sigma is None: - # Option A: known error with unknown bias term - opt_sigma = 'A' - known_discrepancy = self.Discrepancy['known'] - self.Discrepancy = self.Discrepancy['infer'] - sigma2 = np.array(known_discrepancy.parameters[key]) - - elif opt_sigma == 'A' or self.Discrepancy.parameters is not None: - # Option B: The sigma2 is known (no bias term) - if opt_sigma == 'A': - sigma2 = np.array(known_discrepancy.parameters[key]) - else: - opt_sigma = 'B' - sigma2 = np.array(self.Discrepancy.parameters[key]) - - elif not isinstance(self.Discrepancy.InputDisc, str): - # Option C: The sigma2 is unknown (bias term including error) - opt_sigma = 'C' - self.Discrepancy.opt_sigma = opt_sigma - n_measurement = self.measured_data[key].values.shape - sigma2 = np.zeros((n_measurement[0])) - - total_sigma2[key] = sigma2 - - self.Discrepancy.opt_sigma = opt_sigma - self.Discrepancy.total_sigma2 = total_sigma2 - - # If inferred sigma2s obtained from e.g. calibration are given - try: - self.sigma2s = self.Discrepancy.get_sample(self.n_samples) - except: - pass - - # ---------------- Bootstrap & TOM -------------------- - if self.bootstrap or self.bayes_loocv or self.just_analysis: - if len(self.perturbed_data) == 0: - # zero mean noise Adding some noise to the observation function - self.perturbed_data = self._perturb_data( - self.measured_data, output_names - ) - else: - self.n_bootstrap_itrs = len(self.perturbed_data) - - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() != 'calib': - # Select posterior mean as MAP - MAP_theta = self.samples.mean(axis=0).reshape((1, n_params)) - # MAP_theta = stats.mode(self.samples,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=MAP_theta) - - # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) - - # ----------------------------------------------------- - # ----- Loop over the perturbed observation data ------ - # ----------------------------------------------------- - # Initilize arrays - logLikelihoods = np.zeros((self.n_samples, self.n_bootstrap_itrs), - dtype=np.float16) - BME_Corr = np.zeros((self.n_bootstrap_itrs)) - log_BME = np.zeros((self.n_bootstrap_itrs)) - KLD = np.zeros((self.n_bootstrap_itrs)) - inf_entropy = np.zeros((self.n_bootstrap_itrs)) - - # Compute the prior predtions - # Evaluate the MetaModel - if self.emulator: - y_hat, y_std = MetaModel.eval_metamodel(samples=self.samples) - self.__mean_pce_prior_pred = y_hat - self._std_pce_prior_pred = y_std - - # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: - y_hat_corr, y_std = self.error_MetaModel.eval_model_error( - self.bias_inputs, self.__mean_pce_prior_pred - ) - self.__mean_pce_prior_pred = y_hat_corr - self._std_pce_prior_pred = y_std - - # Surrogate model's error using RMSE of test data - if hasattr(MetaModel, 'rmse'): - surrError = MetaModel.rmse - else: - surrError = None - - else: - # Evaluate the original model - self.__model_prior_pred = self._eval_model( - samples=self.samples, key='PriorPred' - ) - surrError = None - - # Start the likelihood-BME computations for the perturbed data - for itr_idx, data in tqdm( - enumerate(self.perturbed_data), - total=self.n_bootstrap_itrs, - desc="Bootstrapping the BME calculations", ascii=True - ): - - # ---------------- Likelihood calculation ---------------- - if self.emulator: - model_evals = self.__mean_pce_prior_pred - else: - model_evals = self.__model_prior_pred - - # Leave one out - if self.bayes_loocv or self.just_analysis: - self.selected_indices = np.nonzero(data)[0] - - # Prepare data dataframe - nobs = list(self.measured_data.count().values[1:]) - numbers = list(np.cumsum(nobs)) - indices = list(zip([0] + numbers, numbers)) - data_dict = { - output_names[i]: data[j:k] for i, (j, k) in - enumerate(indices) - } - #print(output_names) - #print(indices) - #print(numbers) - #print(nobs) - #print(self.measured_data) - #for i, (j, k) in enumerate(indices): - # print(i,j,k) - #print(data) - #print(data_dict) - #stop - - # Unknown sigma2 - if opt_sigma == 'C' or hasattr(self, 'sigma2s'): - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - sigma2=self.sigma2s, std=surrError - ) - else: - # known sigma2 - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - std=surrError - ) - - # ---------------- BME Calculations ---------------- - # BME (log) - log_BME[itr_idx] = np.log( - np.nanmean(np.exp(logLikelihoods[:, itr_idx], - dtype=np.longdouble))#float128)) - ) - - # BME correction when using Emulator - if self.emulator: - BME_Corr[itr_idx] = self.__corr_factor_BME( - data_dict, total_sigma2, log_BME[itr_idx] - ) - - # Rejection Step - if 'kld' in list(map(str.lower, self.valid_metrics)) and\ - 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - # Random numbers between 0 and 1 - unif = np.random.rand(1, self.n_samples)[0] - - # Reject the poorly performed prior - Likelihoods = np.exp(logLikelihoods[:, itr_idx], - dtype=np.float64) - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - posterior = self.samples[accepted] - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean( - logLikelihoods[:, itr_idx][accepted] - ) - - # Calculate Kullback-Leibler Divergence - KLD[itr_idx] = postExpLikelihoods - log_BME[itr_idx] - - # Posterior-based expectation of prior densities - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - n_thread = int(0.875 * multiprocessing.cpu_count()) - with multiprocessing.Pool(n_thread) as p: - postExpPrior = np.mean(np.concatenate( - p.map( - self.engine.ExpDesign.JDist.pdf, - np.array_split(posterior.T, n_thread, axis=1)) - ) - ) - # Information Entropy based on Entropy paper Eq. 38 - inf_entropy[itr_idx] = log_BME[itr_idx] - postExpPrior - \ - postExpLikelihoods - - # Clear memory - gc.collect(generation=2) - - # ---------- Store metrics for perturbed data set ---------------- - # Likelihoods (Size: n_samples, n_bootstrap_itr) - self.log_likes = logLikelihoods - - # BME (log), KLD, infEntropy (Size: 1,n_bootstrap_itr) - self.log_BME = log_BME - - # BMECorrFactor (log) (Size: 1,n_bootstrap_itr) - if self.emulator: - self.log_BME_corr_factor = BME_Corr - - if 'kld' in list(map(str.lower, self.valid_metrics)): - self.KLD = KLD - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - self.inf_entropy = inf_entropy - - # BME = BME + BMECorrFactor - if self.emulator: - self.log_BME += self.log_BME_corr_factor - - # ---------------- Parameter Bayesian inference ---------------- - if self.inference_method.lower() == 'mcmc': - # Instantiate the MCMC object - MCMC_Obj = MCMC(self) - self.posterior_df = MCMC_Obj.run_sampler( - self.measured_data, total_sigma2 - ) - - elif self.name.lower() == 'valid': - # Convert to a dataframe if samples are provided after calibration. - self.posterior_df = pd.DataFrame(self.samples, columns=par_names) - - else: - # Rejection sampling - self.posterior_df = self._rejection_sampling() - - # Provide posterior's summary - print('\n') - print('-'*15 + 'Posterior summary' + '-'*15) - pd.options.display.max_columns = None - pd.options.display.max_rows = None - print(self.posterior_df.describe()) - print('-'*50) - - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() == 'calib': - if self.inference_method.lower() == 'mcmc': - self.error_MetaModel = MCMC_Obj.error_MetaModel - else: - # Select posterior mean as MAP - if opt_sigma == "B": - posterior_df = self.posterior_df.values - else: - posterior_df = self.posterior_df.values[:, :-Model.n_outputs] - - # Select posterior mean as Maximum a posteriori - map_theta = posterior_df.mean(axis=0).reshape((1, n_params)) - # map_theta = stats.mode(Posterior_df,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=map_theta) - - # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) - - # -------- Posterior perdictive ----------- - self._posterior_predictive() - - # ----------------------------------------------------- - # ------------------ Visualization -------------------- - # ----------------------------------------------------- - # Create Output directory, if it doesn't exist already. - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # -------- Posteior parameters -------- - if opt_sigma != "B": - par_names.extend( - [self.Discrepancy.InputDisc.Marginals[i].name for i - in range(len(self.Discrepancy.InputDisc.Marginals))] - ) - # Pot with corner - figPosterior = corner.corner(self.posterior_df.to_numpy(), - labels=par_names, - quantiles=[0.15, 0.5, 0.85], - show_titles=True, - title_fmt=self.corner_title_fmt, - labelpad=0.2, - use_math_text=True, - title_kwargs={"fontsize": 28}, - plot_datapoints=False, - plot_density=False, - fill_contours=True, - smooth=0.5, - smooth1d=0.5) - - # Loop over axes and set x limits - if opt_sigma == "B": - axes = np.array(figPosterior.axes).reshape( - (len(par_names), len(par_names)) - ) - for yi in range(len(par_names)): - ax = axes[yi, yi] - ax.set_xlim(self.engine.ExpDesign.bound_tuples[yi]) - for xi in range(yi): - ax = axes[yi, xi] - ax.set_xlim(self.engine.ExpDesign.bound_tuples[xi]) - plt.close() - - # Turn off gridlines - for ax in figPosterior.axes: - ax.grid(False) - - if self.emulator: - plotname = f'/Posterior_Dist_{Model.name}_emulator' - else: - plotname = f'/Posterior_Dist_{Model.name}' - - figPosterior.set_size_inches((24, 16)) - figPosterior.savefig(f'./{out_dir}{plotname}.pdf', - bbox_inches='tight') - - # -------- Plot MAP -------- - if self.plot_map_pred: - self._plot_max_a_posteriori() - - # -------- Plot log_BME dist -------- - if self.bootstrap: - - # Computing the TOM performance - self.log_BME_tom = stats.chi2.rvs( - self.n_tot_measurement, size=self.log_BME.shape[0] - ) - - fig, ax = plt.subplots() - sns.kdeplot(self.log_BME_tom, ax=ax, color="green", shade=True) - sns.kdeplot( - self.log_BME, ax=ax, color="blue", shade=True, - label='Model BME') - - ax.set_xlabel('log$_{10}$(BME)') - ax.set_ylabel('Probability density') - - legend_elements = [ - Patch(facecolor='green', edgecolor='green', label='TOM BME'), - Patch(facecolor='blue', edgecolor='blue', label='Model BME') - ] - ax.legend(handles=legend_elements) - - if self.emulator: - plotname = f'/BME_hist_{Model.name}_emulator' - else: - plotname = f'/BME_hist_{Model.name}' - - plt.savefig(f'./{out_dir}{plotname}.pdf', bbox_inches='tight') - plt.show() - plt.close() - - # -------- Posteior perdictives -------- - if self.plot_post_pred: - # Plot the posterior predictive - self._plot_post_predictive() - - return self - - # ------------------------------------------------------------------------- - def _perturb_data(self, data, output_names): - """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. - The first row includes the original observation data. - If `self.bayes_loocv` is True, a 2d-array will be returned with - repeated rows and zero diagonal entries. - - Parameters - ---------- - data : pandas DataFrame - Observation data. - output_names : list - List of the output names. - - Returns - ------- - final_data : array - Perturbed data set. - - """ - noise_level = self.bootstrap_noise - obs_data = data[output_names].values - n_measurement, n_outs = obs_data.shape - self.n_tot_measurement = obs_data[~np.isnan(obs_data)].shape[0] - # Number of bootstrap iterations - if self.bayes_loocv: - self.n_bootstrap_itrs = self.n_tot_measurement - - # Pass loocv dataset - if self.bayes_loocv: - obs = obs_data.T[~np.isnan(obs_data.T)] - final_data = np.repeat(np.atleast_2d(obs), self.n_bootstrap_itrs, - axis=0) - np.fill_diagonal(final_data, 0) - return final_data - - else: - final_data = np.zeros( - (self.n_bootstrap_itrs, self.n_tot_measurement) - ) - final_data[0] = obs_data.T[~np.isnan(obs_data.T)] - for itrIdx in range(1, self.n_bootstrap_itrs): - data = np.zeros((n_measurement, n_outs)) - for idx in range(len(output_names)): - std = np.nanstd(obs_data[:, idx]) - if std == 0: - std = 0.001 - noise = std * noise_level - data[:, idx] = np.add( - obs_data[:, idx], - np.random.normal(0, 1, obs_data.shape[0]) * noise, - ) - - final_data[itrIdx] = data.T[~np.isnan(data.T)] - - return final_data - - # ------------------------------------------------------------------------- - def _logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = spla.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(spla.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - return log_lik - - # ------------------------------------------------------------------------- - def _eval_model(self, samples=None, key='MAP'): - """ - Evaluates Forward Model. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Parameter sets. The default is None. - key : str, optional - Key string to be passed to the run_model_parallel method. - The default is 'MAP'. - - Returns - ------- - model_outputs : dict - Model outputs. - - """ - MetaModel = self.MetaModel - Model = self.engine.Model - - if samples is None: - self.samples = self.engine.ExpDesign.generate_samples( - self.n_samples, 'random') - else: - self.samples = samples - self.n_samples = len(samples) - - model_outputs, _ = Model.run_model_parallel( - self.samples, key_str=key+self.name) - - # Clean up - # Zip the subdirectories - try: - dir_name = f'{Model.name}MAP{self.name}' - key = dir_name + '_' - Model.zip_subdirs(dir_name, key) - except: - pass - - return model_outputs - - # ------------------------------------------------------------------------- - def _kernel_rbf(self, X, hyperparameters): - """ - Isotropic squared exponential kernel. - - Higher l values lead to smoother functions and therefore to coarser - approximations of the training data. Lower l values make functions - more wiggly with wide uncertainty regions between training data points. - - sigma_f controls the marginal variance of b(x) - - Parameters - ---------- - X : ndarray of shape (n_samples_X, n_features) - - hyperparameters : Dict - Lambda characteristic length - sigma_f controls the marginal variance of b(x) - sigma_0 unresolvable error nugget term, interpreted as random - error that cannot be attributed to measurement error. - Returns - ------- - var_cov_matrix : ndarray of shape (n_samples_X,n_samples_X) - Kernel k(X, X). - - """ - from sklearn.gaussian_process.kernels import RBF - min_max_scaler = preprocessing.MinMaxScaler() - X_minmax = min_max_scaler.fit_transform(X) - - nparams = len(hyperparameters) - # characteristic length (0,1] - Lambda = hyperparameters[0] - # sigma_f controls the marginal variance of b(x) - sigma2_f = hyperparameters[1] - - # cov_matrix = sigma2_f*rbf_kernel(X_minmax, gamma = 1/Lambda**2) - - rbf = RBF(length_scale=Lambda) - cov_matrix = sigma2_f * rbf(X_minmax) - if nparams > 2: - # (unresolvable error) nugget term that is interpreted as random - # error that cannot be attributed to measurement error. - sigma2_0 = hyperparameters[2:] - for i, j in np.ndindex(cov_matrix.shape): - cov_matrix[i, j] += np.sum(sigma2_0) if i == j else 0 - - return cov_matrix - - # ------------------------------------------------------------------------- - def normpdf(self, outputs, obs_data, total_sigma2s, sigma2=None, std=None): - """ - Calculates the likelihood of simulation outputs compared with - observation data. - - Parameters - ---------- - outputs : dict - A dictionary containing the simulation outputs as array of shape - (n_samples, n_measurement) for each model output. - obs_data : dict - A dictionary/dataframe containing the observation data. - total_sigma2s : dict - A dictionary with known values of the covariance diagonal entries, - a.k.a sigma^2. - sigma2 : array, optional - An array of the sigma^2 samples, when the covariance diagonal - entries are unknown and are being jointly inferred. The default is - None. - std : dict, optional - A dictionary containing the root mean squared error as array of - shape (n_samples, n_measurement) for each model output. The default - is None. - - Returns - ------- - logLik : array of shape (n_samples) - Likelihoods. - - """ - Model = self.engine.Model - logLik = 0.0 - - # Extract the requested model outputs for likelihood calulation - if self.req_outputs is None: - req_outputs = Model.Output.names - else: - req_outputs = list(self.req_outputs) - - # Loop over the outputs - for idx, out in enumerate(req_outputs): - - # (Meta)Model Output - nsamples, nout = outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Add the std of the PCE is chosen as emulator. - if self.emulator: - if std is not None: - tot_sigma2s += std[out]**2 - - # Covariance Matrix - covMatrix = np.diag(tot_sigma2s) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - - # If sigma2 is not given, use given total_sigma2s - if sigma2 is None: - logLik += stats.multivariate_normal.logpdf( - outputs[out][:, indices], data[indices], covMatrix) - continue - - # Loop over each run/sample and calculate logLikelihood - logliks = np.zeros(nsamples) - for s_idx in range(nsamples): - - # Simulation run - tot_outputs = outputs[out] - - # Covariance Matrix - covMatrix = np.diag(tot_sigma2s) - - if sigma2 is not None: - # Check the type error term - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): - # Infer a Bias model usig Gaussian Process Regression - bias_inputs = np.hstack( - (self.bias_inputs[out], - tot_outputs[s_idx].reshape(-1, 1))) - - params = sigma2[s_idx, idx*3:(idx+1)*3] - covMatrix = self._kernel_rbf(bias_inputs, params) - else: - # Infer equal sigma2s - try: - sigma_2 = sigma2[s_idx, idx] - except TypeError: - sigma_2 = 0.0 - - covMatrix += sigma_2 * np.eye(nout) - # covMatrix = np.diag(sigma2 * total_sigma2s) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - - # Compute loglikelihood - logliks[s_idx] = self._logpdf( - tot_outputs[s_idx, indices], data[indices], covMatrix - ) - - logLik += logliks - return logLik - - # ------------------------------------------------------------------------- - def _corr_factor_BME_old(self, Data, total_sigma2s, posterior): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - OrigModelOutput = self.engine.ExpDesign.Y - Model = self.engine.Model - - # Posterior with guassian-likelihood - postDist = stats.gaussian_kde(posterior.T) - - # Remove NaN - Data = Data[~np.isnan(Data)] - total_sigma2s = total_sigma2s[~np.isnan(total_sigma2s)] - - # Covariance Matrix - covMatrix = np.diag(total_sigma2s[:self.n_tot_measurement]) - - # Extract the requested model outputs for likelihood calulation - if self.req_outputs is None: - OutputType = Model.Output.names - else: - OutputType = list(self.req_outputs) - - # SampleSize = OrigModelOutput[OutputType[0]].shape[0] - - - # Flatten the OutputType for OrigModel - TotalOutputs = np.concatenate([OrigModelOutput[x] for x in OutputType], 1) - - NrofBayesSamples = self.n_samples - # Evaluate MetaModel on the experimental design - Samples = self.engine.ExpDesign.X - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=Samples) - - # Reset the NrofSamples to NrofBayesSamples - self.n_samples = NrofBayesSamples - - # Flatten the OutputType for MetaModel - TotalPCEOutputs = np.concatenate([OutputRS[x] for x in OutputRS], 1) - TotalPCEstdOutputRS= np.concatenate([stdOutputRS[x] for x in stdOutputRS], 1) - - logweight = 0 - for i, sample in enumerate(Samples): - # Compute likelilhood output vs RS - covMatrix = np.diag(TotalPCEstdOutputRS[i]**2) - logLik = self._logpdf(TotalOutputs[i], TotalPCEOutputs[i], covMatrix) - # Compute posterior likelihood of the collocation points - logpostLik = np.log(postDist.pdf(sample[:, None]))[0] - if logpostLik != -np.inf: - logweight += logLik + logpostLik - return logweight - - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = self.engine.ExpDesign.X - model_outputs = self.engine.ExpDesign.Y - Model = self.engine.Model - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names - - # Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - covMatrix = np.eye(len(y_m)) * 1/(2*np.pi) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - covMatrix_data = np.diag(covMatrix_data[indices, indices]) - - # Compute likelilhood output vs data - logLik_data[i] += self._logpdf( - y_m_hat[indices], data[indices], - covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += self._logpdf( - y_m_hat[indices], y_m[indices], - covMatrix - ) - - # Weight - logLik_data -= logBME - weights = np.mean(np.exp(logLik_model+logLik_data)) - - return np.log(weights) - - # ------------------------------------------------------------------------- - def _rejection_sampling(self): - """ - Performs rejection sampling to update the prior distribution on the - input parameters. - - Returns - ------- - posterior : pandas.dataframe - Posterior samples of the input parameters. - - """ - - MetaModel = self.MetaModel - try: - sigma2_prior = self.Discrepancy.sigma2_prior - except: - sigma2_prior = None - - # Check if the discrepancy is defined as a distribution: - samples = self.samples - - if sigma2_prior is not None: - samples = np.hstack((samples, sigma2_prior)) - - # Take the first column of Likelihoods (Observation data without noise) - if self.just_analysis or self.bayes_loocv: - index = self.n_tot_measurement-1 - likelihoods = np.exp(self.log_likes[:, index], dtype=np.longdouble)#np.float128) - else: - likelihoods = np.exp(self.log_likes[:, 0], dtype=np.longdouble)#np.float128) - - n_samples = len(likelihoods) - norm_ikelihoods = likelihoods / np.max(likelihoods) - - # Normalize based on min if all Likelihoods are zero - if all(likelihoods == 0.0): - likelihoods = self.log_likes[:, 0] - norm_ikelihoods = likelihoods / np.min(likelihoods) - - # Random numbers between 0 and 1 - unif = np.random.rand(1, n_samples)[0] - - # Reject the poorly performed prior - accepted_samples = samples[norm_ikelihoods >= unif] - - # Output the Posterior - par_names = self.engine.ExpDesign.par_names - if sigma2_prior is not None: - for name in self.Discrepancy.name: - par_names.append(name) - - return pd.DataFrame(accepted_samples, columns=sigma2_prior) - - # ------------------------------------------------------------------------- - def _posterior_predictive(self): - """ - Stores the prior- and posterior predictive samples, i.e. model - evaluations using the samples, into hdf5 files. - - priorPredictive.hdf5 : Prior predictive samples. - postPredictive_wo_noise.hdf5 : Posterior predictive samples without - the additive noise. - postPredictive.hdf5 : Posterior predictive samples with the additive - noise. - - Returns - ------- - None. - - """ - - MetaModel = self.MetaModel - Model = self.engine.Model - - # Make a directory to save the prior/posterior predictive - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # Read observation data and perturb it if requested - if self.measured_data is None: - self.measured_data = Model.read_observation(case=self.name) - - if not isinstance(self.measured_data, pd.DataFrame): - self.measured_data = pd.DataFrame(self.measured_data) - - # X_values - x_values = self.engine.ExpDesign.x_values - - try: - sigma2_prior = self.Discrepancy.sigma2_prior - except: - sigma2_prior = None - - # Extract posterior samples - posterior_df = self.posterior_df - - # Take care of the sigma2 - if sigma2_prior is not None: - try: - sigma2s = posterior_df[self.Discrepancy.name].values - posterior_df = posterior_df.drop( - labels=self.Discrepancy.name, axis=1 - ) - except: - sigma2s = self.sigma2s - - # Posterior predictive - if self.emulator: - if self.inference_method == 'rejection': - prior_pred = self.__mean_pce_prior_pred - if self.name.lower() != 'calib': - post_pred = self.__mean_pce_prior_pred - post_pred_std = self._std_pce_prior_pred - else: - post_pred, post_pred_std = MetaModel.eval_metamodel( - samples=posterior_df.values - ) - - else: - if self.inference_method == 'rejection': - prior_pred = self.__model_prior_pred - if self.name.lower() != 'calib': - post_pred = self.__mean_pce_prior_pred, - post_pred_std = self._std_pce_prior_pred - else: - post_pred = self._eval_model( - samples=posterior_df.values, key='PostPred' - ) - # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: - y_hat, y_std = self.error_MetaModel.eval_model_error( - self.bias_inputs, post_pred - ) - post_pred, post_pred_std = y_hat, y_std - - # Add discrepancy from likelihood Sample to the current posterior runs - total_sigma2 = self.Discrepancy.total_sigma2 - post_pred_withnoise = copy.deepcopy(post_pred) - for varIdx, var in enumerate(Model.Output.names): - for i in range(len(post_pred[var])): - pred = post_pred[var][i] - - # Known sigma2s - clean_sigma2 = total_sigma2[var][~np.isnan(total_sigma2[var])] - tot_sigma2 = clean_sigma2[:len(pred)] - cov = np.diag(tot_sigma2) - - # Check the type error term - if sigma2_prior is not None: - # Inferred sigma2s - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): - # TODO: Infer a Bias model usig GPR - bias_inputs = np.hstack(( - self.bias_inputs[var], pred.reshape(-1, 1))) - params = sigma2s[i, varIdx*3:(varIdx+1)*3] - cov = self._kernel_rbf(bias_inputs, params) - else: - # Infer equal sigma2s - try: - sigma2 = sigma2s[i, varIdx] - except TypeError: - sigma2 = 0.0 - - # Convert biasSigma2s to a covMatrix - cov += sigma2 * np.eye(len(pred)) - - if self.emulator: - if hasattr(MetaModel, 'rmse') and \ - MetaModel.rmse is not None: - stdPCE = MetaModel.rmse[var] - else: - stdPCE = post_pred_std[var][i] - # Expected value of variance (Assump: i.i.d stds) - cov += np.diag(stdPCE**2) - - # Sample a multivariate normal distribution with mean of - # prediction and variance of cov - post_pred_withnoise[var][i] = np.random.multivariate_normal( - pred, cov, 1 - ) - - # ----- Prior Predictive ----- - if self.inference_method.lower() == 'rejection': - # Create hdf5 metadata - hdf5file = f'{out_dir}/priorPredictive.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=prior_pred[var]) - - # ----- Posterior Predictive only model evaluations ----- - # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive_wo_noise.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=post_pred[var]) - - # ----- Posterior Predictive with noise ----- - # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=post_pred_withnoise[var]) - - return - - # ------------------------------------------------------------------------- - def _plot_max_a_posteriori(self): - """ - Plots the response of the model output against that of the metamodel at - the maximum a posteriori sample (mean or mode of posterior.) - - Returns - ------- - None. - - """ - - MetaModel = self.MetaModel - Model = self.engine.Model - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - opt_sigma = self.Discrepancy.opt_sigma - - # -------- Find MAP and run MetaModel and origModel -------- - # Compute the MAP - if self.max_a_posteriori.lower() == 'mean': - if opt_sigma == "B": - Posterior_df = self.posterior_df.values - else: - Posterior_df = self.posterior_df.values[:, :-Model.n_outputs] - map_theta = Posterior_df.mean(axis=0).reshape( - (1, MetaModel.n_params)) - else: - map_theta = stats.mode(Posterior_df.values, axis=0)[0] - # Prin report - print("\nPoint estimator:\n", map_theta[0]) - - # Run the models for MAP - # MetaModel - map_metamodel_mean, map_metamodel_std = MetaModel.eval_metamodel( - samples=map_theta) - self.map_metamodel_mean = map_metamodel_mean - self.map_metamodel_std = map_metamodel_std - - # origModel - map_orig_model = self._eval_model(samples=map_theta) - self.map_orig_model = map_orig_model - - # Extract slicing index - x_values = map_orig_model['x_values'] - - # List of markers and colors - Color = ['k', 'b', 'g', 'r'] - Marker = 'x' - - # Create a PdfPages object - pdf = PdfPages(f'./{out_dir}MAP_PCE_vs_Model_{self.name}.pdf') - fig = plt.figure() - for i, key in enumerate(Model.Output.names): - - y_val = map_orig_model[key] - y_pce_val = map_metamodel_mean[key] - y_pce_val_std = map_metamodel_std[key] - - plt.plot(x_values, y_val, color=Color[i], marker=Marker, - lw=2.0, label='$Y_{MAP}^{M}$') - - plt.plot( - x_values, y_pce_val[i], color=Color[i], lw=2.0, - marker=Marker, linestyle='--', label='$Y_{MAP}^{PCE}$' - ) - # plot the confidence interval - plt.fill_between( - x_values, y_pce_val[i] - 1.96*y_pce_val_std[i], - y_pce_val[i] + 1.96*y_pce_val_std[i], - color=Color[i], alpha=0.15 - ) - - # Calculate the adjusted R_squared and RMSE - R2 = r2_score(y_pce_val.reshape(-1, 1), y_val.reshape(-1, 1)) - rmse = np.sqrt(mean_squared_error(y_pce_val, y_val)) - - plt.ylabel(key) - plt.xlabel("Time [s]") - plt.title(f'Model vs MetaModel {key}') - - ax = fig.axes[0] - leg = ax.legend(loc='best', frameon=True) - fig.canvas.draw() - p = leg.get_window_extent().inverse_transformed(ax.transAxes) - ax.text( - p.p0[1]-0.05, p.p1[1]-0.25, - f'RMSE = {rmse:.3f}\n$R^2$ = {R2:.3f}', - transform=ax.transAxes, color='black', - bbox=dict(facecolor='none', edgecolor='black', - boxstyle='round,pad=1')) - - plt.show() - - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - pdf.close() - - # ------------------------------------------------------------------------- - def _plot_post_predictive(self): - """ - Plots the posterior predictives against the observation data. - - Returns - ------- - None. - - """ - - Model = self.engine.Model - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - # Plot the posterior predictive - for out_idx, out_name in enumerate(Model.Output.names): - fig, ax = plt.subplots() - with sns.axes_style("ticks"): - x_key = list(self.measured_data)[0] - - # --- Read prior and posterior predictive --- - if self.inference_method == 'rejection' and \ - self.name.lower() != 'valid': - # --- Prior --- - # Load posterior predictive - f = h5py.File( - f'{out_dir}/priorPredictive.hdf5', 'r+') - - try: - x_coords = np.array(f[f"x_values/{out_name}"]) - except: - x_coords = np.array(f["x_values"]) - - X_values = np.repeat(x_coords, 10000) - - prior_pred_df = {} - prior_pred_df[x_key] = X_values - prior_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"])[:10000].flatten('F') - prior_pred_df = pd.DataFrame(prior_pred_df) - - tags_post = ['prior'] * len(prior_pred_df) - prior_pred_df.insert( - len(prior_pred_df.columns), "Tags", tags_post, - True) - f.close() - - # --- Posterior --- - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') - - X_values = np.repeat( - x_coords, np.array(f[f"EDY/{out_name}"]).shape[0]) - - post_pred_df = {} - post_pred_df[x_key] = X_values - post_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"]).flatten('F') - - post_pred_df = pd.DataFrame(post_pred_df) - - tags_post = ['posterior'] * len(post_pred_df) - post_pred_df.insert( - len(post_pred_df.columns), "Tags", tags_post, True) - f.close() - # Concatenate two dataframes based on x_values - frames = [prior_pred_df, post_pred_df] - all_pred_df = pd.concat(frames) - - # --- Plot posterior predictive --- - sns.violinplot( - x_key, y=out_name, data=all_pred_df, hue="Tags", - legend=False, ax=ax, split=True, inner=None, - color=".8") - - # --- Plot Data --- - # Find the x,y coordinates for each point - x_coords = np.arange(x_coords.shape[0]) - first_header = list(self.measured_data)[0] - obs_data = self.measured_data.round({first_header: 6}) - sns.pointplot( - x=first_header, y=out_name, color='g', markers='x', - linestyles='', capsize=16, data=obs_data, ax=ax) - - ax.errorbar( - x_coords, obs_data[out_name].values, - yerr=1.96*self.measurement_error[out_name], - ecolor='g', fmt=' ', zorder=-1) - - # Add labels to the legend - handles, labels = ax.get_legend_handles_labels() - labels.append('Data') - - data_marker = mlines.Line2D( - [], [], color='lime', marker='+', linestyle='None', - markersize=10) - handles.append(data_marker) - - # Add legend - ax.legend(handles=handles, labels=labels, loc='best', - fontsize='large', frameon=True) - - else: - # Load posterior predictive - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') - - try: - x_coords = np.array(f[f"x_values/{out_name}"]) - except: - x_coords = np.array(f["x_values"]) - - mu = np.mean(np.array(f[f"EDY/{out_name}"]), axis=0) - std = np.std(np.array(f[f"EDY/{out_name}"]), axis=0) - - # --- Plot posterior predictive --- - plt.plot( - x_coords, mu, marker='o', color='b', - label='Mean Post. Predictive') - plt.fill_between( - x_coords, mu-1.96*std, mu+1.96*std, color='b', - alpha=0.15) - - # --- Plot Data --- - ax.plot( - x_coords, self.measured_data[out_name].values, - 'ko', label='data', markeredgecolor='w') - - # --- Plot ExpDesign --- - orig_ED_Y = self.engine.ExpDesign.Y[out_name] - for output in orig_ED_Y: - plt.plot( - x_coords, output, color='grey', alpha=0.15 - ) - - # Add labels for axes - plt.xlabel('Time [s]') - plt.ylabel(out_name) - - # Add labels to the legend - handles, labels = ax.get_legend_handles_labels() - - patch = Patch(color='b', alpha=0.15) - handles.insert(1, patch) - labels.insert(1, '95 $\\%$ CI') - - # Add legend - ax.legend(handles=handles, labels=labels, loc='best', - frameon=True) - - # Save figure in pdf format - if self.emulator: - plotname = f'/Post_Prior_Perd_{Model.name}_emulator' - else: - plotname = f'/Post_Prior_Perd_{Model.name}' - - fig.savefig(f'./{out_dir}{plotname}_{out_name}.pdf', - bbox_inches='tight') diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_model_comparison.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_model_comparison.py deleted file mode 100644 index b946281c5..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/bayes_model_comparison.py +++ /dev/null @@ -1,658 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Sat Aug 24 16:04:06 2019 - -@author: farid -""" -import numpy as np -import os -from scipy import stats -import seaborn as sns -import matplotlib.patches as patches -import matplotlib.colors as mcolors -import matplotlib.pylab as plt -from .bayes_inference import BayesInference - -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class BayesModelComparison: - """ - A class to perform Bayesian Analysis. - - - Attributes - ---------- - justifiability : bool, optional - Whether to perform the justifiability analysis. The default is - `True`. - perturbed_data : array of shape (n_bootstrap_itrs, n_obs), optional - User defined perturbed data. The default is `None`. - n_bootstarp : int - Number of bootstrap iteration. The default is `1000`. - data_noise_level : float - A noise level to perturb the data set. The default is `0.01`. - just_n_meas : int - Number of measurements considered for visualization of the - justifiability results. - - """ - - def __init__(self, justifiability=True, perturbed_data=None, - n_bootstarp=1000, data_noise_level=0.01, just_n_meas=2): - - self.justifiability = justifiability - self.perturbed_data = perturbed_data - self.n_bootstarp = n_bootstarp - self.data_noise_level = data_noise_level - self.just_n_meas = just_n_meas - - # -------------------------------------------------------------------------- - def create_model_comparison(self, model_dict, opts_dict): - """ - Starts the two-stage model comparison. - Stage I: Compare models using Bayes factors. - Stage II: Compare models via justifiability analysis. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - opts_dict : dict - A dictionary given the `BayesInference` options. - - Example: - - >>> opts_bootstrap = { - "bootstrap": True, - "n_samples": 10000, - "Discrepancy": DiscrepancyOpts, - "emulator": True, - "plot_post_pred": True - } - - Returns - ------- - output : dict - A dictionary containing the objects and the model weights for the - comparison using Bayes factors and justifiability analysis. - - """ - - # Bayes factor - bayes_dict_bf, model_weights_dict_bf = self.compare_models( - model_dict, opts_dict - ) - - output = { - 'Bayes objects BF': bayes_dict_bf, - 'Model weights BF': model_weights_dict_bf - } - - # Justifiability analysis - if self.justifiability: - bayes_dict_ja, model_weights_dict_ja = self.compare_models( - model_dict, opts_dict, justifiability=True - ) - - output['Bayes objects JA'] = bayes_dict_ja - output['Model weights JA'] = model_weights_dict_ja - - return output - - # -------------------------------------------------------------------------- - def compare_models(self, model_dict, opts_dict, justifiability=False): - """ - Passes the options to instantiates the BayesInference class for each - model and passes the options from `opts_dict`. Then, it starts the - computations. - It also creates a folder and saves the diagrams, e.g., Bayes factor - plot, confusion matrix, etc. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - opts_dict : dict - A dictionary given the `BayesInference` options. - justifiability : bool, optional - Whether to perform the justifiability analysis. The default is - `False`. - - Returns - ------- - bayes_dict : dict - A dictionary with `BayesInference` objects. - model_weights_dict : dict - A dictionary containing the model weights. - - """ - - if not isinstance(model_dict, dict): - raise Exception("To run model comparsion, you need to pass a " - "dictionary of models.") - - # Extract model names - self.model_names = [*model_dict] - - # Compute total number of the measurement points - Engine = list(model_dict.items())[0][1] - Engine.Model.read_observation() - self.n_meas = Engine.Model.n_obs - - # ----- Generate data ----- - # Find n_bootstrap - if self.perturbed_data is None: - n_bootstarp = self.n_bootstarp - else: - n_bootstarp = self.perturbed_data.shape[0] - - # Create dataset - justData = self.generate_dataset( - model_dict, justifiability, n_bootstarp=n_bootstarp) - - # Run create Interface for each model - bayes_dict = {} - for model in model_dict.keys(): - print("-"*20) - print("Bayesian inference of {}.\n".format(model)) - - BayesOpts = BayesInference(model_dict[model]) - - # Set BayesInference options - for key, value in opts_dict.items(): - if key in BayesOpts.__dict__.keys(): - if key == "Discrepancy" and isinstance(value, dict): - setattr(BayesOpts, key, value[model]) - else: - setattr(BayesOpts, key, value) - - # Pass justifiability data as perturbed data - BayesOpts.perturbed_data = justData - BayesOpts.just_analysis = justifiability - - bayes_dict[model] = BayesOpts.create_inference() - print("-"*20) - - # Compute model weights - BME_Dict = dict() - for modelName, bayesObj in bayes_dict.items(): - BME_Dict[modelName] = np.exp(bayesObj.log_BME, dtype=np.longdouble)#float128) - - # BME correction in BayesInference class - model_weights = self.cal_model_weight( - BME_Dict, justifiability, n_bootstarp=n_bootstarp) - - # Plot model weights - if justifiability: - model_names = self.model_names - model_names.insert(0, 'Observation') - - # Split the model weights and save in a dict - list_ModelWeights = np.split( - model_weights, model_weights.shape[1]/self.n_meas, axis=1) - model_weights_dict = {key: weights for key, weights in - zip(model_names, list_ModelWeights)} - - #self.plot_just_analysis(model_weights_dict) - else: - # Create box plot for model weights - self.plot_model_weights(model_weights, 'model_weights') - - # Create kde plot for bayes factors - self.plot_bayes_factor(BME_Dict, 'kde_plot') - - # Store model weights in a dict - model_weights_dict = {key: weights for key, weights in - zip(self.model_names, model_weights)} - - return bayes_dict, model_weights_dict - - # ------------------------------------------------------------------------- - def generate_dataset(self, model_dict, justifiability=False, - n_bootstarp=1): - """ - Generates the perturbed data set for the Bayes factor calculations and - the data set for the justifiability analysis. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - bool, optional - Whether to perform the justifiability analysis. The default is - `False`. - n_bootstarp : int, optional - Number of bootstrap iterations. The default is `1`. - - Returns - ------- - all_just_data: array - Created data set. - - """ - # Compute some variables - all_just_data = [] - Engine = list(model_dict.items())[0][1] - out_names = Engine.Model.Output.names - - # Perturb observations for Bayes Factor - if self.perturbed_data is None: - self.perturbed_data = self.__perturb_data( - Engine.Model.observations, out_names, n_bootstarp, - noise_level=self.data_noise_level) - - # Only for Bayes Factor - if not justifiability: - return self.perturbed_data - - # Evaluate metamodel - runs = {} - for key, metaModel in model_dict.items(): - y_hat, _ = metaModel.eval_metamodel(nsamples=n_bootstarp) - runs[key] = y_hat - - # Generate data - for i in range(n_bootstarp): - y_data = self.perturbed_data[i].reshape(1, -1) - justData = np.tril(np.repeat(y_data, y_data.shape[1], axis=0)) - # Use surrogate runs for data-generating process - for key, metaModel in model_dict.items(): - model_data = np.array( - [runs[key][out][i] for out in out_names]).reshape(y_data.shape) - justData = np.vstack(( - justData, - np.tril(np.repeat(model_data, model_data.shape[1], axis=0)) - )) - # Save in a list - all_just_data.append(justData) - - # Squeeze the array - all_just_data = np.array(all_just_data).transpose(1, 0, 2).reshape( - -1, np.array(all_just_data).shape[2] - ) - - return all_just_data - - # ------------------------------------------------------------------------- - def __perturb_data(self, data, output_names, n_bootstrap, noise_level): - """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. - The first row includes the original observation data. - If `self.bayes_loocv` is True, a 2d-array will be returned with - repeated rows and zero diagonal entries. - - Parameters - ---------- - data : pandas DataFrame - Observation data. - output_names : list - List of the output names. - - Returns - ------- - final_data : array - Perturbed data set. - - """ - obs_data = data[output_names].values - n_measurement, n_outs = obs_data.shape - n_tot_measurement = obs_data[~np.isnan(obs_data)].shape[0] - final_data = np.zeros( - (n_bootstrap, n_tot_measurement) - ) - final_data[0] = obs_data.T[~np.isnan(obs_data.T)] - for itrIdx in range(1, n_bootstrap): - data = np.zeros((n_measurement, n_outs)) - for idx in range(len(output_names)): - std = np.nanstd(obs_data[:, idx]) - if std == 0: - std = 0.001 - noise = std * noise_level - data[:, idx] = np.add( - obs_data[:, idx], - np.random.normal(0, 1, obs_data.shape[0]) * noise, - ) - - final_data[itrIdx] = data.T[~np.isnan(data.T)] - - return final_data - - # ------------------------------------------------------------------------- - def cal_model_weight(self, BME_Dict, justifiability=False, n_bootstarp=1): - """ - Normalize the BME (Asumption: Model Prior weights are equal for models) - - Parameters - ---------- - BME_Dict : dict - A dictionary containing the BME values. - - Returns - ------- - model_weights : array - Model weights. - - """ - # Stack the BME values for all models - all_BME = np.vstack(list(BME_Dict.values())) - - if justifiability: - # Compute expected log_BME for justifiabiliy analysis - all_BME = all_BME.reshape( - all_BME.shape[0], -1, n_bootstarp).mean(axis=2) - - # Model weights - model_weights = np.divide(all_BME, np.nansum(all_BME, axis=0)) - - return model_weights - - # ------------------------------------------------------------------------- - def plot_just_analysis(self, model_weights_dict): - """ - Visualizes the confusion matrix and the model wights for the - justifiability analysis. - - Parameters - ---------- - model_weights_dict : dict - Model weights. - - Returns - ------- - None. - - """ - - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - Color = [*mcolors.TABLEAU_COLORS] - names = [*model_weights_dict] - - model_names = [model.replace('_', '$-$') for model in self.model_names] - for name in names: - fig, ax = plt.subplots() - for i, model in enumerate(model_names[1:]): - plt.plot(list(range(1, self.n_meas+1)), - model_weights_dict[name][i], - color=Color[i], marker='o', - ms=10, linewidth=2, label=model - ) - - plt.title(f"Data generated by: {name.replace('_', '$-$')}") - plt.ylabel("Weights") - plt.xlabel("No. of measurement points") - ax.set_xticks(list(range(1, self.n_meas+1))) - plt.legend(loc="best") - fig.savefig( - f'{directory}modelWeights_{name}.svg', bbox_inches='tight' - ) - plt.close() - - # Confusion matrix for some measurement points - epsilon = 1 if self.just_n_meas != 1 else 0 - for index in range(0, self.n_meas+epsilon, self.just_n_meas): - weights = np.array( - [model_weights_dict[key][:, index] for key in model_weights_dict] - ) - g = sns.heatmap( - weights.T, annot=True, cmap='Blues', xticklabels=model_names, - yticklabels=model_names[1:], annot_kws={"size": 24} - ) - - # x axis on top - g.xaxis.tick_top() - g.xaxis.set_label_position('top') - g.set_xlabel(r"\textbf{Data generated by:}", labelpad=15) - g.set_ylabel(r"\textbf{Model weight for:}", labelpad=15) - g.figure.savefig( - f"{directory}confusionMatrix_ND_{index+1}.pdf", - bbox_inches='tight' - ) - plt.close() - - # ------------------------------------------------------------------------- - def plot_model_weights(self, model_weights, plot_name): - """ - Visualizes the model weights resulting from BMS via the observation - data. - - Parameters - ---------- - model_weights : array - Model weights. - plot_name : str - Plot name. - - Returns - ------- - None. - - """ - font_size = 40 - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - - # Create figure - fig, ax = plt.subplots() - - # Filter data using np.isnan - mask = ~np.isnan(model_weights.T) - filtered_data = [d[m] for d, m in zip(model_weights, mask.T)] - - # Create the boxplot - bp = ax.boxplot(filtered_data, patch_artist=True, showfliers=False) - - # change outline color, fill color and linewidth of the boxes - for box in bp['boxes']: - # change outline color - box.set(color='#7570b3', linewidth=4) - # change fill color - box.set(facecolor='#1b9e77') - - # change color and linewidth of the whiskers - for whisker in bp['whiskers']: - whisker.set(color='#7570b3', linewidth=2) - - # change color and linewidth of the caps - for cap in bp['caps']: - cap.set(color='#7570b3', linewidth=2) - - # change color and linewidth of the medians - for median in bp['medians']: - median.set(color='#b2df8a', linewidth=2) - - # change the style of fliers and their fill - # for flier in bp['fliers']: - # flier.set(marker='o', color='#e7298a', alpha=0.75) - - # Custom x-axis labels - model_names = [model.replace('_', '$-$') for model in self.model_names] - ax.set_xticklabels(model_names) - - ax.set_ylabel('Weight', fontsize=font_size) - - # Title - plt.title('Posterior Model Weights') - - # Set y lim - ax.set_ylim((-0.05, 1.05)) - - # Set size of the ticks - for t in ax.get_xticklabels(): - t.set_fontsize(font_size) - for t in ax.get_yticklabels(): - t.set_fontsize(font_size) - - # Save the figure - fig.savefig( - f'./{directory}{plot_name}.pdf', bbox_inches='tight' - ) - - plt.close() - - # ------------------------------------------------------------------------- - def plot_bayes_factor(self, BME_Dict, plot_name=''): - """ - Plots the Bayes factor distibutions in a :math:`N_m \\times N_m` - matrix, where :math:`N_m` is the number of the models. - - Parameters - ---------- - BME_Dict : dict - A dictionary containing the BME values of the models. - plot_name : str, optional - Plot name. The default is ''. - - Returns - ------- - None. - - """ - - font_size = 40 - - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - - Colors = ["blue", "green", "gray", "brown"] - - model_names = list(BME_Dict.keys()) - nModels = len(model_names) - - # Plots - fig, axes = plt.subplots( - nrows=nModels, ncols=nModels, sharex=True, sharey=True - ) - - for i, key_i in enumerate(model_names): - - for j, key_j in enumerate(model_names): - ax = axes[i, j] - # Set size of the ticks - for t in ax.get_xticklabels(): - t.set_fontsize(font_size) - for t in ax.get_yticklabels(): - t.set_fontsize(font_size) - - if j != i: - - # Null hypothesis: key_j is the better model - BayesFactor = np.log10( - np.divide(BME_Dict[key_i], BME_Dict[key_j]) - ) - - # sns.kdeplot(BayesFactor, ax=ax, color=Colors[i], shade=True) - # sns.histplot(BayesFactor, ax=ax, stat="probability", - # kde=True, element='step', - # color=Colors[j]) - - # taken from seaborn's source code (utils.py and - # distributions.py) - def seaborn_kde_support(data, bw, gridsize, cut, clip): - if clip is None: - clip = (-np.inf, np.inf) - support_min = max(data.min() - bw * cut, clip[0]) - support_max = min(data.max() + bw * cut, clip[1]) - return np.linspace(support_min, support_max, gridsize) - - kde_estim = stats.gaussian_kde( - BayesFactor, bw_method='scott' - ) - - # manual linearization of data - # linearized = np.linspace( - # quotient.min(), quotient.max(), num=500) - - # or better: mimic seaborn's internal stuff - bw = kde_estim.scotts_factor() * np.std(BayesFactor) - linearized = seaborn_kde_support( - BayesFactor, bw, 100, 3, None) - - # computes values of the estimated function on the - # estimated linearized inputs - Z = kde_estim.evaluate(linearized) - - # https://stackoverflow.com/questions/29661574/normalize- - # numpy-array-columns-in-python - def normalize(x): - return (x - x.min(0)) / x.ptp(0) - - # normalize so it is between 0;1 - Z2 = normalize(Z) - ax.plot(linearized, Z2, "-", color=Colors[i], linewidth=4) - ax.fill_between( - linearized, 0, Z2, color=Colors[i], alpha=0.25 - ) - - # Draw BF significant levels according to Jeffreys 1961 - # Strong evidence for both models - ax.axvline( - x=np.log10(3), ymin=0, linewidth=4, color='dimgrey' - ) - # Strong evidence for one model - ax.axvline( - x=np.log10(10), ymin=0, linewidth=4, color='orange' - ) - # Decisive evidence for one model - ax.axvline( - x=np.log10(100), ymin=0, linewidth=4, color='r' - ) - - # legend - BF_label = key_i.replace('_', '$-$') + \ - '/' + key_j.replace('_', '$-$') - legend_elements = [ - patches.Patch(facecolor=Colors[i], edgecolor=Colors[i], - label=f'BF({BF_label})') - ] - ax.legend( - loc='upper left', handles=legend_elements, - fontsize=font_size-(nModels+1)*5 - ) - - elif j == i: - # build a rectangle in axes coords - left, width = 0, 1 - bottom, height = 0, 1 - - # axes coordinates are 0,0 is bottom left and 1,1 is upper - # right - p = patches.Rectangle( - (left, bottom), width, height, color='white', - fill=True, transform=ax.transAxes, clip_on=False - ) - ax.grid(False) - ax.add_patch(p) - # ax.text(0.5*(left+right), 0.5*(bottom+top), key_i, - fsize = font_size+20 if nModels < 4 else font_size - ax.text(0.5, 0.5, key_i.replace('_', '$-$'), - horizontalalignment='center', - verticalalignment='center', - fontsize=fsize, color=Colors[i], - transform=ax.transAxes) - - # Defining custom 'ylim' values. - custom_ylim = (0, 1.05) - - # Setting the values for all axes. - plt.setp(axes, ylim=custom_ylim) - - # set labels - for i in range(nModels): - axes[-1, i].set_xlabel('log$_{10}$(BF)', fontsize=font_size) - axes[i, 0].set_ylabel('Probability', fontsize=font_size) - - # Adjust subplots - plt.subplots_adjust(wspace=0.2, hspace=0.1) - - plt.savefig( - f'./{directory}Bayes_Factor{plot_name}.pdf', bbox_inches='tight' - ) - - plt.close() diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/discrepancy.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/discrepancy.py deleted file mode 100644 index ac1b400c1..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/discrepancy.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import scipy.stats as stats -from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns - - -class Discrepancy: - """ - Discrepancy class for Bayesian inference method. - We define the reference or reality to be equal to what we can model and a - descripancy term \\( \\epsilon \\). We consider the followin format: - - $$\\textbf{y}_{\\text{reality}} = \\mathcal{M}(\\theta) + \\epsilon,$$ - - where \\( \\epsilon \\in R^{N_{out}} \\) represents the the effects of - measurement error and model inaccuracy. For simplicity, it can be defined - as an additive Gaussian disrepancy with zeromean and given covariance - matrix \\( \\Sigma \\): - - $$\\epsilon \\sim \\mathcal{N}(\\epsilon|0, \\Sigma). $$ - - In the context of model inversion or calibration, an observation point - \\( \\textbf{y}_i \\in \\mathcal{y} \\) is a realization of a Gaussian - distribution with mean value of \\(\\mathcal{M}(\\theta) \\) and covariance - matrix of \\( \\Sigma \\). - - $$ p(\\textbf{y}|\\theta) = \\mathcal{N}(\\textbf{y}|\\mathcal{M} - (\\theta))$$ - - The following options are available: - - * Option A: With known redidual covariance matrix \\(\\Sigma\\) for - independent measurements. - - * Option B: With unknown redidual covariance matrix \\(\\Sigma\\), - paramethrized as \\(\\Sigma(\\theta_{\\epsilon})=\\sigma^2 \\textbf{I}_ - {N_{out}}\\) with unknown residual variances \\(\\sigma^2\\). - This term will be jointly infer with the uncertain input parameters. For - the inversion, you need to define a prior marginal via `Input` class. Note - that \\(\\sigma^2\\) is only a single scalar multiplier for the diagonal - entries of the covariance matrix \\(\\Sigma\\). - - Attributes - ---------- - InputDisc : obj - Input object. When the \\(\\sigma^2\\) is expected to be inferred - jointly with the parameters (`Option B`).If multiple output groups are - defined by `Model.Output.names`, each model output needs to have. - a prior marginal using the `Input` class. The default is `''`. - disc_type : str - Type of the noise definition. `'Gaussian'` is only supported so far. - parameters : dict or pandas.DataFrame - Known residual variance \\(\\sigma^2\\), i.e. diagonal entry of the - covariance matrix of the multivariate normal likelihood in case of - `Option A`. - - """ - - def __init__(self, InputDisc='', disc_type='Gaussian', parameters=None): - self.InputDisc = InputDisc - self.disc_type = disc_type - self.parameters = parameters - - # ------------------------------------------------------------------------- - def get_sample(self, n_samples): - """ - Generate samples for the \\(\\sigma^2\\), i.e. the diagonal entries of - the variance-covariance matrix in the multivariate normal distribution. - - Parameters - ---------- - n_samples : int - Number of samples (parameter sets). - - Returns - ------- - sigma2_prior: array of shape (n_samples, n_params) - \\(\\sigma^2\\) samples. - - """ - self.n_samples = n_samples # TODO: not used again in here - needed from the outside? - - # Create and store BoundTuples - self.ExpDesign = ExpDesigns(self.InputDisc) - self.ExpDesign.sampling_method = 'random' - self.ExpDesign.generate_ED( - n_samples, max_pce_deg=1 - ) - # TODO: need to recheck the following line - # This used to simply be the return from the call above - self.sigma2_prior = self.ExpDesign.X - - # Naive approach: Fit a gaussian kernel to the provided data - self.ExpDesign.JDist = stats.gaussian_kde(self.ExpDesign.raw_data) - - # Save the names of sigmas - if len(self.InputDisc.Marginals) != 0: - self.name = [] - for Marginalidx in range(len(self.InputDisc.Marginals)): - self.name.append(self.InputDisc.Marginals[Marginalidx].name) - - return self.sigma2_prior diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/mcmc.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/mcmc.py deleted file mode 100644 index fe22a152f..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayes_inference/mcmc.py +++ /dev/null @@ -1,909 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import numpy as np -import emcee -import pandas as pd -import matplotlib.pyplot as plt -from matplotlib.backends.backend_pdf import PdfPages -import multiprocessing -import scipy.stats as st -from scipy.linalg import cholesky as chol -import warnings -import shutil -os.environ["OMP_NUM_THREADS"] = "1" - - -class MCMC: - """ - A class for bayesian inference via a Markov-Chain Monte-Carlo (MCMC) - Sampler to approximate the posterior distribution of the Bayes theorem: - $$p(\\theta|\\mathcal{y}) = \\frac{p(\\mathcal{y}|\\theta) p(\\theta)} - {p(\\mathcal{y})}.$$ - - This class make inference with emcee package [1] using an Affine Invariant - Ensemble sampler (AIES) [2]. - - [1] Foreman-Mackey, D., Hogg, D.W., Lang, D. and Goodman, J., 2013.emcee: - the MCMC hammer. Publications of the Astronomical Society of the - Pacific, 125(925), p.306. https://emcee.readthedocs.io/en/stable/ - - [2] Goodman, J. and Weare, J., 2010. Ensemble samplers with affine - invariance. Communications in applied mathematics and computational - science, 5(1), pp.65-80. - - - Attributes - ---------- - BayesOpts : obj - Bayes object. - """ - - def __init__(self, BayesOpts): - - self.BayesOpts = BayesOpts - - def run_sampler(self, observation, total_sigma2): - - BayesObj = self.BayesOpts - MetaModel = BayesObj.engine.MetaModel - Model = BayesObj.engine.Model - Discrepancy = self.BayesOpts.Discrepancy - n_cpus = Model.n_cpus - priorDist = BayesObj.engine.ExpDesign.JDist - ndim = MetaModel.n_params - self.counter = 0 - output_dir = f'Outputs_Bayes_{Model.name}_{self.BayesOpts.name}' - if not os.path.exists(output_dir): - os.makedirs(output_dir) - - self.observation = observation - self.total_sigma2 = total_sigma2 - - # Unpack mcmc parameters given to BayesObj.mcmc_params - self.initsamples = None - self.nwalkers = 100 - self.nburn = 200 - self.nsteps = 100000 - self.moves = None - self.mp = False - self.verbose = False - - # Extract initial samples - if 'init_samples' in BayesObj.mcmc_params: - self.initsamples = BayesObj.mcmc_params['init_samples'] - if isinstance(self.initsamples, pd.DataFrame): - self.initsamples = self.initsamples.values - - # Extract number of steps per walker - if 'n_steps' in BayesObj.mcmc_params: - self.nsteps = int(BayesObj.mcmc_params['n_steps']) - # Extract number of walkers (chains) - if 'n_walkers' in BayesObj.mcmc_params: - self.nwalkers = int(BayesObj.mcmc_params['n_walkers']) - # Extract moves - if 'moves' in BayesObj.mcmc_params: - self.moves = BayesObj.mcmc_params['moves'] - # Extract multiprocessing - if 'multiprocessing' in BayesObj.mcmc_params: - self.mp = BayesObj.mcmc_params['multiprocessing'] - # Extract verbose - if 'verbose' in BayesObj.mcmc_params: - self.verbose = BayesObj.mcmc_params['verbose'] - - # Set initial samples - np.random.seed(0) - if self.initsamples is None: - try: - initsamples = priorDist.sample(self.nwalkers).T - except: - # when aPCE selected - gaussian kernel distribution - inputSamples = MetaModel.ExpDesign.raw_data.T - random_indices = np.random.choice( - len(inputSamples), size=self.nwalkers, replace=False - ) - initsamples = inputSamples[random_indices] - - else: - if self.initsamples.ndim == 1: - # When MAL is given. - theta = self.initsamples - initsamples = [theta + 1e-1*np.multiply( - np.random.randn(ndim), theta) for i in - range(self.nwalkers)] - else: - # Pick samples based on a uniform dist between min and max of - # each dim - initsamples = np.zeros((self.nwalkers, ndim)) - bound_tuples = [] - for idx_dim in range(ndim): - lower = np.min(self.initsamples[:, idx_dim]) - upper = np.max(self.initsamples[:, idx_dim]) - bound_tuples.append((lower, upper)) - dist = st.uniform(loc=lower, scale=upper-lower) - initsamples[:, idx_dim] = dist.rvs(size=self.nwalkers) - - # Update lower and upper - MetaModel.ExpDesign.bound_tuples = bound_tuples - - # Check if sigma^2 needs to be inferred - if Discrepancy.opt_sigma != 'B': - sigma2_samples = Discrepancy.get_sample(self.nwalkers) - - # Update initsamples - initsamples = np.hstack((initsamples, sigma2_samples)) - - # Update ndim - ndim = initsamples.shape[1] - - # Discrepancy bound - disc_bound_tuple = Discrepancy.ExpDesign.bound_tuples - - # Update bound_tuples - BayesObj.engine.ExpDesign.bound_tuples += disc_bound_tuple - - print("\n>>>> Bayesian inference with MCMC for " - f"{self.BayesOpts.name} started. <<<<<<") - - # Set up the backend - filename = f"{output_dir}/emcee_sampler.h5" - backend = emcee.backends.HDFBackend(filename) - # Clear the backend in case the file already exists - backend.reset(self.nwalkers, ndim) - - # Define emcee sampler - # Here we'll set up the computation. emcee combines multiple "walkers", - # each of which is its own MCMC chain. The number of trace results will - # be nwalkers * nsteps. - if self.mp: - # Run in parallel - if n_cpus is None: - n_cpus = multiprocessing.cpu_count() - - with multiprocessing.Pool(n_cpus) as pool: - sampler = emcee.EnsembleSampler( - self.nwalkers, ndim, self.log_posterior, moves=self.moves, - pool=pool, backend=backend - ) - - # Check if a burn-in phase is needed! - if self.initsamples is None: - # Burn-in - print("\n Burn-in period is starting:") - pos = sampler.run_mcmc( - initsamples, self.nburn, progress=True - ) - - # Reset sampler - sampler.reset() - pos = pos.coords - else: - pos = initsamples - - # Production run - print("\n Production run is starting:") - pos, prob, state = sampler.run_mcmc( - pos, self.nsteps, progress=True - ) - - else: - # Run in series and monitor the convergence - sampler = emcee.EnsembleSampler( - self.nwalkers, ndim, self.log_posterior, moves=self.moves, - backend=backend, vectorize=True - ) - - # Check if a burn-in phase is needed! - if self.initsamples is None: - # Burn-in - print("\n Burn-in period is starting:") - pos = sampler.run_mcmc( - initsamples, self.nburn, progress=True - ) - - # Reset sampler - sampler.reset() - pos = pos.coords - else: - pos = initsamples - - # Production run - print("\n Production run is starting:") - - # Track how the average autocorrelation time estimate changes - autocorrIdx = 0 - autocorr = np.empty(self.nsteps) - tauold = np.inf - autocorreverynsteps = 50 - - # sample step by step using the generator sampler.sample - for sample in sampler.sample(pos, - iterations=self.nsteps, - tune=True, - progress=True): - - # only check convergence every autocorreverynsteps steps - if sampler.iteration % autocorreverynsteps: - continue - - # Train model discrepancy/error - if hasattr(BayesObj, 'errorModel') and BayesObj.errorModel \ - and not sampler.iteration % 3 * autocorreverynsteps: - try: - self.error_MetaModel = self.train_error_model(sampler) - except: - pass - - # Print the current mean acceptance fraction - if self.verbose: - print("\nStep: {}".format(sampler.iteration)) - acc_fr = np.mean(sampler.acceptance_fraction) - print(f"Mean acceptance fraction: {acc_fr:.3f}") - - # compute the autocorrelation time so far - # using tol=0 means that we'll always get an estimate even if - # it isn't trustworthy - tau = sampler.get_autocorr_time(tol=0) - # average over walkers - autocorr[autocorrIdx] = np.nanmean(tau) - autocorrIdx += 1 - - # output current autocorrelation estimate - if self.verbose: - print(f"Mean autocorr. time estimate: {np.nanmean(tau):.3f}") - list_gr = np.round(self.gelman_rubin(sampler.chain), 3) - print("Gelman-Rubin Test*: ", list_gr) - - # check convergence - converged = np.all(tau*autocorreverynsteps < sampler.iteration) - converged &= np.all(np.abs(tauold - tau) / tau < 0.01) - converged &= np.all(self.gelman_rubin(sampler.chain) < 1.1) - - if converged: - break - tauold = tau - - # Posterior diagnostics - try: - tau = sampler.get_autocorr_time(tol=0) - except emcee.autocorr.AutocorrError: - tau = 5 - - if all(np.isnan(tau)): - tau = 5 - - burnin = int(2*np.nanmax(tau)) - thin = int(0.5*np.nanmin(tau)) if int(0.5*np.nanmin(tau)) != 0 else 1 - finalsamples = sampler.get_chain(discard=burnin, flat=True, thin=thin) - acc_fr = np.nanmean(sampler.acceptance_fraction) - list_gr = np.round(self.gelman_rubin(sampler.chain[:, burnin:]), 3) - - # Print summary - print('\n') - print('-'*15 + 'Posterior diagnostics' + '-'*15) - print(f"Mean auto-correlation time: {np.nanmean(tau):.3f}") - print(f"Thin: {thin}") - print(f"Burn-in: {burnin}") - print(f"Flat chain shape: {finalsamples.shape}") - print(f"Mean acceptance fraction*: {acc_fr:.3f}") - print("Gelman-Rubin Test**: ", list_gr) - - print("\n* This value must lay between 0.234 and 0.5.") - print("** These values must be smaller than 1.1.") - print('-'*50) - - print(f"\n>>>> Bayesian inference with MCMC for {self.BayesOpts.name} " - "successfully completed. <<<<<<\n") - - # Extract parameter names and their prior ranges - par_names = self.BayesOpts.engine.ExpDesign.par_names - - if Discrepancy.opt_sigma != 'B': - for i in range(len(Discrepancy.InputDisc.Marginals)): - par_names.append(Discrepancy.InputDisc.Marginals[i].name) - - params_range = self.BayesOpts.engine.ExpDesign.bound_tuples - - # Plot traces - if self.verbose and self.nsteps < 10000: - pdf = PdfPages(output_dir+'/traceplots.pdf') - fig = plt.figure() - for parIdx in range(ndim): - # Set up the axes with gridspec - fig = plt.figure() - grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2) - main_ax = fig.add_subplot(grid[:-1, :3]) - y_hist = fig.add_subplot(grid[:-1, -1], xticklabels=[], - sharey=main_ax) - - for i in range(self.nwalkers): - samples = sampler.chain[i, :, parIdx] - main_ax.plot(samples, '-') - - # histogram on the attached axes - y_hist.hist(samples[burnin:], 40, histtype='stepfilled', - orientation='horizontal', color='gray') - - main_ax.set_ylim(params_range[parIdx]) - main_ax.set_title('traceplot for ' + par_names[parIdx]) - main_ax.set_xlabel('step number') - - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - pdf.close() - - # plot development of autocorrelation estimate - if not self.mp: - fig1 = plt.figure() - steps = autocorreverynsteps*np.arange(1, autocorrIdx+1) - taus = autocorr[:autocorrIdx] - plt.plot(steps, steps / autocorreverynsteps, "--k") - plt.plot(steps, taus) - plt.xlim(0, steps.max()) - plt.ylim(0, np.nanmax(taus)+0.1*(np.nanmax(taus)-np.nanmin(taus))) - plt.xlabel("number of steps") - plt.ylabel(r"mean $\hat{\tau}$") - fig1.savefig(f"{output_dir}/autocorrelation_time.pdf", - bbox_inches='tight') - - # logml_dict = self.marginal_llk_emcee(sampler, self.nburn, logp=None, - # maxiter=5000) - # print('\nThe Bridge Sampling Estimation is " - # f"{logml_dict['logml']:.5f}.') - - # # Posterior-based expectation of posterior probablity - # postExpPostLikelihoods = np.mean(sampler.get_log_prob(flat=True) - # [self.nburn*self.nwalkers:]) - - # # Posterior-based expectation of prior densities - # postExpPrior = np.mean(self.log_prior(emcee_trace.T)) - - # # Posterior-based expectation of likelihoods - # postExpLikelihoods_emcee = postExpPostLikelihoods - postExpPrior - - # # Calculate Kullback-Leibler Divergence - # KLD_emcee = postExpLikelihoods_emcee - logml_dict['logml'] - # print("Kullback-Leibler divergence: %.5f"%KLD_emcee) - - # # Information Entropy based on Entropy paper Eq. 38 - # infEntropy_emcee = logml_dict['logml'] - postExpPrior - - # postExpLikelihoods_emcee - # print("Information Entropy: %.5f" %infEntropy_emcee) - - Posterior_df = pd.DataFrame(finalsamples, columns=par_names) - - return Posterior_df - - # ------------------------------------------------------------------------- - def log_prior(self, theta): - """ - Calculates the log prior likelihood \\( p(\\theta)\\) for the given - parameter set(s) \\( \\theta \\). - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter sets, i.e. proposals of MCMC chains. - - Returns - ------- - logprior: float or array of shape n_samples - Log prior likelihood. If theta has only one row, a single value is - returned otherwise an array. - - """ - - MetaModel = self.BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy - - # Find the number of sigma2 parameters - if Discrepancy.opt_sigma != 'B': - disc_bound_tuples = Discrepancy.ExpDesign.bound_tuples - disc_marginals = Discrepancy.ExpDesign.InputObj.Marginals - disc_prior_space = Discrepancy.ExpDesign.prior_space - n_sigma2 = len(disc_bound_tuples) - else: - n_sigma2 = -len(theta) - prior_dist = self.BayesOpts.engine.ExpDesign.prior_space - params_range = self.BayesOpts.engine.ExpDesign.bound_tuples - theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) - nsamples = theta.shape[0] - logprior = -np.inf*np.ones(nsamples) - - for i in range(nsamples): - # Check if the sample is within the parameters' range - if self._check_ranges(theta[i], params_range): - # Check if all dists are uniform, if yes priors are equal. - if all(MetaModel.input_obj.Marginals[i].dist_type == 'uniform' - for i in range(MetaModel.n_params)): - logprior[i] = 0.0 - else: - logprior[i] = np.log( - prior_dist.pdf(theta[i, :-n_sigma2].T) - ) - - # Check if bias term needs to be inferred - if Discrepancy.opt_sigma != 'B': - if self._check_ranges(theta[i, -n_sigma2:], - disc_bound_tuples): - if all('unif' in disc_marginals[i].dist_type for i in - range(Discrepancy.ExpDesign.ndim)): - logprior[i] = 0.0 - else: - logprior[i] += np.log( - disc_prior_space.pdf(theta[i, -n_sigma2:]) - ) - - if nsamples == 1: - return logprior[0] - else: - return logprior - - # ------------------------------------------------------------------------- - def log_likelihood(self, theta): - """ - Computes likelihood \\( p(\\mathcal{Y}|\\theta)\\) of the performance - of the (meta-)model in reproducing the observation data. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - log_like : array of shape (n_samples) - Log likelihood. - - """ - - BayesOpts = self.BayesOpts - MetaModel = BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy - - # Find the number of sigma2 parameters - if Discrepancy.opt_sigma != 'B': - disc_bound_tuples = Discrepancy.ExpDesign.bound_tuples - n_sigma2 = len(disc_bound_tuples) - else: - n_sigma2 = -len(theta) - # Check if bias term needs to be inferred - if Discrepancy.opt_sigma != 'B': - sigma2 = theta[:, -n_sigma2:] - theta = theta[:, :-n_sigma2] - else: - sigma2 = None - theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) - - # Evaluate Model/MetaModel at theta - mean_pred, BayesOpts._std_pce_prior_pred = self.eval_model(theta) - - # Surrogate model's error using RMSE of test data - surrError = MetaModel.rmse if hasattr(MetaModel, 'rmse') else None - - # Likelihood - log_like = BayesOpts.normpdf( - mean_pred, self.observation, self.total_sigma2, sigma2, - std=surrError - ) - return log_like - - # ------------------------------------------------------------------------- - def log_posterior(self, theta): - """ - Computes the posterior likelihood \\(p(\\theta| \\mathcal{Y})\\) for - the given parameterset. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - log_like : array of shape (n_samples) - Log posterior likelihood. - - """ - - nsamples = 1 if theta.ndim == 1 else theta.shape[0] - - if nsamples == 1: - if self.log_prior(theta) == -np.inf: - return -np.inf - else: - # Compute log prior - log_prior = self.log_prior(theta) - # Compute log Likelihood - log_likelihood = self.log_likelihood(theta) - - return log_prior + log_likelihood - else: - # Compute log prior - log_prior = self.log_prior(theta) - - # Initialize log_likelihood - log_likelihood = -np.inf*np.ones(nsamples) - - # find the indices for -inf sets - non_inf_idx = np.where(log_prior != -np.inf)[0] - - # Compute loLikelihoods - if non_inf_idx.size != 0: - log_likelihood[non_inf_idx] = self.log_likelihood( - theta[non_inf_idx] - ) - - return log_prior + log_likelihood - - # ------------------------------------------------------------------------- - def eval_model(self, theta): - """ - Evaluates the (meta-) model at the given theta. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - mean_pred : dict - Mean model prediction. - std_pred : dict - Std of model prediction. - - """ - - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - Model = BayesObj.engine.Model - - if BayesObj.emulator: - # Evaluate the MetaModel - mean_pred, std_pred = MetaModel.eval_metamodel(samples=theta) - else: - # Evaluate the origModel - mean_pred, std_pred = dict(), dict() - - model_outs, _ = Model.run_model_parallel( - theta, prevRun_No=self.counter, - key_str='_MCMC', mp=False, verbose=False) - - # Save outputs in respective dicts - for varIdx, var in enumerate(Model.Output.names): - mean_pred[var] = model_outs[var] - std_pred[var] = np.zeros((mean_pred[var].shape)) - - # Remove the folder - if Model.link_type.lower() != 'function': - shutil.rmtree(f"{Model.name}_MCMC_{self.counter+1}") - - # Add one to the counter - self.counter += 1 - - if hasattr(self, 'error_MetaModel') and BayesObj.error_model: - meanPred, stdPred = self.error_MetaModel.eval_model_error( - BayesObj.BiasInputs, mean_pred - ) - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - def train_error_model(self, sampler): - """ - Trains an error model using a Gaussian Process Regression. - - Parameters - ---------- - sampler : obj - emcee sampler. - - Returns - ------- - error_MetaModel : obj - A error model. - - """ - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - - # Prepare the poster samples - try: - tau = sampler.get_autocorr_time(tol=0) - except emcee.autocorr.AutocorrError: - tau = 5 - - if all(np.isnan(tau)): - tau = 5 - - burnin = int(2*np.nanmax(tau)) - thin = int(0.5*np.nanmin(tau)) if int(0.5*np.nanmin(tau)) != 0 else 1 - finalsamples = sampler.get_chain(discard=burnin, flat=True, thin=thin) - posterior = finalsamples[:, :MetaModel.n_params] - - # Select posterior mean as MAP - map_theta = posterior.mean(axis=0).reshape((1, MetaModel.n_params)) - # MAP_theta = st.mode(Posterior_df,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_map, y_std_map = MetaModel.eval_metamodel(samples=map_theta) - - # Train a GPR meta-model using MAP - error_MetaModel = MetaModel.create_model_error( - BayesObj.BiasInputs, y_map, name='Calib') - - return error_MetaModel - - # ------------------------------------------------------------------------- - def gelman_rubin(self, chain, return_var=False): - """ - The potential scale reduction factor (PSRF) defined by the variance - within one chain, W, with the variance between chains B. - Both variances are combined in a weighted sum to obtain an estimate of - the variance of a parameter \\( \\theta \\).The square root of the - ratio of this estimates variance to the within chain variance is called - the potential scale reduction. - For a well converged chain it should approach 1. Values greater than - 1.1 typically indicate that the chains have not yet fully converged. - - Source: http://joergdietrich.github.io/emcee-convergence.html - - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py - - Parameters - ---------- - chain : array (n_walkers, n_steps, n_params) - The emcee ensamples. - - Returns - ------- - R_hat : float - The Gelman-Robin values. - - """ - m_chains, n_iters = chain.shape[:2] - - # Calculate between-chain variance - θb = np.mean(chain, axis=1) - θbb = np.mean(θb, axis=0) - B_over_n = ((θbb - θb)**2).sum(axis=0) - B_over_n /= (m_chains - 1) - - # Calculate within-chain variances - ssq = np.var(chain, axis=1, ddof=1) - W = np.mean(ssq, axis=0) - - # (over) estimate of variance - var_θ = W * (n_iters - 1) / n_iters + B_over_n - - if return_var: - return var_θ - else: - # The square root of the ratio of this estimates variance to the - # within chain variance - R_hat = np.sqrt(var_θ / W) - return R_hat - - # ------------------------------------------------------------------------- - def marginal_llk_emcee(self, sampler, nburn=None, logp=None, maxiter=1000): - """ - The Bridge Sampling Estimator of the Marginal Likelihood based on - https://gist.github.com/junpenglao/4d2669d69ddfe1d788318264cdcf0583 - - Parameters - ---------- - sampler : TYPE - MultiTrace, result of MCMC run. - nburn : int, optional - Number of burn-in step. The default is None. - logp : TYPE, optional - Model Log-probability function. The default is None. - maxiter : int, optional - Maximum number of iterations. The default is 1000. - - Returns - ------- - marg_llk : dict - Estimated Marginal log-Likelihood. - - """ - r0, tol1, tol2 = 0.5, 1e-10, 1e-4 - - if logp is None: - logp = sampler.log_prob_fn - - # Split the samples into two parts - # Use the first 50% for fiting the proposal distribution - # and the second 50% in the iterative scheme. - if nburn is None: - mtrace = sampler.chain - else: - mtrace = sampler.chain[:, nburn:, :] - - nchain, len_trace, nrofVars = mtrace.shape - - N1_ = len_trace // 2 - N1 = N1_*nchain - N2 = len_trace*nchain - N1 - - samples_4_fit = np.zeros((nrofVars, N1)) - samples_4_iter = np.zeros((nrofVars, N2)) - effective_n = np.zeros((nrofVars)) - - # matrix with already transformed samples - for var in range(nrofVars): - - # for fitting the proposal - x = mtrace[:, :N1_, var] - - samples_4_fit[var, :] = x.flatten() - # for the iterative scheme - x2 = mtrace[:, N1_:, var] - samples_4_iter[var, :] = x2.flatten() - - # effective sample size of samples_4_iter, scalar - effective_n[var] = self._my_ESS(x2) - - # median effective sample size (scalar) - neff = np.median(effective_n) - - # get mean & covariance matrix and generate samples from proposal - m = np.mean(samples_4_fit, axis=1) - V = np.cov(samples_4_fit) - L = chol(V, lower=True) - - # Draw N2 samples from the proposal distribution - gen_samples = m[:, None] + np.dot( - L, st.norm.rvs(0, 1, size=samples_4_iter.shape) - ) - - # Evaluate proposal distribution for posterior & generated samples - q12 = st.multivariate_normal.logpdf(samples_4_iter.T, m, V) - q22 = st.multivariate_normal.logpdf(gen_samples.T, m, V) - - # Evaluate unnormalized posterior for posterior & generated samples - q11 = logp(samples_4_iter.T) - q21 = logp(gen_samples.T) - - # Run iterative scheme: - tmp = self._iterative_scheme( - N1, N2, q11, q12, q21, q22, r0, neff, tol1, maxiter, 'r' - ) - if ~np.isfinite(tmp['logml']): - warnings.warn( - "Logml could not be estimated within maxiter, rerunning with " - "adjusted starting value. Estimate might be more variable than" - " usual.") - # use geometric mean as starting value - r0_2 = np.sqrt(tmp['r_vals'][-2]*tmp['r_vals'][-1]) - tmp = self._iterative_scheme( - q11, q12, q21, q22, r0_2, neff, tol2, maxiter, 'logml' - ) - - marg_llk = dict( - logml=tmp['logml'], niter=tmp['niter'], method="normal", - q11=q11, q12=q12, q21=q21, q22=q22 - ) - return marg_llk - - # ------------------------------------------------------------------------- - def _iterative_scheme(self, N1, N2, q11, q12, q21, q22, r0, neff, tol, - maxiter, criterion): - """ - Iterative scheme as proposed in Meng and Wong (1996) to estimate the - marginal likelihood - - """ - l1 = q11 - q12 - l2 = q21 - q22 - # To increase numerical stability, - # subtracting the median of l1 from l1 & l2 later - lstar = np.median(l1) - s1 = neff/(neff + N2) - s2 = N2/(neff + N2) - r = r0 - r_vals = [r] - logml = np.log(r) + lstar - criterion_val = 1 + tol - - i = 0 - while (i <= maxiter) & (criterion_val > tol): - rold = r - logmlold = logml - numi = np.exp(l2 - lstar)/(s1 * np.exp(l2 - lstar) + s2 * r) - deni = 1/(s1 * np.exp(l1 - lstar) + s2 * r) - if np.sum(~np.isfinite(numi))+np.sum(~np.isfinite(deni)) > 0: - warnings.warn( - """Infinite value in iterative scheme, returning NaN. - Try rerunning with more samples.""") - r = (N1/N2) * np.sum(numi)/np.sum(deni) - r_vals.append(r) - logml = np.log(r) + lstar - i += 1 - if criterion == 'r': - criterion_val = np.abs((r - rold)/r) - elif criterion == 'logml': - criterion_val = np.abs((logml - logmlold)/logml) - - if i >= maxiter: - return dict(logml=np.NaN, niter=i, r_vals=np.asarray(r_vals)) - else: - return dict(logml=logml, niter=i) - - # ------------------------------------------------------------------------- - def _my_ESS(self, x): - """ - Compute the effective sample size of estimand of interest. - Vectorised implementation. - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py - - - Parameters - ---------- - x : array of shape (n_walkers, n_steps) - MCMC Samples. - - Returns - ------- - int - Effective sample size. - - """ - m_chains, n_iters = x.shape - - def variogram(t): - variogram = ((x[:, t:] - x[:, :(n_iters - t)])**2).sum() - variogram /= (m_chains * (n_iters - t)) - return variogram - - post_var = self.gelman_rubin(x, return_var=True) - - t = 1 - rho = np.ones(n_iters) - negative_autocorr = False - - # Iterate until the sum of consecutive estimates of autocorrelation is - # negative - while not negative_autocorr and (t < n_iters): - rho[t] = 1 - variogram(t) / (2 * post_var) - - if not t % 2: - negative_autocorr = sum(rho[t-1:t+1]) < 0 - - t += 1 - - return int(m_chains*n_iters / (1 + 2*rho[1:t].sum())) - - # ------------------------------------------------------------------------- - def _check_ranges(self, theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayesvalidrox.mplstyle b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayesvalidrox.mplstyle deleted file mode 100644 index 1f31c01f2..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/bayesvalidrox.mplstyle +++ /dev/null @@ -1,16 +0,0 @@ -figure.titlesize : 30 -axes.titlesize : 30 -axes.labelsize : 30 -axes.linewidth : 3 -axes.grid : True -lines.linewidth : 3 -lines.markersize : 10 -xtick.labelsize : 30 -ytick.labelsize : 30 -legend.fontsize : 30 -font.family : serif -font.serif : Arial -font.size : 30 -text.usetex : True -grid.linestyle : - -figure.figsize : 24, 16 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__init__.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__init__.py deleted file mode 100644 index 81c982542..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .post_processing import PostProcessing - -__all__ = [ - "PostProcessing" - ] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index c8590a242166b2e8d40de7ee2eece71980bd1571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmZ8bu};G<5Vf5GRYl8y)IVUz!u<fM7!d7*A|aM6CpWel3nz|z4z!=dFJ)!o7g*rZ ziSnd-r+4q2?!tUN6O76AjZNG?NAVYm#XT1-nT#;fi$<1G3Zr(iR3>{C`Q%Honag2O z1WH8=l_hfRE{@Ajc{W^iJjd?T7%mXC_lO@No^kL<-z79{f(l;9MuPYnYF}$j@DQrL zv27w)yR_-I@aV&Pp;HZ8eX#VVy)!ZF;ol`dbgfH>x7}fw-ZjDW-mb=X>740Oscic5 E3kw-WVE_OC diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9d21ad3c9193151d5353eea7e29d38f3b43e4b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmZ3^%ge<81T4a;sU<-AF^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%zJUDVl7OQ8<kaHg%)Im>W}vX2Ci5-+0-$(&0jk6;_W1b3oSgXhl?<Oj z*8B={wu%WYPAw{qDay{z$jL}dERJ!>PcF?(%_}L6anCIAC{2oS%gHYfNG!>SNlL6t zEiOyU$xJEAuZTgjASOOOGcU6wK3=b&@)w6qZhlH>PO4oIC(s&@Q;Ri$#0O?ZM#c|p d42(J#7_^ZQP>fad12YphTLU`?7O?|W0{}&mQW5|F diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 58a0eb24635d0b97a14d13708e616de6a0659976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZ9G&q@O^5XO_;ibbs6e1|=xP{fOf2=(GYS&#)Ofsk&pH8lT7Hl_9IbNB$hg4e#q zUOo8=UUarz)Pea8Gv7DE@X_c1K|H^0g@O9sH@_o;<_a>N00a_PBZFrcBatoeEED-X zDh3}I!~%CmrHgGDTrFc%b`kpJyCUz7J<OT^D|GveajhA9MPUz&JAA%O&uJB9h&0Hh zn^2KVTK|w3Wo6)6J@HmKOB%`B6ePKsmgKs+tsYLtXLO#F7Nj<ODJl0}Q&oE^0mL-4 zQI_i<W72J0O&(eA3dzzr-^jRv%Obcn{r4<oOj*@3HujrtcwwAKT3+VxaU1{+^X%&z DlmueV diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc deleted file mode 100644 index 0924d8afac04d4fe82ebe791bc55a8ae48d7c117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28679 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc deleted file mode 100644 index 2922ed407a89b026bf4d9e031464e011a7ad4a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58838 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 C=CgqS diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc deleted file mode 100644 index 312575d7655db85df423489051f494f3dce62692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28771 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/post_processing.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/post_processing.py deleted file mode 100644 index 6520a40f9..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/post_processing/post_processing.py +++ /dev/null @@ -1,1338 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import math -import os -from itertools import combinations, cycle -import pandas as pd -import scipy.stats as stats -from sklearn.linear_model import LinearRegression -from sklearn.metrics import mean_squared_error, r2_score -import matplotlib.pyplot as plt -import matplotlib.ticker as ticker -from matplotlib.offsetbox import AnchoredText -from matplotlib.patches import Patch -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class PostProcessing: - """ - This class provides many helper functions to post-process the trained - meta-model. - - Attributes - ---------- - MetaModel : obj - MetaModel object to do postprocessing on. - name : str - Type of the anaylsis. The default is `'calib'`. If a validation is - expected to be performed change this to `'valid'`. - """ - - def __init__(self, engine, name='calib'): - self.engine = engine - self.MetaModel = engine.MetaModel - self.ExpDesign = engine.ExpDesign - self.ModelObj = engine.Model - self.name = name - - # ------------------------------------------------------------------------- - def plot_moments(self, xlabel='Time [s]', plot_type=None): - """ - Plots the moments in a pdf format in the directory - `Outputs_PostProcessing`. - - Parameters - ---------- - xlabel : str, optional - String to be displayed as x-label. The default is `'Time [s]'`. - plot_type : str, optional - Options: bar or line. The default is `None`. - - Returns - ------- - pce_means: dict - Mean of the model outputs. - pce_means: dict - Standard deviation of the model outputs. - - """ - - bar_plot = True if plot_type == 'bar' else False - meta_model_type = self.MetaModel.meta_model_type - Model = self.ModelObj - - # Read Monte-Carlo reference - self.mc_reference = Model.read_observation('mc_ref') - - # Set the x values - x_values_orig = self.engine.ExpDesign.x_values - - # Compute the moments with the PCEModel object - self.pce_means, self.pce_stds = self.compute_pce_moments() - - # Get the variables - out_names = Model.Output.names - - # Open a pdf for the plots - newpath = (f'Outputs_PostProcessing_{self.name}/') - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Plot the best fit line, set the linewidth (lw), color and - # transparency (alpha) of the line - for key in out_names: - fig, ax = plt.subplots(nrows=1, ncols=2) - - # Extract mean and std - mean_data = self.pce_means[key] - std_data = self.pce_stds[key] - - # Extract a list of x values - if type(x_values_orig) is dict: - x = x_values_orig[key] - else: - x = x_values_orig - - # Plot: bar plot or line plot - if bar_plot: - ax[0].bar(list(map(str, x)), mean_data, color='b', - width=0.25) - ax[1].bar(list(map(str, x)), std_data, color='b', - width=0.25) - ax[0].legend(labels=[meta_model_type]) - ax[1].legend(labels=[meta_model_type]) - else: - ax[0].plot(x, mean_data, lw=3, color='k', marker='x', - label=meta_model_type) - ax[1].plot(x, std_data, lw=3, color='k', marker='x', - label=meta_model_type) - - if self.mc_reference is not None: - if bar_plot: - ax[0].bar(list(map(str, x)), self.mc_reference['mean'], - color='r', width=0.25) - ax[1].bar(list(map(str, x)), self.mc_reference['std'], - color='r', width=0.25) - ax[0].legend(labels=[meta_model_type]) - ax[1].legend(labels=[meta_model_type]) - else: - ax[0].plot(x, self.mc_reference['mean'], lw=3, marker='x', - color='r', label='Ref.') - ax[1].plot(x, self.mc_reference['std'], lw=3, marker='x', - color='r', label='Ref.') - - # Label the axes and provide a title - ax[0].set_xlabel(xlabel) - ax[1].set_xlabel(xlabel) - ax[0].set_ylabel(key) - ax[1].set_ylabel(key) - - # Provide a title - ax[0].set_title('Mean of ' + key) - ax[1].set_title('Std of ' + key) - - if not bar_plot: - ax[0].legend(loc='best') - ax[1].legend(loc='best') - - plt.tight_layout() - - # save the current figure - fig.savefig( - f'./{newpath}Mean_Std_PCE_{key}.pdf', - bbox_inches='tight' - ) - - return self.pce_means, self.pce_stds - - # ------------------------------------------------------------------------- - def valid_metamodel(self, n_samples=1, samples=None, model_out_dict=None, - x_axis='Time [s]'): - """ - Evaluates and plots the meta model and the PCEModel outputs for the - given number of samples or the given samples. - - Parameters - ---------- - n_samples : int, optional - Number of samples to be evaluated. The default is 1. - samples : array of shape (n_samples, n_params), optional - Samples to be evaluated. The default is None. - model_out_dict: dict - The model runs using the samples provided. - x_axis : str, optional - Label of x axis. The default is `'Time [s]'`. - - Returns - ------- - None. - - """ - MetaModel = self.MetaModel - Model = self.ModelObj - - if samples is None: - self.n_samples = n_samples - samples = self._get_sample() - else: - self.n_samples = samples.shape[0] - - # Extract x_values - x_values = self.engine.ExpDesign.x_values - - if model_out_dict is not None: - self.model_out_dict = model_out_dict - else: - self.model_out_dict = self._eval_model(samples, key_str='valid') - self.pce_out_mean, self.pce_out_std = MetaModel.eval_metamodel(samples) - - try: - key = Model.Output.names[1] - except IndexError: - key = Model.Output.names[0] - - n_obs = self.model_out_dict[key].shape[1] - - if n_obs == 1: - self._plot_validation() - else: - self._plot_validation_multi(x_values=x_values, x_axis=x_axis) - - # ------------------------------------------------------------------------- - def check_accuracy(self, n_samples=None, samples=None, outputs=None): - """ - Checks accuracy of the metamodel by computing the root mean square - error and validation error for all outputs. - - Parameters - ---------- - n_samples : int, optional - Number of samples. The default is None. - samples : array of shape (n_samples, n_params), optional - Parameter sets to be checked. The default is None. - outputs : dict, optional - Output dictionary with model outputs for all given output types in - `Model.Output.names`. The default is None. - - Raises - ------ - Exception - When neither n_samples nor samples are provided. - - Returns - ------- - rmse: dict - Root mean squared error for each output. - valid_error : dict - Validation error for each output. - - """ - MetaModel = self.MetaModel - Model = self.ModelObj - - # Set the number of samples - if n_samples: - self.n_samples = n_samples - elif samples is not None: - self.n_samples = samples.shape[0] - else: - raise Exception("Please provide either samples or pass the number" - " of samples!") - - # Generate random samples if necessary - Samples = self._get_sample() if samples is None else samples - - # Run the original model with the generated samples - if outputs is None: - outputs = self._eval_model(Samples, key_str='validSet') - - # Run the PCE model with the generated samples - pce_outputs, _ = MetaModel.eval_metamodel(samples=Samples) - - self.rmse = {} - self.valid_error = {} - # Loop over the keys and compute RMSE error. - for key in Model.Output.names: - # Root mena square - self.rmse[key] = mean_squared_error(outputs[key], pce_outputs[key], - squared=False, - multioutput='raw_values') - # Validation error - self.valid_error[key] = (self.rmse[key]**2) / \ - np.var(outputs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(self.rmse[key], - self.valid_error[key])))) - # Save error dicts in PCEModel object - self.MetaModel.rmse = self.rmse - self.MetaModel.valid_error = self.valid_error - - return - - # ------------------------------------------------------------------------- - def plot_seq_design_diagnostics(self, ref_BME_KLD=None): - """ - Plots the Bayesian Model Evidence (BME) and Kullback-Leibler divergence - (KLD) for the sequential design. - - Parameters - ---------- - ref_BME_KLD : array, optional - Reference BME and KLD . The default is `None`. - - Returns - ------- - None. - - """ - engine = self.engine - PCEModel = self.MetaModel - n_init_samples = engine.ExpDesign.n_init_samples - n_total_samples = engine.ExpDesign.X.shape[0] - - newpath = f'Outputs_PostProcessing_{self.name}/seq_design_diagnostics/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - plotList = ['Modified LOO error', 'Validation error', 'KLD', 'BME', - 'RMSEMean', 'RMSEStd', 'Hellinger distance'] - seqList = [engine.SeqModifiedLOO, engine.seqValidError, - engine.SeqKLD, engine.SeqBME, engine.seqRMSEMean, - engine.seqRMSEStd, engine.SeqDistHellinger] - - markers = ('x', 'o', 'd', '*', '+') - colors = ('k', 'darkgreen', 'b', 'navy', 'darkred') - - # Plot the evolution of the diagnostic criteria of the - # Sequential Experimental Design. - for plotidx, plot in enumerate(plotList): - fig, ax = plt.subplots() - seq_dict = seqList[plotidx] - name_util = list(seq_dict.keys()) - - if len(name_util) == 0: - continue - - # Box plot when Replications have been detected. - if any(int(name.split("rep_", 1)[1]) > 1 for name in name_util): - # Extract the values from dict - sorted_seq_opt = {} - # Number of replications - n_reps = engine.ExpDesign.n_replication - - # Get the list of utility function names - # Handle if only one UtilityFunction is provided - if not isinstance(engine.ExpDesign.util_func, list): - util_funcs = [engine.ExpDesign.util_func] - else: - util_funcs = engine.ExpDesign.util_func - - for util in util_funcs: - sortedSeq = {} - # min number of runs available from reps - n_runs = min([seq_dict[f'{util}_rep_{i+1}'].shape[0] - for i in range(n_reps)]) - - for runIdx in range(n_runs): - values = [] - for key in seq_dict.keys(): - if util in key: - values.append(seq_dict[key][runIdx].mean()) - sortedSeq['SeqItr_'+str(runIdx)] = np.array(values) - sorted_seq_opt[util] = sortedSeq - - # BoxPlot - def draw_plot(data, labels, edge_color, fill_color, idx): - pos = labels - (idx-1) - bp = plt.boxplot(data, positions=pos, labels=labels, - patch_artist=True, sym='', widths=0.75) - elements = ['boxes', 'whiskers', 'fliers', 'means', - 'medians', 'caps'] - for element in elements: - plt.setp(bp[element], color=edge_color[idx]) - - for patch in bp['boxes']: - patch.set(facecolor=fill_color[idx]) - - if engine.ExpDesign.n_new_samples != 1: - step1 = engine.ExpDesign.n_new_samples - step2 = 1 - else: - step1 = 5 - step2 = 5 - edge_color = ['red', 'blue', 'green'] - fill_color = ['tan', 'cyan', 'lightgreen'] - plot_label = plot - # Plot for different Utility Functions - for idx, util in enumerate(util_funcs): - all_errors = np.empty((n_reps, 0)) - - for key in list(sorted_seq_opt[util].keys()): - errors = sorted_seq_opt.get(util, {}).get(key)[:, None] - all_errors = np.hstack((all_errors, errors)) - - # Special cases for BME and KLD - if plot == 'KLD' or plot == 'BME': - # BME convergence if refBME is provided - if ref_BME_KLD is not None: - if plot == 'BME': - refValue = ref_BME_KLD[0] - plot_label = r'BME/BME$^{Ref.}$' - if plot == 'KLD': - refValue = ref_BME_KLD[1] - plot_label = '$D_{KL}[p(\\theta|y_*),p(\\theta)]'\ - ' / D_{KL}^{Ref.}[p(\\theta|y_*), '\ - 'p(\\theta)]$' - - # Difference between BME/KLD and the ref. values - all_errors = np.divide(all_errors, - np.full((all_errors.shape), - refValue)) - - # Plot baseline for zero, i.e. no difference - plt.axhline(y=1.0, xmin=0, xmax=1, c='green', - ls='--', lw=2) - - # Plot each UtilFuncs - labels = np.arange(n_init_samples, n_total_samples+1, step1) - draw_plot(all_errors[:, ::step2], labels, edge_color, - fill_color, idx) - - plt.xticks(labels, labels) - # Set the major and minor locators - ax.xaxis.set_major_locator(ticker.AutoLocator()) - ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) - ax.xaxis.grid(True, which='major', linestyle='-') - ax.xaxis.grid(True, which='minor', linestyle='--') - - # Legend - legend_elements = [] - for idx, util in enumerate(util_funcs): - legend_elements.append(Patch(facecolor=fill_color[idx], - edgecolor=edge_color[idx], - label=util)) - plt.legend(handles=legend_elements[::-1], loc='best') - - if plot != 'BME' and plot != 'KLD': - plt.yscale('log') - plt.autoscale(True) - plt.xlabel('\\# of training samples') - plt.ylabel(plot_label) - plt.title(plot) - - # save the current figure - plot_name = plot.replace(' ', '_') - fig.savefig( - f'./{newpath}/seq_{plot_name}.pdf', - bbox_inches='tight' - ) - # Destroy the current plot - plt.clf() - # Save arrays into files - f = open(f'./{newpath}/seq_{plot_name}.txt', 'w') - f.write(str(sorted_seq_opt)) - f.close() - else: - for idx, name in enumerate(name_util): - seq_values = seq_dict[name] - if engine.ExpDesign.n_new_samples != 1: - step = engine.ExpDesign.n_new_samples - else: - step = 1 - x_idx = np.arange(n_init_samples, n_total_samples+1, step) - if n_total_samples not in x_idx: - x_idx = np.hstack((x_idx, n_total_samples)) - - if plot == 'KLD' or plot == 'BME': - # BME convergence if refBME is provided - if ref_BME_KLD is not None: - if plot == 'BME': - refValue = ref_BME_KLD[0] - plot_label = r'BME/BME$^{Ref.}$' - if plot == 'KLD': - refValue = ref_BME_KLD[1] - plot_label = '$D_{KL}[p(\\theta|y_*),p(\\theta)]'\ - ' / D_{KL}^{Ref.}[p(\\theta|y_*), '\ - 'p(\\theta)]$' - - # Difference between BME/KLD and the ref. values - values = np.divide(seq_values, - np.full((seq_values.shape), - refValue)) - - # Plot baseline for zero, i.e. no difference - plt.axhline(y=1.0, xmin=0, xmax=1, c='green', - ls='--', lw=2) - - # Set the limits - plt.ylim([1e-1, 1e1]) - - # Create the plots - plt.semilogy(x_idx, values, marker=markers[idx], - color=colors[idx], ls='--', lw=2, - label=name.split("_rep", 1)[0]) - else: - plot_label = plot - - # Create the plots - plt.plot(x_idx, seq_values, marker=markers[idx], - color=colors[idx], ls='--', lw=2, - label=name.split("_rep", 1)[0]) - - else: - plot_label = plot - seq_values = np.nan_to_num(seq_values) - - # Plot the error evolution for each output - plt.semilogy(x_idx, seq_values.mean(axis=1), - marker=markers[idx], ls='--', lw=2, - color=colors[idx], - label=name.split("_rep", 1)[0]) - - # Set the major and minor locators - ax.xaxis.set_major_locator(ticker.AutoLocator()) - ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) - ax.xaxis.grid(True, which='major', linestyle='-') - ax.xaxis.grid(True, which='minor', linestyle='--') - - ax.tick_params(axis='both', which='major', direction='in', - width=3, length=10) - ax.tick_params(axis='both', which='minor', direction='in', - width=2, length=8) - plt.xlabel('Number of runs') - plt.ylabel(plot_label) - plt.title(plot) - plt.legend(frameon=True) - - # save the current figure - plot_name = plot.replace(' ', '_') - fig.savefig( - f'./{newpath}/seq_{plot_name}.pdf', - bbox_inches='tight' - ) - # Destroy the current plot - plt.clf() - - # ---------------- Saving arrays into files --------------- - np.save(f'./{newpath}/seq_{plot_name}.npy', seq_values) - - return - - # ------------------------------------------------------------------------- - def sobol_indices(self, xlabel='Time [s]', plot_type=None): - """ - Provides Sobol indices as a sensitivity measure to infer the importance - of the input parameters. See Eq. 27 in [1] for more details. For the - case with Principal component analysis refer to [2]. - - [1] Global sensitivity analysis: A flexible and efficient framework - with an example from stochastic hydrogeology S. Oladyshkin, F.P. - de Barros, W. Nowak https://doi.org/10.1016/j.advwatres.2011.11.001 - - [2] Nagel, J.B., Rieckermann, J. and Sudret, B., 2020. Principal - component analysis and sparse polynomial chaos expansions for global - sensitivity analysis and model calibration: Application to urban - drainage simulation. Reliability Engineering & System Safety, 195, - p.106737. - - Parameters - ---------- - xlabel : str, optional - Label of the x-axis. The default is `'Time [s]'`. - plot_type : str, optional - Plot type. The default is `None`. This corresponds to line plot. - Bar chart can be selected by `bar`. - - Returns - ------- - sobol_cell: dict - Sobol indices. - total_sobol: dict - Total Sobol indices. - - """ - # Extract the necessary variables - PCEModel = self.MetaModel - basis_dict = PCEModel.basis_dict - coeffs_dict = PCEModel.coeffs_dict - n_params = PCEModel.n_params - max_order = np.max(PCEModel.pce_deg) - sobol_cell_b = {} - total_sobol_b = {} - cov_Z_p_q = np.zeros((n_params)) - - for b_i in range(PCEModel.n_bootstrap_itrs): - - sobol_cell_, total_sobol_ = {}, {} - - for output in self.ModelObj.Output.names: - - n_meas_points = len(coeffs_dict[f'b_{b_i+1}'][output]) - - # Initialize the (cell) array containing the (total) Sobol indices. - sobol_array = dict.fromkeys(range(1, max_order+1), []) - sobol_cell_array = dict.fromkeys(range(1, max_order+1), []) - - for i_order in range(1, max_order+1): - n_comb = math.comb(n_params, i_order) - - sobol_cell_array[i_order] = np.zeros((n_comb, n_meas_points)) - - total_sobol_array = np.zeros((n_params, n_meas_points)) - - # Initialize the cell to store the names of the variables - TotalVariance = np.zeros((n_meas_points)) - # Loop over all measurement points and calculate sobol indices - for pIdx in range(n_meas_points): - - # Extract the basis indices (alpha) and coefficients - Basis = basis_dict[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - - try: - clf_poly = PCEModel.clf_poly[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - PCECoeffs = clf_poly.coef_ - except: - PCECoeffs = coeffs_dict[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - - # Compute total variance - TotalVariance[pIdx] = np.sum(np.square(PCECoeffs[1:])) - - nzidx = np.where(PCECoeffs != 0)[0] - # Set all the Sobol indices equal to zero in the presence of a - # null output. - if len(nzidx) == 0: - # This is buggy. - for i_order in range(1, max_order+1): - sobol_cell_array[i_order][:, pIdx] = 0 - - # Otherwise compute them by summing well-chosen coefficients - else: - nz_basis = Basis[nzidx] - for i_order in range(1, max_order+1): - idx = np.where(np.sum(nz_basis > 0, axis=1) == i_order) - subbasis = nz_basis[idx] - Z = np.array(list(combinations(range(n_params), i_order))) - - for q in range(Z.shape[0]): - Zq = Z[q] - subsubbasis = subbasis[:, Zq] - subidx = np.prod(subsubbasis, axis=1) > 0 - sum_ind = nzidx[idx[0][subidx]] - if TotalVariance[pIdx] == 0.0: - sobol_cell_array[i_order][q, pIdx] = 0.0 - else: - sobol = np.sum(np.square(PCECoeffs[sum_ind])) - sobol /= TotalVariance[pIdx] - sobol_cell_array[i_order][q, pIdx] = sobol - - # Compute the TOTAL Sobol indices. - for ParIdx in range(n_params): - idx = nz_basis[:, ParIdx] > 0 - sum_ind = nzidx[idx] - - if TotalVariance[pIdx] == 0.0: - total_sobol_array[ParIdx, pIdx] = 0.0 - else: - sobol = np.sum(np.square(PCECoeffs[sum_ind])) - sobol /= TotalVariance[pIdx] - total_sobol_array[ParIdx, pIdx] = sobol - - # ----- if PCA selected: Compute covariance ----- - if PCEModel.dim_red_method.lower() == 'pca': - # Extract the basis indices (alpha) and coefficients for - # next component - if pIdx < n_meas_points-1: - nextBasis = basis_dict[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - if PCEModel.bootstrap_method != 'fast' or b_i == 0: - clf_poly = PCEModel.clf_poly[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - nextPCECoeffs = clf_poly.coef_ - else: - nextPCECoeffs = coeffs_dict[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - - # Choose the common non-zero basis - mask = (Basis[:, None] == nextBasis).all(-1).any(-1) - n_mask = (nextBasis[:, None] == Basis).all(-1).any(-1) - - # Compute the covariance in Eq 17. - for ParIdx in range(n_params): - idx = (mask) & (Basis[:, ParIdx] > 0) - n_idx = (n_mask) & (nextBasis[:, ParIdx] > 0) - try: - cov_Z_p_q[ParIdx] += np.sum(np.dot( - PCECoeffs[idx], nextPCECoeffs[n_idx]) - ) - except: - pass - - # Compute the sobol indices according to Ref. 2 - if PCEModel.dim_red_method.lower() == 'pca': - n_c_points = self.engine.ExpDesign.Y[output].shape[1] - PCA = PCEModel.pca[f'b_{b_i+1}'][output] - compPCA = PCA.components_ - nComp = compPCA.shape[0] - var_Z_p = PCA.explained_variance_ - - # Extract the sobol index of the components - for i_order in range(1, max_order+1): - n_comb = math.comb(n_params, i_order) - sobol_array[i_order] = np.zeros((n_comb, n_c_points)) - Z = np.array(list(combinations(range(n_params), i_order))) - - # Loop over parameters - for q in range(Z.shape[0]): - S_Z_i = sobol_cell_array[i_order][q] - - for tIdx in range(n_c_points): - var_Y_t = np.var( - self.engine.ExpDesign.Y[output][:, tIdx]) - if var_Y_t == 0.0: - term1, term2 = 0.0, 0.0 - else: - # Eq. 17 - term1 = 0.0 - for i in range(nComp): - a = S_Z_i[i] * var_Z_p[i] - a *= compPCA[i, tIdx]**2 - term1 += a - - # TODO: Term 2 - # term2 = 0.0 - # for i in range(nComp-1): - # term2 += cov_Z_p_q[q] * compPCA[i, tIdx] - # term2 *= compPCA[i+1, tIdx] - # term2 *= 2 - - sobol_array[i_order][q, tIdx] = term1 #+ term2 - - # Devide over total output variance Eq. 18 - sobol_array[i_order][q, tIdx] /= var_Y_t - - # Compute the TOTAL Sobol indices. - total_sobol = np.zeros((n_params, n_c_points)) - for ParIdx in range(n_params): - S_Z_i = total_sobol_array[ParIdx] - - for tIdx in range(n_c_points): - var_Y_t = np.var(self.engine.ExpDesign.Y[output][:, tIdx]) - if var_Y_t == 0.0: - term1, term2 = 0.0, 0.0 - else: - term1 = 0 - for i in range(nComp): - term1 += S_Z_i[i] * var_Z_p[i] * \ - (compPCA[i, tIdx]**2) - - # Term 2 - term2 = 0 - for i in range(nComp-1): - term2 += cov_Z_p_q[ParIdx] * compPCA[i, tIdx] \ - * compPCA[i+1, tIdx] - term2 *= 2 - - total_sobol[ParIdx, tIdx] = term1 #+ term2 - - # Devide over total output variance Eq. 18 - total_sobol[ParIdx, tIdx] /= var_Y_t - - sobol_cell_[output] = sobol_array - total_sobol_[output] = total_sobol - else: - sobol_cell_[output] = sobol_cell_array - total_sobol_[output] = total_sobol_array - - # Save for each bootsrtap iteration - sobol_cell_b[b_i] = sobol_cell_ - total_sobol_b[b_i] = total_sobol_ - - # Average total sobol indices - total_sobol_all = {} - for i in sorted(total_sobol_b): - for k, v in total_sobol_b[i].items(): - if k not in total_sobol_all: - total_sobol_all[k] = [None] * len(total_sobol_b) - total_sobol_all[k][i] = v - - self.total_sobol = {} - for output in self.ModelObj.Output.names: - self.total_sobol[output] = np.mean(total_sobol_all[output], axis=0) - - # ---------------- Plot ----------------------- - par_names = self.engine.ExpDesign.par_names - x_values_orig = self.engine.ExpDesign.x_values - - newpath = (f'Outputs_PostProcessing_{self.name}/') - if not os.path.exists(newpath): - os.makedirs(newpath) - - fig = plt.figure() - - for outIdx, output in enumerate(self.ModelObj.Output.names): - - # Extract total Sobol indices - total_sobol = self.total_sobol[output] - - # Compute quantiles - q_5 = np.quantile(total_sobol_all[output], q=0.05, axis=0) - q_97_5 = np.quantile(total_sobol_all[output], q=0.975, axis=0) - - # Extract a list of x values - if type(x_values_orig) is dict: - x = x_values_orig[output] - else: - x = x_values_orig - - if plot_type == 'bar': - ax = fig.add_axes([0, 0, 1, 1]) - dict1 = {xlabel: x} - dict2 = {param: sobolIndices for param, sobolIndices - in zip(par_names, total_sobol)} - - df = pd.DataFrame({**dict1, **dict2}) - df.plot(x=xlabel, y=par_names, kind="bar", ax=ax, rot=0, - colormap='Dark2', yerr=q_97_5-q_5) - ax.set_ylabel('Total Sobol indices, $S^T$') - - else: - for i, sobolIndices in enumerate(total_sobol): - plt.plot(x, sobolIndices, label=par_names[i], - marker='x', lw=2.5) - plt.fill_between(x, q_5[i], q_97_5[i], alpha=0.15) - - plt.ylabel('Total Sobol indices, $S^T$') - plt.xlabel(xlabel) - - plt.title(f'Sensitivity analysis of {output}') - if plot_type != 'bar': - plt.legend(loc='best', frameon=True) - - # Save indices - np.savetxt(f'./{newpath}totalsobol_' + - output.replace('/', '_') + '.csv', - total_sobol.T, delimiter=',', - header=','.join(par_names), comments='') - - # save the current figure - fig.savefig( - f'./{newpath}Sobol_indices_{output}.pdf', - bbox_inches='tight' - ) - - # Destroy the current plot - plt.clf() - - return self.total_sobol - - # ------------------------------------------------------------------------- - def check_reg_quality(self, n_samples=1000, samples=None): - """ - Checks the quality of the metamodel for single output models based on: - https://towardsdatascience.com/how-do-you-check-the-quality-of-your-regression-model-in-python-fa61759ff685 - - - Parameters - ---------- - n_samples : int, optional - Number of parameter sets to use for the check. The default is 1000. - samples : array of shape (n_samples, n_params), optional - Parameter sets to use for the check. The default is None. - - Returns - ------- - None. - - """ - MetaModel = self.MetaModel - - if samples is None: - self.n_samples = n_samples - samples = self._get_sample() - else: - self.n_samples = samples.shape[0] - - # Evaluate the original and the surrogate model - y_val = self._eval_model(samples, key_str='valid') - y_pce_val, _ = MetaModel.eval_metamodel(samples=samples) - - # Open a pdf for the plots - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Fit the data(train the model) - for key in y_pce_val.keys(): - - y_pce_val_ = y_pce_val[key] - y_val_ = y_val[key] - residuals = y_val_ - y_pce_val_ - - # ------ Residuals vs. predicting variables ------ - # Check the assumptions of linearity and independence - fig1 = plt.figure() - for i, par in enumerate(self.engine.ExpDesign.par_names): - plt.title(f"{key}: Residuals vs. {par}") - plt.scatter( - x=samples[:, i], y=residuals, color='blue', edgecolor='k') - plt.grid(True) - xmin, xmax = min(samples[:, i]), max(samples[:, i]) - plt.hlines(y=0, xmin=xmin*0.9, xmax=xmax*1.1, color='red', - lw=3, linestyle='--') - plt.xlabel(par) - plt.ylabel('Residuals') - plt.show() - - # save the current figure - fig1.savefig(f'./{newpath}/Residuals_vs_Par_{i+1}.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Fitted vs. residuals ------ - # Check the assumptions of linearity and independence - fig2 = plt.figure() - plt.title(f"{key}: Residuals vs. fitted values") - plt.scatter(x=y_pce_val_, y=residuals, color='blue', edgecolor='k') - plt.grid(True) - xmin, xmax = min(y_val_), max(y_val_) - plt.hlines(y=0, xmin=xmin*0.9, xmax=xmax*1.1, color='red', lw=3, - linestyle='--') - plt.xlabel(key) - plt.ylabel('Residuals') - plt.show() - - # save the current figure - fig2.savefig(f'./{newpath}/Fitted_vs_Residuals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Histogram of normalized residuals ------ - fig3 = plt.figure() - resid_pearson = residuals / (max(residuals)-min(residuals)) - plt.hist(resid_pearson, bins=20, edgecolor='k') - plt.ylabel('Count') - plt.xlabel('Normalized residuals') - plt.title(f"{key}: Histogram of normalized residuals") - - # Normality (Shapiro-Wilk) test of the residuals - ax = plt.gca() - _, p = stats.shapiro(residuals) - if p < 0.01: - annText = "The residuals seem to come from a Gaussian Process." - else: - annText = "The normality assumption may not hold." - at = AnchoredText(annText, prop=dict(size=30), frameon=True, - loc='upper left') - at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") - ax.add_artist(at) - - plt.show() - - # save the current figure - fig3.savefig(f'./{newpath}/Hist_NormResiduals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Q-Q plot of the normalized residuals ------ - plt.figure() - stats.probplot(residuals[:, 0], plot=plt) - plt.xticks() - plt.yticks() - plt.xlabel("Theoretical quantiles") - plt.ylabel("Sample quantiles") - plt.title(f"{key}: Q-Q plot of normalized residuals") - plt.grid(True) - plt.show() - - # save the current figure - plt.savefig(f'./{newpath}/QQPlot_NormResiduals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------------------------------------------------------------------------- - def eval_pce_model_3d(self): - - self.n_samples = 1000 - - PCEModel = self.MetaModel - Model = self.ModelObj - n_samples = self.n_samples - - # Create 3D-Grid - # TODO: Make it general - x = np.linspace(-5, 10, n_samples) - y = np.linspace(0, 15, n_samples) - - X, Y = np.meshgrid(x, y) - PCE_Z = np.zeros((self.n_samples, self.n_samples)) - Model_Z = np.zeros((self.n_samples, self.n_samples)) - - for idxMesh in range(self.n_samples): - sample_mesh = np.vstack((X[:, idxMesh], Y[:, idxMesh])).T - - univ_p_val = PCEModel.univ_basis_vals(sample_mesh) - - for Outkey, ValuesDict in PCEModel.coeffs_dict.items(): - - pce_out_mean = np.zeros((len(sample_mesh), len(ValuesDict))) - pce_out_std = np.zeros((len(sample_mesh), len(ValuesDict))) - model_outs = np.zeros((len(sample_mesh), len(ValuesDict))) - - for Inkey, InIdxValues in ValuesDict.items(): - idx = int(Inkey.split('_')[1]) - 1 - basis_deg_ind = PCEModel.basis_dict[Outkey][Inkey] - clf_poly = PCEModel.clf_poly[Outkey][Inkey] - - PSI_Val = PCEModel.create_psi(basis_deg_ind, univ_p_val) - - # Perdiction with error bar - y_mean, y_std = clf_poly.predict(PSI_Val, return_std=True) - - pce_out_mean[:, idx] = y_mean - pce_out_std[:, idx] = y_std - - # Model evaluation - model_out_dict, _ = Model.run_model_parallel(sample_mesh, - key_str='Valid3D') - model_outs[:, idx] = model_out_dict[Outkey].T - - PCE_Z[:, idxMesh] = y_mean - Model_Z[:, idxMesh] = model_outs[:, 0] - - # ---------------- 3D plot for PCEModel ----------------------- - fig_PCE = plt.figure() - ax = plt.axes(projection='3d') - ax.plot_surface(X, Y, PCE_Z, rstride=1, cstride=1, - cmap='viridis', edgecolor='none') - ax.set_title('PCEModel') - ax.set_xlabel('$x_1$') - ax.set_ylabel('$x_2$') - ax.set_zlabel('$f(x_1,x_2)$') - - plt.grid() - plt.show() - - # Saving the figure - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # save the figure to file - fig_PCE.savefig(f'./{newpath}/3DPlot_PCEModel.pdf', - bbox_inches='tight') - plt.close(fig_PCE) - - # ---------------- 3D plot for Model ----------------------- - fig_Model = plt.figure() - ax = plt.axes(projection='3d') - ax.plot_surface(X, Y, PCE_Z, rstride=1, cstride=1, - cmap='viridis', edgecolor='none') - ax.set_title('Model') - ax.set_xlabel('$x_1$') - ax.set_ylabel('$x_2$') - ax.set_zlabel('$f(x_1,x_2)$') - - plt.grid() - plt.show() - - # Save the figure - fig_Model.savefig(f'./{newpath}/3DPlot_Model.pdf', - bbox_inches='tight') - plt.close(fig_Model) - - return - - # ------------------------------------------------------------------------- - def compute_pce_moments(self): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moments (mean) of outpust. - pce_means: dict - The first moments (mean) of outpust. - - """ - - MetaModel = self.MetaModel - outputs = self.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.inverse_transform(pce_mean) - stds[output] = np.sqrt(np.dot(pce_var, - PCA.components_**2)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - # Print a report table - print("\n>>>>> Moments of {} <<<<<".format(output)) - print("\nIndex | Mean | Std. deviation") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(pce_means[output], - pce_stds[output])))) - print('-'*40) - - return pce_means, pce_stds - - # ------------------------------------------------------------------------- - def _get_sample(self, n_samples=None): - """ - Generates random samples taken from the input parameter space. - - Returns - ------- - samples : array of shape (n_samples, n_params) - Generated samples. - - """ - if n_samples is None: - n_samples = self.n_samples - self.samples = self.ExpDesign.generate_samples( - n_samples, - sampling_method='random') - return self.samples - - # ------------------------------------------------------------------------- - def _eval_model(self, samples=None, key_str='Valid'): - """ - Evaluates Forward Model for the given number of self.samples or given - samples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate the model at. The default is None. - key_str : str, optional - Key string pass to the model. The default is 'Valid'. - - Returns - ------- - model_outs : dict - Dictionary of results. - - """ - Model = self.ModelObj - - if samples is None: - samples = self._get_sample() - self.samples = samples - else: - self.n_samples = len(samples) - - model_outs, _ = Model.run_model_parallel(samples, key_str=key_str) - - return model_outs - - # ------------------------------------------------------------------------- - def _plot_validation(self): - """ - Plots outputs for visual comparison of metamodel outputs with that of - the (full) original model. - - Returns - ------- - None. - - """ - PCEModel = self.MetaModel - - # get the samples - x_val = self.samples - y_pce_val = self.pce_out_mean - y_val = self.model_out_dict - - # Open a pdf for the plots - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - fig = plt.figure() - # Fit the data(train the model) - for key in y_pce_val.keys(): - - y_pce_val_ = y_pce_val[key] - y_val_ = y_val[key] - - regression_model = LinearRegression() - regression_model.fit(y_pce_val_, y_val_) - - # Predict - x_new = np.linspace(np.min(y_pce_val_), np.max(y_val_), 100) - y_predicted = regression_model.predict(x_new[:, np.newaxis]) - - plt.scatter(y_pce_val_, y_val_, color='gold', linewidth=2) - plt.plot(x_new, y_predicted, color='k') - - # Calculate the adjusted R_squared and RMSE - # the total number of explanatory variables in the model - # (not including the constant term) - length_list = [] - for key, value in PCEModel.coeffs_dict['b_1'][key].items(): - length_list.append(len(value)) - n_predictors = min(length_list) - n_samples = x_val.shape[0] - - R2 = r2_score(y_pce_val_, y_val_) - AdjR2 = 1 - (1 - R2) * (n_samples - 1) / \ - (n_samples - n_predictors - 1) - rmse = mean_squared_error(y_pce_val_, y_val_, squared=False) - - plt.annotate(f'RMSE = {rmse:.3f}\n Adjusted $R^2$ = {AdjR2:.3f}', - xy=(0.05, 0.85), xycoords='axes fraction') - - plt.ylabel("Original Model") - plt.xlabel("PCE Model") - plt.grid() - plt.show() - - # save the current figure - plot_name = key.replace(' ', '_') - fig.savefig(f'./{newpath}/Model_vs_PCEModel_{plot_name}.pdf', - bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - # ------------------------------------------------------------------------- - def _plot_validation_multi(self, x_values=[], x_axis="x [m]"): - """ - Plots outputs for visual comparison of metamodel outputs with that of - the (full) multioutput original model - - Parameters - ---------- - x_values : list or array, optional - List of x values. The default is []. - x_axis : str, optional - Label of the x axis. The default is "x [m]". - - Returns - ------- - None. - - """ - Model = self.ModelObj - - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # List of markers and colors - color = cycle((['b', 'g', 'r', 'y', 'k'])) - marker = cycle(('x', 'd', '+', 'o', '*')) - - fig = plt.figure() - # Plot the model vs PCE model - for keyIdx, key in enumerate(Model.Output.names): - - y_pce_val = self.pce_out_mean[key] - y_pce_val_std = self.pce_out_std[key] - y_val = self.model_out_dict[key] - try: - x = self.model_out_dict['x_values'][key] - except (TypeError, IndexError): - x = x_values - - for idx in range(y_val.shape[0]): - Color = next(color) - Marker = next(marker) - - plt.plot(x, y_val[idx], color=Color, marker=Marker, - label='$Y_{%s}^M$'%(idx+1)) - - plt.plot(x, y_pce_val[idx], color=Color, marker=Marker, - linestyle='--', - label='$Y_{%s}^{PCE}$'%(idx+1)) - plt.fill_between(x, y_pce_val[idx]-1.96*y_pce_val_std[idx], - y_pce_val[idx]+1.96*y_pce_val_std[idx], - color=Color, alpha=0.15) - - # Calculate the RMSE - rmse = mean_squared_error(y_pce_val, y_val, squared=False) - R2 = r2_score(y_pce_val[idx].reshape(-1, 1), - y_val[idx].reshape(-1, 1)) - - plt.annotate(f'RMSE = {rmse:.3f}\n $R^2$ = {R2:.3f}', - xy=(0.85, 0.1), xycoords='axes fraction') - - plt.ylabel(key) - plt.xlabel(x_axis) - plt.legend(loc='best') - plt.grid() - - # save the current figure - plot_name = key.replace(' ', '_') - fig.savefig(f'./{newpath}/Model_vs_PCEModel_{plot_name}.pdf', - bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - # Zip the subdirectories - Model.zip_subdirs(f'{Model.name}valid', f'{Model.name}valid_') diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__init__.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__init__.py deleted file mode 100644 index 4bd81739f..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .pylink import PyLinkForwardModel - -__all__ = [ - "PyLinkForwardModel" - ] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 5b7c1b3926506fb279b856f55ca6120df31b8888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYk0F>V4e5Jhb-0ThKMNZf#88|DHCrHFtcL7*rNjb*UKTFkDI?G5aaa;0rk<q9+~ z3k_eIKl*yo{BgbBGb6S7LlbEKHQ`Z$!W&H(kZGnlvYf9uXIkv|TIl49rLBKXFy-~@ zvih*ae(L;DdHw0MLEju$q)FXAR7mWW>yDHPQOaNDpNQY=yn?)lu!Zknd;q_98D>fa zcz4?}H$@CEvvFQ-V2bXzR562%s!aG%Xtj4IxEFwwwy;sk(V?ol<J{>I&7^rSw8>tC HNV=CRubV&? diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2ce3317406e07859bf08a42b738674e05d5c4339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmZ3^%ge<81T4a;sl`D0F^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%p@2%C%)D&3{G#&2q7>i!l+>IeW}uXxCi5+}g327A9GHKLJw84$Cnr9B zCBtWs4ZnPytztrpQ;UjYin8-FaxxMVi(_2!lS^|`^Gb?i+%ro&N|R#Ta`MXq5=$~- zk`gOZi^~#oGE<83D`Ft##>B^G=4F<|$LkeT{^GF7%}*)KNwq8D1ey+VT(KsQ_`uA_ g$oPScfl>VegBmgdim^(5U}oZGYhVY#B6gr^0M-CYtpET3 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 0bbb522855ad250ad55bca46123c0f5023076291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmYk0%}N6?6or$S`h(bw3*TWDDHL%dB0@zFtQ2HGN+6_7M#J1>hGbGZZhZw`!dGzX zTg=v#ui!@Sv>Pwn?{YYo!;!<`0l|6w_*8)Rs~7(#L2-#2juDC|3dGVmr9>r<be^d6 zo@9e>ie^T;qgi`vTzOsjXX(|nQW|_8aF?asZruWU8{O>*ApwMVCw>S04SwDxXFLzu z2kv!Qjk$_8uD4{?IPE2v7ulG~u|mrxdd+SoGj^3v^M{ksDPKebiY=`yHJ5b_+$?LZ z5zH36FiwKkAwm;Y<0sL7`RMpUwmPgZS@~+sw;j0<#+gQlQQda?=eAN2^hJtA!vJxZ GCcl4{ja-8O diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc deleted file mode 100644 index b6ae7c14b35b60388e38fcbd3af64d04771a947c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18654 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc deleted file mode 100644 index e430ff1341268f5ee1e872f5ce19d674ba50b8c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35406 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc deleted file mode 100644 index 746c82eb52be2e437c61bd201433f9d38b8ab177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18646 zcmbVUTWlQHd7j(u&R)1&Qg<bG#*Pzf6N$3bBuy1XwG&ybo0wKC#j#nr%i+$DoYiu6 zd1jU(H?u(+I*4P`iCPrBIc}*oK;u3XMH--JAKLVa0)1$ar()Wo0SXid(6kQ)`d}bY zzyCiov$IPolCv_;%$#%PKezw>|6_Y*rlR2Yoj?0)=ew(l@*nh&{~36A0)Ih>!ciQx zt8A!Cs!I1-S6kBfsxRq$HI@v%7M6;9EiIM!YA%_4EiYC0T3xE*s&{J}GfOiGtol;@ zXB5Y93NI^8!JXaJml}?CRcRK#hmn=08kZeAwA)=f2o~{F>f0jp>~5P{^S{G*cmjXH zAE0oRCDl<dOLa+i4ZznN9q@Ixu&eK?m?g$@3ZCK=>56~FHD!&SO35?Y=-=vL$8^ds zt5{FPslKdWJ(e@$)KOD*W}OCVD$blUk89OA<Q&Ge<{WX3;yU9TbB^O$cOG(1I`6<6 zv(7u62T;>+9(3M?>zq@-Iv<Ybuk3u%^KV@4iJP`?p6NMm*Z$6&qEsyWp0rkFy|qCN z){5sluBdR^wRJDB+IBYxtiTmpZeZE?&uXKibyL{=zAF|i?vy-PcDLKR8Cc=EYq{HQ zdk}g(-|DS0G#k~PaL&*M?^r=^HN<q>vq7)B<qGSjhgP584BEZEi?^(g**k9VyxsMj z=X%=<a!yZ%q3~7)p&KyJGue+HyI5x{+`;STtsoR!N2|Ps32`-`(&TcpcP+<VwFlkM z!eW;n?e7qbN0*a@iGk0{$sirH2CFA5+fP<(uXJ5&5P1F?wkmMDUF_G!hV47NL~G64 za{UaN=l2Jpwd!@<U?Ho#>b866-s|)3@vK${ew&^iUAAtnd+l``L@?NJ9W2HUlap&> z3M;OK8Oz}_c(#?kj&*xs==zu!PQeb{?v8~`x2-EX;W|z#XbZ0&%9;4~#`G>OQdP2p zj4iTff2Tz&nA-9LB)2duI^iBxyS&ifS;l5z9s!|8*h{AkOytv9el(r%qs!SUvLjpU zg*Z%FH=QJdPUh5?tKcDN!?{z^mO{+nZ482t1`fOpuiLd#Oiue*+%DX<=Wfw(u0=bx z;fAgVc+aqHLfAVQJd6{p+rYf#Q+_M3H~Ki!)0W@j*MjCUFvPKh8x908%C;Pj57ZVr z5-%`925P&tWp@WeZiEJdkZ^<t3y4@H3Z?b5{sebu>MdKW1vm);pTT?5aXi8vy9+RD zz#Bi5ka$_+O(UG2B!|zAmgN}->%inzipi72b(PvOESJYAsUHYBKGT%4GUDU;F$LuC zhiIwm1>?!nl*VL|U`rqPPuSn%lNnR(L9jy?X8~N7__+`MlUCN@?GGclA0b?}*(qKT zpX~1txh#*@2=WCLSj!h)@GdS}m{!}h)_YxW+-#$`a|SJkbYN4Sk3~z~B7p|W7E7+v z60Qe?CdNbO>JK(n05)O1!~`=~@|?$%>G}@66@Wau4mP{p9e~3xFNFQ>G9cmzB?Z{+ zaA0?{xs6FUp|SD)o#y4Z+e`+htz}6B1aN^nC0Jz-w(oWHgbTEZ=<0PnA{Ux>VEL}= z+y{CA4?%(0@=26^DicoJ=&f2iy#e+xSSOq!7D`(vCF0#NINJ&0p?(jq2oN54M%WWO z`-y3>=ex@|DQ4j9o)B)(2cw64VKmO5wFhWw`=NESCvMQejA3#g$q{(tT1@^}T)Itp zq4&vT>lhoRS$E1mLY!i<rTZ6}O(|u*`SI^}Xt|4W(!5qM-2qW=I-U*2v=ev<7fV(L zjDgNEb!?0KR*`gLTt0Od3Dd-3LRuueT<Q%(5411K`!;i$QJ-_pFz?OSG<Hh>Cq?h3 zq_%962wuv%Ph0N7+JdzWCeRb0F7Tg#SWoCdgi6^2QSD0H7B+MyVrev`3>*a00DOxz zC@BMI!(1EEKfk4<zA#?^5~i!+qk#%TqB4WWn_#cm=m$iV6ippdiOzd?H?b+j;YuDF zL?_;s;sG-ay;fiJ+HMe>w^n++F`M|zx{GB=$u1`@l`0ndnVi6^h)Hz2&_Pqg81waP z5h)_>lT_Elz)iS{-)i><n1$z0N|B5sTGXCMk_k-AW+3M&Cr1a6%qW}2cxIWz**Bvf zMebN<2Fu>Ey)J8wG_7PmT|3Be#;or(V(hsy+d#j8a7m&=jBST!R&1s$ut?%R&>i_y zStdcL3~~4wtQ1vAsVCHxXx;902OGrBpn3Q%(3c+%#60G38MwR_%}Zafp7o($PBCiM z={=~bPy4IDLcg72P`YB$eLQE1@ZZL|)3dS|4%5$%HPP|wlJe7uXA7QQK)WT})%!WL zjOAuieFjJ4p82>fx)45YvM<&toGzb4He?XuTwue2=C?dvT9cLuRdK<38g>Aww8=4B z%jx-oq2&%ZgC$QEvYAH7`UKMU$YH^95IR{iTR%LOv^FwmOh%An&=5gHlDUApc^hDS z4)~SSIi>0XCE7kCDGXFksMqfW;h79p!bVsn3Eh5z$iU?u;nSF02q_6iB@35?(_0Bz zr27JYCRJd5BpnzUM6yMxrt~9;DB0F*a`)I?%Y!zVQ4c>HNIMxk#?1*6lyvU5MLOx4 zGs?N|mFIB$9-ENO_kM8fo|}+COO9?I@67Cu4M|mR_ek$SQ1A^%Ldquc;}cZ2*bLTz z6qVt{LG(oIEzdu*<&&DiZ2bPPzYW*a#81c56Zi|xp-7!ppN6}Q+*WSE(JsJgwN!LV zxHtIT<og2Mlap-tz<%e^!n3T7T!PyyR^p;m!4~5JYaMZgB#zWeo8{PS@olRWS6VI5 z`~YpOxYlZI!jhmDS}jq;++rP?YdqU(**+9$W^DnQO4MYKaw|;SzNv^=T)22E{P_9n zpN5VYTo>+*-s9Jw_1#MX-j(Z@+~7vo>tDYLJ-W9>n%DKqa7&S<--5K1b=RRZ*<EO0 z&|HG8$JbjM_6-+`$@LX-Ix%60-u88Av?dogF5=2~@i#D)fF@tjYHCdtaH-LDumfpP z6!3JdeFSCtqkF3TIR1iLC?YjdT1up$RHFh)Ez(iyk%7{PiYN<F31u-dQI?`IN;8^4 zS&r%`E0NNvMzyFKRUGv-dbbv$wNvZVcM0}vG>ftkHBin)b13Jdd6b8uLnseNhfyAJ z6qH9D1;?!|Hg!G@-gw^f=CQb(dDUWrjx3&;@CLwTDjh&^IrBiom9fnm*X4a`X2)h~ z_Qhsup2ag08f09QI$W})a?4}A>-rKS%6?07jvy`*<6@~B&t|uh6UNnqdk{v(HLyuI zF(qon^ZBQwdrfwiT1i}N!>jT1rRI^?fERC79KwMKasrE^R2-v%PE;JH;sg~Zsdxv9 zcur0)XQN?!rW#2Z@l5h0iATJX-h6<Hhp2d%ig%-k&6K&v_4ICPal{(OR3RGtR;%Ut zUI;3~Q}7rHrBqZ8`e&#b{riDgsOQ`D;X4kX`xI)My!YvkFj~VOWA!7ranz9k%+_ug zd&+G^Sh&}3DDvLX&}IPB^u^29;BD8T2saDj6kdyUY)M?)@O*i-xB2S9NeK5yM)q=n zHR&#H3EN+De-&>B#2ysYP><tp_^tycpMN7Rz^m=8v}xYykJdr!;&ohCi8^V{j(S5A zpASJz9WB&%HE}Kkb#}B}6?cVBaS!y_(Qd0FZS#k?GaYT9isi7}sq9t5@?PyWsH<b% z)<!yd&qTVTJH~4o^-f>{2B2;c6t1m1g<bUvs{grU{36DeeP?<6Z}RxF82_8u__H*= z|4G0=Yy;zecWV5`{_*_>dHh*|f${$j@6G~-8P=T=jZa*uGuN3vq3j*Ht?V7Xt#po1 zNoSkx%Pm!Wn7Nn69P22p;cB{Xm^a#A;PzQ=KSpC*MXUtpZw|km$;;<l+X>G01^J|< z=9nYSvw6jYA~mEmXRq=x!jTQdE{PA2#C%SAS+ibAj39d^$#t2WxmgXp^`u4MSE+t% z>*ogG=G-XaL%^2Bx75>bQVhxM!jBB+@bHUQy5LCAX+>`fn9KTYZaoY|#!-lJ6O9zw zyp`(&&u<#$Ag4j<8nD{I))_YF*lPuK`<b!*cNt7>{90UK5%%NH=Gh##9E1HaXVW|$ z7a)OM0l9$42x(t!R}iy^4cdj+Adf+;^_{q!9S+2a=xwkz&s;IqdO>W^%44I`^ZdBD z=7#N?PHYMwPz!q#m!H~hyBszV?*VYhM<1j+RwPPLE&M^Z3uR-l5f`Q91iht&t&gjG zk<2w^Nk$td3C4uxGOIN-y7&YEoMK1~o<r^kUq`3lJPM^+Q;(_*wW1zISyxT1VvxFE z-qEyttyw&&r94<(hwnasjZKf!2B*q?#LqGw_60nE;=sWMijdR}4%RV1?GH*yO*s&1 zE{D)In5$i;J}Fm&W}x{WN}#A>D>OUhy-H~ARhh3T;43Qn*CLf7ps$f8qxnULbPwVm zMCr!xPct%mI$+P=X$uZl+d5cDho(DW;$<(d4g_pP0k_T>2Zy{at;U?OXs?3)tekZj z3ivx<<>iR>UaWyU7c$UDEMZanBsNie7)5i21+ut674N0ur>S^?ijPupk%}j&_!t!= zM#Lp5o}%J1il)YbPCQE$Q}{E-=bBeQ{t>+bQZ<xHMXdo@ia?`zMx%M$4<ET3a^!(b zU<awHBqmwH`M9BT?Wj0G;6<cDV^nt`gVvN0G)c4=mz0-Ig5T?Vg|OHu?Li0alq2Id zq@Aj4K0Iu&jHpDAilf436#t~5gw>sORiS@qLnM4ucv11S$CQX7(W-qE$eNw!bHw(U zJ+ccx`g^5XB)wMTgGvKt9wJ~A56j-pM_bdF9Xlp~Kf>J{zzvUx>pEhc1f9JN)F8ue zs2T&>=V#^k9@q)b0uH&X>%EZYS?Q)d&+*pmEkdNEMQVFlI5r2mSrg2s=#1hL7#j%y zvYEV%eosJ?V`V%pQqbLZrcsP^PS#E1@-+m%pMs4ennkHrHRP7IST|?&y_&0$U=0!; zaZ%P!qh?jI9A4XhVxWMOV5Meib<F@DI}ZJ^fookIK6p2jlz`hhy_ozcJ*133M#gX9 zCenyiodEL5WC}1RAkZZRNCcGwsQ8spA=Dz+sk_=&kB^E`aZiUjQu++iIt*~VU0qfD z#^Xxx$;TK0Rpmuop)47ZwyWX&<JYy3IVwk`y#masvQvB=s5~ldE;G~;pq^x?#i&FG zo`<_>0q)oHa5pVZt}yMF^C*28$rFUqz(Gg~a3f!85*J>0{37@kqoVKLgmR9Mu5=Yj zB$tsuAUSENW6UAcMStnzvq&5=2pNw6GT9rgzzy>#dL;`|XHc>XiLr-mY7R1dl)XR* zn~xpwY$Y*_6(ifR`{deVqhI>o=)G)GaKOoFW^r+Z#kn<TPK=bz7)c38J;>VbMQp^W zbKM2W!3lOp!jP2utN07Zz*+;td+G29i8~Ni>M`YYsG@J^zpQPtK{C`Xyzo5&@|Jp$ zN#IQ_))pR%Rd1RgDi_EhL7vWw^LXKZ@s2V)e*o?e`p_ud<h1457cO*r&?$q9xJiM; zs#qKvk1c$_jn$jYQe5CXg1ErOO>7_;#*Ymm!dM@A{kQ~0nF7agfwDQ=W<}C@eezJ_ za&{DPVX?P*#f}e=<GB^~fHSseueWFdu}OLjvjv0h<TEM4aecBoJ9_MmV0t$W9k5Ce zo)XN{zRXqBdCi1><h}a5I<ME%;d}3Iqb8U|YMT)Q35F;_We-P4WEyIFU>LX6FN4&- zq^zoBU%hNbAoyKKG_kPhY*HWOU`6Wd${S><>9E3zH*}$d$j90x7)8g7bf81|4YVD_ zn~-nx7P7Kvj7Zrt+43PosoI|cW{uG_Nf65AJEd6?oa$q(>@dy3L5>jEIJPVsSuTyK z2hQg9y4$`12_*BBB;!nIZ{0>F%8Cn-w&waSrSCY9cnDonq6x8zP7k3~Zyexs$U9C9 z28;zqFA%?%IVCwc$ifnydXTal>{QT%`x)Q_!r|`eY@rN;Qo0bxq`}fvazrslh#5VP z=WzfBO5dIg%Uk$e18nv$Wg}qMu&y*xINmKe-<*#HJcn>Pn=*l0By%pwPsr_N%D1w< z_hL6=Eg^M19mwHe0Z`J99BGQvU7Zf-<{9_*2)AQ(VIK>l`kx@YCtVN>tUiLC_KLEl zJP#_{)W~o5rn<;f2?g^P2#Vo$-3?f!1)}JLVA(HJzCf6>-4_=>0tyv2Iu9Q|fF9uo zO>=#63@d$iSXel_uyB?+?yy>U1|eU2&9xpsKdhI5j%-%ZmOnZ?_b4UR*_Pk)&kSAB zlWmNwK8K1B_~ZaLw0NY=Z3I?js4XnOZ){MY9GtN0x_#Dm;u0M#G9d)Hv*Kc~1DxH6 z3w?nwFZ?;{)U<@A)OIT+C?=ZJzjQ^$rsMhj2Prw)4!TL_QZ={yhl!JsUr#w!f$n`& zHS~sR;$KbG?wEQ-H?@P+p79P&c$sQ|l<DAq1>li-T_3?aG%`Zc$DxbwYJo*}Yh*>K zT&r^}*<m`@>d?{QFYb_9v^XMrtGK0zC8$IOaYaXi8dZ!6P;{t9M~!hpiHu`Vm5BF| z=zBvurev+f6Us4#wfZLjwYb0Ms1%ku<{p%%+iLLVVQH@-m84`2jZrbI?$zM2F5T9E zm4Ac!8K(qK)PHk5o@5K&tjjk;c&0n>db4V_AXPK0!`xEfHF_j6b1O0NR)bVFf_+Qf zg#T@C4*qhDo`>fEXMPX<><&0TRtW|11lgsPsFKuTb*M#2wXjnjNi3ARyeBP|5Wexw zkzMtc8vG%~KT7s)>j*|Z7LnKec;^J5Rii5Tvg~Vli6F!7Ny4VphTtZa84OmkG@dN( z%b7k1-2>s6Pa|W@lk7F)OTJ4f72~`oFhkZa$H1fp$$A(u<_)BMfZ4;wCZ;bLb_R_Y zx0E~yb-ZoHy}b>-7Y>l!m;og=i!3^-OOnSZvdZcQrAv}tcbd{H(`=R`4}<1?!$l@A z5_;d3jh?XagA~k!@4o+WX2L5|4ERaxGUaTtLk$8i5zPranlK6JspxPTMu+`5v0~cF zaV8KghHA#kBx{p{OIRQh=qRs_dr+?=@n;`Ao?Y%p-crwg?+$)LgHq?1;l^r9{5+V* zV)LZ*MR4Syjv5X`fMxc(UMQ|n1sQ5%Q!y^O+hCzVY*MHT_!EGOt|LXe3-*ar#d9)# z@r(4*I*Pc6^bAN(5mF6@Iy|~#M+aM+?AiDt)v@hLd<}N&DO_T0dpkDUtv>v87_mqk z)$he6oOcW7Ehuyrmps2kL7}(=)s_8v<t$Pp7gHsjHs#|l(m+#glLi5XLzoiVS(kc- z_%$tFIaGnR3D1dI(G0Buj$MZX4t^B;nZ|Ld*DEk#D{5UQ*Bq{DL$B!?uEjeBG}huB z6MhzYVn}*JJJ=yNH3MmgkR6}?C~`!5!`ka_fK`B}LpL22J(#cHCF-7*#2HS9I(zpK z0YE)?<A{7NMfmjLX#y7_Ewt>Dr>+P?w&>_LwBWhO2wt6l5`tH%tExxxr2KXDE9$7? zgPVb8vmAIuiS$*-1l0Z$dQ^j7iwyAGCBUzN$Esib2KZWjR&i9_n+fZYnTN?9KkbWJ zINNEgLf(KI*8FqfT%@uV4u1Qx8O}#VX~IV&w~B{hq>p9@8sJx=8G0uwVC-{FiS+L` zv{5}g6dvvzMohC9)gALS@*!0al{ggD=nh7?mKpo=k3$*+SMp|g2oBvj+Brs}zVtOn zmDw+=;qj;vp4g>m#H-=#-pQ!)3fv4>f5U$tw;kfPZ($`Tzl42r;2MAhQ6UQgb?<O0 zh}Sgm<~#BC0RA3~8n;=>I#|DB@aomk9QwWsv939M`%!&OAI+nu#dVFe?zS40UQsWQ z3|j>b%<bYlZs@l(ob5vn)(1=EA!jDJ)(O@LWfwATUu(J|4Klyt%tF4EoY@PIY~jOB z!<l<ok+X;N(!}S`0}^rE3z+b3z%C&ktiPh%F2KGiMf0oVtDUzWf%`aPOV5#Q!(^4` zYix6D^hvV|k#uLBN-`IkiC#Cw1~X{jz2J`_zW$KRkoYa7`{nrEecBEQTRBhx-=BFu zo&e<3$9wofrJX39%$%%KshgMtRdZ}!ARx7c9cV4~Fc8?->Ew%yTn02rzANbF^^i{p zR+J=NL-s<wr63UR1-y~S&%-xG$nglgHJ^44A!Vcq!+@KZ-8IODd>+VSNk$`$ldw+A z1q}2qb3q8pmEUk64<Zq)tZZ;FNUj>w4E84-J&G@0vZ>&3We(?EhIxjvJ;#ps{m^pB zm^5{K-?P#S+#d<^dG6zd2jopB(6Z^>%Txnar3M(*LGh*RRhkVpX&iVXe;cxNWhe-! zK<T+KEczViBK)vCr^&h*pe7b_lA}qm==T(5<dPzjC=O&|k9}W^0SA2-0!y)(+jEw5 zQ;0n=?N75a$-yZ1!eH_V*g1-|oF0@)#J(orrS>#5(>AG?s|bwkNI$}a>PFa#4Ab5g zA!`N!exgLfU1W7cN<9eQ><2l=u_%&$>@sHeTWti}HG=a^y4`Z}{3Y~5MnGjucCwKS zSFw!ZUjSX2tUq-Zla*N&I~kd;9N=mj9tA~HNQkI{l!k=8HMO`9BJZe+cqAxjpAk+$ zwS5aAGyKH9g=9uJWqe^l`WCc0R$H=_d_P?YnhOqnmj+|qu%VsBYGru%eFyx8k5z~{ ztkU7%oKUaH0c?$3L&;H{uf%4mxgNNh04oY8bp<Yk20}nMln~*cu~R|ZL?af%0WXel z(Fx@ajF<CS)TuaXc`zS-y9blH6q=8ScM){jWAPCxo}=O_6`XGK0Pc|BGs$@3GBT#2 z9}fIb=HvW2^(R+vY+Rv$vVr{5z979T)_kdF(k`=lD_rVKiZh%Io6bgDc43&XTTQC7 z6fz#KJ}%j?!eBharPXfF4nOpPxH#}Vuy*7#i8Vx;1pF0V;M)jHBO3sgPh7D>$^{5p z=N$2Q8c4VOop>G^FbslL&Qxd~l99n%G~{nm@hj9_Bi%S*o^b^(nN**y=2%>8UQQ^H z6NuuOHPIXNk&Dd6N38Z^lXd}tZ2=s^*J0vyf{pwD(emQbvmDn6;?knM*z%n1xR&Qc zeB3|+p3@sNF*@~l9zuk&`P^<sZNEi|H(3gbWx`2P*X9dwm}o^P;ZVFOQgo+Cac{)9 z5eL6h)D2wCA5zaEl<x}MDHZ*cei({(1Am8A<4#d~7?CAIt>393JBgew2CL?{lTe|s z8*1f_VGQ4MUx?S9*2=R0)H-k^g6{;mHpd-`TvKpBe?uP?{klW>KG}1qcHnW2iqIcR zp+O!NrvN?Hj7q`R5JT6<&j7u#1daVwcri=|9+OcyMCM+n(y6ju`XKbu3Uur;;^tNP zMpT7{X1+$glXZVSGCMUVfhBA6@842i>Lw6M!Qb&1<)}*j8))Fr()VVZ>=}NK3gr(a zYx`kT1LSICkgkmgZ8oYeh93*-d$SR~MvkgjdyV^$Cq;$EK2`fs1$`UHLu3f6<WsN1 zukudBf9GzgJ4l{NBEWz@swWX(8hM61ORU#prE+f2%70tVj_;^fegFJ6zcIX=%nZ3i zn7uKYmGh0D{Z7m=Y5$RP)OL7=m;<k1Vvdbubh19^JiZauJM)yohA*_|pw~B|(k(6c zFz@^PZPhn<$8k4;Pl|RMI`^x|is)`m?l{)1CTDqw0-NZm-_pf(ZpVtz-jMD7cZMHw z4#`<etrD1#wj}GDk6?Wz`+uDGU)%ZTWd9r4x@Zm)dk=dmHwTP&_^#t6Eq5JH-}%`C z$HPA6&f28hG5R7OR>l#T92-}j+U_G)7aDO3F6DJ+^@DNwdHVR{svEXq)fT@CZZa&V zV(cuWr9qLYq4CtE7p40d9GCJOhn2G&kA&9Sip#m%MGm%7kNR1<A2-cRJc{2Twx&OI z>4o78iZQg|96e6-Z629&tcX|XWn=w={T=ZF-;zk@tdO`S{eLZH%7Xsa0b}73*ONwC z6vTL}BknJLpCA;Zs3~s2UTWWn%}=;H9Ml(oL=Z?+!e`TkPCX$x{)8I;f(jBJ%(P>Z z_LU=h6}oG&4@mS0LTyd-Tj}mnI+S?Y*%rj*V*^buA|asbV5`O75;S%ueLHP@AwG=8 zoHccYjj3t%;E&P22K69_aHAL|czYeLmm2uC%zYxcP%-B9qmU42Lq^m|O;b-I(d8)Q zMjgRJIBm!k1IG+yPo?!o;f6m6DKSsd1#RTMsqqs99P8>-jeekn*e{4DqK=f$O%j6r zHWwk^C^H6s@YL_A@Wd2wMMA=D@-=(_Ui{*yL~;O6kBrLDa?9|^p9<lZ-ZS8>hW8pi zY2?yG98=spwRtkq(f8*@Rfbb#IOj7sCfeRNswM9iqZ-}^4I`4NMl*Zx?n^&^;<xW_ zu54ZlOOXN2qJy)j;ykjn%H;7OuRq?cNA<75^BqxEPkl5S)!`39-Y7WS-@~g?%)Ba; zLh)aDp9=ePN{$JCj<Q#!_(GDDL692ojMU)Ifk%XW^Yh3bEwcv${tL*F${Wa(1>F}Z zaytA$W<M->eb`AbsmMO!FjZ<kk#b9wu&7Sq16T(ZdG^-*`3K<I<Sc7xDrYalRI@In zU*~fCZ*1|B`L;h4396$RP}o+6%*krVP3K;Q=yZz07LaLdEy1aaaK31xa`8YFos?l# z(b;l>l1`Qra0=-#)7DdBba2)gYzZCfnX)-<WlH+F19T-!1fNDwgd)fV{IU!MaT`+^ zHfg?mSg<z&8Htu0%$YDEAF4EGrQ4Yt#IbSH?%v4d!;yDZe3=U7V<iA({#07>`j-)~ z6dh{&92LKW0?y-&P`EB@(9JpNUN+M+7XL<F_>t2Y<ku(UOopGEI<a5b5WQX)SMki> zW+TQTD2o7TyD2{4vladf{|cp-CLI}xM2`oc8FHIRTSZUIL*=sAy8Bo3OX7#rCE3jt zVt$XINtrXC7MoyarbfQ#x^9vJ3|94^4$re%MD6>u<J87~2SychfSW4kA2$uQyye#> z*P8Q!7?z;qDp5rdms%~S*GBpn=7Fv3t#q&h{8@!KOPxMQ#T6<(MFj;=rN5uu`fN}A zCDjol7vHCX7dtK*R7d79am!!<1=RExHFds_|J=ZMtMYEMRQZ5;%sgp6Y`))o2Fk#l ziZGw&cbjwAa|l8He;MF#XtEN62m{1Fpg@}LU;_e{#G@c-BL1Cf@%0hDhzw*h=I>Dr te}odk`U}|b6K_)A|Dl3rdC>G@^8#!ce3^8SIX&5%HJriZKP2qx{|_sWajgIV diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/pylink.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/pylink.py deleted file mode 100644 index 11cc11c49..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/pylink/pylink.py +++ /dev/null @@ -1,799 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -from dataclasses import dataclass - -import os -import shutil -import h5py -import numpy as np -import time -import zipfile -import pandas as pd -import multiprocessing -from functools import partial -import tqdm - -import umbridge # TODO: add this to the imports!? -#from multiprocessing import get_context -from multiprocess import get_context - - - -def within_range(out, minout, maxout): - """ - Checks if all the values in out lie between minout and maxout - - Parameters - ---------- - out : array or list - Data to check against range - minout : int - Lower bound of the range - maxout : int - Upper bound of the range - - Returns - ------- - inside : bool - True if all values in out are in the specified range - - """ - try: - out = np.array(out) - except: - raise AttributeError('The given values should be a 1D array, but are not') - if out.ndim != 1: - raise AttributeError('The given values should be a 1D array, but are not') - - if minout > maxout: - raise ValueError('The lower and upper bounds do not form a valid range, they might be switched') - - inside = False - if (out > minout).all() and (out < maxout).all(): - inside = True - return inside - - -class PyLinkForwardModel(object): - """ - A forward model binder - - This calss serves as a code wrapper. This wrapper allows the execution of - a third-party software/solver within the scope of BayesValidRox. - - Attributes - ---------- - link_type : str - The type of the wrapper. The default is `'pylink'`. This runs the - third-party software or an executable using a shell command with given - input files. - Second option is `'function'` which assumed that model can be run using - a function written separately in a Python script. - name : str - Name of the model. - py_file : str - Python file name without `.py` extension to be run for the `'function'` - wrapper. Note that the name of the python file and that of the function - must be simillar. This function must recieve the parameters in an array - of shape `(n_samples, n_params)` and returns a dictionary with the - x_values and output arrays for given output names. - func_args : dict - Additional arguments for the python file. The default is `{}`. - shell_command : str - Shell command to be executed for the `'pylink'` wrapper. - input_file : str or list - The input file to be passed to the `'pylink'` wrapper. - input_template : str or list - A template input file to be passed to the `'pylink'` wrapper. This file - must be a copy of `input_file` with `<Xi>` place holder for the input - parameters defined using `inputs` class, with i being the number of - parameter. The file name ending should include `.tpl` before the actual - extension of the input file, for example, `params.tpl.input`. - aux_file : str or list - The list of auxiliary files needed for the `'pylink'` wrapper. - exe_path : str - Execution path if you wish to run the model for the `'pylink'` wrapper - in another directory. The default is `None`, which corresponds to the - currecnt working directory. - output_file_names : list of str - List of the name of the model output text files for the `'pylink'` - wrapper. - output_names : list of str - List of the model outputs to be used for the analysis. - output_parser : str - Name of the model parser file (without `.py` extension) that recieves - the `output_file_names` and returns a 2d-array with the first row being - the x_values, e.g. x coordinates or time and the rest of raws pass the - simulation output for each model output defined in `output_names`. Note - that again here the name of the file and that of the function must be - the same. - multi_process: bool - Whether the model runs to be executed in parallel for the `'pylink'` - wrapper. The default is `True`. - n_cpus: int - The number of cpus to be used for the parallel model execution for the - `'pylink'` wrapper. The default is `None`, which corresponds to all - available cpus. - meas_file : str - The name of the measurement text-based file. This file must contain - x_values as the first column and one column for each model output. The - default is `None`. Only needed for the Bayesian Inference. - meas_file_valid : str - The name of the measurement text-based file for the validation. The - default is `None`. Only needed for the validation with Bayesian - Inference. - mc_ref_file : str - The name of the text file for the Monte-Carlo reference (mean and - standard deviation) values. It must contain `x_values` as the first - column, `mean` as the second column and `std` as the third. It can be - used to compare the estimated moments using meta-model in the post- - processing step. This is only available for one output. - obs_dict : dict - A dictionary containing the measurement text-based file. It must - contain `x_values` as the first item and one item for each model output - . The default is `{}`. Only needed for the Bayesian Inference. - obs_dict_valid : dict - A dictionary containing the validation measurement text-based file. It - must contain `x_values` as the first item and one item for each model - output. The default is `{}`. - mc_ref_dict : dict - A dictionary containing the Monte-Carlo reference (mean and standard - deviation) values. It must contain `x_values` as the first item and - `mean` as the second item and `std` as the third. The default is `{}`. - This is only available for one output. - """ - - # Nested class - @dataclass - class OutputData(object): - parser: str = "" - names: list = None - file_names: list = None - - def __init__(self, link_type='pylink', name=None, py_file=None, - func_args={}, shell_command='', input_file=None, - input_template=None, aux_file=None, exe_path='', - output_file_names=[], output_names=[], output_parser='', - multi_process=True, n_cpus=None, meas_file=None, - meas_file_valid=None, mc_ref_file=None, obs_dict={}, - obs_dict_valid={}, mc_ref_dict={}): - self.link_type = link_type - self.name = name - self.shell_command = shell_command - self.py_file = py_file - self.func_args = func_args - self.input_file = input_file - self.input_template = input_template - self.aux_file = aux_file - self.exe_path = exe_path - self.multi_process = multi_process - self.n_cpus = n_cpus - self.Output = self.OutputData( - parser=output_parser, - names=output_names, - file_names=output_file_names, - ) - self.n_outputs = len(self.Output.names) - self.meas_file = meas_file - self.meas_file_valid = meas_file_valid - self.mc_ref_file = mc_ref_file - self.observations = obs_dict - self.observations_valid = obs_dict_valid - self.mc_reference = mc_ref_dict - - # ------------------------------------------------------------------------- - def read_observation(self, case='calib'): - """ - Reads/prepare the observation/measurement data for - calibration. - - Parameters - ---------- - case : str - The type of observation to read in. Can be either 'calib', - 'valid' or 'mc_ref' - - Returns - ------- - DataFrame - A dataframe with the calibration data. - - """ - # TOOD: check that what is read in/transformed matches the expected form of data/reference - if case.lower() == 'calib': - if isinstance(self.observations, dict) and bool(self.observations): - self.observations = pd.DataFrame.from_dict(self.observations) - elif self.meas_file is not None: - file_path = os.path.join(os.getcwd(), self.meas_file) - self.observations = pd.read_csv(file_path, delimiter=',') - elif isinstance(self.observations, pd.DataFrame): - self.observations = self.observations - else: - raise Exception("Please provide the observation data as a " - "dictionary via observations attribute or pass" - " the csv-file path to MeasurementFile " - "attribute") - # Compute the number of observation - self.n_obs = self.observations[self.Output.names].notnull().sum().values.sum() - return self.observations - - elif case.lower() == 'valid': - if isinstance(self.observations_valid, dict) and \ - bool(self.observations_valid): - self.observations_valid = pd.DataFrame.from_dict(self.observations_valid) - elif self.meas_file_valid is not None: - file_path = os.path.join(os.getcwd(), self.meas_file_valid) - self.observations_valid = pd.read_csv(file_path, delimiter=',') - elif isinstance(self.observations_valid, pd.DataFrame): - self.observations_valid = self.observations_valid - else: - raise Exception("Please provide the observation data as a " - "dictionary via observations attribute or pass" - " the csv-file path to MeasurementFile " - "attribute") - # Compute the number of observation - self.n_obs_valid = self.observations_valid[self.Output.names].notnull().sum().values.sum() - return self.observations_valid - - elif case.lower() == 'mc_ref': - if self.mc_ref_file is None and \ - isinstance(self.mc_reference, pd.DataFrame): - return self.mc_reference - elif isinstance(self.mc_reference, dict) and bool(self.mc_reference): - self.mc_reference = pd.DataFrame.from_dict(self.mc_reference) - elif self.mc_ref_file is not None: - file_path = os.path.join(os.getcwd(), self.mc_ref_file) - self.mc_reference = pd.read_csv(file_path, delimiter=',') - else: - self.mc_reference = None - return self.mc_reference - - - # ------------------------------------------------------------------------- - def read_output(self): - """ - Reads the the parser output file and returns it as an - executable function. It is required when the models returns the - simulation outputs in csv files. - - Returns - ------- - Output : func - Output parser function. - - """ - output_func_name = self.Output.parser - - output_func = getattr(__import__(output_func_name), output_func_name) - - file_names = [] - for File in self.Output.file_names: - file_names.append(os.path.join(self.exe_path, File)) - try: - output = output_func(self.name, file_names) - except TypeError: - output = output_func(file_names) - return output - - # ------------------------------------------------------------------------- - def update_input_params(self, new_input_file, param_set): - """ - Finds this pattern with <X1> in the new_input_file and replace it with - the new value from the array param_sets. - - Parameters - ---------- - new_input_file : list - List of the input files with the adapted names. - param_set : array of shape (n_params) - Parameter set. - - Returns - ------- - None. - - """ - NofPa = param_set.shape[0] - text_to_search_list = [f'<X{i+1}>' for i in range(NofPa)] - - for filename in new_input_file: - # Read in the file - with open(filename, 'r') as file: - filedata = file.read() - - # Replace the target string - for text_to_search, params in zip(text_to_search_list, param_set): - filedata = filedata.replace(text_to_search, f'{params:0.4e}') - - # Write the file out again - with open(filename, 'w') as file: - file.write(filedata) - - # ------------------------------------------------------------------------- - def run_command(self, command, output_file_names): - """ - Runs the execution command given by the user to run the given model. - It checks if the output files have been generated. If yes, the jobe is - done and it extracts and returns the requested output(s). Otherwise, - it executes the command again. - - Parameters - ---------- - command : str - The shell command to be executed. - output_file_names : list - Name of the output file names. - - Returns - ------- - simulation_outputs : array of shape (n_obs, n_outputs) - Simulation outputs. - - """ - - # Check if simulation is finished - while True: - time.sleep(3) - files = os.listdir(".") - if all(elem in files for elem in output_file_names): - break - else: - # Run command - Process = os.system(f'./../{command}') - if Process != 0: - print('\nMessage 1:') - print(f'\tIf the value of \'{Process}\' is a non-zero value' - ', then compilation problems occur \n' % Process) - os.chdir("..") - - # Read the output - simulation_outputs = self.read_output() - - return simulation_outputs - - # ------------------------------------------------------------------------- - def run_forwardmodel(self, xx): - """ - This function creates subdirectory for the current run and copies the - necessary files to this directory and renames them. Next, it executes - the given command. - - Parameters - ---------- - xx : tuple - A tuple including parameter set, simulation number and key string. - - Returns - ------- - output : array of shape (n_outputs+1, n_obs) - An array passed by the output paraser containing the x_values as - the first row and the simulations results stored in the the rest of - the array. - - """ - c_points, run_no, key_str = xx - - # Handle if only one imput file is provided - if not isinstance(self.input_template, list): - self.input_template = [self.input_template] - if not isinstance(self.input_file, list): - self.input_file = [self.input_file] - - new_input_file = [] - # Loop over the InputTemplates: - for in_temp in self.input_template: - if '/' in in_temp: - in_temp = in_temp.split('/')[-1] - new_input_file.append(in_temp.split('.tpl')[0] + key_str + - f"_{run_no+1}" + in_temp.split('.tpl')[1]) - - # Create directories - newpath = self.name + key_str + f'_{run_no+1}' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Copy the necessary files to the directories - for in_temp in self.input_template: - # Input file(s) of the model - shutil.copy2(in_temp, newpath) - # Auxiliary file - if self.aux_file is not None: - shutil.copy2(self.aux_file, newpath) # Auxiliary file - - # Rename the Inputfile and/or auxiliary file - os.chdir(newpath) - for input_tem, input_file in zip(self.input_template, new_input_file): - if '/' in input_tem: - input_tem = input_tem.split('/')[-1] - os.rename(input_tem, input_file) - - # Update the parametrs in Input file - self.update_input_params(new_input_file, c_points) - - # Update the user defined command and the execution path - try: - new_command = self.shell_command.replace(self.input_file[0], - new_input_file[0]) - new_command = new_command.replace(self.input_file[1], - new_input_file[1]) - except: - new_command = self.shell_command.replace(self.input_file[0], - new_input_file[0]) - # Set the exe path if not provided - if not bool(self.exe_path): - self.exe_path = os.getcwd() - - # Run the model - print(new_command) - output = self.run_command(new_command, self.Output.file_names) - - return output - - # ------------------------------------------------------------------------- - def run_model_parallel(self, c_points, prevRun_No=0, key_str='', - mp=True, verbose=True): - """ - Runs model simulations. If mp is true (default), then the simulations - are started in parallel. - - Parameters - ---------- - c_points : array of shape (n_samples, n_params) - Collocation points (training set). - prevRun_No : int, optional - Previous run number, in case the sequential design is selected. - The default is `0`. - key_str : str, optional - A descriptive string for validation runs. The default is `''`. - mp : bool, optional - Multiprocessing. The default is `True`. - verbose: bool, optional - Verbosity. The default is `True`. - - Returns - ------- - all_outputs : dict - A dictionary with x values (time step or point id) and all outputs. - Each key contains an array of the shape `(n_samples, n_obs)`. - new_c_points : array - Updated collocation points (training set). If a simulation does not - executed successfully, the parameter set is removed. - - """ - - # Initilization - n_c_points = len(c_points) - all_outputs = {} - - # TODO: if umbridge, just run, no parallel from here - # If the link type is UM-Bridge, then no parallel needs to be started from here - if self.link_type.lower() == 'umbridge': - Function = self.uMBridge_model - # For now just do same as usual - self.link_type = 'function' - - # Extract the function - if self.link_type.lower() == 'function': - # Prepare the function - Function = getattr(__import__(self.py_file), self.py_file) - # --------------------------------------------------------------- - # -------------- Multiprocessing with Pool Class ---------------- - # --------------------------------------------------------------- - # Start a pool with the number of CPUs - if self.n_cpus is None: - n_cpus = multiprocessing.cpu_count() - else: - n_cpus = self.n_cpus - - # Run forward model - if n_c_points == 1 or not mp: - if n_c_points== 1: - if self.link_type.lower() == 'function': - group_results = Function(c_points, **self.func_args) - else: - group_results = self.run_forwardmodel( - (c_points[0], prevRun_No, key_str) - ) - else: - for i in range(c_points.shape[0]): - if i == 0: - if self.link_type.lower() == 'function': - group_results = Function(np.array([c_points[0]]), **self.func_args) - else: - group_results = self.run_forwardmodel( - (c_points[0], prevRun_No, key_str) - ) - for key in group_results: - if key != 'x_values': - group_results[key] = [group_results[key]] - else: - if self.link_type.lower() == 'function': - res = Function(np.array([c_points[i]]), **self.func_args) - else: - res = self.run_forwardmodel( - (c_points[i], prevRun_No, key_str) - ) - for key in res: - if key != 'x_values': - group_results[key].append(res[key]) - - for key in group_results: - if key != 'x_values': - group_results[key]= np.array(group_results[key]) - - elif self.multi_process or mp: - with get_context('spawn').Pool(n_cpus) as p: - #with multiprocessing.Pool(n_cpus) as p: - - if self.link_type.lower() == 'function': - imap_var = p.imap(partial(Function, **self.func_args), - c_points[:, np.newaxis]) - else: - args = zip(c_points, - [prevRun_No+i for i in range(n_c_points)], - [key_str]*n_c_points) - imap_var = p.imap(self.run_forwardmodel, args) - - if verbose: - desc = f'Running forward model {key_str}' - group_results = list(tqdm.tqdm(imap_var, total=n_c_points, - desc=desc)) - else: - group_results = list(imap_var) - - # Check for NaN - for var_i, var in enumerate(self.Output.names): - # If results are given as one dictionary - if isinstance(group_results, dict): - Outputs = np.asarray(group_results[var]) - # If results are given as list of dictionaries - elif isinstance(group_results, list): - Outputs = np.asarray([item[var] for item in group_results], - dtype=np.float64) - NaN_idx = np.unique(np.argwhere(np.isnan(Outputs))[:, 0]) - new_c_points = np.delete(c_points, NaN_idx, axis=0) - all_outputs[var] = np.atleast_2d( - np.delete(Outputs, NaN_idx, axis=0) - ) - - # Print the collocation points whose simulations crashed - if len(NaN_idx) != 0: - print('\n') - print('*'*20) - print("\nThe following parameter sets have been removed:\n", - c_points[NaN_idx]) - print("\n") - print('*'*20) - - # Save time steps or x-values - if isinstance(group_results, dict): - all_outputs["x_values"] = group_results["x_values"] - elif any(isinstance(i, dict) for i in group_results): - all_outputs["x_values"] = group_results[0]["x_values"] - - # Store simulations in a hdf5 file - self._store_simulations( - c_points, all_outputs, NaN_idx, key_str, prevRun_No - ) - - return all_outputs, new_c_points - - def uMBridge_model(self, params): - """ - Function that calls a UMBridge model and transforms its output into the - shape expected for the surrogate. - - Parameters - ---------- - params : 2d np.array, shape (#samples, #params) - The parameter values for which the model is run. - - Returns - ------- - dict - The transformed model outputs. - - """ - # Init model - #model = umbridge.HTTPModel('http://localhost:4242', 'forward') - model = umbridge.HTTPModel(self.host, 'forward') # TODO: is this always forward? - - # Run the model - #out = np.array(model(np.ndarray.tolist(params), {'level':0})) - out = np.array(model(np.ndarray.tolist(params), self.modelparams)) - - # Sort into dict - out_dict = {} - cnt = 0 - for key in self.Output.names: - # If needed resort into single-value outputs - if self.output_type == 'single-valued': - if out[:,cnt].shape[1] >1: # TODO: this doesn't fully seem correct?? - for i in range(out[:,key]): - new_key = key+str(i) - if new_key not in self.Output.names: - self.Output.names.append(new_key) - if i == 0: - self.Ouptut.names.remove(key) - out_dict[new_key] = out[:,cnt,i] # TODO: not sure about this, need to test - else: - out_dict[key] = out[:,cnt] - - - else: - out_dict[key] = out[:,cnt] - cnt += 1 - - - # TODO: how to deal with the x-values? - if self.output_type == 'single-valued': - out_dict['x_values'] = [0] - else: - out_dict['x_values'] = np.arange(0,out[:,0].shape[0],1) - - #return {'T1':out[:,0], 'T2':out[:,1], 'H1':out[:,2], 'H2':out[:,3], - # 'x_values':[0]} - return out_dict - - # ------------------------------------------------------------------------- - def _store_simulations(self, c_points, all_outputs, NaN_idx, key_str, - prevRun_No): - """ - - - Parameters - ---------- - c_points : TYPE - DESCRIPTION. - all_outputs : TYPE - DESCRIPTION. - NaN_idx : TYPE - DESCRIPTION. - key_str : TYPE - DESCRIPTION. - prevRun_No : TYPE - DESCRIPTION. - - Returns - ------- - None. - - """ - - # Create hdf5 metadata - if key_str == '': - hdf5file = f'ExpDesign_{self.name}.hdf5' - else: - hdf5file = f'ValidSet_{self.name}.hdf5' - hdf5_exist = os.path.exists(hdf5file) - file = h5py.File(hdf5file, 'a') - - # ---------- Save time steps or x-values ---------- - if not hdf5_exist: - if type(all_outputs["x_values"]) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(self.Output.names): - grp_x_values.create_dataset( - var, data=all_outputs["x_values"][var] - ) - else: - file.create_dataset("x_values", data=all_outputs["x_values"]) - - # ---------- Save outputs ---------- - for varIdx, var in enumerate(self.Output.names): - if not hdf5_exist: - grpY = file.create_group("EDY/"+var) - else: - grpY = file.get("EDY/"+var) - - if prevRun_No == 0 and key_str == '': - grpY.create_dataset(f'init_{key_str}', data=all_outputs[var]) - else: - try: - oldEDY = np.array(file[f'EDY/{var}/adaptive_{key_str}']) - del file[f'EDY/{var}/adaptive_{key_str}'] - data = np.vstack((oldEDY, all_outputs[var])) - except KeyError: - data = all_outputs[var] - grpY.create_dataset('adaptive_'+key_str, data=data) - - if prevRun_No == 0 and key_str == '': - grpY.create_dataset(f"New_init_{key_str}", - data=all_outputs[var]) - else: - try: - name = f'EDY/{var}/New_adaptive_{key_str}' - oldEDY = np.array(file[name]) - del file[f'EDY/{var}/New_adaptive_{key_str}'] - data = np.vstack((oldEDY, all_outputs[var])) - except KeyError: - data = all_outputs[var] - grpY.create_dataset(f'New_adaptive_{key_str}', data=data) - - # ---------- Save CollocationPoints ---------- - new_c_points = np.delete(c_points, NaN_idx, axis=0) - grpX = file.create_group("EDX") if not hdf5_exist else file.get("EDX") - if prevRun_No == 0 and key_str == '': - grpX.create_dataset("init_"+key_str, data=c_points) - if len(NaN_idx) != 0: - grpX.create_dataset("New_init_"+key_str, data=new_c_points) - - else: - try: - name = f'EDX/adaptive_{key_str}' - oldCollocationPoints = np.array(file[name]) - del file[f'EDX/adaptive_{key_str}'] - data = np.vstack((oldCollocationPoints, new_c_points)) - except KeyError: - data = new_c_points - grpX.create_dataset('adaptive_'+key_str, data=data) - - if len(NaN_idx) != 0: - try: - name = f'EDX/New_adaptive_{key_str}' - oldCollocationPoints = np.array(file[name]) - del file[f'EDX/New_adaptive_{key_str}'] - data = np.vstack((oldCollocationPoints, new_c_points)) - except KeyError: - data = new_c_points - grpX.create_dataset('New_adaptive_'+key_str, data=data) - - # Close h5py file - file.close() - - # ------------------------------------------------------------------------- - def zip_subdirs(self, dir_name, key): - """ - Zips all the files containing the key(word). - - Parameters - ---------- - dir_name : str - Directory name. - key : str - Keyword to search for. - - Returns - ------- - None. - - """ - # setup file paths variable - dir_list = [] - file_paths = [] - - # Read all directory, subdirectories and file lists - dir_path = os.getcwd() - - for root, directories, files in os.walk(dir_path): - for directory in directories: - # Create the full filepath by using os module. - if key in directory: - folderPath = os.path.join(dir_path, directory) - dir_list.append(folderPath) - - # Loop over the identified directories to store the file paths - for direct_name in dir_list: - for root, directories, files in os.walk(direct_name): - for filename in files: - # Create the full filepath by using os module. - filePath = os.path.join(root, filename) - file_paths.append('.'+filePath.split(dir_path)[1]) - - # writing files to a zipfile - if len(file_paths) != 0: - zip_file = zipfile.ZipFile(dir_name+'.zip', 'w') - with zip_file: - # writing each file one by one - for file in file_paths: - zip_file.write(file) - - file_paths = [path for path in os.listdir('.') if key in path] - - for path in file_paths: - shutil.rmtree(path) - - print("\n") - print(f'{dir_name}.zip has been created successfully!\n') - - return diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__init__.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__init__.py deleted file mode 100644 index 70bfb20f5..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .surrogate_models import MetaModel - -__all__ = [ - "MetaModel" - ] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 8c10c82287a57ba1e3b4dd428962e57cdfbc5c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmZ8bL23d)5S*DcQG-Gt;14|P#r}Xu4ncEKgy2OF&FBp7;_ObCo;C4Ferd0s{DPOH z*HcJAS5s6M)xO_<5{%Z%&>nbS8u1s3#VZdDn2a#ei9)WW6h`gkTAAcSq^+xDGnI9B zZlj)iV_j%+i!`a9sS3gGb+lMC2Hl;yji{YNJd5zamv_2tpeQ5kU_~|%goDpqrZvHv z-&KVzBf%_>@6{Hj&VMa+%wVfemX6xxCirjoUj>MHnMcIY=c(?DxxaFD()>z~Og*KN G&d)E$kVM1) diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fe3d14f8dfc5304350b98b23bc52ca5b2315a871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmZ3^%ge<81T4a;so6mKF^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%PT$m$MBn_B)SMz_popI)^DTkm(xRgL^u&_X_*{@gF<9mndwhIiPELIM zN`}uMD}IGLTg8MHrxq2*6lLdU<YXi!7RR{cCzs}?=9Lu3xM!AllqSWv<>Z$KB$i~v zBqdg+7MCUFWTq75SHz&(5ECDtnU`4-AFo$X`HRB_Xl-dus$CH$&>oOGi#3772WCb_ g#t&=^j2agh)R7TTj8)(RGZQyk13L&7u>(~D0K~CSSO5S3 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index f1a3fcc2eed66172304cd27ab5fe111ca0198bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmZ9Hy-EW?5XX1#B7R`N%6GV813_#=M2L;Wi693O7M4wRE-u;KJN6?aw!VkGuV9<E zxYo*7u+h2Lhy(K*hX2g)A2}Qz5sa7jtx{M&`sQzB*j!_VQ-mUl8e-{`Qlhd2on|V3 zAjRO5qFB)Gu!JbfMuGAD-d&M*Cn0&?EMx>>dm-$UZeIv#j1X_c@8RSQU$2u3UIp-h zdssGOu98jbUoxv5cxm*rjJk2G1{sqFc00LeH&t0Zo{i4=ENP?I+{z_z*|vu3dCLL8 zY|U%!r121viD5N<68)4<j?d%<!U``d->mt6w_FJAbQEILZn}d@d?6XQ%F%KdAdd6w F`v>INVKD#z diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc deleted file mode 100644 index 2854217e56fecb2456011a91a984951fed9cbcbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4921 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc deleted file mode 100644 index ffab8b4f67e52a3128aa8740301f958a0d72c502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 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 C4-2yZ diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc deleted file mode 100644 index 92db2e7e7390700d4b6b25bcdc0db1906dee37bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5228 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 H>m>gNxx5;C diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc deleted file mode 100644 index 82737a42dd7351d06b703b3da838031ba95979da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2886 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 UGiz{V6;d({`I`N<wKeJd7wkkSHUIzs diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc deleted file mode 100644 index 92d0cc0e7a0a07123fdfbc2c777d1b9281a43344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14412 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc deleted file mode 100644 index 51c4ea4a7b9eb757b303782de26abffc022df39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21706 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc deleted file mode 100644 index 063355b16a397fb5fd89d38daa0d3ca5a8506766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14506 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 B<oN&q diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc deleted file mode 100644 index f32454f2feaeb17bcf42a4b924156c45d354b009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84465 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 B#&`e# diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc deleted file mode 100644 index cbfe4d97e8e83ebc276e45ba6e84f514784f1d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5560 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 Z-$TZ+G!?TsR$7>|U8i)t^vVlo{{y+urp*8V diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc deleted file mode 100644 index aaf7d2d285e24e4d2e31c3dab3b1b071be7c5ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 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 bd8inaNFU$G@89A|r0WO|$^Hun+x`CllJEy5 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc deleted file mode 100644 index 27878248cbdaa2abf0af9d51d061aa6e2db86f43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5648 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 Qn=09pu6MokM(NCd0M{nQGXMYp diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc deleted file mode 100644 index fc01f0f01b8bc70d438a3317b87d304883456f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17477 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т#dTfa#8J56>f8$ut6T)8sKb87ka10Av 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 WxdKn&n8;-&>4E+sNkEpU=>G#}NHw+q diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc deleted file mode 100644 index 786fb6880e590007f4cc628dab413d62f1590cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19555 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc deleted file mode 100644 index e7e0226dc1e28c09b9cd09a610599007b2267e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17597 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 C=1mCz diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc deleted file mode 100644 index 076580dd7fa9e11559ef202903d44e00e25b8a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20552 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc deleted file mode 100644 index af7431ce432969f095d1c07f429b8129cb5a2def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc deleted file mode 100644 index 93c4663b2cd6bd9acef73471231ba305bddf9dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12405 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc deleted file mode 100644 index 98964152a4ea29f85f061ea6ec7daa3df7487230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8190 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 O{Slolq(+zPr9T4XZ>fI( diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc deleted file mode 100644 index 16a383b994853cdb226f7b7fb291cdbef789e1f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7185 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc deleted file mode 100644 index 1ce136ba4d826073719d19ffbbc87cff8dc02562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7952 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc deleted file mode 100644 index c3f24cf9cb753b59f9e226f828a7c3598ac65a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 zcmds6OK%*<5uVpRxTIu8RvgK8oQ@JC++?{FC0Pk*Q?V^uf(=<QEXfE&(z~-ez1-o> zW7RVwlFASWOc@9e2+$7*VDjjD4neN@7jwuZhd`Gg=OBUeRrl<RT1l2K1~Sz4OuwqC ztE;QNYT3t*RWv;NfBCEP@CTaqcdCp(MO5CxFZu|DqutgV-7!4<wl3cW-Y+;sr*vPx zZ94N#*_pwY<y4&6``Yb-^Bt~l6}L*fj6Z#A#+m!0<s5U4-!I&*IK~aFdg9(6Djz0Z z>@qiS+%}I`Clt&NgV1+vkMW&;81NvD>XplaJ8rzfJ_rLl?%Dyn!rh?7#b%`&$Ngw! zX=&4qyGg6w4*jJqIjFM~Bz`~ic9&XS*jn=KDCT0=mc*_XEp2*y2dw!{y}w&|ge7X% zAL%InL7$rTuU}nhlLiJ)86PG5F5?&d9z_a0B$_zk7^!Axd)l5JYg>A%#fD=(Fb>Q^ zw8<8ItOa8ZtQ2$cE~LhxerT?nG<UC<nrJIJ)}ek<+cV=5jY`dZbFY+^w#wpuT8d}z zRY|S1;1nL1r#0$<CX4nR2v%WuuJV8jJLYUt*ba9XEwLS<((k%$Xw@f$FODlb?((Th zCu(nt&1gl^rCJo*B4!J>0yhlS+#s$o((!IRaBLy$-HqyKC=I^}!d|$|1q+2kWrq>3 zoOhkQ-(hkdbx3OMFu`^+J5tkze2G{KeU3B`ZnwM4-f>|U)Im=ahy5qZRb$s-NYkYA zLB>yf7Ip1D3D))!=uAom8;oP_tSH)VE~>@9k?R2UvqSDA0oH;gFgId-5#Dt{rN$y2 z%eB~IlSeU&!x;LPs(5_u6U6d~Nxu)RJ$2!Z>+>MOc0_Ce{HJUHb_fTBR6I7;4dhPX zgxPZTNRw?5Mo}XcNzk@q&}9o9FSN1KH<P}{*Yb*d9aZS9h_mi4L~ezi+h&py8>1Ap zyWHnc1H)-f+W3Mo48@yJ0FJ63L80UWatTSp@pj1W+Fk-rVGBN{>5eO)U??BvrW7_w zZn&Hp+wQuaV(r=3V8O<;tTsOIb{XtNajL2Q336&jz|D@L#D~2Md-F55&<aEE$X;Ak z$1w^;>;{`P=5ss1$M}hmi?Y3KdpBY<4yU)ZI~c%shFqk@Cw`s1SKq9&W^>_OjnThq zv&p(RJT`+^wBr|R%*LVFc0G^C2oC?sS&L6lYQuP7uY!4Grvd}vUt3|^CCcY(Y#INE zGEqVcRcq`#T1Lwj{4N*R{b}p|SoJ;bh;mJgDZ-9(21FgZIaN$3CGu_08%UZ9i5WE* z44k~}3>;0^?}w2ab0z4<JWfO~=FL1eiYFb`uce!!cIA>}P*Sts+p&EdfU)V9E?tuD z4<V*L3?vH|s`VJ=AH@sRq4;ZSXE$nWZJCO5RGi<~7<Nu4gY6t0*VS{=iPo5+o4?Ou zXP!w|y6{zyCzrX3?R_R2j2*C%D*&5w&t$U(8^Of$8&8ycOz6?4Tmlq?_w%u-DR(pG zxK>qYa)Zt{7J*Eiwre1b`lOZR>%T4tEqtkG1t*5%dt{(iHL{{|16e6Q7uDIUAf?F) zGTvn-Ty<9JNCy;T^DPnDP8$HFA-kij!2N!_n_2KeQC4XTtt+!4_a4v6)Ii54({EPG zSwZe8`mm!}Wwf8!{848v2)zh`F`3@TN_imuQWGzu>EB;mURj3^7ty-ly>NNmN&I9- zm5aVhsKRsa$)K><;WiEvUwr@aM~m;?`ta6o&evaGZzZnhEVg~S$JgzC-&=Rv{dJCF z(eJEx+`#q(kAOa+yUX1Mje=KRZ`r#%f=_oH5$>!<i4fr?&`ZM)9qvWz!=(eEWi!Lt zF~}R8M4?s7dPP5hzn6{U`kY?WPwL`Tw6{&_&7V2Ehrn$CdzR`48o-$u1FY@qdsb|0 znW+S~0B!(dsp(ifP1MnD1=L&EE1(2GlfcUWR4Y1$V|;F)wbU^Ph{fg9a*C%w?_F)< z)4g(97Qa(~4b;${8cy-Fwl6_jY#db5618`XLjxeLcrXiDO8bC&FKdSY*%P#9Fn%rt z^uuU<uXLwLoO*`%8)yI|_6kI+2c%AN1Q!S-Vl|4VPCWN2vP~bCV{aCtD(URoau(Kc z4ALG4tTYZ@a7w9lND#ez??><0?H<pe7e(yhCa?}b0%3%@JO<Zc`31WHOOY>o=aB|Y z3k$jzbTA%$g{L~7nE+jx>G43!pf$7Fp4-m~368`svm(8gFJ?ts*uf^xN&(*{q?Z*` z{rH4M^UMN_=UGwkJ`6IOYlmLq2MwHuc27`dBW8&O&Y=W&)j2^nBfd+;_o$~JL%Dc~ z8Vb}<lzbZEG*wL3*~tnW5#qEKB#?!igvsQ2QN=4XbsmLG3Vw_a%_{3<eIAB*Tt8vV zo0fjcnzxuaZ<h6!jFV`eGvtg36D2hbP4qUIsNv|nLNxz@<{10>XOu1IseY&*7>CFy z4q&cZmIGswxq`|ikd5?E7at+#C{p&YuXpsg>{t)5l``9)5ilX~XN;JEi6D#k+@LI` zXOI!ooAS8_295@0C*UXkgsh}8G1jE9$V_M+B!Hyl2j+)3PN{iA$!&;#g2OBwsUA#~ zC^}|O-!q*V%5k;|l-Ue=-qeCCse#tHp7Br@C-8NQ`d@(wk7fpE6h&%JjTZ-fmDG4e zLrqeL%!)p(ZMYWF(L+7@<OA(994{F4to;+HTSnlU3K{aTc+ZlEaM`s+p9P`tRrs&h znUBnK1Q*b~uv2BL3_i<mxGddixJ#{un||77pZ<1vslUh8J${EROE%jCzSxQ+(ZndA zDFR}Y(nJKfVkVQCd;mx_k&=XoM+uJy%Tq#3CS!vXZs7*MlklL;DI+_I$=}ZtYk=++ zP;b84F~q8{EaeV0_B28_aq`vJ!Ks(I*tQ!Z86&qa5T_0F7=$sg8v~ST0R&u0r^BRT z$Z={yK|Gs%AVHO_G@<k6qTCa91LqI{5M455i*mqvt#LL7s@EEb{5eE@4EenScn<hI zlo{G-HuD7ld16sr2Fu{1bQ7I?2e|`nBUU>^Z)53ATL5Yb*Jj<&bMoADI%*uKYBf)v zWz=6#c*WlouCunX49tN7@G19Qgz*=btM!{h)&v}LN^6sD5xXgotAt>ruhp~Fjj@@E zA5f`8Stuo>sSPR9HsPUu1><Po#>NQHJ`d~VXR`hp+%e?21(4zczDWf<S&EJ6>mDpu zhPHd(4>(YXdzTO0g0yj@A-LXfWO$Q-?z&*`;{b#fMXf5{#QlmOFj76P0$$mUI&udD z!4mNT3P3ozfXGZc*v$&}IC5}thT1JkB+=}7qDplW&W6xqNBj`gswLx;sN-8)l>K26 z9}P}4aSOkQC~B|H>#qSRoy6}9kkij}%RpGtPXRlfGS1*nGOAjc)#JO-7+^$@rTl3k zXi>-<1uazIfPtuhQOwj3uL9p7L;%SU=AnQBCy&5o;>rt{E7ip(sf8B&5D?^81S3lZ zBH*tF2vnyL$S~4^(=OOoaTh0T^ah=L5-)evdDeaOrc2(mz?CcCbHm2n1CrxrQysJ% zLQ~q<N^no(MIq8=<yCTml=0>eUh;i9gGuj9;*FvO9j8y!#RYr~LHChERLmyFUj6^S zESOwyeoOG!ZRNLqN$@sZY>uM?8Ldey8TF(U+FqDn<V1bmb~`TaC`R{_&l3ZV_+*)X z4&8DcAmj;8o^FpE`oMkB_;GK&GPttM&3_Oos-p{uvFI@L{?h+Wb(D%F`f2PlxDIYg zNPFKp<J#b8uTrF+zW&L@O<n(_ik=W7bFEKXe=WbKe~J{Od>P8=V|utkzZym2e1lz> zkm74<W{lyJG&3glbj<)iD{q_|-Gv%^y++rTxR?UqS)M*?jpj^K=Ht6a`jFIe$~i$5 zr)6vx7ZA6qB^8@1b_`&Mi<onc%pbE-eonFyE=S33#VUr27imsGyhY!mJCy=?1C=`- z4Z<fd@(cVT`p|w}(JlSBF^{sSpZcn72x_htt}7%#XyMA0s;*#zfzR2j)Mz+iyU|c` z&MB?o(h2cR-gn51Qh|h`YR+b)@4DvVqU8-xL^7@Zn?^Dl6Ob-{1m&?=`AuBABp$y+ h5=5_|u!=}#O(gPPRW4S3TK)yT{%b&J1Ao?k{s*!9t}Orn diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc deleted file mode 100644 index d2310be6610a4c4824d6749297cdffe80c533a47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16785 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc deleted file mode 100644 index ed2b0f6f101965fb42fe059ec79e8084a4b3a9bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 zcmc&$&2HO95GE<=$Exk5b`J%5Sp;rf0g2e4$i-+38*SqTXoVt4f!2mWued9jDYYx_ zE*;y*EqR6B+hbmdKu>*(o;ow6D5(mJ-ns_IoZZ>knc4Y1N^fj*Js9Ekr}DS9=lzAs z;%I<!0FPxLjy&NB|1CUkf@9PI(EzOhnlHlVUay&e)zSz+JAlXTfRG;8dB=h9j~gO5 z4n;$RZ@uHDXo?p6Z;3Ye=oHPTYMML#C+zJq7>6v$xV6k_CgdnplDTuqa+OHqc&b>6 z=4{FhpGYT-?RU#<&Y5(WJ84OMP!Cdn;AWgEo>{iX^zbFk;bF6RoRo>PefC^Rc1CB| z{%rNEPaB?TE7dUL&ViSq)>-Z5>4?E%z3L2CcBIXOyHrEOmKk}Gr$!0}vy_jJQ>lbh zuFR+Qw364iS9~(fma`)3S#XvmT(P07swEh=a7vcxSE(BBmBrcL-)B^2+vh^WlUX%B z?~$v8<=X4X7pHv%C1#J=?$7bV-CGSsYF+HEr(~V06m!3Q$2?Cs;N-!h`|Qza87tHh zF5E~go6;=NlL^#NaK~|mU-B&F!%W_%GM3Fii&YiI>7`T@?Eg>)3MZy;9+wwO3Wf6` z@c|UGf$xZxui>$GL5#iEUJO_R38(>N1cN8NpjfLfr0CB3@10+SR%WAjo@v3}zki7) z%0)@^lLbIT=2v~5opWxZZ*-DRpvi1>l)CToVe|yr;z#bzqanYR7HcVtzKU#aj2?3* z<B1kBvrz?r>2=YG<5Z<Cj_+ZlA&8dW^=~$*o%*xImE4d?D7P(mdF{RQe)nDQ#{0wf zAxF&a=7Oq%AUqTTE|w|z>fd-o5<v8q*IZ(>!aHt!CS7h+33${i%-4<wTFC|TL9b!3 z=0%H75q(8xR$PO5Q7KCS+~^e>OHla?rY!E>TD#dUlV4gN^x9Y}giIV4-54vGXZXGz z#}_%zs+D#e3!T99-Koy5<3!8R$i}0Lk4*=I_y7f7>Vm*<40a5LX_3M^Ug(FPbb|Ge z<`bA&8W`vSJoaM{%S4PM4rELOZqOJ12&}1QhpOU1K%GLe1qPw|+o?>_QJN5+S*8i1 ztfmoSHOZ6nIZczl8sz_pqls<ym<1kJ<M|yT2UQ2o{jnF&74UiBc?Jw>+1c*SRs3*g zw_@r!AKmH?&FG^6EZtvmiQQBAs}IKSM+Up<@V*CSB|M;HZH%;2tpt^@?Bd1a7_udu zS-V<HXW?w>{gPAm7&nGr*E<d`d72>^RsccbS<U0*w8~<li3@H^p)x7IcPpUAt|Cz1 zgBPMI_=!*w7RZ1otU)tjMPWBhx|d$F2=RK0wfbg??!2f)cb;U?u3~r}CJ7=(a5#aW z<(GdzM<33RTr<+3*EH*3X*N)7qPT;CK=wX-Ar!uZ$KoR5YkiyGG3W(^F;W&lNj``u SI$xDo-$#fNMQ%2>qJID($9<0g diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc deleted file mode 100644 index 43d077e6552c249ec0d115a4d34f47de65e354cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2860 zcmc&$&2Jk;6rXjxjbobhD~L8UFhW&>p|z+`IYcy4MWIwGIkZJWsmo@(Gj=wtcioxY zwuySkp@$rLMG+E6oPw%K{4E6`5v|0Df526G>WTN>?v9ffMcf$2&olGhym|9JelNdF zPSzQW_QtR3`*Ftp#zi@*#bkFLCR?n+t~1G=FzIYp7<&%id@SXh3UI~_a2#2^%^I#> zisG+REOy_6$re*=$&qZSBAul%Sy`&eu_tWFl~tfeqzk8yWbTcqpC;ljxUtS*T;+Z! zjNwVlrRoHc;>n8QY2+)Nh#=wtiu1nEqNft2O|zaKOA;Nl(?l6sUbKUjUkTj}A`u!s z&*Szg?crtRK5i;MF-?A3DZWg1m}bdcZqk8Uu~AVw6iEVF+Ho9OH8(mOn3kJp5t&Y` zdm;&9u-I^|?x%rPlEW^&N2<Pxq>7UKJyz4myFPy;di`+!t4O*u&TwBuysZjvNiGcB z5{B`^AnMNN&RJMk;N)i06jFM<(i`tLNYx&;)q3}%d(8-3%&+jdZ@f!$hYHHTBwn)C zC+Rc_@a>167`_uOxO?&P1%CNnZY%f_0<IOhEsD7x_j=$%DH4G@;(-VQ(GJxGa$}wh z#4Nnf4IZe7jQt<{K<0R4&Xqi{v><ct_+@QiiC}$=!MCWBE_=*8+@~QOSXpVwpiU}_ zUo<M&gbhztA7<k-C#xD2b_^cjuOELl-}>4>Wwi8n@k+QNglS!i{j>+!W?I*S<jb_( zYKt{x(3eujk6NlovR2w_>p*sumzWfyA0%lK>p+AD<V~t|+!cxPda+cYX%z+2U(0Hq z7eqngdFxY@am{j#fMBM9Y_Od(Z*NwgPVLOR3qQv;;j@eH-sd2MCvwm&m~4T2R#Ak; z&(<~N4*n+YaJ3E7=XSXb^3UxV2Otg|x_+O+LXaaRWEPLq!-If;D1`8n=UEOC1>oSp zTPjI)lp_wV3(&EO7vo6n5npVKX|yssBKlbVS*?tx26Se5{PYA$Ozx}G^;5Yo_idiX zBj<o@u)#?-G5K`r&)V$owb`Fmepvl+^|xB%k6PnJ`KR9i!NtZn#s|yV^Rl{!(Mv;| zAN9QZsR#?sxaY~(hwbD2I9&7mSamwa>x81Kv7hK;K%OyDN!Dr%6cLP?xdvpzeg>5p zw>Dr%K4GWNzNk(Qsuh<Hm?gCd_k#f&CHV!Y+lQ|mWh8e`!`8tT1C0fm48*spr+_V{ zZCi;7j0Z%Cu#o^dQfN(I`9UY}39Ai{34XYRNJ4BS{FPw~qVQS(`%nFckaV6K=uuI3 zm>!6)#f3wC{0<}>v_6rB&>ak4o;&x*yL4`@=t4uRJyaixQA30d)ErTXiCO5g7h`V> z;gmJ+CM-tGgLV^ZtxP|TB)KpzkiFM&>;!bDRkimyd+w&P%JFiZ3$4YPJ#qDc2tow< zqV^C}N8fSxUh#@vOz?Kt6AF>Mm+!+G3&uAoqX>R&x=DoQGUwo5Bv_$54T5b<P#VO; z3Mf_t+v_exui<7@OoD8}#xJW6U7yv5uE@p<OAmqq72o=a5;H8aUWfZk0|+4NG$QN7 z&Y9U9VBbN2-I+N{KW`!L=q7v$G;sBCIHgY@If>*H5-RaGafX<Y7dX}u71YNtF&BaC zE$|aq;7HE9?%4qwCAlV4ve>BPXh9nH-}1WlX%0vWdKN^{=VlqmV9arxLG42aP-2w4 Z#JyKT#<$KH2aFgcFLCeHzc9$Ue*o51>5l*a diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc deleted file mode 100644 index b0c91ff3182adb1245aa7f20656e8e94336a438c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2474 zcmc&$&2HO95GM6w$!hGRO%DZnSp-I10g+lG@Wp5h8*UpIXoMn(fxxCgued9jF}b97 zmyRvu<~&9Z?J=*=Yu|!EPkoD?Iy0mwsS1qVy2g&Vf3rK^&iAeO+FHkfa{K!q;;`j7 ze_><3)S<Bl)i5y69N`G}J=ELUF}7-=4y`)0T+w*xbejRpS|~MW?LjpgV59@{oa35s zkL#j#+z@rqc<&rHMN_Q6{}s^!AMLz(sM5^xKVfZ$LD^?P#EoG#VM2~VC7C^!EK`Bh zmWPUkIGv?j^H^G`O}|qtvsQ=0%t}MeUR9|1oa=F@cx2cPONMW#4>z0kW2X$P>9dzo zvNPJl^rxd|eOmA$F;Wd9ZY_8jCP`GeIUF$<tVXTo%8U{na~mdbV#Bn&%t9>%gI<b9 z$W$sJl`Z0_JT1lb!!?i7XfZ09Jw2RZ0at7&OSA;z26l;}<ZY<NI|VqqySt2FHhnIH zA5YQvx=XI+hAXcp-=6jrK+K-9&DZ|c=A9EoXsmB<QktEq5M#f4#Vk(P;H0<xm~EdH zX9X<b!nH)$RKkKJjsZi#Eyo^y#iNi9Bl(zMERul+OBBZ8l~i=t{{aU&j!(yVT3jqO z=s2$e7f3NJ_>F8ifNCCq89VPBAGih<SOd(c4Swv_^401>^3E*(KDc?q$Y}Jz(JQd_ z?_Umfydwi-@U*;0wmgx=*>z!iF;GYYXcJ1t-biwrY1unG___D}(etC%Px{;5FbgBm z3u1mDJ)WkK7Y3;(!Sv#h2OQ*)mL`j=x!O91?75ISQ{Ir@NQ2iQbaL&POzULKt@PtW z$jEplhtiw8?fan$t?xg=U>jf@cg3BoQ%3fugG=zB7!f?5!N)u2jq|H(Yq!pCt_v_B zK$A-X7J0lc1mp%&^6kGVjXHt?Qe;X&^HMT!;R^|9s6sQaUCKt~c#tSLH+|5pYrM96 z1z-XK=k4kJXpD<)qc9+^PQJFlwy&Ve;A&@e@~{YgVSLbSAy&vb-_JWfBAG?_eb4tV zGai*AE#DVO0NoGLB)ai~M2<$rA4Pnu+u&S(f(G+q&fsx0CLJEr;Iy{e__9%JH>fv& zj)j89+=FVq0JEs%_zHlU(+i;SJ>j3jY(i{bl|l-%RjAe=L4>|ZWe|?SfO62VggDMB z9U@tjJUE}}Jo&3s;y;Nz$<+=s@DQl+>;_T9$_;1!*el2hcwabVHR{UQ=Ek+ZwXs=B z{Y=pA^oP^v)d89BFS*3rDg9L&;{z1Is_J+@L1XE7py`PQ%B6`C1YwcG^V>0$TiUa7 zH6PC0-jw-;DD5z=HNUA=>|gOPLNzVvfy%WU$H{3KMV!R&V%-@+Ii+|omne-{MU;L7 zAEb5g8>3J>ur<=aI`uS44V*OTUb@Y^f!CX_RyUJ(W}xPsS&(_FJj2HrNd$QYn;ZHe z1Ts|oO+KCSxYDCRx2f;JOudF?9nF0-M6r*t3q3x8N(u+;dPw9LbZf*gYRnOmJdjAV PzbkmYOVmV&*1!1&Ix?AS diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc deleted file mode 100644 index a1e26394365e683dbec6da95fbe223ebcee10ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13488 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 Bp;Z6? diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc deleted file mode 100644 index 7ebbfad9c34b1f9e6c819ea7cf7852af65591444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42392 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 J{$pjC|2Gc|fYty2 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc deleted file mode 100644 index ff5e3935b0dd191141f8dfb60bedbeb9a3441d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87304 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 VVvQP|=-}`ZcKvS-xy!oPe*=NpfUp1n diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc deleted file mode 100644 index bd6eb8fcd459fd95ff1b85514f996344b6e4880c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42705 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 X0Qd@E+a(_g`Az8O{>jTCN=^RXpccWy diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc deleted file mode 100644 index 543416416ef052c2402c2e9a97976dc4aab22866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8915 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 StX4>a*409eT+%Xuv;M!r+lnOs diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc deleted file mode 100644 index e2b6e8e274e98df5f28013ef45589d246125aff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14832 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc deleted file mode 100644 index 9f1ec9479869fec42f363e7f46e07dba2f1c6be5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8930 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 H7PS8b3n7jV diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc deleted file mode 100644 index 97ed55acc1e800a138ddf489ccea709a8b28f634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11629 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 avA&6Yk^<6Wno`U`AM%$xPx3uy*Z&u-bVhUl diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc deleted file mode 100644 index 0784caa91ce5a8acf65a6e83b8f58a47f8e12bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19787 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 M>^HBe!Eo^Z0iAV!9smFU diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc deleted file mode 100644 index 0843cdf8bd820d9cccfdcde3a1193f3f416ccc10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11717 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 Zi*F}O^<C;cm`0%G$mvY}IHnd?{}%}UP3r&v diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc deleted file mode 100644 index 30079dce4bc04802324f720381b872c1a2f64018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9509 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 X4&uxQi9kPt=A@8#$;cEg3d(;2)UokG diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc deleted file mode 100644 index 489534282f927e599530fd2c176b5240e2214e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19040 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 RV>v$k20#DP38fgR{|_UFGxGod diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc deleted file mode 100644 index 7a3bbc05003eab405d52a934e83053ae50080d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9581 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc deleted file mode 100644 index af35ff42f1ea1e8ee19d476f7b51c19199513cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87535 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 E|3L9E)c^nh diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc deleted file mode 100644 index b856dfef2c2658af8ecc6b1ab85b99c499a39705..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35103 zcmchAdypLWUFUR9&vR$rt9|L=(aYMErCmMzh-JyPo{osL7LwxF8=KMW^z818W@lF2 zy^?n50VguV$)Ur*T|sb}+702jgv)VUj-rn6NKw=kxuW1M{{YRwU4=V{6F71}0ywdC zpU?N#-7~YhvSe~~yEVV={`K$u`2N1{u61^%Bl!FLTVus*UyVfmj1R4UQ9L}2pFOBW zB4)(YDv@b*)uwfMj!sAAYD^n)jV;8d6B^U#mE=NdIwkj7B|Y7NxM(G_keSX%oKfjq z=$h{K-}fx^PWQ=utkS<QFg@VMZ(11CBU)r(XnM$x8J-?SN%6|a!sztq!shACe*Bi{ zEr?H4wk~X&-X?L$$^#48>8#wRD%%%!Oz)8UbY<tluIXKJ-%;7U@Zj`=a-XT}Ss0rh zll#uf_`=@ly$cUbKcq#9k(GUB*Q%yPo{5;<X3r}Tv*(sRz2DR>MaFyI<cLj;YhLDj zsd_$t^HL#SDOz|ooNML+uF(r8kK;1@On%9>OZn;rt5zu5_Qm3yg-gvE*S+M0yp^w1 ziWM(m7AyJXqKORY(>E7S746bo)y7k5u2Q^Ns+z@{c<3%(&sTCw)zbCcOx`Z>eXn0$ zsa8Fcx1Hk`Pa$$sd*r$NVkKWF;>F0bmNQ?Qt5x%r^LeK*U#iYsShDP;l7rUtJ$K?< zsanii&D>t!>Gg4OG_7V83mkyfKLZa><7fXVf?{M^Gb30o+H^D(O~q1)RLXqROq(6A zXjn9lnVn`A?qcTqWN5YNxY=v=y%L#DnEmDeu1Rx~If!e@95RP-O(V~UIf^_T=4NvX zVlw9A<~H*I#B`cR%&fT`cU|TVb0^+)BW9Pm8!<hpR4QXWVLoW?!BcN4gLWJ>$IZQX z>NAg-`^^2g>o+INN#q;AR39)8VyX`oH{FU(51LP!hs?uBF=Re$K7tg(W(L#$l$SbR zbn@qGoVR>OB$CeJk5Sn%d&#nDb9tvYo?YPkw7k1KU$V1>O5V1!j+HM}?QA|9rc?<h zvS*!azECJGI(S>nma2<OPPR5vE*6~Zm^|h1G%n>8YE=itU<R|!d@*Y;77L}>QX%hP zC1h)}5^0uf$12S%G0x7;)~xJOwNSK}FT04Pw@`G7mMz8Qt0o#G?G0+YQF7+d1{ASW zP$i(``Pz-FQ_EUQRjHv+TR<D7(tO45h3fBdM^#-^<?j#wq`I&(*(0n@;y8k5Te~a` zVCPCzw0*(vnyOf}RE<!xD-%)>x|PpKf}FFwSVR@*Ls-S7V0!%CGKoEry*zIfF^n6% z%;qh=SzN4HPSHFPmb6%_ELUp_CG@;7pRd{3;?2c;)#e0@UAb`b^p){_$U0NPd|S&| zL?AjZ@t9pREG7UD*+m5*vX%l7s+?yopqz>9sp4#Ysp4d@h){y+=VGClL)skrJ6|)` zbd%M!6y&GD)Tt>e`qNjO#iA({tBwpo5sRc!solV;3Y)jC5Ufp%NB(-gRLRd&ibvFZ zbM_8SWS>2E=}7ij%Pdvd=W|8Cr0k_@OU$8~5SDvrB75TE#Ut4hfO~|G*^4D}u9&?T zc0Npbcp`i5_(hbfipy646I=Qgrh9lI3;5SkBAzxX?~#eD4=azzO|uDi$?)hz7O?S1 z_PM-O3f6kqY&6Q^HVm8b*hCgk^GNpe!eY_Fj;u7xUzfIJTCZT}uBeHfsnr}T+5F<h zQ+pzK&CRby6$8Jh_9#dC${qmdg?wet6)rS9&SDz&T;U=wW=*w{!scQ{H4^{;Eflea zu{!ctY}ITrUjPsQm{7Z~c$3gc*3N9n!ra!X#eE1W%VBxku!WkeD=aHnD>y9jmBLa5 zFwxA0ySf&vl8USnyLFYQaj52+BY|CHV~LllPFT~_(!xy9BCrb^sGuC15a!I<`Gv&_ zhN`Xm+(=gr`s2-wWESUC@mYY$3IL~++fv(w=59w?0E;mj`||88z@{Wefpewn#VYoE zHJdl{n2+n&CY8CG1wgvM3YY9+bK7Gp&f;K~v79NQK2>USe6SB0jWu(<xc}KIemD&Z zR?W8e0}UvdG9%$&jGcS-+3{=<M~{^q!;fPyUz(d|5q1IR^|6EdnWPPrw2i>E99Inn zVYX7sH%IyXfRENptx_sTx!3kH)i@3@oF!^e@L*X0a4PLbe@Z}dICK(mT{cWHY-AH+ z0^GE&{eu$+{JAho3jk{7#w-6+X`v_p7X5dY0Rv2RH2J$gjyQI_w&d{Wv=@Q)sA&(u zRoE6EB4S#AOJQ9CYA;%)YN519c#d-oOPlK#xY9Ckt?U@_IaOG*<zZ>ua{dk@aKz8K zQOn-QFJmj!vUah;GrSru*sy&22v<c|42HUZTJr#e{uz!lrGoRCkTxsBi4z=?3mkI3 zRxz_<Geze{u~^L>kgb03zyXCG5FC#wn2<d_&NXe8unisbv1k{pl0XaA(QL_{pnXBU z6XPwgodrJm<dcHqoF`g?!tIGQvvn-H2cxtn?9RrS(2d+;A)jmZ;#l_a$0r_t{PApd zrw_=o$L~={Rf=e~K6@;C@K7`R33V!6=hC%_0stOV!XhtVqJd-COA8A;ru?C9Iq5J+ zSkP-0>6v`RE@GKVF;g{1O`DI{NaW=j!7Gqx*?s}w@mD8tI<?&e0VMFYi;jQ`OfrrN ztZfHt&lKce$|Lrb=Y-qypcAq)0=-eZ$#sY|SpcYEB$jG+X4#*u^|O>W&0I)TjE$=f zT*ms`pk4rr`QifhFxPMs=^>!sk0l30^olxMu8gxk(##Or*~M#1=masMu`A67BvqZV z6<j}q<+xGRR&f^a9Q)-;*jhUnZ_k)Q6G&B^_M$i{J%fkZo1jo5e}NzVzVVc&S8Hbq zz{bNr-s||C#Ls>jfvdTZT*TE8YHk#v?ivWAZVaK}#u3Kc1j4wRM3`_>2$LprrOXI0 ze|_rAc-l*a2&|V>yJ4p6bpxcdBA#AXJBH@<golz3-n^c*N1T`N4<j$l8wHcSuJ(QA zCH!?g-r*U5Ewk1Ly5^-6&I^3n+Kgvw3xll;wlR2sL6*UG20IXZCSvWz<*mZxLe-fp zOn%S?Juqoqt<6{F^LcynRIRYYRcTK?Q*z$FG&6Yyhth?-Ge0>)tWAy~t9ElTM4J`b zZLf=%SX}m!xg6*fCzmUtN_zl7JQmm5|I=E%?|eX5O#~UH3Y^2>FN&KOeln-OgBw?~ zV*b2F%8`cdV7AJ7IeLq;X2{%OcFXaV#3~pRS9NR5!Q7Tpw=^eR?pV_BoL<Q=W>w}H zcb(-fGm4aloNm*&rG1noGEPI>$*{y8S2ts3{I;$|ss>Uf{FIS$uhf-9>KVz|C(o&? zQ9SD_{jOdf;P3T_nSMiGMShoStE2wMvY!YxFFAP&Ad0712rhg$#bvf%<~ls^)RQ6= z0TvW(*hERC7{N{i-fv8?vDS-4XUVE6l8w);z>UwWTGiD~xAEO&G?nk$s7N1L^1T;V zfWwPoWqau+c&I;dfhb^+Ct>q^IbEG2AXOwYQ49`6Gm{TdwqO2?CQG?K<=0PAh{-ns zFw3<iAPs;~HZjrpyq&EAqRsI9ECERb+^h1%a?zRa;)~0`8n1c=T4i}!ZhVt9ipAzd zE5)k6-_GYPv=OI*m&9>Ig4*^vL(p}mlAn`}=*5W2S>Oy2mEtx8pjz}2RWol{`DHJr zE~zl57soiFA0DEJZ-Wx_dSw*|iUwSj>>)43_6dpWbq8ln09ZQerNx}RG=o#$_KYe> z{qd-^6IH8D#Ln{wm(8z&2idBgf>i{L&N9?2Uq`GxhQR3HKJDU9@4+>r>zb|^cQQs? z>(P?Y9-~Ja)C|2odLDVD@QJmB6}WMOKSHDwevGsKH@5SuI<{`~Rec3uc~yH+Zy1dj z;`Eg$HZ8Z^cDyrIkuHaL|1KWhC8|5a`(${R3h&b4T}ODA3GX_?y9Da&k~#?}E`;&j zu2JqmtKto$Sn0(P5nt8OmcB4WKXUe+ioCS1f%?n+D+8;MM#@b(o63W3${8}FxAp6q z^_nw`w<EVSq#Q(f=?2<U9>rnPVH&sfM#e>}%Kgq}H+f4NiQw9COFJ65wtUS*d@veO z>kZVq#Why7MyDBbW7i|rXWf_?8{s%^&28iTF&uN&FFOyI7^SifP?LBAAW>tAW)FWG zPg#?I>bFgdRxXR@?b81=;=XKlG`dQWMmK&vRo%=qx=`j<{XB;CRcD8TaW7|YX%g3I zc9>najYe-Z7Q{Dt-QH7?*R+?u)#!8k%<ij(bq8aztGpYBZQSfZpZlu`XVc1q&K?(_ z7Cq|6k=#EL`MBoluW8m6zc#sdcDS*XF{}tM3z2i6YN+SNfIA?y{1(P^Q)3W$!akym zyxWEFsH$J?dfZJMtK2wJ?sW%QpP4cHZ|g5c8$%zDHiq3Hyy-RvkS945c|G!mJ`!;^ z9gRpySEMAi=!!e+qO7Ah08}X-#~Kdji77nip<9v0h&!^f?^X2f;}LfRDdHQHtReO5 z&VDjJ&7s@+$08roKNg*hn#1PED@lxJwA^DRM<QH1x3pVYW3;-}nLt^SuWEBz@OB`A zJeoObZr&hIw6WPa;BIE#_VQjDZftQ!-7T_yVr$!mvDxBo3C7_lX7k!_;<v-?<hWrJ z54zfGx~0k3e9a#lJh${k^ZT;(u6>zc8TKT~(5*~Z#-#M{&;~u+wowmTdv(ib_Et)L zGA#8;=kUtI?kJA?ZkbbAm#FtyN%t)F)+4WCMEQ0kvKn1CTDKcpF<M(OE)U3vB{v+g zt<4ehQ)eZ0>ONC%m(=O|Oua)=cid;{osv3ppQ(3A>dt$meoepj9M{FQzsAnht#7u# zp4|%em=9ix@Hf6E|7$?qLu^N=nOSfYc-Cbrwb~+>2tab>&{x#FBA<jG<$zQIPq(-@ zxmW`sCv??p$!Vf3L=||5wQ;10gHYgt7XjCsQ6Xb`f7lux<rK@TB^#NXSVs7s<fo5J zDOx&Ud->c{pVvm-&t+?=sHh*7(oUCxgC>W3zDc1n5fKPMW%BFs9`few5>OE^>~NH? z<82A8+Jb!D3$Y^=u^y%4VeVs^3b$-2(TmP4f*u1Q{~67TnZ#`%M2agemKXOam*mYH zs01Kf_5L&n(<d<wEmDj6<`#?+q%QgE6WOEkm$n9h8@y>Eur?vMe5O8fqE-{WC~4<l zjs+bZk9sku2I|=}fE*QoQrU%4$s%<Kv6o?&>cx8BnUdo$XOqq!*Q^h){D%;D`b_T4 zJNN?~M`o7KjYkG{tC}m<W^6AplP_E?R?PxS4*p1-#PK_fpS=&kM}W@1)Z5UU$g5fz zkor}?NE6c0AJScI7U#$<{W(ZCuOaSI<TKjTxNaqo%Nv>VMTI%P?pzTq$vZXcGrFfw z9Ppwg^Co&4eLi<da5*oIA)6~YEht>-=v=W1)Yp1)Cz@z?p<MlCBckicJ3X3yCw-?r z!AVsZ+B%eS;%KD?R;~TyL|Dwao|5$H$M0`RUe2+n=>~e(+P@#uuj!W})+HoRP5U73 zfTzC@MhLo@K1#+Z_t2Aj(b&J`IBtp5C-1L;VO~#P&aG=@I3E)zROX}a?(^Ylx1!A% zk#+}j(jV|PC~2YK7VybpcQ6mB=W}WVXB1}L-aTs?sUG1Z^x#G&!AQT|1+-azCw*sK zgM(qUK8)0BhR%ACal09C;H;Mr97D<0_wnfr0xx!r#FZBp&O4|OS;C;Vg&*ss!TCM; z+$FMsy=0*>n<FE(4*4XOg6tn~dMKQpU8+=;g+#0XNH(|P)cB){Zs_Ccf-Ioe<R>X! z1J}OSn_qHjx$C9tp(N5v%q>b~9sq$YB62Tr?xe7(y(C~o4h?j?4h1dz2h|7lkQPC= ze=mG&xwmH7^X&}C2Jm8FkO3Nv<ifR+%PFQS8T(+?dns0?2(4}a_Y;(#pY?~wxLRDc ztw&f;a@K-G4+n%76E?V)DuQb(UAD4JFyNCls$IbVM*)_+?xtj(K+m?`hYZ&HnJY%t zvZMGg!jU1}<Han<vWi|D7qhnDC3r<LFOKsEFRV#Pgw}wr1gD5R(<Z~y>k}R-QraMQ zm2}kN7V<iA7II~(7Z$gI7hT9NT9<ieaN~GsY3m}}X<d=%LXA8cvshe|yWXWmNEnK! zw1`S^uG!<;6wpZq$Dh#M*3-=0dy;ZPB@ej3Guigi5Le)EJjMA<RdYh17D<bOm*qt{ zD@#)EH2^hFyXJMaji~i8zU(58uPFrbQX+K90U_`@sxlU8Wh6OCl#P4QnOw<BAy89m zeT2nCF~441wMVTNz;lkI7x&j>ltm_duCMhWX3|Qs<Hil^c|2Nq20IzZHkW<)1RhuL zv;Pu7yst~|il()+meJBWufcy8@1h9hZJ*Ys#{mW6cZPNSW#&lg84%V+v`-rbL#!)m zXa=99G=uO$OTL|srK3r$59D`J@6-E`rz_fn|1|O?walI2Xpf%M^p}%*Pc)9&hf&9{ zmWig{j>lMk2E@AYPBPY~Pv9<X4Dzj!{>~t4^xtQ6<2%V%4_exz8!Y)wUvvWL)&C*Q z_(%N<@n=Ei->Gj7_u0g{L!>}Okl>G+MoIj*OYI*=;6xOK-!L2<EU>5vDp#oCBaN72 zti-^S1r=-Jlw8%!=t!gycR(lJ!abO0XZ*JY;=!a{Nsv`rPOj<=Vd#O1CPOZUb2i3v z)=ijkGhrrg$3TgvSSBb-zjQYasygEuz(rH}8`w7?_V+<q_=@#LDSA_wNeLbi2+BJZ zX8JB7%&@$Gcg3|##7`6id{&+?ge?r=;vx!e!LIHPQGFg5s=zd2p8^82W8qfYmkpRw zO_31M%F6);2I)f+BVE2%QP?5&nu34|kA-js%1a8}27YBjcxFSZA{+x`mYs@92=K#r zX%C8#MI=M3BzH`NleR@Tqr}ajpm$%kG|_@jvm7FXAtTyvN-*}2!3w8tBd%b}sNV}q zhG+*0Soi9Tf}9Zb1Otr>6h}5Y)l#KkxmE!?L$Fng`0kWN?)VwtooQel0ZT6laV8dz zvpk-*US;}^GiWfl#z4-mM736}7a;_evm@;vR*QB?0n{jt24p83^R(wZ4G=%*4S;Q1 z@2nLjN>r=$93Zsy6MTxIAg{ykAICu<B~8ra6G-)8U?w(MrRl-G=wLJh*aMgr9U#nm zXCMwtNN<H7>&}@rJ|SUA2tUX)bifUCHB%n~=2-@Z$c&nX8M_^CMBOO%ay<Wcs6Jd@ zCxxL2NncUq`3fZfhgZ;}yNRo_En;fYUtwwMbf<iYslBfy3mDTxIQC`dHx!(Qg|!IK zmB_7SQQY6|R~2DP;k*rt<xW_qs?gkscM<Y4*T(I|Dh>qwEe*WaMrk|CH-s!eu@*3H z8-u9x@1{-AGS+}FVaL_>A<cN^@^~B=A<0RQeok%CO9SUniUUBTM1=zQQP3@(`vl8C z#OAEL2{@)(WKCNK5#acjL!U^t^$Y`Ugtg0l8F8QBvd`cq-OocCNBG-@QQy`)C^teJ z+sFVE5aD{4vyvTg)Eb8{%hYaDWEnL<SB*#O<*?Uhm4p~-Nf6m?B=T5Cx8G~(C}wRL zR*=tWk_kB>8K*EF+>RmuQJ6oGT+q=nN&*N%XyA3W37$XA0U|OQPZ_{i>O;+;X-n58 z?CV8(;t(<>ui%)*u7`+^dmmDPsPzrt5W1;Di1%41x?;#v6!<{2o_1m@aTm~mn1rk6 z5+90GdyR;bT%OcGeQOc_J@5hb{)I?Yy8)hgIZ;lTao`GiE{%FR%9(O!!zl5&tG>hO zzQr_MX5whX=^@7&ocvATI>&&is2Y=QT=9#+%O-{*sZky=j_*M$`lS_4TPqT(6{=j- zlCboLRO$6jzx))-hu{#{5o$=H!~rSsXWB|ssXBsGe(!)GmAj-R%Wia~cNODMJ!4Y% z*-`F8shw{`8!4y1Jg~CKg*epuhS}w&h9Zr$AD2el*UWgM!|ZNkByP~ntPH9AZpW&Q z_g{f5qvx?mqhsUu_Ltjpu<Vs#2-?%D6of)Lf?pcHQL`64-i)%h02l1LZD1TaA%W=R zY`Ty{<hCN!HtdUS&I33J`frinK7_a~tO#(at$jFj2PpG!wUzB|=c<Mhx*I*<*t3Lg z<lKP}^IGk7b}}DC!rhYdaX#@q1iQP;O(NLEb9u)sci>?DU@OLW!7Act#s(w`ve70i zLIVuU%o(aI<w4?stp_qwlKc8NGcB57pu6(a*a3tR{a(8yY#`u6t?=&t&IsAH0KfnP zA<Q7KSMlqCL%syOEljC+qv2yHjSOR06ja~>9zxho(H@~}6`ZW=CBRhPK=@f%ZUHU# zf<&iJ<;Y?Au25X+{&8XgY8WlSEKs@HuAxaY`I!>wVJNqSNkplwd19g!FKmFdssU`7 z8lb|$j2l-hTd3<Ow66sVw)O&&P1SYlp?c@(Q_oLM6>lh&h<b{Tq8*`*vG*fkJr(dy zC+o)PQ!h-`(=9pTDtU{!K&~E}m^Wu1@eC-2<?2HWLy>as`y1cikk^86UIuQN3VZBz zEaYzrr4N+C(_W|p&!3{AH<mN-pBs4#7!w7?*=n(9Vl->iI>PeYp00ndFT3|AI_od> zd<(YAwVcngX|v#1Gk4f5X;Dt1F?gbDGBLheF-{I)47?PxNdnK9e*_!~;|$6WT-SOG z39Ns`RLKt%mrqmmQ7~bztEz_8=Q#-L%6gp%W0Zv3)_>%^L44f0Dba-rw8X5Zc(2#M zq*#QGix-FGg$+(dykxV5UL0cqJ`4CYMHb_AG?`(itYgdzF3U|N;O{N0V~AvCYD-l! z=PYqWdI@MB<e?*Pxy;yy!Sq$u0ZEiiNVhDpXG1QE^)OOeM-Ytns^j))M)3Ugv{^4j zL|(e*#i3z$7F?AmuAX+&`gtZv1{2_AxH7`0L;=kr!z;;7O2@F;a?g7SfB$)We8EdB zE#?@r7WbJ$;lISA-N8+K5UdWcCUl_t84W1^oh~CC1-k=eKo6dKG~=C2bQtkHhOUhw z%_#0OU|96TG8z~ez?%%PCX(9logT17l3<4DWS_hpho%8y!R(+G0`JNENb2cmeM=LO zXwFDrMAJr15c`PXC)h+8H-PBCBtSc8#Ib-+^x~udmgN}W32VS3gu+;gSexbSjg%9s zS`~4Efq?U1@0Jo$)?T@$8wRB0QSdf8ppc}4TVX&73HdzE3?u(<F-jriJWa8PU~S~Y zDLvUhGEsx7bG}l;F`*0`l<MX`3I6+AU_%t#e|I+|{E~v5O-P6pn!l;Yjk`#!U<ZY> zYM})~_o<<E@~JCCGXvc|o+9@;44S;v`#KNUDYW*XgY7Jf;{eMWkN46d0h45E_V`Wm zQw3m7jc3$OOOrShr5oG&QM?tdA(_uYaVx;|CFT-6pB|+r$P+y$`d6Nj7wspOqS&ey z(cAI3qRA8foB&X<`PQGXhK_tQwa>T}`fBY?{C*@JLW}J_+$4Lkr?8WRMTi{<qI;yd zPnx4Coa(ks(uv&Eo0Ls5iZ$zCi>yF&1!NOMHiYxoB2aF@0xv_m4y-t$-3HlfSn8U8 z7YD12_jr$Ob-;<4++^|$G}CYmgt0ebM64WW=0X25J`3crk$`TVpH5KgbB!e4r$F+@ z%{Ul)Niz1J#Rt_FsWDaGkF5qp8^$+)HU{b3^ehnMm9#JcnKQ){Wva|{pu~>$c%rVY zF-IdGid=gVXmxBEgk1y1i*?=2d=#x{WPTuXgM>l?n>vwywG|O;7h}WLtGGbDZJwh_ zXDf^I!z$g(Ua(6|6i_MV$&_Nl!_+SX5@cJPojP^)<mpSH@^H)Y<+AV%kZ2hQa6%X% z3p^*R{T5{F{?Nt$e{?(dJpW`RN@H7L)J9y)f8v(DB0H%K)VwQ_`y9p9f=q<dz;;%1 z!m*&-J-}3KC|-*KAttpj-!j(sf@R>MwRUzR#;sJ=4!eXYvi_uKsaNq5v123kt(VCS zC0r6~jP`jQtM`fWcI)7e)w`jkU90YaLIJz8eLFy&r`wc~03`u;Bw4ckyM$8{uCv0n z(#;W5JV*ne-4@2A7rOzvr)d2tn&c%x9YCyJSsw3H=!<YtDCe<0#enP<>z^}a!XIqw z7x<(tczQnXC8ZBUYxJ2JFA5RjTKM;Aq<)<6?*MKx!v=7KG_VhdUZOg%28vvaJ6-WU zeH-pG+Jo8{Vv*`){SKhxKodGPxu%y3L>Yp=Zrp^BaSS!NfM-AsD1;ys6gVk5#?b~e z$;(lz-;7o@(*RVXXan%gi~$<%GULJX=13z6lpz5DhOwd}FIDjlJMnS?Y|Yedt&yt! zGye@0@;-n!NhsN6@HPr~)oFG@=#hldU8<2nOe&YE+J5?Oq`!jnX+LcTQumlWlD?Pe ztKa9R>_f^$2MUN%ChTv`O%$0_r~LPWc>jYA>V(1`>mGuNU#j|)|8^K}e+2b(hAlqi zzZt=s*YTzcZ$^=C^KCE}syqF+Tk!VhsbB5)bI6b1iulhvJz;!@AHNOpzv1+n513hw zi<?^MBa*dBra{d5eT-<on<@`*jCm4NQ-}c*qdZU^WDMXwPlwo5ePw7hVtpNNhuiZ| zbOdFuG|;v*N&pIH;vXkRTF#aX%aS*pU_qpE1I`E(`@kM?yUguS4D7&l2d)`hcjDTK z>n<t`;+)u>|6J=i0Zo(u*8{}%rAj;{no0(g%~O>*AfQ{e`Tc?Nd&-7pq3gQ@u0=bP zxf}>BuEScWX6?($4hHxOFiGe#v87F0rr<?j4MJ$iziKY1f%;GFd4e}hRO{X4PixvJ zgf`5fs94l2q8-R>geLyKVmhl1W;tEHbO!JoDgbvui%*@tbn@ca3zyG6JGBlGUc+v^ z*U@2#f_|$A>eO0!8r7V@=75fS36PvqNU&X$<759>;uk8$E<P_vg)iS!M!-#e`jkk@ zFP~}h)#q;i)i1C7{eSv*PkPZ>h0X^=(E!2+8m%olkiA=0>8nv_1-<_lf9<FL<`3#m z&h0<B<?CO0bo8n56ji81uOjNyD%LjvNud=$db$GLEU!~((iNd2LLHSvzOp!<&m9bI z4tdE+eqqLBRB(65i-IpP_npuDpD&-Exqup^Q0pI2vh@~&zi03d48G0aI}F}t@D2hm zL2)b!DDA^}IroKM|ARmJ@9rNT8;{+!6m+j(gZ-_VK2yruf)O;Ufo28HNk|;#Osn*2 zKal#UN}L2HFMXHRVDO-L5WPNA!6Ak~FVb5?iW-0m7z#^NTi)tfJ7=DV|B65yMOZjK zs?2+~vqOg&>|j6{p!H=0o?cn-dd{u&=g=9LEsL?Wmx84TL?3fS)9Zxo^Tno$6OTEI z(hRTT9PrrMIdtvhb6)1sGeIgaTSzHbR57!7GFm^!;AatdF|Mhc^)e$Uo5WOAD&V6) zC=6lu7ZEewt#AOcZ-hUg<SMIt{1gK~bv2J({G3d^Qu+BT-gyHG4^d7q0#y$+Kz0!v ziUJdLuh}YVu?4o)0Z_I-iksvhEgPu70S<+piNeAG*aKBBD9M2==iAA6M$|UcGq8ql zXA(*|1NU!dVoK(dd?#bjIs)n&TJlbY!cTB9$lu671WMJ9j4=wXMGtry;9`KAq5ci6 z-r2-IAfzpjO%eQYRw<DZitNjH0}3gkgaV~V3Cev9;1B*?s*(2ZIvN@O4oq|Z4$N-{ ztPZN}m7|~19N;fdqwiJE4iqrlUQ$(5FCU3~N^A6inb8mYWx$LzHbD`i531vXpn-;< z?7qoN3`MR+z-fZYJW5S;L>z4;>Gqa=^^Ji@W4I-La8*Ohh?8=AN!h_9;57O$3MK6n z%Y_)_b9mkY)oQfOiBU}*1`siKE3XZ(`9aGeEQ3;OJb<T+3#Pxj4JURMPn|Bz7$9WH znkfl!f&(|8$Y6V82Xb|p9l#$xr&5)>(Nc~?@2XbrLmxh;+S%CdZg)rAEjYEaCQC@5 z{w?e$jW7_GL0oE09Bb`pi`%9~z=go3B{xJ3ZO=mxP;@!{Xvu&(vWgLRH(fOt=Z*w% z==V<CZ^CcT-MLB%e3#Sj?s7MEz?@?U;+h|l*&<fMoDk-8AT2~7q>d$S7;)OQtB4(D zEsfpi-)^*c*d0ZW*uUMXe~3%sX*BFD``LU4aazke_P6;i)Ao+NZocbkd&d!IzUygy zht)Og`s?K?D0hs<fQ-i{+v6J#aztE)BkqH%+AuM@J$T|s_Pcw`E;T9~EwkGl7>Hb@ zNl8D(2LiHn<MXd&d}fdrwIc^cwJ|0mF(&J7+-1+z{a%+nRre1e$0&0&_POk%irw$B zPwIY$+Z&XMd7OYLPaj7fJE#xqaSIgWcj5h3cbs#D6qD{=cM{hF&Ng7_QMLp;l3t}a zkGMX!*Bvtx!;ulj_hY;c+|qD2;5?x2-Tj-vS-C}1pG|MT77-%OZ7?NCI3w=xEsT>n z^t$ne?#Ckrc(Z|4{0>sVAW2e>`q$ujGjakFBgGc9IUCgP$8ANudjTs{3JBrUbI=Yy z{sE*Rj?O)py&gf0zwK-<?=ZKUJ8n}Tcd&8D*}k&V#QH`}+snJ$hswL*y(ebwz8z)E z%7f;E>fOp7a}V!WmY4yJVU6q7&zj@N({1j3-7p`50Q0c956|P~e)X(H%n2#88=NDi znS2A~R{L6V9gtiH*QY{z_R<58d)R!~Jyd?keB^da+O&_NQ;f@_GGhBd2|VmR<UVXB zv8yI<eGJz=T;GT5IId}2_u~3EuKRF3g6j@kpTPBDPzXo!ui-EXSq{g22NF;;!)c(< zXDXv9F$_dlM3}%e29KDSwV+Kx>6@il7*WG6AS_C$i74|4<-OrO(-P$S--}~`*1-O; z9Z`pzXRTd(6J4iN;av-DFY9tE(y!FNU;z<G9D$09#l8sNI3n*_wUUpZ^0k^Xf*uF{ z0F?Z$+2H#!+7Q<Q6#WI>1=eBw@6|Lz;W5tv0YiiD1KV$LCbAE5Iw&2gS>Km!YJn5+ z4;M%le|I4QtW!WcgaSD8CJ_6G_1_R&R(z&eK7%nDQTSHk3=nD{kyZzyrrvx9mK4^r zNb**X5@9Lt6=a9Lr5&lCxQsdSNfeU6&|hrPwG>(eZSs-REPT<l@H&0Hr+QrZN~w=z z6>Dzn64oFU<S?zEa<a#=b$xuIzV!_C+9>fx|9uZBe$B-r*?M&1aIt<k-82Kb-@E#u zWAFK|zKw(J|6OXjp9ofOJ*jr`k#v3F1gB0O_khzVN@Yjtom0<F$oi!E)RB63dzX*Y zyCfHuG5xR{NkhyVg_k8SiisK5-y}l+rpOyK5J06lv5OfB%$Q+!HMhS~x>~H1=4-G% zhS~7-Wt0GHzEZQq+_-q7WI{3;yCh^<`YZ-sF`Ypj%~<v1t`~)JJBCp`I9u0urR%9( zFDlaQ*jpIs*?M%>xnpl>yKqe-c=6mZ$`A4P)u;TM|MAqDlwY9U<Sgvi*+lDC5K+JI zo=5v08N_nJnnBs3b!ioOca?QdG&L%fl$o+knBPE!zs^LH{^P9mbv{ytY?1pYN|r(g zLCp*VQVy1Eh3h#Gb$HmqOmRio!n%M?%`ge{wR0G>Y;n={qHst;HY?tNRHoSyth^zn zo}E=RU8)LiG}asiLliNAq|R6QaD!FvU_k0iNt9z2rOlSjbkW6%1M+BTX0ZatQm~XN zIS^+XeDV@%!R5U8GTeE=6=D3QT!pCg5<b}t+x6m2=<$on!10^Z<A*bl8;X>BM3HiT z$htiS|CNEXhwNNo?0V^IkiDH0Ljo_=yzOJOzg%;&n2TQT`lt+(1%@kLN9%(WT)oWw zAO-uk9n29}nxvceG9ohRUYE?v*(%w+(0cK@VH7Z5EL^n%n-S;{_z~BpXkC-2ij|G+ zb;<MTJoH&EQNIvo1Yld(uw!95*&I+Cz@7!W+Io#+@M8>q9D$cP(Q0}U1wjvm4d_-w zW08f(0`&S?3WCjl^=x&P<yD+K$|X$C!C=ClIsdh8!wrGFBCH?@tVn7B(_Gq~c0sLp zp`rU*n-PpW)Pv{1Y`<xp1`Mb2F}*?X<XKBRUqN|a0ls2?6*uYOroF>JbQBf|hHk(b z0a||e4JSzU_UMB~7Z~wW2B7r=EE?hz^C$HIs09qbc|eaAj}3@>fh{1xL59;@&B$n5 z^evkDA2p~#kk#Y50kJ0EcR^`@|Fmy_mN9<GC@dtj0i>Y)0#d#M0qEPqv7{D9Jpa?E zu?vDx<PkEw4|f!m@*l0h+d)a$B+h*jU9WF#lIR<lg|(6FRNoBsmj4i=Ng=AMJGv0u zI;<cdO7#(clHCx5iffV~Q=iiyMx|bJG_YfUW}&2jHlbdQ39*nw39ySOiys1L>_Ha+ zLQ-h#nFcKE-w($oNr*U8xMn~ar&O+0ZKZ290`fUsjZ2Ph=79d4ltukJh(;sj9z6Gg zoed8MW(?1LaB&iCWa<#Y(sc>6C5_=oqZ4|EIQ{uA`JwFq5vsg-fiVN(ouCU$aC%aB z&4lJ1ek^+vd@00GZ!bI-^bAMbUh32#e$eeS6aCc2?1EUN8&5GeGaSKvFW=%f<bq)L z-?Jpx-b3H;m(a!$DR~rqAbHh?IwSTMNpfLalNgcTL+Vl0XWYdxju=a7D@yvLn?RaB zp=iVffdw)u=JpLmz^>@8My2$A=nVGb8H^Bj0KMPjZc^=r^~emAc0*+9WZ>ye;p{vG zz(@x_wuyYuD4~VX5A4T(YEd=!<-}JYD!c*=9|%yO+M--Ywc=}8FuqX%%K7lYmxQJJ z;X^OA;P{L^0Xx!#Je<=#GqEpw=)i%;;VUulQKz_Rtr*rCcb4K+FYF<)7wAqaKcYak zsM(i?zf+=dKr5kZ4;O84en&*C={*gugushlW8n-3rQ`@o-hJ7VQ0!X3k-z^805eNE zG~U{aLv6i~sxB>=fKmIhC!|vc;eYa8ooeevG4$6Nj-c{IxYotwMD}}XfP}yzfu|}~ zwX}IncP`AsQ(OUB?S~E@7<&}nKNlA#4jq2@k^P4bKl)fpS1yoLx~CO7jyoXyN=37+ z*=rg6O$y~c1j~WsWesr!Y+S^%fqWURPJKtgE$aeK@WPdfsR{5{S&Jl2L?|p6B*!Tf zYX?>CYp?UP5>Q~}7HUl|q+zMwg+M4Q<KjKs8C}dBLbKcb9kN$KD8b!l;AK&v;n^{9 zp?LB+AtG7^07rkxT*B(uNao~=$JTWIVvt1%v9e>!+5Ol_Md~DCM3gEi985OlF-=lz zYOeQd`#<u@pS*TV2r*#F2K26M>om?BA<zVqe)*M&<KtUeG$jQ~6a<mztIwA=fdXom zy*OM6!BwSafaWr-KgWBZBee=B-oM~|w76Wf-sGJDJGJZ9qon%&iqC1PshPDU&~<QK zrrNKN)fml?fG5(QC=ev^?&-x!HgHz!0MUyWkV!a#isonR@j<2j6vdhsp})dkejYVg zf~};nvU3VfStc`UQ(gk7(`EcT?Yw8;dfwCKy<{*KUJOe)w+vlSU}P|)UsPB)sF+&K zN63ll1F^Mo=e^|R+-#lz%IgmyHj#HfQxpqjEedoH&G<Rc#P$@5>B@G2*ROmbQU4Lf zn9zWX!#@)E{km@S;T;f-XcCAC(V`3`0Z2h~D2?kDATEPi+(^Q_GuiG%X$=|Crm97H zF2ph@>Y~Mn35J{nw{_HOglYk7As{Z$!DxdfqP&md{RrMeNul}#L;$p(5=#ZBDBwKA zc@BjvDjK+A31KE~>t=F5Yz^w&c$da08NG@VoUC^FrNJ~!0Uzjs!c@odc^@l)btUi` zy^-?m8RXeb-J)`YZdIJlTf`mUGe}ryov=cnT>~r-{AWL2Qc?Aw%j|}*BJHMEx<nbR z!%Y)QnWf!VPyRn+KEjO;DYmkHR;RGPo#4P!v}x_}?DbMUOID3?_jwY`G$^gWnZ|K! z1G@Wc?z{T~)~bg0007$9SuNZAULXrb->7A+I=_D;*jI6WSylMp^v{hZkXB5X^Gf~f z{^3+OkRec7Cw5<Jn2zSHWvfkvj!#1iJQ~EW@wM7&-Qe|d`-+8o;Oo@q54`ZS^--*J zalNmsxMk+-Hz60Jvk#cC7a;hC`Tbc$G^N*X9lBq}PBUG7H-}P)UZwj@90$q_;A-+2 zV<O&+>lr}`R6F1~E^oo{>{XbNeH?2Np6;%jIR#81_558n>Q%%m76ZG26ydxnAu0ua z@a3?y0EU2dl!c4{SD_zRc*d0@8u(XEST8y2FQo|KT%IPQ0b1y#sxSepSMUmot2=Q~ zX6r(fOYNd)m2T>2$e?<eLXG3Duup;G(g$TU4}uflIDiJbaAMcO!&|7N516q1KHQ`S zK>pDP9;6h_-ZPY=-k}DTZfwI7w6P!^H30pf#|<JdPE&QHZq?;p@7|zI8LJKULCO_@ zYO3KzVXs3Ab71yVR&{h*n46%cZtDX`foH-ys0fA6F+3?N@#sKgj<CtFJ_vtji8-id zL7)NKbBHFl0e(WX>LlE>nc`;*ZbSXbO@Voj5Nf7SS|vRJ(FEx*6_*CB1!#J00%EoZ zsIlZK1(}IzH%f_9lo*smE3uXmVrJ)(W_<#2P_<>Lpvv&M1RpAPyD>n?o)Ahxm?}`T z4^~(Gp@7FvFG{Kd`A>pW4`Cx<1%v_F(Cz#M-|hTq;iZE%fgUtD=srkO+Nl!Zs|JN7 z0X4)<Z{4={2Q2?dvIIaPu*D$n2r31hCV$@rq8JoWU78bR4uCE}2JfQBGqp4aZ#%+m zUdPp^9*-}T2sS8@VAwkamC!lLCFKZOxg)+yE$86<N;$u>Yw&Y*wP;m~6(zn=&{JlI zoSt=!@I?zjjc5oMPzoO3r82VN6}Ma|bge7$J?baTEuy;nqFKUmv4#kx^tnH3c;Eal zfAbqh0Oucm@S9gNCxO^zV39KC%q!P1UVrNo+=76?Y0v%iC;9iKrvPq$l8`bc99EP! z_}pLo%r8d2d{mtq<$rkEKS2KBDJbSJsr6G#uUD5Wd`$-C_E9gc2HP8`!rhM;5Zk#> zF$XS30P{s(DYq==%9QmZEC%15fx16}`u_D&4Sc@=hlBV9TO-xjS04y{;a~i|LyE>Y zlC>T}N#k8DsyqpQ33$<qC(huDFFxt{y-RtMM?k@g<5<TkQG93~gNg+mhgS*ss`7@w z*9S;fzDjc~41OF`!c2aN9iSaja8`s`IdE+1Zw)WqT))EL^%5UYE7Q~GpwD#T{Ap{2 zRlm-{@Hw4zM$(t@_B;;=8n^Y0CgDOfey17IJAm;W1Gd57?%_w(oAf(9u>nD*`4org zP!edi92q<|aKzMiHhFS)b)RMZ0BUSw&+$a0iqlE_?3HL>2vmj{FSS0Q)7wJ?nFhsV zYr)n5Pi4N7qePySKVbv<yfps70pO&78dE<-j+aK9hX{U2hvv1NzRt^TXs!mnhz&5t z-jAm)GY<D8BJZc0NwDWwPWReal+}S>1_*G^Y6OSUw{R#yw+Hq1I?#oM@oJxoV?yjG zx;Ko414%gK?DF$}2KoD-8`0XHe}kv~_L|*J9B@J!z|H2m*7B{}hgO3n2L0Fp9%^u- zsW%22L)8M(Z(3iPq#uUX&LDI<z-EMd%t(0%8ah$?OBf02Kz|D{!*|I!TJLa2QP)Uo zT_8X9f&3U*{-z>7+)<@h(-_1^jJnW1Y7Bu88HMG>y0H!W09_;)9FMr0(WaJs(01wu znm}D(Fe`EB54k;U&%I^>2G70M>L`1Q_<GKW_6=uu>-t{6+2)p&ZEiPMnH_E?49Qa~ z54hdsES@ubzBUcBWO)O&V-N$26+t*MAisckTsw@lu+`b_Lem3lVJ9@C67Dw4lv*1j zn1KfxS?EY@y-vrXbyJ(;`ao(RLR;Mj(2Fdun7wV{(sLfJ8?U%Aly$7pi5Bg^Tg)vq zq;~RaO}BYX@Y>jpx4VM3?sm-m4krbNt~*R>qU(OkvF1&%RZ;h^;_ZXsTj>w#`eF71 zwR8P6<Cy+;Q36mO5_Y^3lk4vMGuWo#q0uy-10yZ)Q3x(6@sy^AXP@_iucOeDG{4JH zv1=hGH7u+eq<gPaU!eN@ZuAuNpdpr~YQ$ZR;7fsxGW_wA8w6M`j@f+2i~04(ygHME zQ$A?@yPoqc6j-ymfTaw)Wfq1k*(-j3t_Y3eTW$+R5Dpb9ZSiW^-V(_U6zzU=qA$Zc zif{?p9OSuo8(QjZYtA0>ifapdnwXZ7TZJ0y?}}}a-i9kpH7M_?5%_ixz6bFhNOy9= z;Mx&X<B|1Vkj~>J$Ab&l=c9qxY|(DF9rLc4FX1Z@a3+qApcTQ`04E+~>bsRSW$nko z2d^EE<6@mq_kYHFGP9ayL~yPiNC9)GU;J<iEhub8<S!9d+0!(zwtkcONdbC2!RiX; zL8SOiZ-Exg6&034VYd1_fp{~bn;)yhpvvGQ2)r0Lc+Rr2u`Dx|2$)sl-KQCBWk6A< zm*UD&gm79|kb?18Wv1WGR6O&&Ua&Fg^QFa4p3M}ZtsKYa`M`y>9%IZV1kgjbmBo|8 zCwTia$9F2S`YS9g8SFu22Hw@a0KJ6Ic2Yi=I>L33n*r(XPit<*`Y9Hb77Z`u)-DyM zg!JA|=fzcFH1ekTgT)qEpJ(tP=7*AXj_&R{&Q^i@gN2PW^cZ^Cf~F&0FJp6pAsbuf zgnBUuKEOHt1>{uv)dk)GNrM-`u<~5KQW4zF)2@2jb+1F|C*-W!4cmH=HScCF2_9tD zF2XSafxL9)Ul8g06keo9lW<NaI@RyQ;|itgiWAj?HuO6Nbf|m4I~}C>7UErqV|6&2 z!?i2A4IEN%Ng?j-i*7*)L=wBeK}eI6@DAf4!WD6D53I|(z-xtNIC!cM0s~<LpA|7c zD&J1V4Qg@UL4N$=ci>7-&!Cn82$g9~ULS6vlkJ`GVvy{WW(pje;IA7uDg3yi<g14` z?P&*Ql)-RqfU!WAJ-~8|Rp1=>u1IhP76ZhOFf+$l8kZCI0_|SGIEcIA2&NlYBgC!p z1Xn1~Fc$V|x3E{A^zj>ctKJ0+R%jun-4xgbNeF#4mIeG3;R?QHVH&HtV1~pWyWI@% zp-!}@2X;!-sO|zY6?h<1n=#-9basL-p{S>8(EbFIHJ;ZtVkBHRy<f@ClyahIRkVP` z?}jJfZycI_iY4_L{lc^Ixj@;O^6^9-@&3mzARmP4WX&p&WuWrX4@IG-K08KtNwwLw za|E7S!08k53+=U=$H~SFhM;NfLM;-2Y8XI3iWj_4Bk}z43*tE%`vSgT+MMsv>jDmi zyIT;++Ec1l>;<-$|NXCZ^!k-Ok`~{hY9cfD;wgizpqxKLQr$KrU{}nBoaFG07X?uZ zPODLX+*x$|<izlz%ejMaO)-kyAl^3QFz~f(U|NEm1%ozg9<RMlStOxCPg)-36RKVh zUF5)*CyKr<l&(4>t`pAuIzd=h_-RRj^2+CFd>-U_;i_1g3fohhovybsp^FdYva~}@ z;1nH#;3KY30fI4{c?vUc{S2F!fS`(=@1TIixHlLV6BQgUeFD}$vi5A{9F(ASEfDPU ztw<F-mk#a%ZEo*HL2<B0A^5>RDOxyYhDT32$k6Y^4MW?;c+rFbecR&PVts*a!XQ{2 zHC<&<4-51`6hGRff+Z>xV-8dS9aZ5&5`YZKDl*ab1m{(L+NY5gEKlZUO5*CUiG&4x z_(W}ZDMcudJxEV#REK(nCTY4>5}=a6z*H0|+&(2q^S}X9M>z!w3NT41#a^gv@RJ&# ze4sO(6bk6EYY!j>&Oi|d+gM(&rRY#YsDW7i8iqVvkxgoV=#z}K+J!Bf;5~w&uxw(y zYOY%#!d)@33rYm4P`9v*du_n*sJ$y@C@7(*SonAywxADn+q%ov@-ILaHYyN1r5#%g zk;S_d8up{P*)Ln4#RR~W<nM9me*~*dZPQ=m<L@)L$+$1`?oWC5D-4LVjrS|Wi99Bv zBkY;=t4#L=1mdQb_=~bCx2f;!rI<$HElIf*)a7gy>8#&mPT7C5L$xwQ)GU!YS6<4e zt#X%$@IZ^k`Yk43gRb<blb#Nal)U#t+^4(HJ_D}&`e+tL!~`L=+lWd)sG;fKP9_Cq zX!+#L+JcBpwf*7vj698>J&d6B8_DD=;p@T>PT-u4wfe_g=Tp1>k#IiF1|KaFKuMIJ zKDMAPd>p*y=UV)5XMG)vmi=%E8Z8AVK+ikQqJ3m?Qs5`Qxd0CMjR`2ZOy(yaedOT# z9(#Q9;QJ1|@6f}KJQmj5=Ati(u7pBpqW*P?JAnH@NUMJccmuE&eHkoP{yV^jU@?L? zy3lcHRi(!xFCf(o<@FpEmS02}UPmqmUOUua7jil4*AZhqjKKehk!SD)Mf^Z-*G#AN zzc9tOIfIlC(eNKgBW6s0r@p6&+^ri`d~7VNZ)!Zoua)ss&gHyxj-Hv8D!k9+a!_Qb z_-_)qoLMWNeXO#j8M3~J3Cm&k!)!|&Pss>G|8a?H1KdO@If#Nrp2LkAK9OL7{fJN0 z;hRYC{fMw^0F6}FIHX8gISDf<#-^H2xwMH~i0crKsL}idv@V=FaZv&kgtq07Waf!4 zU58+W!td|{9FPFf3AhlWNUP9z|05OeUECwk^Vyj)V9^GW0b)#opM{8qf?&Rnx_8ZY zUYwGtLR*&hy})f1e%HdK!0%Yzy=54N5(xHnRY2ti_6qb0^eQGyx#AVXXM~U31=i;g zc*&siigcxC3UM2xyj}b%9s>`ff5kP#BD~&p?Q2<ELSPMWc7(w4orXb3VgF06Gpf#~ zdzFJMy2>KA99YD*u)EmV>$A2kNAktFT)8CeuOLv%u`D80++zpJJ$d862Ffw0Lqf3x zr@pwyg2n~Kp>hwZCsC!Usyxq8brUfki_C(TYU-~f#Y+bKR)B~8s2hc7lpn4lNBubR zr(xA-;4TIa8gX#ZAwmTw9WFijK@FGUTqvas1Dar?05cF*n^b-+A#W!YUBP{f;@i6s zP&)>F`wWTdtD6>OQz*BvJya(F#7*W&{fC=GiRl8Xi)^SJNbF)m#|KTs-o|3)z6r}( z_sP1Jg?fKD2|eaxg|1bqI2HJ`4Ou;bTA}~p+pq~u=MC#iS;rV`Y2Ll|5fshUCl!4D zXILS3@Ns_IE}+IpgmLhMRBMGGZ4Ph=2zinaleJ$AR~}|bb99FQ5Xw!k#f1$cxYS#L zZ$h~VK0IPr4^hl697DV0&LfP$N>aU9g_Sei%G3IID;72INT?5C&h;s!J{MP*i?DwL zX=$Kl=&jKOU`lC);e)2*2ENLdzj+D{65*Z($Ky=R=ZTp3vdNDki`t~JKU3#(ON&nJ zeE#O|b5o}AHVsdAecBH2E$aK4n{mxoDw^M42@4RPks@uhK0ydU#c~S=DO8@;GS7a3 z?*;Vy275q%Jy6)dkY}0aF$RYi97I4Rl{xB(++-%2rYJ80FXL{!Lt$vrDbW*2pyxD- z@Dj+9;}{sQP_e9UA+wj@G62Z3{*F&6rVxp;vb2!15F#1%=@PGdO^^RQ$7csB&Gd^Z zKZqgt{nOKlxHbwuJ%%=j7{kcC10dGozidq@aQ;BRXK~?(?{vkfl(CXvh%bf_obkWz zat7Yjr!J3ckor!Yfmh?HDG?H$0Z;QwXe=%)aD2r2Dx3Z$gRe38I)gnd?Kp!c7<_`k zGK2rXfMRCF-261}evZKv2Gkg|Zt;$yQ0sU2_(u%>Cxb6Cj>NI`*L<{iCxh1vxVEfb z1l#emPaq&lp`Rot4Lr2B)4l1vksnMRO-?39lbz|=<c{<c=_+DQr5E%kkm8R148zC| zrhAizdnVJ}nXOXZ_=J~)mrtr!zzzivZgE*Hu5Yj@UqD4(FZKfshQI^E$6Up92w%wL z)#9gUyiL9i(*&?@XoT}?GAK<E=df%kp~OE&ITlZqW@6}SQT2}c;`pu(_rLX{ENvht z4Wa>Pw5d}L+5jz2Rwok<2MN~-e=RJmh?l+F>xn?7-m@+vti&VMZ!vcq-+V%U<qInE zi6%Mhy}fN8znuubIiOl;Pe4`6|3s%P&a%C+dt{iaz|$yA7RB$lx9=Xwh01_cLCykF zD((ZlhwhODYTHn7h1n2<1Qri?Z}NU~RPs<fgSJ1hY46BAay8Y)sY6zn#}ddbE?M>x zpas2!+_RxlJ~;NA^`>hPew&~Iu34}~WzlZ5JG|skg{y-}iY-EPE9pDgAb6pJQT0!X RfEonip2Lr$Q;xp){{<f=hrs{< diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc deleted file mode 100644 index 8d6f35b0e889d838247709ac2440fed2799abfce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61708 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 diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc deleted file mode 100644 index f44a774b4165e6ff769d8db2f2c13c4dd0cbe8b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35188 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 X?l%ZtK(YD%eZCe!@XRZi#_|6P0+p{e diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/adaptPlot.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/adaptPlot.py deleted file mode 100644 index 102f0373c..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/adaptPlot.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Aug 13 13:46:24 2020 - -@author: farid -""" -import os -from sklearn.metrics import mean_squared_error, r2_score -from itertools import cycle -from matplotlib.backends.backend_pdf import PdfPages -import matplotlib.pyplot as plt - - -def adaptPlot(PCEModel, Y_Val, Y_PC_Val, Y_PC_Val_std, x_values=[], - plotED=False, SaveFig=True): - - NrofSamples = PCEModel.ExpDesign.n_new_samples - initNSamples = PCEModel.ExpDesign.n_init_samples - itrNr = 1 + (PCEModel.ExpDesign.X.shape[0] - initNSamples)//NrofSamples - - oldEDY = PCEModel.ExpDesign.Y - - if SaveFig: - newpath = 'adaptivePlots' - os.makedirs(newpath, exist_ok=True) - - # create a PdfPages object - pdf = PdfPages(f'./{newpath}/Model_vs_PCEModel_itr_{itrNr}.pdf') - - # List of markers and colors - color = cycle((['b', 'g', 'r', 'y', 'k'])) - marker = cycle(('x', 'd', '+', 'o', '*')) - - OutNames = list(Y_Val.keys()) - x_axis = 'Time [s]' - - if len(OutNames) == 1: - OutNames.insert(0, x_axis) - try: - x_values = Y_Val['x_values'] - except KeyError: - x_values = x_values - - fig = plt.figure(figsize=(24, 16)) - - # Plot the model vs PCE model - for keyIdx, key in enumerate(PCEModel.ModelObj.Output.names): - Y_PC_Val_ = Y_PC_Val[key] - Y_PC_Val_std_ = Y_PC_Val_std[key] - Y_Val_ = Y_Val[key] - if Y_Val_.ndim == 1: - Y_Val_ = Y_Val_.reshape(1, -1) - old_EDY = oldEDY[key] - if isinstance(x_values, dict): - x = x_values[key] - else: - x = x_values - - for idx, y in enumerate(Y_Val_): - Color = next(color) - Marker = next(marker) - - plt.plot( - x, y, color=Color, marker=Marker, - lw=2.0, label='$Y_{%s}^{M}$'%(idx+itrNr) - ) - - plt.plot( - x, Y_PC_Val_[idx], color=Color, marker=Marker, - lw=2.0, linestyle='--', label='$Y_{%s}^{PCE}$'%(idx+itrNr) - ) - plt.fill_between( - x, Y_PC_Val_[idx]-1.96*Y_PC_Val_std_[idx], - Y_PC_Val_[idx]+1.96*Y_PC_Val_std_[idx], color=Color, - alpha=0.15 - ) - - if plotED: - for output in old_EDY: - plt.plot(x, output, color='grey', alpha=0.1) - - # Calculate the RMSE - RMSE = mean_squared_error(Y_PC_Val_, Y_Val_, squared=False) - R2 = r2_score(Y_PC_Val_.reshape(-1, 1), Y_Val_.reshape(-1, 1)) - - plt.ylabel(key) - plt.xlabel(x_axis) - plt.title(key) - - ax = fig.axes[0] - ax.legend(loc='best', frameon=True) - fig.canvas.draw() - ax.text(0.65, 0.85, - f'RMSE = {round(RMSE, 3)}\n$R^2$ = {round(R2, 3)}', - transform=ax.transAxes, color='black', - bbox=dict(facecolor='none', - edgecolor='black', - boxstyle='round,pad=1') - ) - plt.grid() - - if SaveFig: - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - pdf.close() diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/apoly_construction.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/apoly_construction.py deleted file mode 100644 index 40830fe8a..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/apoly_construction.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import numpy as np - - -def apoly_construction(Data, degree): - """ - Construction of Data-driven Orthonormal Polynomial Basis - Author: Dr.-Ing. habil. Sergey Oladyshkin - Department of Stochastic Simulation and Safety Research for Hydrosystems - Institute for Modelling Hydraulic and Environmental Systems - Universitaet Stuttgart, Pfaffenwaldring 5a, 70569 Stuttgart - E-mail: Sergey.Oladyshkin@iws.uni-stuttgart.de - http://www.iws-ls3.uni-stuttgart.de - The current script is based on definition of arbitrary polynomial chaos - expansion (aPC), which is presented in the following manuscript: - Oladyshkin, S. and W. Nowak. Data-driven uncertainty quantification using - the arbitrary polynomial chaos expansion. Reliability Engineering & System - Safety, Elsevier, V. 106, P. 179-190, 2012. - DOI: 10.1016/j.ress.2012.05.002. - - Parameters - ---------- - Data : array - Raw data. - degree : int - Maximum polynomial degree. - - Returns - ------- - Polynomial : array - The coefficients of the univariate orthonormal polynomials. - - """ - if Data.ndim !=1: - raise AttributeError('Data should be a 1D array') - - # Initialization - dd = degree + 1 - nsamples = len(Data) - - # Forward linear transformation (Avoiding numerical issues) - MeanOfData = np.mean(Data) - Data = Data/MeanOfData - - # Compute raw moments of input data - raw_moments = [np.sum(np.power(Data, p))/nsamples for p in range(2*dd+2)] - - # Main Loop for Polynomial with degree up to dd - PolyCoeff_NonNorm = np.empty((0, 1)) - Polynomial = np.zeros((dd+1, dd+1)) - - for degree in range(dd+1): - Mm = np.zeros((degree+1, degree+1)) - Vc = np.zeros((degree+1)) - - # Define Moments Matrix Mm - for i in range(degree+1): - for j in range(degree+1): - if (i < degree): - Mm[i, j] = raw_moments[i+j] - - elif (i == degree) and (j == degree): - Mm[i, j] = 1 - - # Numerical Optimization for Matrix Solver - Mm[i] = Mm[i] / max(abs(Mm[i])) - - # Defenition of Right Hand side ortogonality conditions: Vc - for i in range(degree+1): - Vc[i] = 1 if i == degree else 0 - - # Solution: Coefficients of Non-Normal Orthogonal Polynomial: Vp Eq.(4) - try: - Vp = np.linalg.solve(Mm, Vc) - except: - inv_Mm = np.linalg.pinv(Mm) - Vp = np.dot(inv_Mm, Vc.T) - - if degree == 0: - PolyCoeff_NonNorm = np.append(PolyCoeff_NonNorm, Vp) - - if degree != 0: - if degree == 1: - zero = [0] - else: - zero = np.zeros((degree, 1)) - PolyCoeff_NonNorm = np.hstack((PolyCoeff_NonNorm, zero)) - - PolyCoeff_NonNorm = np.vstack((PolyCoeff_NonNorm, Vp)) - - if 100*abs(sum(abs(np.dot(Mm, Vp)) - abs(Vc))) > 0.5: - print('\n---> Attention: Computational Error too high !') - print('\n---> Problem: Convergence of Linear Solver') - - # Original Numerical Normalization of Coefficients with Norm and - # orthonormal Basis computation Matrix Storrage - # Note: Polynomial(i,j) correspont to coefficient number "j-1" - # of polynomial degree "i-1" - P_norm = 0 - for i in range(nsamples): - Poly = 0 - for k in range(degree+1): - if degree == 0: - Poly += PolyCoeff_NonNorm[k] * (Data[i]**k) - else: - Poly += PolyCoeff_NonNorm[degree, k] * (Data[i]**k) - - P_norm += Poly**2 / nsamples - - P_norm = np.sqrt(P_norm) - - for k in range(degree+1): - if degree == 0: - Polynomial[degree, k] = PolyCoeff_NonNorm[k]/P_norm - else: - Polynomial[degree, k] = PolyCoeff_NonNorm[degree, k]/P_norm - - # Backward linear transformation to the real data space - Data *= MeanOfData - for k in range(len(Polynomial)): - Polynomial[:, k] = Polynomial[:, k] / (MeanOfData**(k)) - - return Polynomial diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/bayes_linear.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/bayes_linear.py deleted file mode 100644 index 3bd827ac0..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/bayes_linear.py +++ /dev/null @@ -1,523 +0,0 @@ -import numpy as np -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -from sklearn.utils import check_X_y, check_array, as_float_array -from sklearn.utils.validation import check_is_fitted -from scipy.linalg import svd -import warnings -from sklearn.preprocessing import normalize as f_normalize - - - -class BayesianLinearRegression(RegressorMixin,LinearModel): - ''' - Superclass for Empirical Bayes and Variational Bayes implementations of - Bayesian Linear Regression Model - ''' - def __init__(self, n_iter, tol, fit_intercept,copy_X, verbose): - self.n_iter = n_iter - self.fit_intercept = fit_intercept - self.copy_X = copy_X - self.verbose = verbose - self.tol = tol - - - def _check_convergence(self, mu, mu_old): - ''' - Checks convergence of algorithm using changes in mean of posterior - distribution of weights - ''' - return np.sum(abs(mu-mu_old)>self.tol) == 0 - - - def _center_data(self,X,y): - ''' Centers data''' - X = as_float_array(X,copy = self.copy_X) - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype = X.dtype) - if self.fit_intercept: - X_mean = np.average(X,axis = 0) - y_mean = np.average(y,axis = 0) - X -= X_mean - y = y - y_mean - else: - X_mean = np.zeros(X.shape[1],dtype = X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X,y, X_mean, y_mean, X_std - - - def predict_dist(self,X): - ''' - Calculates mean and variance of predictive distribution for each data - point of test set.(Note predictive distribution for each data point is - Gaussian, therefore it is uniquely determined by mean and variance) - - Parameters - ---------- - x: array-like of size (n_test_samples, n_features) - Set of features for which corresponding responses should be predicted - - Returns - ------- - :list of two numpy arrays [mu_pred, var_pred] - - mu_pred : numpy array of size (n_test_samples,) - Mean of predictive distribution - - var_pred: numpy array of size (n_test_samples,) - Variance of predictive distribution - ''' - # Note check_array and check_is_fitted are done within self._decision_function(X) - mu_pred = self._decision_function(X) - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - return [mu_pred,var_pred] - - - - -class EBLinearRegression(BayesianLinearRegression): - ''' - Bayesian Regression with type II maximum likelihood (Empirical Bayes) - - Parameters: - ----------- - n_iter: int, optional (DEFAULT = 300) - Maximum number of iterations - - tol: float, optional (DEFAULT = 1e-3) - Threshold for convergence - - optimizer: str, optional (DEFAULT = 'fp') - Method for optimization , either Expectation Maximization or - Fixed Point Gull-MacKay {'em','fp'}. Fixed point iterations are - faster, but can be numerically unstable (especially in case of near perfect fit). - - fit_intercept: bool, optional (DEFAULT = True) - If True includes bias term in model - - perfect_fit_tol: float (DEAFAULT = 1e-5) - Prevents overflow of precision parameters (this is smallest value RSS can have). - ( !!! Note if using EM instead of fixed-point, try smaller values - of perfect_fit_tol, for better estimates of variance of predictive distribution ) - - alpha: float (DEFAULT = 1) - Initial value of precision paramter for coefficients ( by default we define - very broad distribution ) - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied, otherwise will be - - verbose: bool, optional (Default = False) - If True at each iteration progress report is printed out - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - intercept_: float - Value of bias term (if fit_intercept is False, then intercept_ = 0) - - alpha_ : float - Estimated precision of coefficients - - beta_ : float - Estimated precision of noise - - eigvals_ : array, shape = (n_features, ) - Eigenvalues of covariance matrix (from posterior distribution of weights) - - eigvecs_ : array, shape = (n_features, n_featues) - Eigenvectors of covariance matrix (from posterior distribution of weights) - - ''' - - def __init__(self,n_iter = 300, tol = 1e-3, optimizer = 'fp', fit_intercept = True, - normalize=True, perfect_fit_tol = 1e-6, alpha = 1, copy_X = True, verbose = False): - super(EBLinearRegression,self).__init__(n_iter, tol, fit_intercept, copy_X, verbose) - if optimizer not in ['em','fp']: - raise ValueError('Optimizer can be either "em" or "fp" ') - self.optimizer = optimizer - self.alpha = alpha - self.perfect_fit = False - self.normalize = True - self.scores_ = [np.NINF] - self.perfect_fit_tol = perfect_fit_tol - - def _check_convergence(self, mu, mu_old): - ''' - Checks convergence of algorithm using changes in mean of posterior - distribution of weights - ''' - return np.sum(abs(mu-mu_old)>self.tol) == 0 - - - def _center_data(self,X,y): - ''' Centers data''' - X = as_float_array(X,copy = self.copy_X) - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype = X.dtype) - if self.fit_intercept: - X_mean = np.average(X, axis=0) - X -= X_mean - if self.normalize: - X, X_std = f_normalize(X, axis=0, copy=False, - return_norm=True) - else: - X_std = np.ones(X.shape[1], dtype=X.dtype) - y_mean = np.average(y, axis=0) - y = y - y_mean - else: - X_mean = np.zeros(X.shape[1],dtype = X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X,y, X_mean, y_mean, X_std - - def fit(self, X, y): - ''' - Fits Bayesian Linear Regression using Empirical Bayes - - Parameters - ---------- - X: array-like of size [n_samples,n_features] - Matrix of explanatory variables (should not include bias term) - - y: array-like of size [n_features] - Vector of dependent variables. - - Returns - ------- - object: self - self - - ''' - # preprocess data - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # precision of noise & and coefficients - alpha = self.alpha - var_y = np.var(y) - # check that variance is non zero !!! - if var_y == 0 : - beta = 1e-2 - else: - beta = 1. / np.var(y) - - # to speed all further computations save svd decomposition and reuse it later - u,d,vt = svd(X, full_matrices = False) - Uy = np.dot(u.T,y) - dsq = d**2 - mu = 0 - - for i in range(self.n_iter): - - # find mean for posterior of w ( for EM this is E-step) - mu_old = mu - if n_samples > n_features: - mu = vt.T * d/(dsq+alpha/beta) - else: - # clever use of SVD here , faster for large n_features - mu = u * 1./(dsq + alpha/beta) - mu = np.dot(X.T,mu) - mu = np.dot(mu,Uy) - - # precompute errors, since both methods use it in estimation - error = y - np.dot(X,mu) - sqdErr = np.sum(error**2) - - if sqdErr / n_samples < self.perfect_fit_tol: - self.perfect_fit = True - warnings.warn( ('Almost perfect fit!!! Estimated values of variance ' - 'for predictive distribution are computed using only RSS')) - break - - if self.optimizer == "fp": - gamma = np.sum(beta*dsq/(beta*dsq + alpha)) - # use updated mu and gamma parameters to update alpha and beta - # !!! made computation numerically stable for perfect fit case - alpha = gamma / (np.sum(mu**2) + np.finfo(np.float32).eps ) - beta = ( n_samples - gamma ) / (sqdErr + np.finfo(np.float32).eps ) - else: - # M-step, update parameters alpha and beta to maximize ML TYPE II - eigvals = 1. / (beta * dsq + alpha) - alpha = n_features / ( np.sum(mu**2) + np.sum(1/eigvals) ) - beta = n_samples / ( sqdErr + np.sum(dsq/eigvals) ) - - # if converged or exceeded maximum number of iterations => terminate - converged = self._check_convergence(mu_old,mu) - if self.verbose: - print( "Iteration {0} completed".format(i) ) - if converged is True: - print("Algorithm converged after {0} iterations".format(i)) - if converged or i==self.n_iter -1: - break - eigvals = 1./(beta * dsq + alpha) - self.coef_ = beta*np.dot(vt.T*d*eigvals ,Uy) - self._set_intercept(X_mean,y_mean,X_std) - self.beta_ = beta - self.alpha_ = alpha - self.eigvals_ = eigvals - self.eigvecs_ = vt.T - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self,X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of predictive - distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - ''' - y_hat = np.dot(X,self.coef_) + self.intercept_ - - if return_std: - if self.normalize: - X = (X - self._x_mean_) / self._x_std - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - std_hat = np.sqrt(var_pred) - return y_hat, std_hat - else: - return y_hat - - -# ============================== VBLR ========================================= - -def gamma_mean(a,b): - ''' - Computes mean of gamma distribution - - Parameters - ---------- - a: float - Shape parameter of Gamma distribution - - b: float - Rate parameter of Gamma distribution - - Returns - ------- - : float - Mean of Gamma distribution - ''' - return float(a) / b - - - -class VBLinearRegression(BayesianLinearRegression): - ''' - Implements Bayesian Linear Regression using mean-field approximation. - Assumes gamma prior on precision parameters of coefficients and noise. - - Parameters: - ----------- - n_iter: int, optional (DEFAULT = 100) - Maximum number of iterations for KL minimization - - tol: float, optional (DEFAULT = 1e-3) - Convergence threshold - - fit_intercept: bool, optional (DEFAULT = True) - If True will use bias term in model fitting - - a: float, optional (Default = 1e-4) - Shape parameter of Gamma prior for precision of coefficients - - b: float, optional (Default = 1e-4) - Rate parameter of Gamma prior for precision coefficients - - c: float, optional (Default = 1e-4) - Shape parameter of Gamma prior for precision of noise - - d: float, optional (Default = 1e-4) - Rate parameter of Gamma prior for precision of noise - - verbose: bool, optional (Default = False) - If True at each iteration progress report is printed out - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - intercept_: float - Value of bias term (if fit_intercept is False, then intercept_ = 0) - - alpha_ : float - Mean of precision of coefficients - - beta_ : float - Mean of precision of noise - - eigvals_ : array, shape = (n_features, ) - Eigenvalues of covariance matrix (from posterior distribution of weights) - - eigvecs_ : array, shape = (n_features, n_featues) - Eigenvectors of covariance matrix (from posterior distribution of weights) - - ''' - - def __init__(self, n_iter = 100, tol =1e-4, fit_intercept = True, - a = 1e-4, b = 1e-4, c = 1e-4, d = 1e-4, copy_X = True, - verbose = False): - super(VBLinearRegression,self).__init__(n_iter, tol, fit_intercept, copy_X, - verbose) - self.a,self.b = a, b - self.c,self.d = c, d - - - def fit(self,X,y): - ''' - Fits Variational Bayesian Linear Regression Model - - Parameters - ---------- - X: array-like of size [n_samples,n_features] - Matrix of explanatory variables (should not include bias term) - - Y: array-like of size [n_features] - Vector of dependent variables. - - Returns - ------- - object: self - self - ''' - # preprocess data - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # SVD decomposition, done once , reused at each iteration - u,D,vt = svd(X, full_matrices = False) - dsq = D**2 - UY = np.dot(u.T,y) - - # some parameters of Gamma distribution have closed form solution - a = self.a + 0.5 * n_features - c = self.c + 0.5 * n_samples - b,d = self.b, self.d - - # initial mean of posterior for coefficients - mu = 0 - - for i in range(self.n_iter): - - # update parameters of distribution Q(weights) - e_beta = gamma_mean(c,d) - e_alpha = gamma_mean(a,b) - mu_old = np.copy(mu) - mu,eigvals = self._posterior_weights(e_beta,e_alpha,UY,dsq,u,vt,D,X) - - # update parameters of distribution Q(precision of weights) - b = self.b + 0.5*( np.sum(mu**2) + np.sum(eigvals)) - - # update parameters of distribution Q(precision of likelihood) - sqderr = np.sum((y - np.dot(X,mu))**2) - xsx = np.sum(dsq*eigvals) - d = self.d + 0.5*(sqderr + xsx) - - # check convergence - converged = self._check_convergence(mu,mu_old) - if self.verbose is True: - print("Iteration {0} is completed".format(i)) - if converged is True: - print("Algorithm converged after {0} iterations".format(i)) - - # terminate if convergence or maximum number of iterations are achieved - if converged or i==(self.n_iter-1): - break - - # save necessary parameters - self.beta_ = gamma_mean(c,d) - self.alpha_ = gamma_mean(a,b) - self.coef_, self.eigvals_ = self._posterior_weights(self.beta_, self.alpha_, UY, - dsq, u, vt, D, X) - self._set_intercept(X_mean,y_mean,X_std) - self.eigvecs_ = vt.T - return self - - - def _posterior_weights(self, e_beta, e_alpha, UY, dsq, u, vt, d, X): - ''' - Calculates parameters of approximate posterior distribution - of weights - ''' - # eigenvalues of covariance matrix - sigma = 1./ (e_beta*dsq + e_alpha) - - # mean of approximate posterior distribution - n_samples, n_features = X.shape - if n_samples > n_features: - mu = vt.T * d/(dsq + e_alpha/e_beta)# + np.finfo(np.float64).eps) - else: - mu = u * 1./(dsq + e_alpha/e_beta)# + np.finfo(np.float64).eps) - mu = np.dot(X.T,mu) - mu = np.dot(mu,UY) - return mu,sigma - - def predict(self,X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of predictive - distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - ''' - x = (X - self._x_mean_) / self._x_std - y_hat = np.dot(x,self.coef_) + self._y_mean - - if return_std: - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - std_hat = np.sqrt(var_pred) - return y_hat, std_hat - else: - return y_hat \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/engine.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/engine.py deleted file mode 100644 index 7f5c1bf77..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/engine.py +++ /dev/null @@ -1,2195 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Sat Dec 16 10:16:50 2023 -Engine to train the surrogate with - -@author: Rebecca Kohlhaas -""" -import copy -from copy import deepcopy, copy -import h5py -import joblib -import numpy as np -import os - -from scipy import stats, signal, linalg, sparse -from scipy.spatial import distance -from tqdm import tqdm -import scipy.optimize as opt -from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import seaborn as sns -from joblib import Parallel, delayed -from .exploration import Exploration -import pathlib - -#from .inputs import Input -#from .exp_designs import ExpDesigns -#from .surrogate_models import MetaModel -#from bayesvalidrox.post_processing.post_processing import PostProcessing - -def hellinger_distance(P, Q): - """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) - - Parameters - ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. - - Returns - ------- - float - Hellinger distance of two distributions. - - """ - P = np.array(P) - Q= np.array(Q) - - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - -def logpdf(x, mean, cov): - """ - Computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - -def subdomain(Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : int - Number of samples to divide the domain for. - n_params : int - The number of params to build the subdomains for - - Returns - ------- - Subdomains : List of tuples of tuples - Each tuple of tuples divides one set of bounds into n_new_samples parts. - - """ - n_params = len(Bounds) - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains - -class Engine(): - - - def __init__(self, MetaMod, Model, ExpDes): - self.MetaModel = MetaMod - self.Model = Model - self.ExpDesign = ExpDes - self.parallel = False - - def start_engine(self) -> None: - """ - Do all the preparations that need to be run before the actual training - - Returns - ------- - None - - """ - self.out_names = self.Model.Output.names - self.MetaModel.out_names = self.out_names - - - def train_normal(self, parallel = False, verbose = False, save = False) -> None: - """ - Trains surrogate on static samples only. - Samples are taken from the experimental design and the specified - model is run on them. - Alternatively the samples can be read in from a provided hdf5 file. - - - Returns - ------- - None - - """ - - ExpDesign = self.ExpDesign - MetaModel = self.MetaModel - - # Read ExpDesign (training and targets) from the provided hdf5 - if ExpDesign.hdf5_file is not None: - # TODO: need to run 'generate_ED' as well after this or not? - ExpDesign.read_from_file(self.out_names) - else: - # Check if an old hdf5 file exists: if yes, rename it - hdf5file = f'ExpDesign_{self.Model.name}.hdf5' - if os.path.exists(hdf5file): - # os.rename(hdf5file, 'old_'+hdf5file) - file = pathlib.Path(hdf5file) - file.unlink() - - # Prepare X samples - # For training the surrogate use ExpDesign.X_tr, ExpDesign.X is for the model to run on - ExpDesign.generate_ED(ExpDesign.n_init_samples, - transform=True, - max_pce_deg=np.max(MetaModel.pce_deg)) - - # Run simulations at X - if not hasattr(ExpDesign, 'Y') or ExpDesign.Y is None: - print('\n Now the forward model needs to be run!\n') - ED_Y, up_ED_X = self.Model.run_model_parallel(ExpDesign.X, mp = parallel) - ExpDesign.Y = ED_Y - else: - # Check if a dict has been passed. - if not type(ExpDesign.Y) is dict: - raise Exception('Please provide either a dictionary or a hdf5' - 'file to ExpDesign.hdf5_file argument.') - - # Separate output dict and x-values - if 'x_values' in ExpDesign.Y: - ExpDesign.x_values = ExpDesign.Y['x_values'] - del ExpDesign.Y['x_values'] - else: - print('No x_values are given, this might lead to issues during PostProcessing') - - - # Fit the surrogate - MetaModel.fit(ExpDesign.X_tr, ExpDesign.Y, parallel, verbose) - - # Save what there is to save - if save: - # Save surrogate - with open(f'surrogates/surrogate_{self.Model.name}.pk1', 'wb') as output: - joblib.dump(MetaModel, output, 2) - - # Zip the model run directories - if self.Model.link_type.lower() == 'pylink' and\ - self.ExpDesign.sampling_method.lower() != 'user': - self.Model.zip_subdirs(self.Model.name, f'{self.Model.name}_') - - - def train_sequential(self, parallel = False, verbose = False) -> None: - """ - Train the surrogate in a sequential manner. - First build and train evereything on the static samples, then iterate - choosing more samples and refitting the surrogate on them. - - Returns - ------- - None - - """ - #self.train_normal(parallel, verbose) - self.parallel = parallel - self.train_seq_design(parallel, verbose) - - - # ------------------------------------------------------------------------- - def eval_metamodel(self, samples=None, nsamples=None, - sampling_method='random', return_samples=False): - """ - Evaluates meta-model at the requested samples. One can also generate - nsamples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate meta-model at. The default is None. - nsamples : int, optional - Number of samples to generate, if no `samples` is provided. The - default is None. - sampling_method : str, optional - Type of sampling, if no `samples` is provided. The default is - 'random'. - return_samples : bool, optional - Retun samples, if no `samples` is provided. The default is False. - - Returns - ------- - mean_pred : dict - Mean of the predictions. - std_pred : dict - Standard deviatioon of the predictions. - """ - # Generate or transform (if need be) samples - if samples is None: - # Generate - samples = self.ExpDesign.generate_samples( - nsamples, - sampling_method - ) - - # Transformation to other space is to be done in the MetaModel - # TODO: sort the transformations better - mean_pred, std_pred = self.MetaModel.eval_metamodel(samples) - - if return_samples: - return mean_pred, std_pred, samples - else: - return mean_pred, std_pred - - - # ------------------------------------------------------------------------- - def train_seq_design(self, parallel = False, verbose = False): - """ - Starts the adaptive sequential design for refining the surrogate model - by selecting training points in a sequential manner. - - Returns - ------- - MetaModel : object - Meta model object. - - """ - self.parallel = parallel - - # Initialization - self.SeqModifiedLOO = {} - self.seqValidError = {} - self.SeqBME = {} - self.SeqKLD = {} - self.SeqDistHellinger = {} - self.seqRMSEMean = {} - self.seqRMSEStd = {} - self.seqMinDist = [] - - if not hasattr(self.MetaModel, 'valid_samples'): - self.ExpDesign.valid_samples = [] - self.ExpDesign.valid_model_runs = [] - self.valid_likelihoods = [] - - validError = None - - - # Determine the metamodel type - if self.MetaModel.meta_model_type.lower() != 'gpe': - pce = True - else: - pce = False - mc_ref = True if bool(self.Model.mc_reference) else False - if mc_ref: - self.Model.read_observation('mc_ref') - - # Get the parameters - max_n_samples = self.ExpDesign.n_max_samples - mod_LOO_threshold = self.ExpDesign.mod_LOO_threshold - n_canddidate = self.ExpDesign.n_canddidate - post_snapshot = self.ExpDesign.post_snapshot - n_replication = self.ExpDesign.n_replication - util_func = self.ExpDesign.util_func - output_name = self.out_names - - # Handle if only one UtilityFunctions is provided - if not isinstance(util_func, list): - util_func = [self.ExpDesign.util_func] - - # Read observations or MCReference - # TODO: recheck the logic in this if statement - if (len(self.Model.observations) != 0 or self.Model.meas_file is not None) and hasattr(self.MetaModel, 'Discrepancy'): - self.observations = self.Model.read_observation() - obs_data = self.observations - else: - obs_data = [] - # TODO: TotalSigma2 not defined if not in this else??? - # TODO: no self.observations if in here - TotalSigma2 = {} - - # ---------- Initial self.MetaModel ---------- - self.train_normal(parallel = parallel, verbose=verbose) - - initMetaModel = deepcopy(self.MetaModel) - - # Validation error if validation set is provided. - if self.ExpDesign.valid_model_runs: - init_rmse, init_valid_error = self._validError(initMetaModel) - init_valid_error = list(init_valid_error.values()) - else: - init_rmse = None - - # Check if discrepancy is provided - if len(obs_data) != 0 and hasattr(self.MetaModel, 'Discrepancy'): - TotalSigma2 = self.MetaModel.Discrepancy.parameters - - # Calculate the initial BME - out = self._BME_Calculator( - obs_data, TotalSigma2, init_rmse) - init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out - print(f"\nInitial BME: {init_BME:.2f}") - print(f"Initial KLD: {init_KLD:.2f}") - - # Posterior snapshot (initial) - if post_snapshot: - parNames = self.ExpDesign.par_names - print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') - - # Check the convergence of the Mean & Std - if mc_ref and pce: - init_rmse_mean, init_rmse_std = self._error_Mean_Std() - print(f"Initial Mean and Std error: {init_rmse_mean:.2f}," - f" {init_rmse_std:.2f}") - - # Read the initial experimental design - Xinit = self.ExpDesign.X - init_n_samples = len(self.ExpDesign.X) - initYprev = self.ExpDesign.Y#initMetaModel.ModelOutputDict - #self.MetaModel.ModelOutputDict = self.ExpDesign.Y - initLCerror = initMetaModel.LCerror - n_itrs = max_n_samples - init_n_samples - - ## Get some initial statistics - # Read the initial ModifiedLOO - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = self.ExpDesign.Y[out_name] - Scores_all.append(list( - self.MetaModel.score_dict['b_1'][out_name].values())) - if self.MetaModel.dim_red_method.lower() == 'pca': - pca = self.MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - - Scores = [item for sublist in Scores_all for item in sublist] - weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], - weights=weights)] - - prevMetaModel_dict = {} - #prevExpDesign_dict = {} - # Can run sequential design multiple times for comparison - for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # util_func: the function to use inside the type of exploitation - for util_f in util_func: - print(f'\n>>>> Utility Function: {util_f} <<<<') - # To avoid changes ub original aPCE object - self.ExpDesign.X = Xinit - self.ExpDesign.Y = initYprev - self.ExpDesign.LCerror = initLCerror - - # Set the experimental design - Xprev = Xinit - total_n_samples = init_n_samples - Yprev = initYprev - - Xfull = [] - Yfull = [] - - # Store the initial ModifiedLOO - if pce: - print("\nInitial ModifiedLOO:", init_mod_LOO) - SeqModifiedLOO = np.array(init_mod_LOO) - - if len(self.ExpDesign.valid_model_runs) != 0: - SeqValidError = np.array(init_valid_error) - - # Check if data is provided - if len(obs_data) != 0 and hasattr(self.MetaModel, 'Discrepancy'): - SeqBME = np.array([init_BME]) - SeqKLD = np.array([init_KLD]) - SeqDistHellinger = np.array([init_dist_hellinger]) - - if mc_ref and pce: - seqRMSEMean = np.array([init_rmse_mean]) - seqRMSEStd = np.array([init_rmse_std]) - - # ------- Start Sequential Experimental Design ------- - postcnt = 1 - for itr_no in range(1, n_itrs+1): - print(f'\n>>>> Iteration number {itr_no} <<<<') - - # Save the metamodel prediction before updating - prevMetaModel_dict[itr_no] = deepcopy(self.MetaModel) - #prevExpDesign_dict[itr_no] = deepcopy(self.ExpDesign) - if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] - self._y_hat_prev, _ = pc_model.eval_metamodel( - samples=Xfull[-1].reshape(1, -1)) - del prevMetaModel_dict[itr_no-1] - - # Optimal Bayesian Design - #self.MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.choose_next_sample(TotalSigma2, - n_canddidate, - util_f) - S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - self.seqMinDist.append(S) - print(f"\nmin Dist from OldExpDesign: {S:2f}") - print("\n") - - # Evaluate the full model response at the new sample - Ynew, _ = self.Model.run_model_parallel( - Xnew, prevRun_No=total_n_samples - ) - total_n_samples += Xnew.shape[0] - - # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(self.ExpDesign, 'adapt_verbose') and \ - self.ExpDesign.adapt_verbose: - from .adaptPlot import adaptPlot - y_hat, std_hat = self.MetaModel.eval_metamodel( - samples=Xnew - ) - adaptPlot( - self.MetaModel, Ynew, y_hat, std_hat, - plotED=False - ) - - # -------- Retrain the surrogate model ------- - # Extend new experimental design - Xfull = np.vstack((Xprev, Xnew)) - - # Updating experimental design Y - for out_name in output_name: - Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - self.ExpDesign.Y[out_name] = Yfull - - # Pass new design to the metamodel object - self.ExpDesign.sampling_method = 'user' - self.ExpDesign.X = Xfull - #self.ExpDesign.Y = self.MetaModel.ModelOutputDict - - # Save the Experimental Design for next iteration - Xprev = Xfull - Yprev = self.ExpDesign.Y - - # Pass the new prior as the input - # TODO: another look at this - no difference apc to pce to gpe? - self.MetaModel.input_obj.poly_coeffs_flag = False - if updatedPrior is not None: - self.MetaModel.input_obj.poly_coeffs_flag = True - print("updatedPrior:", updatedPrior.shape) - # Arbitrary polynomial chaos - for i in range(updatedPrior.shape[1]): - self.MetaModel.input_obj.Marginals[i].dist_type = None - x = updatedPrior[:, i] - self.MetaModel.input_obj.Marginals[i].raw_data = x - - # Train the surrogate model for new ExpDesign - self.train_normal(parallel=False) - - # -------- Evaluate the retrained surrogate model ------- - # Extract Modified LOO from Output - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = self.ExpDesign.Y[out_name] - Scores_all.append(list( - self.MetaModel.score_dict['b_1'][out_name].values())) - if self.MetaModel.dim_red_method.lower() == 'pca': - pca = self.MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, - axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - Scores = [item for sublist in Scores_all for item - in sublist] - weights = [item for sublist in varExpDesignY for item - in sublist] - ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] - - print('\n') - print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) - print('\n') - - # Compute the validation error - if self.ExpDesign.valid_model_runs: - rmse, validError = self._validError(self.MetaModel) - ValidError = list(validError.values()) - else: - rmse = None - - # Store updated ModifiedLOO - if pce: - SeqModifiedLOO = np.vstack( - (SeqModifiedLOO, ModifiedLOO)) - if len(self.ExpDesign.valid_model_runs) != 0: - SeqValidError = np.vstack( - (SeqValidError, ValidError)) - # -------- Caclulation of BME as accuracy metric ------- - # Check if data is provided - if len(obs_data) != 0: - # Calculate the initial BME - out = self._BME_Calculator(obs_data, TotalSigma2, rmse) - BME, KLD, Posterior, likes, DistHellinger = out - print('\n') - print(f"Updated BME: {BME:.2f}") - print(f"Updated KLD: {KLD:.2f}") - print('\n') - - # Plot some snapshots of the posterior - step_snapshot = self.ExpDesign.step_snapshot - if post_snapshot and postcnt % step_snapshot == 0: - parNames = self.ExpDesign.par_names - print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') - postcnt += 1 - - # Check the convergence of the Mean&Std - if mc_ref and pce: - print('\n') - RMSE_Mean, RMSE_std = self._error_Mean_Std() - print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " - f"{RMSE_std:.2f}") - print('\n') - - # Store the updated BME & KLD - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.vstack((SeqBME, BME)) - SeqKLD = np.vstack((SeqKLD, KLD)) - SeqDistHellinger = np.vstack((SeqDistHellinger, - DistHellinger)) - if mc_ref and pce: - seqRMSEMean = np.vstack((seqRMSEMean, RMSE_Mean)) - seqRMSEStd = np.vstack((seqRMSEStd, RMSE_std)) - - if pce and any(LOO < mod_LOO_threshold - for LOO in ModifiedLOO): - break - - # Clean up - if len(obs_data) != 0: - del out - print() - print('-'*50) - print() - - # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' - if pce: - self.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(self.ExpDesign.valid_model_runs) != 0: - self.seqValidError[strKey] = SeqValidError - - # Check if data is provided - if len(obs_data) != 0: - self.SeqBME[strKey] = SeqBME - self.SeqKLD[strKey] = SeqKLD - if hasattr(self.MetaModel, 'valid_likelihoods') and \ - self.valid_likelihoods: - self.SeqDistHellinger[strKey] = SeqDistHellinger - if mc_ref and pce: - self.seqRMSEMean[strKey] = seqRMSEMean - self.seqRMSEStd[strKey] = seqRMSEStd - - # return self.MetaModel - - # ------------------------------------------------------------------------- - def util_VarBasedDesign(self, X_can, index, util_func='Entropy'): - """ - Computes the exploitation scores based on: - active learning MacKay(ALM) and active learning Cohn (ALC) - Paper: Sequential Design with Mutual Information for Computer - Experiments (MICE): Emulation of a Tsunami Model by Beck and Guillas - (2016) - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - index : int - Model output index. - UtilMethod : string, optional - Exploitation utility function. The default is 'Entropy'. - - Returns - ------- - float - Score. - - """ - MetaModel = self.MetaModel - ED_X = self.ExpDesign.X - out_dict_y = self.ExpDesign.Y - out_names = self.out_names - - # Run the Metamodel for the candidate - X_can = X_can.reshape(1, -1) - Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) - - if util_func.lower() == 'alm': - # ----- Entropy/MMSE/active learning MacKay(ALM) ----- - # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - varPCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - varPCE[KeyIdx] = np.max(canPredVar[key], axis=1) - score = np.max(varPCE, axis=0) - - elif util_func.lower() == 'eigf': - # ----- Expected Improvement for Global fit ----- - # Find closest EDX to the candidate - distances = distance.cdist(ED_X, X_can, 'euclidean') - index = np.argmin(distances) - - # Compute perdiction error and variance of the old model - predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - # Compute perdiction error and variance of the old model - # Eq (5) from Liu et al.(2018) - EIGF_PCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - residual = predError[key] - out_dict_y[key][int(index)] - var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) - score = np.max(EIGF_PCE, axis=0) - - return -1 * score # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianActiveDesign(self, y_hat, std, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian active design criterion (var). - - It is based on the following paper: - Oladyshkin, Sergey, Farid Mohammadi, Ilja Kroeker, and Wolfgang Nowak. - "Bayesian3 active learning for the gaussian process emulator using - information theory." Entropy 22, no. 8 (2020): 890. - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - BAL design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # Get the data - obs_data = self.observations - # TODO: this should be optimizable to be calculated explicitly - if hasattr(self.Model, 'n_obs'): - n_obs = self.Model.n_obs - else: - n_obs = self.n_obs - mc_size = 10000 - - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((mc_size)) - # print(y_hat) - # print(list[y_hat]) - for key in list(y_hat): - cov = np.diag(std[key]**2) - # print(y_hat[key], cov) - # TODO: added the allow_singular = True here - rv = stats.multivariate_normal(mean=y_hat[key], cov=cov,) - Y_MC[key] = rv.rvs(size=mc_size) - logPriorLikelihoods += rv.logpdf(Y_MC[key]) - std_MC[key] = np.zeros((mc_size, y_hat[key].shape[0])) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self._normpdf(Y_MC, std_MC, obs_data, sigma2Dict) - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, mc_size)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods), dtype=np.longdouble)#float128) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - # Utility function Eq.2 in Ref. (2) - # Posterior covariance matrix after observing data y - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # TODO: Calculate the correction factor for BME - # BMECorrFactor = self.BME_Corr_Weight(PCE_SparseBayes_can, - # ObservationData, sigma2Dict) - # BME += BMECorrFactor - # Haun et al implementation - # U_J_d = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - U_J_d = postExpLikelihoods - logBME - - # Marginal log likelihood - elif var == 'BME': - U_J_d = np.nanmean(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - logBME = np.log(np.nanmean(likelihoods)) - infEntropy = logBME - postExpPrior - postExpLikelihoods - U_J_d = infEntropy * -1 # -1 for minimization - - # Bayesian information criterion - elif var == 'BIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxL = np.nanmax(likelihoods) - U_J_d = -2 * np.log(maxL) + np.log(n_obs) * nModelParams - - # Akaike information criterion - elif var == 'AIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxlogL = np.log(np.nanmax(likelihoods)) - AIC = -2 * maxlogL + 2 * nModelParams - # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) - penTerm = 0 - U_J_d = 1*(AIC + penTerm) - - # Deviance information criterion - elif var == 'DIC': - # D_theta_bar = np.mean(-2 * Likelihoods) - N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self._normpdf( - y_hat, std, obs_data, sigma2Dict - ) - DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p - - U_J_d = DIC - - else: - print('The algorithm you requested has not been implemented yet!') - - # Handle inf and NaN (replace by zero) - if np.isnan(U_J_d) or U_J_d == -np.inf or U_J_d == np.inf: - U_J_d = 0.0 - - # Clear memory - del likelihoods - del Y_MC - del std_MC - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - MetaModel = self.MetaModel - out_names = self.out_names - if X_can.ndim == 1: - X_can = X_can.reshape(1, -1) - - # Compute the mean and std based on the MetaModel - # pce_means, pce_stds = self._compute_pce_moments(MetaModel) - if var == 'ALC': - Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) - - # Old Experimental design - oldExpDesignX = self.ExpDesign.X - oldExpDesignY = self.ExpDesign.Y - - # Evaluate the PCE metamodels at that location ??? - Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) - PCE_Model_can = deepcopy(MetaModel) - engine_can = deepcopy(self) - # Add the candidate to the ExpDesign - NewExpDesignX = np.vstack((oldExpDesignX, X_can)) - - NewExpDesignY = {} - for key in oldExpDesignY.keys(): - NewExpDesignY[key] = np.vstack( - (oldExpDesignY[key], Y_PC_can[key]) - ) - - engine_can.ExpDesign.sampling_method = 'user' - engine_can.ExpDesign.X = NewExpDesignX - #engine_can.ModelOutputDict = NewExpDesignY - engine_can.ExpDesign.Y = NewExpDesignY - - # Train the model for the observed data using x_can - engine_can.MetaModel.input_obj.poly_coeffs_flag = False - engine_can.start_engine() - engine_can.train_normal(parallel=False) - engine_can.MetaModel.fit(NewExpDesignX, NewExpDesignY) -# engine_can.train_norm_design(parallel=False) - - # Set the ExpDesign to its original values - engine_can.ExpDesign.X = oldExpDesignX - engine_can.ModelOutputDict = oldExpDesignY - engine_can.ExpDesign.Y = oldExpDesignY - - if var.lower() == 'mi': - # Mutual information based on Krause et al - # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = engine_can.MetaModel.eval_metamodel(samples=X_can) - std_can = {key: std_PC_can[key] for key in out_names} - - std_old = {key: Y_std_can[key] for key in out_names} - - varPCE = np.zeros((len(out_names))) - for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) - score = np.mean(varPCE) - - return -1 * score - - elif var.lower() == 'alc': - # Active learning based on Gramyc and Lee - # Adaptive design and analysis of supercomputer experiments Techno- - # metrics, 51 (2009), pp. 130–145. - - # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = engine_can.MetaModel.eval_metamodel(samples=X_MC) - - # Compute the score - score = [] - for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) - score = np.mean(score) - - return -1 * score - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = X_MC.shape[0] - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Enriching Monte Carlo samples if need be - if ESS != 0: - X_MC = self.ExpDesign.generate_samples( - MCsize, 'random' - ) - - # Evaluate the MetaModel at the given samples - Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self._normpdf( - Y_MC, std_MC, self.observations, sigma2Dict - ) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - print("--- increasing MC size---") - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # -------------------- Utility functions -------------------- - # Utility function Eq.2 in Ref. (2) - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.longdouble))#float128)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Haun et al implementation - U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) - - # U_J_d = np.sum(G_n_m_all) - # Ryan et al (2014) implementation - # importanceWeights = Likelihoods[Likelihoods!=0]/np.sum(Likelihoods[Likelihoods!=0]) - # U_J_d = np.mean(importanceWeights*np.log(Likelihoods[Likelihoods!=0])) - logBME - - # U_J_d = postExpLikelihoods - logBME - - # Marginal likelihood - elif var == 'BME': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - U_J_d = logBME - - # Bayes risk likelihood - elif var == 'BayesRisk': - - U_J_d = -1 * np.var(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postLikelihoods /= np.nansum(likelihoods[accepted]) - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - infEntropy = logBME - postExpPrior - postExpLikelihoods - - U_J_d = infEntropy * -1 # -1 for minimization - - # D-Posterior-precision - elif var == 'DPP': - X_Posterior = X_MC[accepted] - # covariance of the posterior parameters - U_J_d = -np.log(np.linalg.det(np.cov(X_Posterior))) - - # A-Posterior-precision - elif var == 'APP': - X_Posterior = X_MC[accepted] - # trace of the posterior parameters - U_J_d = -np.log(np.trace(np.cov(X_Posterior))) - - else: - print('The algorithm you requested has not been implemented yet!') - - # Clear memory - del likelihoods - del Y_MC - del std_MC - - return -1 * U_J_d # -1 is for minimization instead of maximization - - - # ------------------------------------------------------------------------- - def run_util_func(self, method, candidates, index, sigma2Dict=None, - var=None, X_MC=None): - """ - Runs the utility function based on the given method. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - candidates : array of shape (n_samples, n_params) - All candidate parameter sets. - index : int - ExpDesign index. - sigma2Dict : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - var : string, optional - Utility function. The default is None. - X_MC : TYPE, optional - DESCRIPTION. The default is None. - - Returns - ------- - index : TYPE - DESCRIPTION. - List - Scores. - - """ - - if method.lower() == 'varoptdesign': - # U_J_d = self.util_VarBasedDesign(candidates, index, var) - U_J_d = np.zeros((candidates.shape[0])) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="varoptdesign"): - U_J_d[idx] = self.util_VarBasedDesign(X_can, index, var) - - elif method.lower() == 'bayesactdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - # Evaluate all candidates - y_can, std_can = self.MetaModel.eval_metamodel(samples=candidates) - # loop through candidates - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="BAL Design"): - y_hat = {key: items[idx] for key, items in y_can.items()} - std = {key: items[idx] for key, items in std_can.items()} - - # print(y_hat) - # print(std) - U_J_d[idx] = self.util_BayesianActiveDesign( - y_hat, std, sigma2Dict, var) - - elif method.lower() == 'bayesoptdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, - var) - return (index, -1 * U_J_d) - - # ------------------------------------------------------------------------- - def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, - verbose=False): - """ - Exploration algorithm to find the optimum parameter space. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - Bounds : list of tuples - List of lower and upper boundaries of parameters. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - Run_No : int - Run number. - verbose : bool, optional - Print out a summary. The default is False. - - Returns - ------- - Run_No : int - Run number. - array - Optimial candidate. - - """ - - Model = self.Model - max_func_itr = self.ExpDesign.max_func_itr - - if method == 'VarOptDesign': - Res_Global = opt.dual_annealing(self.util_VarBasedDesign, - bounds=Bounds, - args=(Model, var), - maxfun=max_func_itr) - - elif method == 'BayesOptDesign': - Res_Global = opt.dual_annealing(self.util_BayesianDesign, - bounds=Bounds, - args=(Model, sigma2Dict, var), - maxfun=max_func_itr) - - if verbose: - print(f"Global minimum: xmin = {Res_Global.x}, " - f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - - return (Run_No, Res_Global.x) - - # ------------------------------------------------------------------------- - def tradeoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): - """ - Calculates weights for exploration scores based on the requested - scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. - - `None`: No exploration. - `equal`: Same weights for exploration and exploitation scores. - `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay - function - `adaptive`: An adaptive method based on: - Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling - approach for Kriging metamodeling by maximizing expected prediction - error." Computers & Chemical Engineering 106 (2017): 171-182. - - Parameters - ---------- - tradeoff_scheme : string - Trade-off scheme for exloration and exploitation scores. - old_EDX : array (n_samples, n_params) - Old experimental design (training points). - old_EDY : dict - Old model responses (targets). - - Returns - ------- - exploration_weight : float - Exploration weight. - exploitation_weight: float - Exploitation weight. - - """ - if tradeoff_scheme is None: - exploration_weight = 0 - - elif tradeoff_scheme == 'equal': - exploration_weight = 0.5 - - elif tradeoff_scheme == 'epsilon-decreasing': - # epsilon-decreasing scheme - # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.ExpDesign.n_init_samples - n_max_samples = self.ExpDesign.n_max_samples - - itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.ExpDesign.n_new_samples - - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, - 0, tau2, False)[itrNumber] - - elif tradeoff_scheme == 'adaptive': - - # Extract itrNumber - initNSamples = self.ExpDesign.n_init_samples - n_max_samples = self.ExpDesign.n_max_samples - itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.ExpDesign.n_new_samples - - if itrNumber == 0: - exploration_weight = 0.5 - else: - # New adaptive trade-off according to Liu et al. (2017) - # Mean squared error for last design point - last_EDX = old_EDX[-1].reshape(1, -1) - lastPCEY, _ = self.MetaModel.eval_metamodel(samples=last_EDX) - pce_y = np.array(list(lastPCEY.values()))[:, 0] - y = np.array(list(old_EDY.values()))[:, -1, :] - mseError = mean_squared_error(pce_y, y) - - # Mean squared CV - error for last design point - pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] - mseCVError = mean_squared_error(pce_y_prev, y) - - exploration_weight = min([0.5*mseError/mseCVError, 1]) - - # Exploitation weight - exploitation_weight = 1 - exploration_weight - - return exploration_weight, exploitation_weight - - # ------------------------------------------------------------------------- - def choose_next_sample(self, sigma2=None, n_candidates=5, var='DKL'): - """ - Runs optimal sequential design. - - Parameters - ---------- - sigma2 : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - n_candidates : int, optional - Number of candidate samples. The default is 5. - var : string, optional - Utility function. The default is None. # TODO: default is set to DKL, not none - - Raises - ------ - NameError - Wrong utility function. - - Returns - ------- - Xnew : array (n_samples, n_params) - Selected new training point(s). - """ - - # Initialization - Bounds = self.ExpDesign.bound_tuples - n_new_samples = self.ExpDesign.n_new_samples - explore_method = self.ExpDesign.explore_method - exploit_method = self.ExpDesign.exploit_method - n_cand_groups = self.ExpDesign.n_cand_groups - tradeoff_scheme = self.ExpDesign.tradeoff_scheme - - old_EDX = self.ExpDesign.X - old_EDY = self.ExpDesign.Y.copy() - ndim = self.ExpDesign.X.shape[1] - OutputNames = self.out_names - - # ----------------------------------------- - # ----------- CUSTOMIZED METHODS ---------- - # ----------------------------------------- - # Utility function exploit_method provided by user - if exploit_method.lower() == 'user': - if not hasattr(self.ExpDesign, 'ExploitFunction'): - raise AttributeError('Function `ExploitFunction` not given to the ExpDesign, thus cannor run user-defined sequential scheme') - # TODO: syntax does not fully match the rest - can test this?? - Xnew, filteredSamples = self.ExpDesign.ExploitFunction(self) - - print("\n") - print("\nXnew:\n", Xnew) - - return Xnew, filteredSamples - - - # Dual-Annealing works differently from the rest, so deal with this first - # Here exploration and exploitation are performed simulataneously - if explore_method == 'dual annealing': - # ------- EXPLORATION: OPTIMIZATION ------- - import time - start_time = time.time() - - # Divide the domain to subdomains - subdomains = subdomain(Bounds, n_new_samples) - - # Multiprocessing - if self.parallel: - args = [] - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() - - # Close the pool - pool.close() - # Without multiprocessing - else: - results = [] - for i in range(n_new_samples): - results.append(self.dual_annealing(exploit_method, subdomains[i], sigma2, var, i)) - - # New sample - Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - print("\nXnew:\n", Xnew) - - # Computational cost - elapsed_time = time.time() - start_time - print("\n") - print(f"Elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) - - return Xnew, None - - # Generate needed Exploration class - explore = Exploration(self.ExpDesign, n_candidates) - explore.w = 100 # * ndim #500 # TODO: where does this value come from? - - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - - # Generate the candidate samples - # TODO: here use the sampling method provided by the expdesign? - sampling_method = self.ExpDesign.sampling_method - - # TODO: changed this from 'random' for LOOCV - if explore_method == 'LOOCV': - allCandidates = self.ExpDesign.generate_samples(n_candidates, - sampling_method) - else: - allCandidates, scoreExploration = explore.get_exploration_samples() - - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- - if explore_method == 'LOOCV': - # ----------------------------------------------------------------- - # TODO: LOOCV model construnction based on Feng et al. (2020) - # 'LOOCV': - # Initilize the ExploitScore array - - # Generate random samples - allCandidates = self.ExpDesign.generate_samples(n_candidates, - 'random') - - # Construct error model based on LCerror - errorModel = self.MetaModel.create_ModelError(old_EDX, self.LCerror) - self.errorModel.append(copy(errorModel)) - - # Evaluate the error models for allCandidates - eLCAllCands, _ = errorModel.eval_errormodel(allCandidates) - # Select the maximum as the representative error - eLCAllCands = np.dstack(eLCAllCands.values()) - eLCAllCandidates = np.max(eLCAllCands, axis=1)[:, 0] - - # Normalize the error w.r.t the maximum error - scoreExploration = eLCAllCandidates / np.sum(eLCAllCandidates) - - else: - # ------- EXPLORATION: SPACE-FILLING DESIGN ------- - # Generate candidate samples from Exploration class - explore = Exploration(self.ExpDesign, n_candidates) - explore.w = 100 # * ndim #500 - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - allCandidates, scoreExploration = explore.get_exploration_samples() - - # Temp: ---- Plot all candidates ----- - if ndim == 2: - def plotter(points, allCandidates, Method, - scoreExploration=None): - if Method == 'Voronoi': - from scipy.spatial import Voronoi, voronoi_plot_2d - vor = Voronoi(points) - fig = voronoi_plot_2d(vor) - ax1 = fig.axes[0] - else: - fig = plt.figure() - ax1 = fig.add_subplot(111) - ax1.scatter(points[:, 0], points[:, 1], s=10, c='r', - marker="s", label='Old Design Points') - ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, - c='b', marker="o", label='Design candidates') - for i in range(points.shape[0]): - txt = 'p'+str(i+1) - ax1.annotate(txt, (points[i, 0], points[i, 1])) - if scoreExploration is not None: - for i in range(allCandidates.shape[0]): - txt = str(round(scoreExploration[i], 5)) - ax1.annotate(txt, (allCandidates[i, 0], - allCandidates[i, 1])) - - plt.xlim(self.bound_tuples[0]) - plt.ylim(self.bound_tuples[1]) - # plt.show() - plt.legend(loc='upper left') - - # ----------------------------------------- - # --------- EXPLOITATION METHODS ---------- - # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\n Exploration weight={explore_w:0.3f} " - f"Exploitation weight={exploit_w:0.3f}\n") - - # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- - if explore_w != 1.0: - # Check if all needed properties are set - if not hasattr(self.ExpDesign, 'max_func_itr'): - raise AttributeError('max_func_itr not given to the experimental design') - - # Create a sample pool for rejection sampling - MCsize = 15000 - X_MC = self.ExpDesign.generate_samples(MCsize, 'random') - candidates = self.ExpDesign.generate_samples( - n_candidates, 'latin_hypercube') - - # Split the candidates in groups for multiprocessing - split_cand = np.array_split( - candidates, n_cand_groups, axis=0 - ) - # print(candidates) - # print(split_cand) - if self.parallel: - results = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.run_util_func)( - exploit_method, split_cand[i], i, sigma2, var, X_MC) - for i in range(n_cand_groups)) - else: - results = [] - for i in range(n_cand_groups): - results.append(self.run_util_func(exploit_method, split_cand[i], i, sigma2, var, X_MC)) - - # Retrieve the results and append them - U_J_d = np.concatenate([results[NofE][1] for NofE in - range(n_cand_groups)]) - - # Check if all scores are inf - if np.isinf(U_J_d).all() or np.isnan(U_J_d).all(): - U_J_d = np.ones(len(U_J_d)) - - # Get the expected value (mean) of the Utility score - # for each cell - if explore_method == 'Voronoi': - U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - - # Normalize U_J_d - norm_U_J_d = U_J_d / np.sum(U_J_d) - else: - norm_U_J_d = np.zeros((len(scoreExploration))) - - # ------- Calculate Total score ------- - # ------- Trade off between EXPLORATION & EXPLOITATION ------- - # Total score - totalScore = exploit_w * norm_U_J_d - totalScore += explore_w * scoreExploration - - # temp: Plot - # dim = self.ExpDesign.X.shape[1] - # if dim == 2: - # plotter(self.ExpDesign.X, allCandidates, explore_method) - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - # select the requested number of samples - if explore_method == 'Voronoi': - Xnew = np.zeros((n_new_samples, ndim)) - for i, idx in enumerate(bestIdx): - X_can = explore.closestPoints[idx] - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - elif exploit_method == 'VarOptDesign': - # ------- EXPLOITATION: VarOptDesign ------- - UtilMethod = var - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\nweightExploration={explore_w:0.3f} " - f"weightExploitation={exploit_w:0.3f}") - - # Generate candidate samples from Exploration class - nMeasurement = old_EDY[OutputNames[0]].shape[1] - - # print(UtilMethod) - - # Find sensitive region - if UtilMethod == 'LOOCV': - LCerror = self.MetaModel.LCerror - allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), - nMeasurement)) - for y_idx, y_key in enumerate(OutputNames): - for idx, key in enumerate(LCerror[y_key].keys()): - allModifiedLOO[:, y_idx, idx] = abs( - LCerror[y_key][key]) - - ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) - # print(allModifiedLOO.shape) - - elif UtilMethod in ['EIGF', 'ALM']: - # ----- All other in ['EIGF', 'ALM'] ----- - # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) - - # Split the candidates in groups for multiprocessing - if explore_method != 'Voronoi': - split_cand = np.array_split(allCandidates, - n_cand_groups, - axis=0) - goodSampleIdx = range(n_cand_groups) - else: - # Find indices of the Vornoi cells with samples - goodSampleIdx = [] - for idx in range(len(explore.closest_points)): - if len(explore.closest_points[idx]) != 0: - goodSampleIdx.append(idx) - split_cand = explore.closest_points - - # Split the candidates in groups for multiprocessing - args = [] - for index in goodSampleIdx: - args.append((exploit_method, split_cand[index], index, - sigma2, var)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.run_util_func, args).get() - - # Close the pool - pool.close() - - # Retrieve the results and append them - if explore_method == 'Voronoi': - ExploitScore = [np.mean(results[k][1]) for k in - range(len(goodSampleIdx))] - else: - ExploitScore = np.concatenate( - [results[k][1] for k in range(len(goodSampleIdx))]) - - else: - raise NameError('The requested utility function is not ' - 'available.') - - # print("ExploitScore:\n", ExploitScore) - - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - # Total score - # Normalize U_J_d - ExploitScore = ExploitScore / np.sum(ExploitScore) - totalScore = exploit_w * ExploitScore - # print(totalScore.shape) - # print(explore_w) - # print(scoreExploration.shape) - totalScore += explore_w * scoreExploration - - temp = totalScore.copy() - sorted_idxtotalScore = np.argsort(temp, axis=0)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - Xnew = np.zeros((n_new_samples, ndim)) - if explore_method != 'Voronoi': - Xnew = allCandidates[bestIdx] - else: - for i, idx in enumerate(bestIdx.flatten()): - X_can = explore.closest_points[idx] - # plotter(self.ExpDesign.X, X_can, explore_method, - # scoreExploration=None) - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - - elif exploit_method == 'alphabetic': - # ------- EXPLOITATION: ALPHABETIC ------- - Xnew = self.util_AlphOptDesign(allCandidates, var) - - elif exploit_method == 'Space-filling': - # ------- EXPLOITATION: SPACE-FILLING ------- - totalScore = scoreExploration - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - - # select the requested number of samples - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - else: - raise NameError('The requested design method is not available.') - - print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) - print("Xnew:\n", Xnew) - - # TODO: why does it also return None? - return Xnew, None - - # ------------------------------------------------------------------------- - def util_AlphOptDesign(self, candidates, var='D-Opt'): - """ - Enriches the Experimental design with the requested alphabetic - criterion based on exploring the space with number of sampling points. - - Ref: Hadigol, M., & Doostan, A. (2018). Least squares polynomial chaos - expansion: A review of sampling strategies., Computer Methods in - Applied Mechanics and Engineering, 332, 382-407. - - Arguments - --------- - NCandidate : int - Number of candidate points to be searched - - var : string - Alphabetic optimality criterion - - Returns - ------- - X_new : array of shape (1, n_params) - The new sampling location in the input space. - """ - MetaModelOrig = self # TODO: this doesn't fully seem correct? - n_new_samples = MetaModelOrig.ExpDesign.n_new_samples - NCandidate = candidates.shape[0] - - # TODO: Loop over outputs - OutputName = self.out_names[0] - - # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) - - # Old Experimental design - oldExpDesignX = self.ExpDesign.X - - # TODO: Only one psi can be selected. - # Suggestion: Go for the one with the highest LOO error - # TODO: this is just a patch, need to look at again! - Scores = list(self.MetaModel.score_dict['b_1'][OutputName].values()) - #print(Scores) - #print(self.MetaModel.score_dict) - #print(self.MetaModel.score_dict.values()) - #print(self.MetaModel.score_dict['b_1'].values()) - #print(self.MetaModel.score_dict['b_1'][OutputName].values()) - ModifiedLOO = [1-score for score in Scores] - outIdx = np.argmax(ModifiedLOO) - - # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) - - # TODO: also patched here - BasisIndices = self.MetaModel.basis_dict['b_1'][OutputName]["y_"+str(outIdx+1)] - P = len(BasisIndices) - - # ------ Old Psi ------------ - univ_p_val = self.MetaModel.univ_basis_vals(oldExpDesignX) - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - # ------ New candidates (Psi_c) ------------ - # Assemble Psi_c - univ_p_val_c = self.MetaModel.univ_basis_vals(candidates) - Psi_c = self.MetaModel.create_psi(BasisIndices, univ_p_val_c) - - for idx in range(NCandidate): - - # Include the new row to the original Psi - Psi_cand = np.vstack((Psi, Psi_c[idx])) - - # Information matrix - PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) - - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: - # faster - invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - invM = np.linalg.pinv(M) - - # ---------- Calculate optimality criterion ---------- - # Optimality criteria according to Section 4.5.1 in Ref. - - # D-Opt - if var.lower() == 'd-opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) - - # A-Opt - elif var.lower() == 'a-opt': - Phi[idx] = np.trace(invM) - - # K-Opt - elif var.lower() == 'k-opt': - Phi[idx] = np.linalg.cond(M) - - else: - # print(var.lower()) - raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') - - # find an optimal point subset to add to the initial design - # by minimization of the Phi - sorted_idxtotalScore = np.argsort(Phi) - - # select the requested number of samples - Xnew = candidates[sorted_idxtotalScore[:n_new_samples]] - - return Xnew - - # ------------------------------------------------------------------------- - def _normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): - """ - Calculated gaussian likelihood for given y+std based on given obs+sigma - # TODO: is this understanding correct? - - Parameters - ---------- - y_hat_pce : dict of 2d np arrays - Mean output of the surrogate. - std_pce : dict of 2d np arrays - Standard deviation output of the surrogate. - obs_data : dict of 1d np arrays - Observed data. - total_sigma2s : pandas dataframe, matches obs_data - Estimated uncertainty for the observed data. - rmse : dict, optional - RMSE values from validation of the surrogate. The default is None. - - Returns - ------- - likelihoods : dict of float - The likelihood for each surrogate eval in y_hat_pce compared to the - observations (?). - - """ - - likelihoods = 1.0 - - # Loop over the outputs - for idx, out in enumerate(self.out_names): - - # (Meta)Model Output - # print(y_hat_pce[out]) - nsamples, nout = y_hat_pce[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout].values - - # Surrogate error if valid dataset is given. - if rmse is not None: - tot_sigma2s += rmse[out]**2 - else: - tot_sigma2s += np.mean(std_pce[out])**2 - - likelihoods *= stats.multivariate_normal.pdf( - y_hat_pce[out], data, np.diag(tot_sigma2s), - allow_singular=True) - - # TODO: remove this here - self.Likelihoods = likelihoods - - return likelihoods - - # ------------------------------------------------------------------------- - def _corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = self.ExpDesign.X # valid_samples - model_outputs = self.ExpDesign.Y # valid_model_runs - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = self.out_names - - # TODO: Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) - covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) - - # Compute likelilhood output vs data - logLik_data[i] += logpdf( - y_m_hat, data, covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += logpdf(y_m_hat, y_m, covMatrix) - - # Weight - logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) - - return np.log(np.mean(weights)) - - # ------------------------------------------------------------------------- - def _posteriorPlot(self, posterior, par_names, key): - """ - Plot the posterior of a specific key as a corner plot - - Parameters - ---------- - posterior : 2d np.array - Samples of the posterior. - par_names : list of strings - List of the parameter names. - key : string - Output key that this posterior belongs to. - - Returns - ------- - figPosterior : corner.corner - Plot of the posterior. - - """ - - # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') - os.makedirs(newpath, exist_ok=True) - - bound_tuples = self.ExpDesign.bound_tuples - n_params = len(par_names) - font_size = 40 - if n_params == 2: - - figPosterior, ax = plt.subplots(figsize=(15, 15)) - - sns.kdeplot(x=posterior[:, 0], y=posterior[:, 1], - fill=True, ax=ax, cmap=plt.cm.jet, - clip=bound_tuples) - # Axis labels - plt.xlabel(par_names[0], fontsize=font_size) - plt.ylabel(par_names[1], fontsize=font_size) - - # Set axis limit - plt.xlim(bound_tuples[0]) - plt.ylim(bound_tuples[1]) - - # Increase font size - plt.xticks(fontsize=font_size) - plt.yticks(fontsize=font_size) - - # Switch off the grids - plt.grid(False) - - else: - import corner - figPosterior = corner.corner(posterior, labels=par_names, - title_fmt='.2e', show_titles=True, - title_kwargs={"fontsize": 12}) - - figPosterior.savefig(f'./{newpath}/{key}.pdf', bbox_inches='tight') - plt.close() - - # Save the posterior as .npy - np.save(f'./{newpath}/{key}.npy', posterior) - - return figPosterior - - - # ------------------------------------------------------------------------- - def _BME_Calculator(self, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - - Parameters - ---------- - obs_data : dict of 1d np arrays - Observed data. - sigma2Dict : pandas dataframe, matches obs_data - Estimated uncertainty for the observed data. - rmse : dict of floats, optional - RMSE values for each output-key. The dafault is None. - - Returns - ------- - (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - """ - # Initializations - if hasattr(self, 'valid_likelihoods'): - valid_likelihoods = self.valid_likelihoods - else: - valid_likelihoods = [] - valid_likelihoods = np.array(valid_likelihoods) - - post_snapshot = self.ExpDesign.post_snapshot - if post_snapshot or valid_likelihoods.shape[0] != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') - os.makedirs(newpath, exist_ok=True) - - SamplingMethod = 'random' - MCsize = 10000 - ESS = 0 - - # Estimation of the integral via Monte Varlo integration - while (ESS > MCsize) or (ESS < 1): - - # Generate samples for Monte Carlo simulation - X_MC = self.ExpDesign.generate_samples( - MCsize, SamplingMethod - ) - - # Monte Carlo simulation for the candidate design - Y_MC, std_MC = self.MetaModel.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and - # simulation results via PCE with candidate design) - Likelihoods = self._normpdf( - Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) - - # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if (ESS > MCsize) or (ESS < 1): - print(f'ESS={ESS} MC size should be larger.') - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - X_Posterior = X_MC[accepted] - - # ------------------------------------------------------------ - # --- Kullback-Leibler Divergence & Information Entropy ------ - # ------------------------------------------------------------ - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - - # TODO: Correction factor - # log_weight = self.__corr_factor_BME(obs_data, sigma2Dict, logBME) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(self.ExpDesign.JDist.pdf(X_Posterior.T)) - ) - - # Calculate Kullback-Leibler Divergence - # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - KLD = postExpLikelihoods - logBME - - # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods - - # If post_snapshot is True, plot likelihood vs refrence - if post_snapshot or valid_likelihoods: - # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) - est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = hellinger_distance(ref_like, est_like) - - idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' - in name and os.path.isfile(os.path.join(newpath, name))]) - - fig, ax = plt.subplots() - try: - sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), - shade=True, color="g", label='Ref. Likelihood') - sns.kdeplot(np.log(Likelihoods[Likelihoods > 0]), shade=True, - color="b", label='Likelihood with PCE') - except: - pass - - text = f"Hellinger Dist.={distHellinger:.3f}\n logBME={logBME:.3f}" - "\n DKL={KLD:.3f}" - - plt.text(0.05, 0.75, text, bbox=dict(facecolor='wheat', - edgecolor='black', - boxstyle='round,pad=1'), - transform=ax.transAxes) - - fig.savefig(f'./{newpath}/Likelihoods_{idx}.pdf', - bbox_inches='tight') - plt.close() - - else: - distHellinger = 0.0 - - # Bayesian inference with Emulator only for 2D problem - if post_snapshot and self.MetaModel.n_params == 2 and not idx % 5: - from bayesvalidrox.bayes_inference.bayes_inference import BayesInference - from bayesvalidrox.bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(self) - BayesOpts.emulator = True - BayesOpts.plot_post_pred = False - - # Select the inference method - import emcee - BayesOpts.inference_method = "MCMC" - # Set the MCMC parameters passed to self.mcmc_params - BayesOpts.mcmc_params = { - 'n_steps': 1e5, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'verbose': False - } - - # ----- Define the discrepancy model ------- - # TODO: check with Farid if this first line is how it should be - BayesOpts.measured_data = obs_data - obs_data = pd.DataFrame(obs_data, columns=self.out_names) - BayesOpts.measurement_error = obs_data - # TODO: shouldn't the uncertainty be sigma2Dict instead of obs_data? - - # # -- (Option B) -- - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 - BayesOpts.Discrepancy = DiscrepancyOpts - # Start the calibration/inference - Bayes_PCE = BayesOpts.create_inference() - X_Posterior = Bayes_PCE.posterior_df.values - - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - # ------------------------------------------------------------------------- - def _validError(self): - """ - Evaluate the metamodel on the validation samples and calculate the - error against the corresponding model runs - - Returns - ------- - rms_error : dict - RMSE for each validation run. - valid_error : dict - Normed (?)RMSE for each validation run. - - """ - # Extract the original model with the generated samples - valid_model_runs = self.ExpDesign.valid_model_runs - - # Run the PCE model with the generated samples - valid_PCE_runs, _ = self.MetaModel.eval_metamodel(samples=self.ExpDesign.valid_samples) - - rms_error = {} - valid_error = {} - # Loop over the keys and compute RMSE error. - for key in self.out_names: - rms_error[key] = mean_squared_error( - valid_model_runs[key], valid_PCE_runs[key], - multioutput='raw_values', - sample_weight=None, - squared=False) - # Validation error - valid_error[key] = (rms_error[key]**2) - valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Updated Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(rms_error[key], - valid_error[key])))) - - return rms_error, valid_error - - # ------------------------------------------------------------------------- - def _error_Mean_Std(self): - """ - Calculates the error in the overall mean and std approximation of the - surrogate against the mc-reference provided to the model. - This can only be applied to metamodels of polynomial type - - Returns - ------- - RMSE_Mean : float - RMSE of the means - RMSE_std : float - RMSE of the standard deviations - - """ - # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self.MetaModel._compute_pce_moments() - - # Compute the root mean squared error - for output in self.out_names: - - # Compute the error between mean and std of MetaModel and OrigModel - RMSE_Mean = mean_squared_error( - self.Model.mc_reference['mean'], pce_means[output], squared=False - ) - RMSE_std = mean_squared_error( - self.Model.mc_reference['std'], pce_stds[output], squared=False - ) - - return RMSE_Mean, RMSE_std diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/eval_rec_rule.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/eval_rec_rule.py deleted file mode 100644 index b583c7eb2..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/eval_rec_rule.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" - - -Based on the implementation in UQLab [1]. - -References: -1. S. Marelli, and B. Sudret, UQLab: A framework for uncertainty quantification -in Matlab, Proc. 2nd Int. Conf. on Vulnerability, Risk Analysis and Management -(ICVRAM2014), Liverpool, United Kingdom, 2014, 2554-2563. - -2. S. Marelli, N. Lüthen, B. Sudret, UQLab user manual – Polynomial chaos -expansions, Report # UQLab-V1.4-104, Chair of Risk, Safety and Uncertainty -Quantification, ETH Zurich, Switzerland, 2021. - -Author: Farid Mohammadi, M.Sc. -E-Mail: farid.mohammadi@iws.uni-stuttgart.de -Department of Hydromechanics and Modelling of Hydrosystems (LH2) -Institute for Modelling Hydraulic and Environmental Systems (IWS), University -of Stuttgart, www.iws.uni-stuttgart.de/lh2/ -Pfaffenwaldring 61 -70569 Stuttgart - -Created on Fri Jan 14 2022 -""" -import numpy as np -from numpy.polynomial.polynomial import polyval - - -def poly_rec_coeffs(n_max, poly_type, params=None): - """ - Computes the recurrence coefficients for classical Wiener-Askey orthogonal - polynomials. - - Parameters - ---------- - n_max : int - Maximum polynomial degree. - poly_type : string - Polynomial type. - params : list, optional - Parameters required for `laguerre` poly type. The default is None. - - Returns - ------- - AB : dict - The 3 term recursive coefficients and the applicable ranges. - - """ - - if poly_type == 'legendre': - - def an(n): - return np.zeros((n+1, 1)) - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = np.sqrt(1./(4-i**-2)) - return sq_bn - - bounds = [-1, 1] - - elif poly_type == 'hermite': - - def an(n): - return np.zeros((n+1, 1)) - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = np.sqrt(i) - return sq_bn - - bounds = [-np.inf, np.inf] - - elif poly_type == 'laguerre': - - def an(n): - a = np.zeros((n+1, 1)) - for i in range(1, n+1): - a[i] = 2*n + params[1] - return a - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = -np.sqrt(i * (i+params[1]-1)) - return sq_bn - - bounds = [0, np.inf] - - AB = {'alpha_beta': np.concatenate((an(n_max), sqrt_bn(n_max)), axis=1), - 'bounds': bounds} - - return AB - - -def eval_rec_rule(x, max_deg, poly_type): - """ - Evaluates the polynomial that corresponds to the Jacobi matrix defined - from the AB. - - Parameters - ---------- - x : array (n_samples) - Points where the polynomials are evaluated. - max_deg : int - Maximum degree. - poly_type : string - Polynomial type. - - Returns - ------- - values : array of shape (n_samples, max_deg+1) - Polynomials corresponding to the Jacobi matrix. - - """ - AB = poly_rec_coeffs(max_deg, poly_type) - AB = AB['alpha_beta'] - - values = np.zeros((len(x), AB.shape[0]+1)) - values[:, 1] = 1 / AB[0, 1] - - for k in range(AB.shape[0]-1): - values[:, k+2] = np.multiply((x - AB[k, 0]), values[:, k+1]) - \ - np.multiply(values[:, k], AB[k, 1]) - values[:, k+2] = np.divide(values[:, k+2], AB[k+1, 1]) - return values[:, 1:] - - -def eval_rec_rule_arbitrary(x, max_deg, poly_coeffs): - """ - Evaluates the polynomial at sample array x. - - Parameters - ---------- - x : array (n_samples) - Points where the polynomials are evaluated. - max_deg : int - Maximum degree. - poly_coeffs : dict - Polynomial coefficients computed based on moments. - - Returns - ------- - values : array of shape (n_samples, max_deg+1) - Univariate Polynomials evaluated at samples. - - """ - values = np.zeros((len(x), max_deg+1)) - - for deg in range(max_deg+1): - values[:, deg] = polyval(x, poly_coeffs[deg]).T - - return values - - -def eval_univ_basis(x, max_deg, poly_types, apoly_coeffs=None): - """ - Evaluates univariate regressors along input directions. - - Parameters - ---------- - x : array of shape (n_samples, n_params) - Training samples. - max_deg : int - Maximum polynomial degree. - poly_types : list of strings - List of polynomial types for all parameters. - apoly_coeffs : dict , optional - Polynomial coefficients computed based on moments. The default is None. - - Returns - ------- - univ_vals : array of shape (n_samples, n_params, max_deg+1) - Univariate polynomials for all degrees and parameters evaluated at x. - - """ - # Initilize the output array - n_samples, n_params = x.shape - univ_vals = np.zeros((n_samples, n_params, max_deg+1)) - - for i in range(n_params): - - if poly_types[i] == 'arbitrary': - polycoeffs = apoly_coeffs[f'p_{i+1}'] - univ_vals[:, i] = eval_rec_rule_arbitrary(x[:, i], max_deg, - polycoeffs) - else: - univ_vals[:, i] = eval_rec_rule(x[:, i], max_deg, poly_types[i]) - - return univ_vals diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exp_designs.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exp_designs.py deleted file mode 100644 index 665ee4fc3..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exp_designs.py +++ /dev/null @@ -1,493 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import math -import itertools -import chaospy -import scipy.stats as st -from tqdm import tqdm -import h5py -import os - -from .apoly_construction import apoly_construction -from .input_space import InputSpace - -# ------------------------------------------------------------------------- -def check_ranges(theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c - - -class ExpDesigns(InputSpace): - """ - This class generates samples from the prescribed marginals for the model - parameters using the `Input` object. - - Attributes - ---------- - Input : obj - Input object containing the parameter marginals, i.e. name, - distribution type and distribution parameters or available raw data. - meta_Model_type : str - Type of the meta_Model_type. - sampling_method : str - Name of the sampling method for the experimental design. The following - sampling method are supported: - - * random - * latin_hypercube - * sobol - * halton - * hammersley - * chebyshev(FT) - * grid(FT) - * user - hdf5_file : str - Name of the hdf5 file that contains the experimental design. - n_new_samples : int - Number of (initial) training points. - n_max_samples : int - Number of maximum training points. - mod_LOO_threshold : float - The modified leave-one-out cross validation threshold where the - sequential design stops. - tradeoff_scheme : str - Trade-off scheme to assign weights to the exploration and exploitation - scores in the sequential design. - n_canddidate : int - Number of candidate training sets to calculate the scores for. - explore_method : str - Type of the exploration method for the sequential design. The following - methods are supported: - - * Voronoi - * random - * latin_hypercube - * LOOCV - * dual annealing - exploit_method : str - Type of the exploitation method for the sequential design. The - following methods are supported: - - * BayesOptDesign - * BayesActDesign - * VarOptDesign - * alphabetic - * Space-filling - util_func : str or list - The utility function to be specified for the `exploit_method`. For the - available utility functions see Note section. - n_cand_groups : int - Number of candidate groups. Each group of candidate training sets will - be evaulated separately in parallel. - n_replication : int - Number of replications. Only for comparison. The default is 1. - post_snapshot : int - Whether to plot the posterior in the sequential design. The default is - `True`. - step_snapshot : int - The number of steps to plot the posterior in the sequential design. The - default is 1. - max_a_post : list or array - Maximum a posteriori of the posterior distribution, if known. The - default is `[]`. - adapt_verbose : bool - Whether to plot the model response vs that of metamodel for the new - trining point in the sequential design. - - Note - ---------- - The following utiliy functions for the **exploitation** methods are - supported: - - #### BayesOptDesign (when data is available) - - DKL (Kullback-Leibler Divergence) - - DPP (D-Posterior-percision) - - APP (A-Posterior-percision) - - #### VarBasedOptDesign -> when data is not available - - Entropy (Entropy/MMSE/active learning) - - EIGF (Expected Improvement for Global fit) - - LOOCV (Leave-one-out Cross Validation) - - #### alphabetic - - D-Opt (D-Optimality) - - A-Opt (A-Optimality) - - K-Opt (K-Optimality) - """ - - def __init__(self, Input, meta_Model_type='pce', - sampling_method='random', hdf5_file=None, - n_new_samples=1, n_max_samples=None, mod_LOO_threshold=1e-16, - tradeoff_scheme=None, n_canddidate=1, explore_method='random', - exploit_method='Space-filling', util_func='Space-filling', - n_cand_groups=4, n_replication=1, post_snapshot=False, - step_snapshot=1, max_a_post=[], adapt_verbose=False, max_func_itr=1): - - self.InputObj = Input - self.meta_Model_type = meta_Model_type - self.sampling_method = sampling_method - self.hdf5_file = hdf5_file - self.n_new_samples = n_new_samples - self.n_max_samples = n_max_samples - self.mod_LOO_threshold = mod_LOO_threshold - self.explore_method = explore_method - self.exploit_method = exploit_method - self.util_func = util_func - self.tradeoff_scheme = tradeoff_scheme - self.n_canddidate = n_canddidate - self.n_cand_groups = n_cand_groups - self.n_replication = n_replication - self.post_snapshot = post_snapshot - self.step_snapshot = step_snapshot - self.max_a_post = max_a_post - self.adapt_verbose = adapt_verbose - self.max_func_itr = max_func_itr - - # Other - self.apce = None - self.ndim = None - - # Init - self.check_valid_inputs() - - # ------------------------------------------------------------------------- - def generate_samples(self, n_samples, sampling_method='random', - transform=False): - """ - Generates samples with given sampling method - - Parameters - ---------- - n_samples : int - Number of requested samples. - sampling_method : str, optional - Sampling method. The default is `'random'`. - transform : bool, optional - Transformation via an isoprobabilistic transformation method. The - default is `False`. - - Returns - ------- - samples: array of shape (n_samples, n_params) - Generated samples from defined model input object. - - """ - try: - samples = chaospy.generate_samples( - int(n_samples), domain=self.origJDist, rule=sampling_method - ) - except: - samples = self.random_sampler(int(n_samples)).T - - return samples.T - - - - # ------------------------------------------------------------------------- - def generate_ED(self, n_samples, transform=False, - max_pce_deg=None): - """ - Generates experimental designs (training set) with the given method. - - Parameters - ---------- - n_samples : int - Number of requested training points. - sampling_method : str, optional - Sampling method. The default is `'random'`. - transform : bool, optional - Isoprobabilistic transformation. The default is `False`. - max_pce_deg : int, optional - Maximum PCE polynomial degree. The default is `None`. - - Returns - ------- - None - - """ - if n_samples <0: - raise ValueError('A negative number of samples cannot be created. Please provide positive n_samples') - n_samples = int(n_samples) - - if not hasattr(self, 'n_init_samples'): - self.n_init_samples = n_samples - - # Generate the samples based on requested method - self.init_param_space(max_pce_deg) - - sampling_method = self.sampling_method - # Pass user-defined samples as ED - if sampling_method == 'user': - if not hasattr(self, 'X'): - raise AttributeError('User-defined sampling cannot proceed as no samples provided. Please add them to this class as attribute X') - if not self.X.ndim == 2: - raise AttributeError('The provided samples shuld have 2 dimensions') - samples = self.X - self.n_samples = len(samples) - - # Sample the distribution of parameters - elif self.input_data_given: - # Case II: Input values are directly given by the user. - - if sampling_method == 'random': - samples = self.random_sampler(n_samples) - - elif sampling_method == 'PCM' or \ - sampling_method == 'LSCM': - samples = self.pcm_sampler(n_samples, max_pce_deg) - - else: - # Create ExpDesign in the actual space using chaospy - try: - samples = chaospy.generate_samples(n_samples, - domain=self.JDist, - rule=sampling_method).T - except: - samples = self.JDist.resample(n_samples).T - - elif not self.input_data_given: - # Case I = User passed known distributions - samples = chaospy.generate_samples(n_samples, domain=self.JDist, - rule=sampling_method).T - - # Transform samples to the original space - if transform: - self.init_param_space(max_pce_deg) - tr_samples = self.transform( - samples, - method=sampling_method - ) - if sampling_method == 'user' or not self.apce: - self.X = samples - self.X_tr = tr_samples - #return samples, tr_samples - else: - self.X = tr_samples - self.X_tr = samples - #return tr_samples, samples # TODO: why is this swapped here? - else: - self.X = samples - self.X_tr = None - - def read_from_file(self, out_names): - """ - Reads in the ExpDesign from a provided h5py file and saves the results. - - Parameters - ---------- - out_names : list of strings - The keys that are in the outputs (y) saved in the provided file. - - Returns - ------- - None. - - """ - if self.hdf5_file == None: - raise AttributeError('ExpDesign cannot be read in, please provide hdf5 file first') - - # Read hdf5 file - f = h5py.File(self.hdf5_file, 'r+') - - # Read EDX and pass it to ExpDesign object - try: - self.X = np.array(f["EDX/New_init_"]) - except KeyError: - self.X = np.array(f["EDX/init_"]) - - # Update number of initial samples - self.n_init_samples = self.X.shape[0] - - # Read EDX and pass it to ExpDesign object - self.Y = {} - - # Extract x values - try: - self.Y["x_values"] = dict() - for varIdx, var in enumerate(out_names): - x = np.array(f[f"x_values/{var}"]) - self.Y["x_values"][var] = x - except KeyError: - self.Y["x_values"] = np.array(f["x_values"]) - - # Store the output - for varIdx, var in enumerate(out_names): - try: - y = np.array(f[f"EDY/{var}/New_init_"]) - except KeyError: - y = np.array(f[f"EDY/{var}/init_"]) - self.Y[var] = y - f.close() - print(f'Experimental Design is read in from file {self.hdf5_file}') - print('') - - - - # ------------------------------------------------------------------------- - def random_sampler(self, n_samples, max_deg = None): - """ - Samples the given raw data randomly. - - Parameters - ---------- - n_samples : int - Number of requested samples. - - max_deg : int, optional - Maximum degree. The default is `None`. - This will be used to run init_param_space, if it has not been done - until now. - - Returns - ------- - samples: array of shape (n_samples, n_params) - The sampling locations in the input space. - - """ - if not hasattr(self, 'raw_data'): - self.init_param_space(max_deg) - else: - if np.array(self.raw_data).ndim !=2: - raise AttributeError('The given raw data for sampling should have two dimensions') - samples = np.zeros((n_samples, self.ndim)) - sample_size = self.raw_data.shape[1] - - # Use a combination of raw data - if n_samples < sample_size: - for pa_idx in range(self.ndim): - # draw random indices - rand_idx = np.random.randint(0, sample_size, n_samples) - # store the raw data with given random indices - samples[:, pa_idx] = self.raw_data[pa_idx, rand_idx] - else: - try: - samples = self.JDist.resample(int(n_samples)).T - except AttributeError: - samples = self.JDist.sample(int(n_samples)).T - # Check if all samples are in the bound_tuples - for idx, param_set in enumerate(samples): - if not check_ranges(param_set, self.bound_tuples): - try: - proposed_sample = chaospy.generate_samples( - 1, domain=self.JDist, rule='random').T[0] - except: - proposed_sample = self.JDist.resample(1).T[0] - while not check_ranges(proposed_sample, - self.bound_tuples): - try: - proposed_sample = chaospy.generate_samples( - 1, domain=self.JDist, rule='random').T[0] - except: - proposed_sample = self.JDist.resample(1).T[0] - samples[idx] = proposed_sample - - return samples - - # ------------------------------------------------------------------------- - def pcm_sampler(self, n_samples, max_deg): - """ - Generates collocation points based on the root of the polynomial - degrees. - - Parameters - ---------- - n_samples : int - Number of requested samples. - max_deg : int - Maximum degree defined by user. Will also be used to run - init_param_space if that has not been done beforehand. - - Returns - ------- - opt_col_points: array of shape (n_samples, n_params) - Collocation points. - - """ - - if not hasattr(self, 'raw_data'): - self.init_param_space(max_deg) - - raw_data = self.raw_data - - # Guess the closest degree to self.n_samples - def M_uptoMax(deg): - result = [] - for d in range(1, deg+1): - result.append(math.factorial(self.ndim+d) // - (math.factorial(self.ndim) * math.factorial(d))) - return np.array(result) - #print(M_uptoMax(max_deg)) - #print(np.where(M_uptoMax(max_deg) > n_samples)[0]) - - guess_Deg = np.where(M_uptoMax(max_deg) > n_samples)[0][0] - - c_points = np.zeros((guess_Deg+1, self.ndim)) - - def PolynomialPa(parIdx): - return apoly_construction(self.raw_data[parIdx], max_deg) - - for i in range(self.ndim): - poly_coeffs = PolynomialPa(i)[guess_Deg+1][::-1] - c_points[:, i] = np.trim_zeros(np.roots(poly_coeffs)) - - # Construction of optimal integration points - Prod = itertools.product(np.arange(1, guess_Deg+2), repeat=self.ndim) - sort_dig_unique_combos = np.array(list(filter(lambda x: x, Prod))) - - # Ranking relatively mean - Temp = np.empty(shape=[0, guess_Deg+1]) - for j in range(self.ndim): - s = abs(c_points[:, j]-np.mean(raw_data[j])) - Temp = np.append(Temp, [s], axis=0) - temp = Temp.T - - index_CP = np.sort(temp, axis=0) - sort_cpoints = np.empty((0, guess_Deg+1)) - - for j in range(self.ndim): - #print(index_CP[:, j]) - sort_cp = c_points[index_CP[:, j], j] - sort_cpoints = np.vstack((sort_cpoints, sort_cp)) - - # Mapping of Combination to Cpoint Combination - sort_unique_combos = np.empty(shape=[0, self.ndim]) - for i in range(len(sort_dig_unique_combos)): - sort_un_comb = [] - for j in range(self.ndim): - SortUC = sort_cpoints[j, sort_dig_unique_combos[i, j]-1] - sort_un_comb.append(SortUC) - sort_uni_comb = np.asarray(sort_un_comb) - sort_unique_combos = np.vstack((sort_unique_combos, sort_uni_comb)) - - # Output the collocation points - if self.sampling_method.lower() == 'lscm': - opt_col_points = sort_unique_combos - else: - opt_col_points = sort_unique_combos[0:self.n_samples] - - return opt_col_points diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exploration.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exploration.py deleted file mode 100644 index e18537207..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/exploration.py +++ /dev/null @@ -1,364 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -from scipy.spatial import distance - - -class Exploration: - """ - Created based on the Surrogate Modeling Toolbox (SUMO) [1]. - - [1] Gorissen, D., Couckuyt, I., Demeester, P., Dhaene, T. and Crombecq, K., - 2010. A surrogate modeling and adaptive sampling toolbox for computer - based design. Journal of machine learning research.-Cambridge, Mass., - 11, pp.2051-2055. sumo@sumo.intec.ugent.be - http://sumo.intec.ugent.be - - Attributes - ---------- - ExpDesign : obj - ExpDesign object. - n_candidate : int - Number of candidate samples. - mc_criterion : str - Selection crieterion. The default is `'mc-intersite-proj-th'`. Another - option is `'mc-intersite-proj'`. - w : int - Number of random points in the domain for each sample of the - training set. - """ - - def __init__(self, ExpDesign, n_candidate, - mc_criterion='mc-intersite-proj-th'): - self.ExpDesign = ExpDesign - self.n_candidate = n_candidate - self.mc_criterion = mc_criterion - self.w = 100 - - def get_exploration_samples(self): - """ - This function generates candidates to be selected as new design and - their associated exploration scores. - - Returns - ------- - all_candidates : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - explore_method = self.ExpDesign.explore_method - - print("\n") - print(f' The {explore_method}-Method is selected as the exploration ' - 'method.') - print("\n") - - if explore_method == 'Voronoi': - # Generate samples using the Voronoi method - all_candidates, exploration_scores = self.get_vornoi_samples() - else: - # Generate samples using the MC method - all_candidates, exploration_scores = self.get_mc_samples() - - return all_candidates, exploration_scores - - # ------------------------------------------------------------------------- - def get_vornoi_samples(self): - """ - This function generates samples based on voronoi cells and their - corresponding scores - - Returns - ------- - new_samples : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - - mc_criterion = self.mc_criterion - n_candidate = self.n_candidate - # Get the Old ExpDesign #samples - old_ED_X = self.ExpDesign.X - ndim = old_ED_X.shape[1] - - # calculate error #averageErrors - error_voronoi, all_candidates = self.approximate_voronoi( - self.w, old_ED_X - ) - - # Pick the best candidate point in the voronoi cell - # for each best sample - selected_samples = np.empty((0, ndim)) - bad_samples = [] - - for index in range(len(error_voronoi)): - - # get candidate new samples from voronoi tesselation - candidates = self.closest_points[index] - - # get total number of candidates - n_new_samples = candidates.shape[0] - - # still no candidate samples around this one, skip it! - if n_new_samples == 0: - print('The following sample has been skipped because there ' - 'were no candidate samples around it...') - print(old_ED_X[index]) - bad_samples.append(index) - continue - - # find candidate that is farthest away from any existing sample - max_min_distance = 0 - best_candidate = 0 - min_intersite_dist = np.zeros((n_new_samples)) - min_projected_dist = np.zeros((n_new_samples)) - - for j in range(n_new_samples): - - new_samples = np.vstack((old_ED_X, selected_samples)) - - # find min distorted distance from all other samples - euclidean_dist = self._build_dist_matrix_point( - new_samples, candidates[j], do_sqrt=True) - min_euclidean_dist = np.min(euclidean_dist) - min_intersite_dist[j] = min_euclidean_dist - - # Check if this is the maximum minimum distance from all other - # samples - if min_euclidean_dist >= max_min_distance: - max_min_distance = min_euclidean_dist - best_candidate = j - - # Projected distance - projected_dist = distance.cdist( - new_samples, [candidates[j]], 'chebyshev') - min_projected_dist[j] = np.min(projected_dist) - - if mc_criterion == 'mc-intersite-proj': - weight_euclidean_dist = 0.5 * ((n_new_samples+1)**(1/ndim) - 1) - weight_projected_dist = 0.5 * (n_new_samples+1) - total_dist_scores = weight_euclidean_dist * min_intersite_dist - total_dist_scores += weight_projected_dist * min_projected_dist - - elif mc_criterion == 'mc-intersite-proj-th': - alpha = 0.5 # chosen (tradeoff) - d_min = 2 * alpha / n_new_samples - if any(min_projected_dist < d_min): - candidates = np.delete( - candidates, [min_projected_dist < d_min], axis=0 - ) - total_dist_scores = np.delete( - min_intersite_dist, [min_projected_dist < d_min], - axis=0 - ) - else: - total_dist_scores = min_intersite_dist - else: - raise NameError( - 'The MC-Criterion you requested is not available.' - ) - - # Add the best candidate to the list of new samples - best_candidate = np.argsort(total_dist_scores)[::-1][:n_candidate] - selected_samples = np.vstack( - (selected_samples, candidates[best_candidate]) - ) - - self.new_samples = selected_samples - self.exploration_scores = np.delete(error_voronoi, bad_samples, axis=0) - - return self.new_samples, self.exploration_scores - - # ------------------------------------------------------------------------- - def get_mc_samples(self, all_candidates=None): - """ - This function generates random samples based on Global Monte Carlo - methods and their corresponding scores, based on [1]. - - [1] Crombecq, K., Laermans, E. and Dhaene, T., 2011. Efficient - space-filling and non-collapsing sequential design strategies for - simulation-based modeling. European Journal of Operational Research - , 214(3), pp.683-696. - DOI: https://doi.org/10.1016/j.ejor.2011.05.032 - - Implemented methods to compute scores: - 1) mc-intersite-proj - 2) mc-intersite-proj-th - - Arguments - --------- - all_candidates : array, optional - Samples to compute the scores for. The default is `None`. In this - case, samples will be generated by defined model input marginals. - - Returns - ------- - new_samples : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - explore_method = self.ExpDesign.explore_method - mc_criterion = self.mc_criterion - if all_candidates is None: - n_candidate = self.n_candidate - else: - n_candidate = all_candidates.shape[0] - - # Get the Old ExpDesign #samples - old_ED_X = self.ExpDesign.X - ndim = old_ED_X.shape[1] - - # ----- Compute the number of random points ----- - if all_candidates is None: - # Generate MC Samples - all_candidates = self.ExpDesign.generate_samples( - self.n_candidate, explore_method - ) - self.all_candidates = all_candidates - - # initialization - min_intersite_dist = np.zeros((n_candidate)) - min_projected_dist = np.zeros((n_candidate)) - - for i, candidate in enumerate(all_candidates): - - # find candidate that is farthest away from any existing sample - maxMinDistance = 0 - - # find min distorted distance from all other samples - euclidean_dist = self._build_dist_matrix_point( - old_ED_X, candidate, do_sqrt=True - ) - min_euclidean_dist = np.min(euclidean_dist) - min_intersite_dist[i] = min_euclidean_dist - - # Check if this is the maximum minimum distance from all other - # samples - if min_euclidean_dist >= maxMinDistance: - maxMinDistance = min_euclidean_dist - - # Projected distance - projected_dist = self._build_dist_matrix_point( - old_ED_X, candidate, 'chebyshev' - ) - min_projected_dist[i] = np.min(projected_dist) - - if mc_criterion == 'mc-intersite-proj': - weight_euclidean_dist = ((n_candidate+1)**(1/ndim) - 1) * 0.5 - weight_projected_dist = (n_candidate+1) * 0.5 - total_dist_scores = weight_euclidean_dist * min_intersite_dist - total_dist_scores += weight_projected_dist * min_projected_dist - - elif mc_criterion == 'mc-intersite-proj-th': - alpha = 0.5 # chosen (tradeoff) - d_min = 2 * alpha / n_candidate - if any(min_projected_dist < d_min): - all_candidates = np.delete( - all_candidates, [min_projected_dist < d_min], axis=0 - ) - total_dist_scores = np.delete( - min_intersite_dist, [min_projected_dist < d_min], axis=0 - ) - else: - total_dist_scores = min_intersite_dist - else: - raise NameError('The MC-Criterion you requested is not available.') - - self.new_samples = all_candidates - self.exploration_scores = total_dist_scores - self.exploration_scores /= np.nansum(total_dist_scores) - - return self.new_samples, self.exploration_scores - - # ------------------------------------------------------------------------- - def approximate_voronoi(self, w, samples): - """ - An approximate (monte carlo) version of Matlab's voronoi command. - - Arguments - --------- - samples : array - Old experimental design to be used as center points for voronoi - cells. - - Returns - ------- - areas : array - An approximation of the voronoi cells' areas. - all_candidates: list of arrays - A list of samples in each voronoi cell. - """ - n_samples = samples.shape[0] - ndim = samples.shape[1] - - # Compute the number of random points - n_points = w * samples.shape[0] - # Generate w random points in the domain for each sample - points = self.ExpDesign.generate_samples(n_points, 'random') - self.all_candidates = points - - # Calculate the nearest sample to each point - self.areas = np.zeros((n_samples)) - self.closest_points = [np.empty((0, ndim)) for i in range(n_samples)] - - # Compute the minimum distance from all the samples of old_ED_X for - # each test point - for idx in range(n_points): - # calculate the minimum distance - distances = self._build_dist_matrix_point( - samples, points[idx], do_sqrt=True - ) - closest_sample = np.argmin(distances) - - # Add to the voronoi list of the closest sample - self.areas[closest_sample] = self.areas[closest_sample] + 1 - prev_closest_points = self.closest_points[closest_sample] - self.closest_points[closest_sample] = np.vstack( - (prev_closest_points, points[idx]) - ) - - # Divide by the amount of points to get the estimated volume of each - # voronoi cell - self.areas /= n_points - - self.perc = np.max(self.areas * 100) - - self.errors = self.areas - - return self.areas, self.all_candidates - - # ------------------------------------------------------------------------- - def _build_dist_matrix_point(self, samples, point, method='euclidean', - do_sqrt=False): - """ - Calculates the intersite distance of all points in samples from point. - - Parameters - ---------- - samples : array of shape (n_samples, n_params) - The old experimental design. - point : array - A candidate point. - method : str - Distance method. - do_sqrt : bool, optional - Whether to return distances or squared distances. The default is - `False`. - - Returns - ------- - distances : array - Distances. - - """ - distances = distance.cdist(samples, np.array([point]), method) - - # do square root? - if do_sqrt: - return distances - else: - return distances**2 - diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/glexindex.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/glexindex.py deleted file mode 100644 index 90877331e..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/glexindex.py +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Multi indices for monomial exponents. -Credit: Jonathan Feinberg -https://github.com/jonathf/numpoly/blob/master/numpoly/utils/glexindex.py -""" - -import numpy -import numpy.typing - - -def glexindex(start, stop=None, dimensions=1, cross_truncation=1., - graded=False, reverse=False): - """ - Generate graded lexicographical multi-indices for the monomial exponents. - Args: - start (Union[int, numpy.ndarray]): - The lower order of the indices. If array of int, counts as lower - bound for each axis. - stop (Union[int, numpy.ndarray, None]): - The maximum shape included. If omitted: stop <- start; start <- 0 - If int is provided, set as largest total order. If array of int, - set as upper bound for each axis. - dimensions (int): - The number of dimensions in the expansion. - cross_truncation (float, Tuple[float, float]): - Use hyperbolic cross truncation scheme to reduce the number of - terms in expansion. If two values are provided, first is low bound - truncation, while the latter upper bound. If only one value, upper - bound is assumed. - graded (bool): - Graded sorting, meaning the indices are always sorted by the index - sum. E.g. ``(2, 2, 2)`` has a sum of 6, and will therefore be - consider larger than both ``(3, 1, 1)`` and ``(1, 1, 3)``. - reverse (bool): - Reversed lexicographical sorting meaning that ``(1, 3)`` is - considered smaller than ``(3, 1)``, instead of the opposite. - Returns: - list: - Order list of indices. - Examples: - >>> numpoly.glexindex(4).tolist() - [[0], [1], [2], [3]] - >>> numpoly.glexindex(2, dimensions=2).tolist() - [[0, 0], [1, 0], [0, 1]] - >>> numpoly.glexindex(start=2, stop=3, dimensions=2).tolist() - [[2, 0], [1, 1], [0, 2]] - >>> numpoly.glexindex([1, 2, 3]).tolist() - [[0, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 2]] - >>> numpoly.glexindex([1, 2, 3], cross_truncation=numpy.inf).tolist() - [[0, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 1], [0, 0, 2], [0, 1, 2]] - """ - if stop is None: - start, stop = 0, start - start = numpy.array(start, dtype=int).flatten() - stop = numpy.array(stop, dtype=int).flatten() - start, stop, _ = numpy.broadcast_arrays(start, stop, numpy.empty(dimensions)) - - cross_truncation = cross_truncation*numpy.ones(2) - - # Moved here from _glexindex - bound = stop.max() - dimensions = len(start) - start = numpy.clip(start, a_min=0, a_max=None) - dtype = numpy.uint8 if bound < 256 else numpy.uint16 - range_ = numpy.arange(bound, dtype=dtype) - indices = range_[:, numpy.newaxis] - - for idx in range(dimensions-1): - - # Truncate at each step to keep memory usage low - if idx: - indices = indices[cross_truncate(indices, bound-1, cross_truncation[1])] - - # Repeats the current set of indices. - # e.g. [0,1,2] -> [0,1,2,0,1,2,...,0,1,2] - indices = numpy.tile(indices, (bound, 1)) - - # Stretches ranges over the new dimension. - # e.g. [0,1,2] -> [0,0,...,0,1,1,...,1,2,2,...,2] - front = range_.repeat(len(indices)//bound)[:, numpy.newaxis] - - # Puts them two together. - indices = numpy.column_stack((front, indices)) - - # Complete the truncation scheme - if dimensions == 1: - indices = indices[(indices >= start) & (indices < bound)] - else: - lower = cross_truncate(indices, start-1, cross_truncation[0]) - upper = cross_truncate(indices, stop-1, cross_truncation[1]) - indices = indices[lower ^ upper] - - indices = numpy.array(indices, dtype=int).reshape(-1, dimensions) - if indices.size: - # moved here from glexsort - keys = indices.T - keys_ = numpy.atleast_2d(keys) - if reverse: - keys_ = keys_[::-1] - - indices_sort = numpy.array(numpy.lexsort(keys_)) - if graded: - indices_sort = indices_sort[numpy.argsort( - numpy.sum(keys_[:, indices_sort], axis=0))].T - - indices = indices[indices_sort] - return indices - -def cross_truncate(indices, bound, norm): - r""" - Truncate of indices using L_p norm. - .. math: - L_p(x) = \sum_i |x_i/b_i|^p ^{1/p} \leq 1 - where :math:`b_i` are bounds that each :math:`x_i` should follow. - Args: - indices (Sequence[int]): - Indices to be truncated. - bound (int, Sequence[int]): - The bound function for witch the indices can not be larger than. - norm (float, Sequence[float]): - The `p` in the `L_p`-norm. Support includes both `L_0` and `L_inf`. - Returns: - Boolean indices to ``indices`` with True for each index where the - truncation criteria holds. - Examples: - >>> indices = numpy.array(numpy.mgrid[:10, :10]).reshape(2, -1).T - >>> indices[cross_truncate(indices, 2, norm=0)].T - array([[0, 0, 0, 1, 2], - [0, 1, 2, 0, 0]]) - >>> indices[cross_truncate(indices, 2, norm=1)].T - array([[0, 0, 0, 1, 1, 2], - [0, 1, 2, 0, 1, 0]]) - >>> indices[cross_truncate(indices, [0, 1], norm=1)].T - array([[0, 0], - [0, 1]]) - """ - assert norm >= 0, "negative L_p norm not allowed" - bound = numpy.asfarray(bound).flatten()*numpy.ones(indices.shape[1]) - - if numpy.any(bound < 0): - return numpy.zeros((len(indices),), dtype=bool) - - if numpy.any(bound == 0): - out = numpy.all(indices[:, bound == 0] == 0, axis=-1) - if numpy.any(bound): - out &= cross_truncate(indices[:, bound != 0], bound[bound != 0], norm=norm) - return out - - if norm == 0: - out = numpy.sum(indices > 0, axis=-1) <= 1 - out[numpy.any(indices > bound, axis=-1)] = False - elif norm == numpy.inf: - out = numpy.max(indices/bound, axis=-1) <= 1 - else: - out = numpy.sum((indices/bound)**norm, axis=-1)**(1./norm) <= 1 - - assert numpy.all(out[numpy.all(indices == 0, axis=-1)]) - - return out diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/input_space.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/input_space.py deleted file mode 100644 index 3160ba2d0..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/input_space.py +++ /dev/null @@ -1,395 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import chaospy -import scipy.stats as st - - -class InputSpace: - """ - This class generates the input space for the metamodel from the - distributions provided using the `Input` object. - - Attributes - ---------- - Input : obj - Input object containing the parameter marginals, i.e. name, - distribution type and distribution parameters or available raw data. - meta_Model_type : str - Type of the meta_Model_type. - - """ - - def __init__(self, Input, meta_Model_type='pce'): - self.InputObj = Input - self.meta_Model_type = meta_Model_type - - # Other - self.apce = None - self.ndim = None - - # Init - self.check_valid_inputs() - - - def check_valid_inputs(self)-> None: - """ - Check if the given InputObj is valid to use for further calculations: - Has some Marginals - Marginals have valid priors - All Marginals given as the same type (samples vs dist) - - Returns - ------- - None - - """ - Inputs = self.InputObj - self.ndim = len(Inputs.Marginals) - - # Check if PCE or aPCE metamodel is selected. - # TODO: test also for 'pce'?? - if self.meta_Model_type.lower() == 'apce': - self.apce = True - else: - self.apce = False - - # check if marginals given - if not self.ndim >=1: - raise AssertionError('Cannot build distributions if no marginals are given') - - # check that each marginal is valid - for marginals in Inputs.Marginals: - if len(marginals.input_data) == 0: - if marginals.dist_type == None: - raise AssertionError('Not all marginals were provided priors') - break - if np.array(marginals.input_data).shape[0] and (marginals.dist_type != None): - raise AssertionError('Both samples and distribution type are given. Please choose only one.') - break - - # Check if input is given as dist or input_data. - self.input_data_given = -1 - for marg in Inputs.Marginals: - #print(self.input_data_given) - size = np.array(marg.input_data).shape[0] - #print(f'Size: {size}') - if size and abs(self.input_data_given) !=1: - self.input_data_given = 2 - break - if (not size) and self.input_data_given > 0: - self.input_data_given = 2 - break - if not size: - self.input_data_given = 0 - if size: - self.input_data_given = 1 - - if self.input_data_given == 2: - raise AssertionError('Distributions cannot be built as the priors have different types') - - - # Get the bounds if input_data are directly defined by user: - if self.input_data_given: - for i in range(self.ndim): - low_bound = np.min(Inputs.Marginals[i].input_data) - up_bound = np.max(Inputs.Marginals[i].input_data) - Inputs.Marginals[i].parameters = [low_bound, up_bound] - - - - # ------------------------------------------------------------------------- - def init_param_space(self, max_deg=None): - """ - Initializes parameter space. - - Parameters - ---------- - max_deg : int, optional - Maximum degree. The default is `None`. - - Creates - ------- - raw_data : array of shape (n_params, n_samples) - Raw data. - bound_tuples : list of tuples - A list containing lower and upper bounds of parameters. - - """ - # Recheck all before running! - self.check_valid_inputs() - - Inputs = self.InputObj - ndim = self.ndim - rosenblatt_flag = Inputs.Rosenblatt - mc_size = 50000 - - # Save parameter names - self.par_names = [] - for parIdx in range(ndim): - self.par_names.append(Inputs.Marginals[parIdx].name) - - # Create a multivariate probability distribution - # TODO: change this to make max_deg obligatory? at least in some specific cases? - if max_deg is not None: - JDist, poly_types = self.build_polytypes(rosenblatt=rosenblatt_flag) - self.JDist, self.poly_types = JDist, poly_types - - if self.input_data_given: - self.MCSize = len(Inputs.Marginals[0].input_data) - self.raw_data = np.zeros((ndim, self.MCSize)) - - for parIdx in range(ndim): - # Save parameter names - try: - self.raw_data[parIdx] = np.array( - Inputs.Marginals[parIdx].input_data) - except: - self.raw_data[parIdx] = self.JDist[parIdx].sample(mc_size) - - else: - # Generate random samples based on parameter distributions - self.raw_data = chaospy.generate_samples(mc_size, - domain=self.JDist) - - # Extract moments - for parIdx in range(ndim): - mu = np.mean(self.raw_data[parIdx]) - std = np.std(self.raw_data[parIdx]) - self.InputObj.Marginals[parIdx].moments = [mu, std] - - # Generate the bounds based on given inputs for marginals - bound_tuples = [] - for i in range(ndim): - if Inputs.Marginals[i].dist_type == 'unif': - low_bound = Inputs.Marginals[i].parameters[0] - up_bound = Inputs.Marginals[i].parameters[1] - else: - low_bound = np.min(self.raw_data[i]) - up_bound = np.max(self.raw_data[i]) - - bound_tuples.append((low_bound, up_bound)) - - self.bound_tuples = tuple(bound_tuples) - - # ------------------------------------------------------------------------- - def build_polytypes(self, rosenblatt): - """ - Creates the polynomial types to be passed to univ_basis_vals method of - the MetaModel object. - - Parameters - ---------- - rosenblatt : bool - Rosenblatt transformation flag. - - Returns - ------- - orig_space_dist : object - A chaospy JDist object or a gaussian_kde object. - poly_types : list - List of polynomial types for the parameters. - - """ - Inputs = self.InputObj - - all_data = [] - all_dist_types = [] - orig_joints = [] - poly_types = [] - - for parIdx in range(self.ndim): - - if Inputs.Marginals[parIdx].dist_type is None: - data = Inputs.Marginals[parIdx].input_data - all_data.append(data) - dist_type = None - else: - dist_type = Inputs.Marginals[parIdx].dist_type - params = Inputs.Marginals[parIdx].parameters - - if rosenblatt: - polytype = 'hermite' - dist = chaospy.Normal() - - elif dist_type is None: - polytype = 'arbitrary' - dist = None - - elif 'unif' in dist_type.lower(): - polytype = 'legendre' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Uniform(lower=params[0], upper=params[1]) - - elif 'norm' in dist_type.lower() and \ - 'log' not in dist_type.lower(): - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - polytype = 'hermite' - dist = chaospy.Normal(mu=params[0], sigma=params[1]) - - elif 'gamma' in dist_type.lower(): - polytype = 'laguerre' - if not np.array(params).shape[0]>=3: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Gamma(shape=params[0], - scale=params[1], - shift=params[2]) - - elif 'beta' in dist_type.lower(): - if not np.array(params).shape[0]>=4: - raise AssertionError('Distribution has too few parameters!') - polytype = 'jacobi' - dist = chaospy.Beta(alpha=params[0], beta=params[1], - lower=params[2], upper=params[3]) - - elif 'lognorm' in dist_type.lower(): - polytype = 'hermite' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - mu = np.log(params[0]**2/np.sqrt(params[0]**2 + params[1]**2)) - sigma = np.sqrt(np.log(1 + params[1]**2 / params[0]**2)) - dist = chaospy.LogNormal(mu, sigma) - # dist = chaospy.LogNormal(mu=params[0], sigma=params[1]) - - elif 'expon' in dist_type.lower(): - polytype = 'exponential' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Exponential(scale=params[0], shift=params[1]) - - elif 'weibull' in dist_type.lower(): - polytype = 'weibull' - if not np.array(params).shape[0]>=3: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Weibull(shape=params[0], scale=params[1], - shift=params[2]) - - else: - message = (f"DistType {dist_type} for parameter" - f"{parIdx+1} is not available.") - raise ValueError(message) - - if self.input_data_given or self.apce: - polytype = 'arbitrary' - - # Store dists and poly_types - orig_joints.append(dist) - poly_types.append(polytype) - all_dist_types.append(dist_type) - - # Prepare final output to return - if None in all_dist_types: - # Naive approach: Fit a gaussian kernel to the provided data - Data = np.asarray(all_data) - try: - orig_space_dist = st.gaussian_kde(Data) - except: - raise ValueError('The samples provided to the Marginals should be 1D only') - self.prior_space = orig_space_dist - else: - orig_space_dist = chaospy.J(*orig_joints) - try: - self.prior_space = st.gaussian_kde(orig_space_dist.sample(10000)) - except: - raise ValueError('Parameter values are not valid, please set differently') - - return orig_space_dist, poly_types - - # ------------------------------------------------------------------------- - def transform(self, X, params=None, method=None): - """ - Transforms the samples via either a Rosenblatt or an isoprobabilistic - transformation. - - Parameters - ---------- - X : array of shape (n_samples,n_params) - Samples to be transformed. - method : string - If transformation method is 'user' transform X, else just pass X. - - Returns - ------- - tr_X: array of shape (n_samples,n_params) - Transformed samples. - - """ - # Check for built JDist - if not hasattr(self, 'JDist'): - raise AttributeError('Call function init_param_space first to create JDist') - - # Check if X is 2d - if X.ndim != 2: - raise AttributeError('X should have two dimensions') - - # Check if size of X matches Marginals - if X.shape[1]!= self.ndim: - raise AttributeError('The second dimension of X should be the same size as the number of marginals in the InputObj') - - if self.InputObj.Rosenblatt: - self.origJDist, _ = self.build_polytypes(False) - if method == 'user': - tr_X = self.JDist.inv(self.origJDist.fwd(X.T)).T - else: - # Inverse to original spcace -- generate sample ED - tr_X = self.origJDist.inv(self.JDist.fwd(X.T)).T - else: - # Transform samples via an isoprobabilistic transformation - n_samples, n_params = X.shape - Inputs = self.InputObj - origJDist = self.JDist - poly_types = self.poly_types - - disttypes = [] - for par_i in range(n_params): - disttypes.append(Inputs.Marginals[par_i].dist_type) - - # Pass non-transformed X, if arbitrary PCE is selected. - if None in disttypes or self.input_data_given or self.apce: - return X - - cdfx = np.zeros((X.shape)) - tr_X = np.zeros((X.shape)) - - for par_i in range(n_params): - - # Extract the parameters of the original space - disttype = disttypes[par_i] - if disttype is not None: - dist = origJDist[par_i] - else: - dist = None - polytype = poly_types[par_i] - cdf = np.vectorize(lambda x: dist.cdf(x)) - - # Extract the parameters of the transformation space based on - # polyType - if polytype == 'legendre' or disttype == 'uniform': - # Generate Y_Dists based - params_Y = [-1, 1] - dist_Y = st.uniform(loc=params_Y[0], - scale=params_Y[1]-params_Y[0]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'hermite' or disttype == 'norm': - params_Y = [0, 1] - dist_Y = st.norm(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'laguerre' or disttype == 'gamma': - if params == None: - raise AttributeError('Additional parameters have to be set for the gamma distribution!') - params_Y = [1, params[1]] - dist_Y = st.gamma(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - # Compute CDF_x(X) - cdfx[:, par_i] = cdf(X[:, par_i]) - - # Compute invCDF_y(cdfx) - tr_X[:, par_i] = inv_cdf(cdfx[:, par_i]) - - return tr_X diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/inputs.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/inputs.py deleted file mode 100644 index 783e82b05..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/inputs.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -class Input: - """ - A class to define the uncertain input parameters. - - Attributes - ---------- - Marginals : obj - Marginal objects. See `inputs.Marginal`. - Rosenblatt : bool - If Rossenblatt transformation is required for the dependent input - parameters. - - Examples - ------- - Marginals can be defined as following: - - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].dist_type = 'uniform' - >>> Inputs.Marginals[0].parameters = [-5, 5] - - If there is no common data is avaliable, the input data can be given - as following: - - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].input_data = input_data - """ - poly_coeffs_flag = True - - def __init__(self): - self.Marginals = [] - self.Rosenblatt = False - - def add_marginals(self): - """ - Adds a new Marginal object to the input object. - - Returns - ------- - None. - - """ - self.Marginals.append(Marginal()) - - -# Nested class -class Marginal: - """ - An object containing the specifications of the marginals for each uncertain - parameter. - - Attributes - ---------- - name : string - Name of the parameter. The default is `'$x_1$'`. - dist_type : string - Name of the distribution. The default is `None`. - parameters : list - List of the parameters corresponding to the distribution type. The - default is `None`. - input_data : array - Available input data. The default is `[]`. - moments : list - List of the moments. - """ - - def __init__(self): - self.name = '$x_1$' - self.dist_type = None - self.parameters = None - self.input_data = [] - self.moments = None diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py deleted file mode 100644 index 96ef9c1d5..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jul 15 14:08:59 2022 - -@author: farid -""" -import numpy as np -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -from sklearn.utils import check_X_y - - -def corr(x, y): - return abs(x.dot(y))/np.sqrt((x**2).sum()) - - -class OrthogonalMatchingPursuit(LinearModel, RegressorMixin): - ''' - Regression with Orthogonal Matching Pursuit [1]. - - Parameters - ---------- - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - References - ---------- - [1] Pati, Y., Rezaiifar, R., Krishnaprasad, P. (1993). Orthogonal matching - pursuit: recursive function approximation with application to wavelet - decomposition. Proceedings of 27th Asilomar Conference on Signals, - Systems and Computers, 40-44. - ''' - - def __init__(self, fit_intercept=True, normalize=False, copy_X=True, - verbose=False): - self.fit_intercept = fit_intercept - self.normalize = normalize - self.copy_X = copy_X - self.verbose = verbose - - def _preprocess_data(self, X, y): - """Center and scale data. - Centers data to have mean zero along axis 0. If fit_intercept=False or - if the X is a sparse matrix, no centering is done, but normalization - can still be applied. The function returns the statistics necessary to - reconstruct the input data, which are X_offset, y_offset, X_scale, such - that the output - X = (X - X_offset) / X_scale - X_scale is the L2 norm of X - X_offset. - """ - - if self.copy_X: - X = X.copy(order='K') - - y = np.asarray(y, dtype=X.dtype) - - if self.fit_intercept: - X_offset = np.average(X, axis=0) - X -= X_offset - if self.normalize: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - std = np.sqrt(np.sum(X**2, axis=0)/(len(X)-1)) - X_scale[std != 0] = std[std != 0] - X /= X_scale - else: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - y_offset = np.mean(y) - y = y - y_offset - else: - X_offset = np.zeros(X.shape[1], dtype=X.dtype) - X_scale = np.ones(X.shape[1], dtype=X.dtype) - if y.ndim == 1: - y_offset = X.dtype.type(0) - else: - y_offset = np.zeros(y.shape[1], dtype=X.dtype) - - return X, y, X_offset, y_offset, X_scale - - def fit(self, X, y): - ''' - Fits Regression with Orthogonal Matching Pursuit Algorithm. - - Parameters - ----------- - X: {array-like, sparse matrix} of size (n_samples, n_features) - Training data, matrix of explanatory variables - - y: array-like of size [n_samples, n_features] - Target values - - Returns - ------- - self : object - Returns self. - ''' - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._preprocess_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # Normalize columns of Psi, so that each column has norm = 1 - norm_X = np.linalg.norm(X, axis=0) - X_norm = X/norm_X - - # Initialize residual vector to full model response and normalize - R = y - norm_y = np.sqrt(np.dot(y, y)) - r = y/norm_y - - # Check for constant regressors - const_indices = np.where(~np.diff(X, axis=0).any(axis=0))[0] - bool_const = not const_indices - - # Start regression using OPM algorithm - precision = 0 # Set precision criterion to precision of program - early_stop = True - cond_early = True # Initialize condition for early stop - ind = [] - iindx = [] # index of selected columns - indtot = np.arange(n_features) # Full index set for remaining columns - kmax = min(n_samples, n_features) # Maximum number of iterations - LOO = np.PINF * np.ones(kmax) # Store LOO error at each iteration - LOOmin = np.PINF # Initialize minimum value of LOO - coeff = np.zeros((n_features, kmax)) - count = 0 - k = 0.1 # Percentage of iteration history for early stop - - # Begin iteration over regressors set (Matrix X) - while (np.linalg.norm(R) > precision) and (count <= kmax-1) and \ - ((cond_early or early_stop) ^ ~cond_early): - - # Update index set of columns yet to select - if count != 0: - indtot = np.delete(indtot, iindx) - - # Find column of X that is most correlated with residual - h = abs(np.dot(r, X_norm)) - iindx = np.argmax(h[indtot]) - indx = indtot[iindx] - - # initialize with the constant regressor, if it exists in the basis - if (count == 0) and bool_const: - # overwrite values for iindx and indx - iindx = const_indices[0] - indx = indtot[iindx] - - # Invert the information matrix at the first iteration, later only - # update its value on the basis of the previously inverted one, - if count == 0: - M = 1 / np.dot(X[:, indx], X[:, indx]) - else: - x = np.dot(X[:, ind].T, X[:, indx]) - r = np.dot(X[:, indx], X[:, indx]) - M = self.blockwise_inverse(M, x, x.T, r) - - # Add newly found index to the selected indexes set - ind.append(indx) - - # Select regressors subset (Projection subspace) - Xpro = X[:, ind] - - # Obtain coefficient by performing OLS - TT = np.dot(y, Xpro) - beta = np.dot(M, TT) - coeff[ind, count] = beta - - # Compute LOO error - LOO[count] = self.loo_error(Xpro, M, y, beta) - - # Compute new residual due to new projection - R = y - np.dot(Xpro, beta) - - # Normalize residual - norm_R = np.sqrt(np.dot(R, R)) - r = R / norm_R - - # Update counters and early-stop criterions - countinf = max(0, int(count-k*kmax)) - LOOmin = min(LOOmin, LOO[count]) - - if count == 0: - cond_early = (LOO[0] <= LOOmin) - else: - cond_early = (min(LOO[countinf:count+1]) <= LOOmin) - - if self.verbose: - print(f'Iteration: {count+1}, mod. LOOCV error : ' - f'{LOO[count]:.2e}') - - # Update counter - count += 1 - - # Select projection with smallest cross-validation error - countmin = np.argmin(LOO[:-1]) - self.coef_ = coeff[:, countmin] - self.active = coeff[:, countmin] != 0.0 - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self, X): - ''' - Computes predictive distribution for test set. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - ''' - - y_hat = np.dot(X, self.coef_) + self.intercept_ - - return y_hat - - def loo_error(self, psi, inv_inf_matrix, y, coeffs): - """ - Calculates the corrected LOO error for regression on regressor - matrix `psi` that generated the coefficients based on [1] and [2]. - - [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for - uncertainty propagation and sensitivity analysis (Doctoral - dissertation, Clermont-Ferrand 2). - - [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos - expansion based on least angle regression. Journal of computational - Physics, 230(6), pp.2345-2367. - - Parameters - ---------- - psi : array of shape (n_samples, n_feature) - Orthogonal bases evaluated at the samples. - inv_inf_matrix : array - Inverse of the information matrix. - y : array of shape (n_samples, ) - Targets. - coeffs : array - Computed regresssor cofficients. - - Returns - ------- - loo_error : float - Modified LOOCV error. - - """ - - # NrEvaluation (Size of experimental design) - N, P = psi.shape - - # h factor (the full matrix is not calculated explicitly, - # only the trace is, to save memory) - PsiM = np.dot(psi, inv_inf_matrix) - - h = np.sum(np.multiply(PsiM, psi), axis=1, dtype=np.longdouble) - - # ------ Calculate Error Loocv for each measurement point ---- - # Residuals - residual = np.dot(psi, coeffs) - y - - # Variance - varY = np.var(y) - - if varY == 0: - norm_emp_error = 0 - loo_error = 0 - else: - norm_emp_error = np.mean(residual**2)/varY - - loo_error = np.mean(np.square(residual / (1-h))) / varY - - # if there are NaNs, just return an infinite LOO error (this - # happens, e.g., when a strongly underdetermined problem is solved) - if np.isnan(loo_error): - loo_error = np.inf - - # Corrected Error for over-determined system - tr_M = np.trace(np.atleast_2d(inv_inf_matrix)) - if tr_M < 0 or abs(tr_M) > 1e6: - tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) - - # Over-determined system of Equation - if N > P: - T_factor = N/(N-P) * (1 + tr_M) - - # Under-determined system of Equation - else: - T_factor = np.inf - - loo_error *= T_factor - - return loo_error - - def blockwise_inverse(self, Ainv, B, C, D): - """ - non-singular square matrix M defined as M = [[A B]; [C D]] . - B, C and D can have any dimension, provided their combination defines - a square matrix M. - - Parameters - ---------- - Ainv : float or array - inverse of the square-submatrix A. - B : float or array - Information matrix with all new regressor. - C : float or array - Transpose of B. - D : float or array - Information matrix with all selected regressors. - - Returns - ------- - M : array - Inverse of the information matrix. - - """ - if np.isscalar(D): - # Inverse of D - Dinv = 1/D - # Schur complement - SCinv = 1/(D - np.dot(C, np.dot(Ainv, B[:, None])))[0] - else: - # Inverse of D - Dinv = np.linalg.solve(D, np.eye(D.shape)) - # Schur complement - SCinv = np.linalg.solve((D - C*Ainv*B), np.eye(D.shape)) - - T1 = np.dot(Ainv, np.dot(B[:, None], SCinv)) - T2 = np.dot(C, Ainv) - - # Assemble the inverse matrix - M = np.vstack(( - np.hstack((Ainv+T1*T2, -T1)), - np.hstack((-(SCinv)*T2, SCinv)) - )) - return M diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_ard.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_ard.py deleted file mode 100644 index e6883a3ed..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_ard.py +++ /dev/null @@ -1,475 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Tue Mar 24 19:41:45 2020 - -@author: farid -""" -import numpy as np -from scipy.linalg import solve_triangular -from numpy.linalg import LinAlgError -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -import warnings -from sklearn.utils import check_X_y -from scipy.linalg import pinvh - - -def update_precisions(Q,S,q,s,A,active,tol,n_samples,clf_bias): - ''' - Selects one feature to be added/recomputed/deleted to model based on - effect it will have on value of log marginal likelihood. - ''' - # initialise vector holding changes in log marginal likelihood - deltaL = np.zeros(Q.shape[0]) - - # identify features that can be added , recomputed and deleted in model - theta = q**2 - s - add = (theta > 0) * (active == False) - recompute = (theta > 0) * (active == True) - delete = ~(add + recompute) - - # compute sparsity & quality parameters corresponding to features in - # three groups identified above - Qadd,Sadd = Q[add], S[add] - Qrec,Srec,Arec = Q[recompute], S[recompute], A[recompute] - Qdel,Sdel,Adel = Q[delete], S[delete], A[delete] - - # compute new alpha's (precision parameters) for features that are - # currently in model and will be recomputed - Anew = s[recompute]**2/ ( theta[recompute] + np.finfo(np.float32).eps) - delta_alpha = (1./Anew - 1./Arec) - - # compute change in log marginal likelihood - deltaL[add] = ( Qadd**2 - Sadd ) / Sadd + np.log(Sadd/Qadd**2 ) - deltaL[recompute] = Qrec**2 / (Srec + 1. / delta_alpha) - np.log(1 + Srec*delta_alpha) - deltaL[delete] = Qdel**2 / (Sdel - Adel) - np.log(1 - Sdel / Adel) - deltaL = deltaL / n_samples - - # find feature which caused largest change in likelihood - feature_index = np.argmax(deltaL) - - # no deletions or additions - same_features = np.sum( theta[~recompute] > 0) == 0 - - # changes in precision for features already in model is below threshold - no_delta = np.sum( abs( Anew - Arec ) > tol ) == 0 - # if same_features: print(abs( Anew - Arec )) - # print("same_features = {} no_delta = {}".format(same_features,no_delta)) - # check convergence: if no features to add or delete and small change in - # precision for current features then terminate - converged = False - if same_features and no_delta: - converged = True - return [A,converged] - - # if not converged update precision parameter of weights and return - if theta[feature_index] > 0: - A[feature_index] = s[feature_index]**2 / theta[feature_index] - if active[feature_index] == False: - active[feature_index] = True - else: - # at least two active features - if active[feature_index] == True and np.sum(active) >= 2: - # do not remove bias term in classification - # (in regression it is factored in through centering) - if not (feature_index == 0 and clf_bias): - active[feature_index] = False - A[feature_index] = np.PINF - - return [A,converged] - - -class RegressionFastARD(LinearModel, RegressorMixin): - ''' - Regression with Automatic Relevance Determination (Fast Version uses - Sparse Bayesian Learning) - https://github.com/AmazaspShumik/sklearn-bayes/blob/master/skbayes/rvm_ard_models/fast_rvm.py - - Parameters - ---------- - n_iter: int, optional (DEFAULT = 100) - Maximum number of iterations - - start: list, optional (DEFAULT = None) - Initial selected features. - - tol: float, optional (DEFAULT = 1e-3) - If absolute change in precision parameter for weights is below threshold - algorithm terminates. - - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - compute_score : bool, default=False - If True, compute the log marginal likelihood at each iteration of the - optimization. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - alpha_ : float - estimated precision of the noise - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - lambda_ : array, shape = (n_features) - estimated precisions of the coefficients - - sigma_ : array, shape = (n_features, n_features) - estimated covariance matrix of the weights, computed only - for non-zero coefficients - - scores_ : array-like of shape (n_iter_+1,) - If computed_score is True, value of the log marginal likelihood (to be - maximized) at each iteration of the optimization. - - References - ---------- - [1] Fast marginal likelihood maximisation for sparse Bayesian models - (Tipping & Faul 2003) (http://www.miketipping.com/papers/met-fastsbl.pdf) - [2] Analysis of sparse Bayesian learning (Tipping & Faul 2001) - (http://www.miketipping.com/abstracts.htm#Faul:NIPS01) - ''' - - def __init__(self, n_iter=300, start=None, tol=1e-3, fit_intercept=True, - normalize=False, copy_X=True, compute_score=False, verbose=False): - self.n_iter = n_iter - self.start = start - self.tol = tol - self.scores_ = list() - self.fit_intercept = fit_intercept - self.normalize = normalize - self.copy_X = copy_X - self.compute_score = compute_score - self.verbose = verbose - - def _preprocess_data(self, X, y): - """Center and scale data. - Centers data to have mean zero along axis 0. If fit_intercept=False or - if the X is a sparse matrix, no centering is done, but normalization - can still be applied. The function returns the statistics necessary to - reconstruct the input data, which are X_offset, y_offset, X_scale, such - that the output - X = (X - X_offset) / X_scale - X_scale is the L2 norm of X - X_offset. - """ - - if self.copy_X: - X = X.copy(order='K') - - y = np.asarray(y, dtype=X.dtype) - - if self.fit_intercept: - X_offset = np.average(X, axis=0) - X -= X_offset - if self.normalize: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - std = np.sqrt(np.sum(X**2, axis=0)/(len(X)-1)) - X_scale[std != 0] = std[std != 0] - X /= X_scale - else: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - y_offset = np.mean(y) - y = y - y_offset - else: - X_offset = np.zeros(X.shape[1], dtype=X.dtype) - X_scale = np.ones(X.shape[1], dtype=X.dtype) - if y.ndim == 1: - y_offset = X.dtype.type(0) - else: - y_offset = np.zeros(y.shape[1], dtype=X.dtype) - - return X, y, X_offset, y_offset, X_scale - - def fit(self, X, y): - ''' - Fits ARD Regression with Sequential Sparse Bayes Algorithm. - - Parameters - ----------- - X: {array-like, sparse matrix} of size (n_samples, n_features) - Training data, matrix of explanatory variables - - y: array-like of size [n_samples, n_features] - Target values - - Returns - ------- - self : object - Returns self. - ''' - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._preprocess_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # precompute X'*Y , X'*X for faster iterations & allocate memory for - # sparsity & quality vectors - XY = np.dot(X.T, y) - XX = np.dot(X.T, X) - XXd = np.diag(XX) - - # initialise precision of noise & and coefficients - var_y = np.var(y) - - # check that variance is non zero !!! - if var_y == 0: - beta = 1e-2 - self.var_y = True - else: - beta = 1. / np.var(y) - self.var_y = False - - A = np.PINF * np.ones(n_features) - active = np.zeros(n_features, dtype=np.bool) - - if self.start is not None and not hasattr(self, 'active_'): - start = self.start - # start from a given start basis vector - proj = XY**2 / XXd - active[start] = True - A[start] = XXd[start]/(proj[start] - var_y) - - else: - # in case of almost perfect multicollinearity between some features - # start from feature 0 - if np.sum(XXd - X_mean**2 < np.finfo(np.float32).eps) > 0: - A[0] = np.finfo(np.float16).eps - active[0] = True - - else: - # start from a single basis vector with largest projection on - # targets - proj = XY**2 / XXd - start = np.argmax(proj) - active[start] = True - A[start] = XXd[start]/(proj[start] - var_y + - np.finfo(np.float32).eps) - - warning_flag = 0 - scores_ = [] - for i in range(self.n_iter): - # Handle variance zero - if self.var_y: - A[0] = y_mean - active[0] = True - converged = True - break - - XXa = XX[active, :][:, active] - XYa = XY[active] - Aa = A[active] - - # mean & covariance of posterior distribution - Mn, Ri, cholesky = self._posterior_dist(Aa, beta, XXa, XYa) - if cholesky: - Sdiag = np.sum(Ri**2, 0) - else: - Sdiag = np.copy(np.diag(Ri)) - warning_flag += 1 - - # raise warning in case cholesky fails - if warning_flag == 1: - warnings.warn(("Cholesky decomposition failed! Algorithm uses " - "pinvh, which is significantly slower. If you " - "use RVR it is advised to change parameters of " - "the kernel!")) - - # compute quality & sparsity parameters - s, q, S, Q = self._sparsity_quality(XX, XXd, XY, XYa, Aa, Ri, - active, beta, cholesky) - - # update precision parameter for noise distribution - rss = np.sum((y - np.dot(X[:, active], Mn))**2) - - # if near perfect fit , then terminate - if (rss / n_samples/var_y) < self.tol: - warnings.warn('Early termination due to near perfect fit') - converged = True - break - beta = n_samples - np.sum(active) + np.sum(Aa * Sdiag) - beta /= rss - # beta /= (rss + np.finfo(np.float32).eps) - - # update precision parameters of coefficients - A, converged = update_precisions(Q, S, q, s, A, active, self.tol, - n_samples, False) - - if self.compute_score: - scores_.append(self.log_marginal_like(XXa, XYa, Aa, beta)) - - if self.verbose: - print(('Iteration: {0}, number of features ' - 'in the model: {1}').format(i, np.sum(active))) - - if converged or i == self.n_iter - 1: - if converged and self.verbose: - print('Algorithm converged!') - break - - # after last update of alpha & beta update parameters - # of posterior distribution - XXa, XYa, Aa = XX[active, :][:, active], XY[active], A[active] - Mn, Sn, cholesky = self._posterior_dist(Aa, beta, XXa, XYa, True) - self.coef_ = np.zeros(n_features) - self.coef_[active] = Mn - self.sigma_ = Sn - self.active_ = active - self.lambda_ = A - self.alpha_ = beta - self.converged = converged - if self.compute_score: - self.scores_ = np.array(scores_) - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - return self - - def log_marginal_like(self, XXa, XYa, Aa, beta): - """Computes the log of the marginal likelihood.""" - N, M = XXa.shape - A = np.diag(Aa) - - Mn, sigma_, cholesky = self._posterior_dist(Aa, beta, XXa, XYa, - full_covar=True) - - C = sigma_ + np.dot(np.dot(XXa.T, np.linalg.pinv(A)), XXa) - - score = np.dot(np.dot(XYa.T, np.linalg.pinv(C)), XYa) +\ - np.log(np.linalg.det(C)) + N * np.log(2 * np.pi) - - return -0.5 * score - - def predict(self, X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance based on - Ref.[1] Section 3.3.2. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - References - ---------- - [1] Bishop, C. M. (2006). Pattern recognition and machine learning. - springer. - ''' - - y_hat = np.dot(X, self.coef_) + self.intercept_ - - if return_std: - # Handle the zero variance case - if self.var_y: - return y_hat, np.zeros_like(y_hat) - - if self.normalize: - X -= self._x_mean_[self.active_] - X /= self._x_std[self.active_] - var_hat = 1./self.alpha_ - var_hat += np.sum(X.dot(self.sigma_) * X, axis=1) - std_hat = np.sqrt(var_hat) - return y_hat, std_hat - else: - return y_hat - - def _posterior_dist(self, A, beta, XX, XY, full_covar=False): - ''' - Calculates mean and covariance matrix of posterior distribution - of coefficients. - ''' - # compute precision matrix for active features - Sinv = beta * XX - np.fill_diagonal(Sinv, np.diag(Sinv) + A) - cholesky = True - - # try cholesky, if it fails go back to pinvh - try: - # find posterior mean : R*R.T*mean = beta*X.T*Y - # solve(R*z = beta*X.T*Y) =>find z=> solve(R.T*mean = z)=>find mean - R = np.linalg.cholesky(Sinv) - Z = solve_triangular(R, beta*XY, check_finite=True, lower=True) - Mn = solve_triangular(R.T, Z, check_finite=True, lower=False) - - # invert lower triangular matrix from cholesky decomposition - Ri = solve_triangular(R, np.eye(A.shape[0]), check_finite=False, - lower=True) - if full_covar: - Sn = np.dot(Ri.T, Ri) - return Mn, Sn, cholesky - else: - return Mn, Ri, cholesky - except LinAlgError: - cholesky = False - Sn = pinvh(Sinv) - Mn = beta*np.dot(Sinv, XY) - return Mn, Sn, cholesky - - def _sparsity_quality(self, XX, XXd, XY, XYa, Aa, Ri, active, beta, cholesky): - ''' - Calculates sparsity and quality parameters for each feature - - Theoretical Note: - ----------------- - Here we used Woodbury Identity for inverting covariance matrix - of target distribution - C = 1/beta + 1/alpha * X' * X - C^-1 = beta - beta^2 * X * Sn * X' - ''' - bxy = beta*XY - bxx = beta*XXd - if cholesky: - # here Ri is inverse of lower triangular matrix obtained from - # cholesky decomp - xxr = np.dot(XX[:, active], Ri.T) - rxy = np.dot(Ri, XYa) - S = bxx - beta**2 * np.sum(xxr**2, axis=1) - Q = bxy - beta**2 * np.dot(xxr, rxy) - else: - # here Ri is covariance matrix - XXa = XX[:, active] - XS = np.dot(XXa, Ri) - S = bxx - beta**2 * np.sum(XS*XXa, 1) - Q = bxy - beta**2 * np.dot(XS, XYa) - # Use following: - # (EQ 1) q = A*Q/(A - S) ; s = A*S/(A-S) - # so if A = np.PINF q = Q, s = S - qi = np.copy(Q) - si = np.copy(S) - # If A is not np.PINF, then it should be 'active' feature => use (EQ 1) - Qa, Sa = Q[active], S[active] - qi[active] = Aa * Qa / (Aa - Sa) - si[active] = Aa * Sa / (Aa - Sa) - - return [si, qi, S, Q] diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_laplace.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_laplace.py deleted file mode 100644 index 7fdcb5cf6..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/reg_fast_laplace.py +++ /dev/null @@ -1,452 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import numpy as np -from sklearn.utils import as_float_array -from sklearn.model_selection import KFold - - -class RegressionFastLaplace(): - ''' - Sparse regression with Bayesian Compressive Sensing as described in Alg. 1 - (Fast Laplace) of Ref.[1], which updated formulas from [2]. - - sigma2: noise precision (sigma^2) - nu fixed to 0 - - uqlab/lib/uq_regression/BCS/uq_bsc.m - - Parameters - ---------- - n_iter: int, optional (DEFAULT = 1000) - Maximum number of iterations - - tol: float, optional (DEFAULT = 1e-7) - If absolute change in precision parameter for weights is below - threshold algorithm terminates. - - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - alpha_ : float - estimated precision of the noise - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - lambda_ : array, shape = (n_features) - estimated precisions of the coefficients - - sigma_ : array, shape = (n_features, n_features) - estimated covariance matrix of the weights, computed only - for non-zero coefficients - - References - ---------- - [1] Babacan, S. D., Molina, R., & Katsaggelos, A. K. (2009). Bayesian - compressive sensing using Laplace priors. IEEE Transactions on image - processing, 19(1), 53-63. - [2] Fast marginal likelihood maximisation for sparse Bayesian models - (Tipping & Faul 2003). - (http://www.miketipping.com/papers/met-fastsbl.pdf) - ''' - - def __init__(self, n_iter=1000, n_Kfold=10, tol=1e-7, fit_intercept=False, - bias_term=True, copy_X=True, verbose=False): - self.n_iter = n_iter - self.n_Kfold = n_Kfold - self.tol = tol - self.fit_intercept = fit_intercept - self.bias_term = bias_term - self.copy_X = copy_X - self.verbose = verbose - - def _center_data(self, X, y): - ''' Centers data''' - X = as_float_array(X, copy = self.copy_X) - - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype=X.dtype) - if self.fit_intercept: - X_mean = np.average(X, axis=0) - y_mean = np.average(y, axis=0) - X -= X_mean - y -= y_mean - else: - X_mean = np.zeros(X.shape[1], dtype=X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X, y, X_mean, y_mean, X_std - - def fit(self, X, y): - - k_fold = KFold(n_splits=self.n_Kfold) - - varY = np.var(y, ddof=1) if np.var(y, ddof=1) != 0 else 1.0 - sigma2s = len(y)*varY*(10**np.linspace(-16, -1, self.n_Kfold)) - - errors = np.zeros((len(sigma2s), self.n_Kfold)) - for s, sigma2 in enumerate(sigma2s): - for k, (train, test) in enumerate(k_fold.split(X, y)): - self.fit_(X[train], y[train], sigma2) - errors[s, k] = np.linalg.norm( - y[test] - self.predict(X[test]) - )**2/len(test) - - KfCVerror = np.sum(errors, axis=1)/self.n_Kfold/varY - i_minCV = np.argmin(KfCVerror) - - self.kfoldCVerror = np.min(KfCVerror) - - return self.fit_(X, y, sigma2s[i_minCV]) - - def fit_(self, X, y, sigma2): - - N, P = X.shape - # n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # check that variance is non zero !!! - if np.var(y) == 0: - self.var_y = True - else: - self.var_y = False - beta = 1./sigma2 - - # precompute X'*Y , X'*X for faster iterations & allocate memory for - # sparsity & quality vectors X=Psi - PsiTY = np.dot(X.T, y) - PsiTPsi = np.dot(X.T, X) - XXd = np.diag(PsiTPsi) - - # initialize with constant regressor, or if that one does not exist, - # with the one that has the largest correlation with Y - ind_global_to_local = np.zeros(P, dtype=np.int32) - - # identify constant regressors - constidx = np.where(~np.diff(X, axis=0).all(axis=0))[0] - - if self.bias_term and constidx.size != 0: - ind_start = constidx[0] - ind_global_to_local[ind_start] = True - else: - # start from a single basis vector with largest projection on - # targets - proj = np.divide(np.square(PsiTY), XXd) - ind_start = np.argmax(proj) - ind_global_to_local[ind_start] = True - - num_active = 1 - active_indices = [ind_start] - deleted_indices = [] - bcs_path = [ind_start] - gamma = np.zeros(P) - # for the initial value of gamma(ind_start), use the RVM formula - # gamma = (q^2 - s) / (s^2) - # and the fact that initially s = S = beta*Psi_i'*Psi_i and q = Q = - # beta*Psi_i'*Y - gamma[ind_start] = np.square(PsiTY[ind_start]) - gamma[ind_start] -= sigma2 * PsiTPsi[ind_start, ind_start] - gamma[ind_start] /= np.square(PsiTPsi[ind_start, ind_start]) - - Sigma = 1. / (beta * PsiTPsi[ind_start, ind_start] - + 1./gamma[ind_start]) - - mu = Sigma * PsiTY[ind_start] * beta - tmp1 = beta * PsiTPsi[ind_start] - S = beta * np.diag(PsiTPsi).T - Sigma * np.square(tmp1) - Q = beta * PsiTY.T - mu*(tmp1) - - tmp2 = np.ones(P) # alternative computation for the initial s,q - q0tilde = PsiTY[ind_start] - s0tilde = PsiTPsi[ind_start, ind_start] - tmp2[ind_start] = s0tilde / (q0tilde**2) / beta - s = np.divide(S, tmp2) - q = np.divide(Q, tmp2) - Lambda = 2*(num_active - 1) / np.sum(gamma) - - Delta_L_max = [] - for i in range(self.n_iter): - # Handle variance zero - if self.var_y: - mu = np.mean(y) - break - - if self.verbose: - print(' lambda = {0:.6e}\n'.format(Lambda)) - - # Calculate the potential updated value of each gamma[i] - if Lambda == 0.0: # RVM - gamma_potential = np.multiply(( - (q**2 - s) > Lambda), - np.divide(q**2 - s, s**2) - ) - else: - a = Lambda * s**2 - b = s**2 + 2*Lambda*s - c = Lambda + s - q**2 - gamma_potential = np.multiply( - (c < 0), np.divide( - -b + np.sqrt(b**2 - 4*np.multiply(a, c)), 2*a) - ) - - l_gamma = - np.log(np.absolute(1 + np.multiply(gamma, s))) - l_gamma += np.divide(np.multiply(q**2, gamma), - (1 + np.multiply(gamma, s))) - l_gamma -= Lambda*gamma # omitted the factor 1/2 - - # Contribution of each updated gamma(i) to L(gamma) - l_gamma_potential = - np.log( - np.absolute(1 + np.multiply(gamma_potential, s)) - ) - l_gamma_potential += np.divide( - np.multiply(q**2, gamma_potential), - (1 + np.multiply(gamma_potential, s)) - ) - # omitted the factor 1/2 - l_gamma_potential -= Lambda*gamma_potential - - # Check how L(gamma) would change if we replaced gamma(i) by the - # updated gamma_potential(i), for each i separately - Delta_L_potential = l_gamma_potential - l_gamma - - # deleted indices should not be chosen again - if len(deleted_indices) != 0: - values = -np.inf * np.ones(len(deleted_indices)) - Delta_L_potential[deleted_indices] = values - - Delta_L_max.append(np.nanmax(Delta_L_potential)) - ind_L_max = np.nanargmax(Delta_L_potential) - - # in case there is only 1 regressor in the model and it would now - # be deleted - if len(active_indices) == 1 and ind_L_max == active_indices[0] \ - and gamma_potential[ind_L_max] == 0.0: - Delta_L_potential[ind_L_max] = -np.inf - Delta_L_max[i] = np.max(Delta_L_potential) - ind_L_max = np.argmax(Delta_L_potential) - - # If L did not change significantly anymore, break - if Delta_L_max[i] <= 0.0 or\ - (i > 0 and all(np.absolute(Delta_L_max[i-1:]) - < sum(Delta_L_max)*self.tol)) or \ - (i > 0 and all(np.diff(bcs_path)[i-1:] == 0.0)): - if self.verbose: - print('Increase in L: {0:.6e} (eta = {1:.3e})\ - -- break\n'.format(Delta_L_max[i], self.tol)) - break - - # Print information - if self.verbose: - print(' Delta L = {0:.6e} \n'.format(Delta_L_max[i])) - - what_changed = int(gamma[ind_L_max] == 0.0) - what_changed -= int(gamma_potential[ind_L_max] == 0.0) - - # Print information - if self.verbose: - if what_changed < 0: - print(f'{i+1} - Remove regressor #{ind_L_max+1}..\n') - elif what_changed == 0: - print(f'{i+1} - Recompute regressor #{ind_L_max+1}..\n') - else: - print(f'{i+1} - Add regressor #{ind_L_max+1}..\n') - - # --- Update all quantities ---- - if what_changed == 1: - # adding a regressor - - # update gamma - gamma[ind_L_max] = gamma_potential[ind_L_max] - - Sigma_ii = 1.0 / (1.0/gamma[ind_L_max] + S[ind_L_max]) - try: - x_i = np.matmul( - Sigma, PsiTPsi[active_indices, ind_L_max].reshape(-1, 1) - ) - except ValueError: - x_i = Sigma * PsiTPsi[active_indices, ind_L_max] - tmp_1 = - (beta * Sigma_ii) * x_i - Sigma = np.vstack( - (np.hstack(((beta**2 * Sigma_ii) * np.dot(x_i, x_i.T) - + Sigma, tmp_1)), np.append(tmp_1.T, Sigma_ii)) - ) - mu_i = Sigma_ii * Q[ind_L_max] - mu = np.vstack((mu - (beta * mu_i) * x_i, mu_i)) - - tmp2_1 = PsiTPsi[:, ind_L_max] - beta * np.squeeze( - np.matmul(PsiTPsi[:, active_indices], x_i) - ) - if i == 0: - tmp2_1[0] /= 2 - tmp2 = beta * tmp2_1.T - S = S - Sigma_ii * np.square(tmp2) - Q = Q - mu_i * tmp2 - - num_active += 1 - ind_global_to_local[ind_L_max] = num_active - active_indices.append(ind_L_max) - bcs_path.append(ind_L_max) - - elif what_changed == 0: - # recomputation - # zero if regressor has not been chosen yet - if not ind_global_to_local[ind_L_max]: - raise Exception('Cannot recompute index{0} -- not yet\ - part of the model!'.format(ind_L_max)) - Sigma = np.atleast_2d(Sigma) - mu = np.atleast_2d(mu) - gamma_i_new = gamma_potential[ind_L_max] - gamma_i_old = gamma[ind_L_max] - # update gamma - gamma[ind_L_max] = gamma_potential[ind_L_max] - - # index of regressor in Sigma - local_ind = ind_global_to_local[ind_L_max]-1 - - kappa_i = (1.0/gamma_i_new - 1.0/gamma_i_old) - kappa_i = 1.0 / kappa_i - kappa_i += Sigma[local_ind, local_ind] - kappa_i = 1 / kappa_i - Sigma_i_col = Sigma[:, local_ind] - - Sigma = Sigma - kappa_i * (Sigma_i_col * Sigma_i_col.T) - mu_i = mu[local_ind] - mu = mu - (kappa_i * mu_i) * Sigma_i_col[:, None] - - tmp1 = beta * np.dot( - Sigma_i_col.reshape(1, -1), PsiTPsi[active_indices])[0] - S = S + kappa_i * np.square(tmp1) - Q = Q + (kappa_i * mu_i) * tmp1 - - # no change in active_indices or ind_global_to_local - bcs_path.append(ind_L_max + 0.1) - - elif what_changed == -1: - gamma[ind_L_max] = 0 - - # index of regressor in Sigma - local_ind = ind_global_to_local[ind_L_max]-1 - - Sigma_ii_inv = 1. / Sigma[local_ind, local_ind] - Sigma_i_col = Sigma[:, local_ind] - - Sigma = Sigma - Sigma_ii_inv * (Sigma_i_col * Sigma_i_col.T) - - Sigma = np.delete( - np.delete(Sigma, local_ind, axis=0), local_ind, axis=1) - - mu = mu - (mu[local_ind] * Sigma_ii_inv) * Sigma_i_col[:, None] - mu = np.delete(mu, local_ind, axis=0) - - tmp1 = beta * np.dot(Sigma_i_col, PsiTPsi[active_indices]) - S = S + Sigma_ii_inv * np.square(tmp1) - Q = Q + (mu_i * Sigma_ii_inv) * tmp1 - - num_active -= 1 - ind_global_to_local[ind_L_max] = 0.0 - v = ind_global_to_local[ind_global_to_local > local_ind] - 1 - ind_global_to_local[ind_global_to_local > local_ind] = v - del active_indices[local_ind] - deleted_indices.append(ind_L_max) - # and therefore ineligible - bcs_path.append(-ind_L_max) - - # same for all three cases - tmp3 = 1 - np.multiply(gamma, S) - s = np.divide(S, tmp3) - q = np.divide(Q, tmp3) - - # Update lambda - Lambda = 2*(num_active - 1) / np.sum(gamma) - - # Prepare the result object - self.coef_ = np.zeros(P) - self.coef_[active_indices] = np.squeeze(mu) - self.sigma_ = Sigma - self.active_ = active_indices - self.gamma = gamma - self.Lambda = Lambda - self.beta = beta - self.bcs_path = bcs_path - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self, X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance based on - Ref.[1] Section 3.3.2. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - - References - ---------- - [1] Bishop, C. M. (2006). Pattern recognition and machine learning. - springer. - ''' - y_hat = np.dot(X, self.coef_) + self.intercept_ - - if return_std: - # Handle the zero variance case - if self.var_y: - return y_hat, np.zeros_like(y_hat) - - var_hat = 1./self.beta - var_hat += np.sum(X.dot(self.sigma_) * X, axis=1) - std_hat = np.sqrt(var_hat) - return y_hat, std_hat - else: - return y_hat - -# l2norm = 0.0 -# for idx in range(10): -# sigma2 = np.genfromtxt('./test/sigma2_{0}.csv'.format(idx+1), delimiter=',') -# Psi_train = np.genfromtxt('./test/Psi_train_{0}.csv'.format(idx+1), delimiter=',') -# Y_train = np.genfromtxt('./test/Y_train_{0}.csv'.format(idx+1)) -# Psi_test = np.genfromtxt('./test/Psi_test_{0}.csv'.format(idx+1), delimiter=',') -# Y_test = np.genfromtxt('./test/Y_test_{0}.csv'.format(idx+1)) - -# clf = RegressionFastLaplace(verbose=True) -# clf.fit_(Psi_train, Y_train, sigma2) -# coeffs_fold = np.genfromtxt('./test/coeffs_fold_{0}.csv'.format(idx+1)) -# print("coeffs error: {0:.4g}".format(np.linalg.norm(clf.coef_ - coeffs_fold))) -# l2norm += np.linalg.norm(Y_test - clf.predict(Psi_test))**2/len(Y_test) -# print("l2norm error: {0:.4g}".format(l2norm)) diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/sequential_design.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/sequential_design.py deleted file mode 100644 index e1feb7317..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/sequential_design.py +++ /dev/null @@ -1,2187 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jan 28 09:21:18 2022 - -@author: farid -""" -import numpy as np -from scipy import stats, signal, linalg, sparse -from scipy.spatial import distance -from copy import deepcopy, copy -from tqdm import tqdm -import scipy.optimize as opt -from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import os -import gc -import seaborn as sns -from joblib import Parallel, delayed -#import resource -from .exploration import Exploration - - -class SeqDesign(): - """ Sequential experimental design - This class provieds method for trainig the meta-model in an iterative - manners. - The main method to execute the task is `train_seq_design`, which - recieves a model object and returns the trained metamodel. - """ - - # ------------------------------------------------------------------------- - def train_seq_design(self, MetaModel): - """ - Starts the adaptive sequential design for refining the surrogate model - by selecting training points in a sequential manner. - - Parameters - ---------- - Model : object - An object containing all model specifications. - - Returns - ------- - MetaModel : object - Meta model object. - - """ - # MetaModel = self - Model = MetaModel.ModelObj - self.MetaModel = MetaModel - self.Model = Model - - # Initialization - MetaModel.SeqModifiedLOO = {} - MetaModel.seqValidError = {} - MetaModel.SeqBME = {} - MetaModel.SeqKLD = {} - MetaModel.SeqDistHellinger = {} - MetaModel.seqRMSEMean = {} - MetaModel.seqRMSEStd = {} - MetaModel.seqMinDist = [] - pce = True if MetaModel.meta_model_type.lower() != 'gpe' else False - mc_ref = True if bool(Model.mc_reference) else False - if mc_ref: - Model.read_mc_reference() - - if not hasattr(MetaModel, 'valid_likelihoods'): - MetaModel.valid_samples = [] - MetaModel.valid_model_runs = [] - MetaModel.valid_likelihoods = [] - - # Get the parameters - max_n_samples = MetaModel.ExpDesign.n_max_samples - mod_LOO_threshold = MetaModel.ExpDesign.mod_LOO_threshold - n_canddidate = MetaModel.ExpDesign.n_canddidate - post_snapshot = MetaModel.ExpDesign.post_snapshot - n_replication = MetaModel.ExpDesign.n_replication - util_func = MetaModel.ExpDesign.util_func - output_name = Model.Output.names - validError = None - # Handle if only one UtilityFunctions is provided - if not isinstance(util_func, list): - util_func = [MetaModel.ExpDesign.util_func] - - # Read observations or MCReference - if len(Model.observations) != 0 or Model.meas_file is not None: - self.observations = Model.read_observation() - obs_data = self.observations - else: - obs_data = [] - TotalSigma2 = {} - # ---------- Initial MetaModel ---------- - initMetaModel = deepcopy(MetaModel) - - # Validation error if validation set is provided. - if len(MetaModel.valid_model_runs) != 0: - init_rmse, init_valid_error = self.__validError(initMetaModel) - init_valid_error = list(init_valid_error.values()) - else: - init_rmse = None - - # Check if discrepancy is provided - if len(obs_data) != 0 and hasattr(MetaModel, 'Discrepancy'): - TotalSigma2 = MetaModel.Discrepancy.parameters - - # Calculate the initial BME - out = self.__BME_Calculator( - initMetaModel, obs_data, TotalSigma2, init_rmse) - init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out - print(f"\nInitial BME: {init_BME:.2f}") - print(f"Initial KLD: {init_KLD:.2f}") - - # Posterior snapshot (initial) - if post_snapshot: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') - - # Check the convergence of the Mean & Std - if mc_ref and pce: - init_rmse_mean, init_rmse_std = self.__error_Mean_Std() - print(f"Initial Mean and Std error: {init_rmse_mean}," - f" {init_rmse_std}") - - # Read the initial experimental design - Xinit = initMetaModel.ExpDesign.X - init_n_samples = len(MetaModel.ExpDesign.X) - initYprev = initMetaModel.ModelOutputDict - initLCerror = initMetaModel.LCerror - n_itrs = max_n_samples - init_n_samples - - # Read the initial ModifiedLOO - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = initMetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - initMetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - - Scores = [item for sublist in Scores_all for item in sublist] - weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], - weights=weights)] - - prevMetaModel_dict = {} - # Replicate the sequential design - for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - for util_f in util_func: - print(f'\n>>>> Utility Function: {util_f} <<<<') - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - # Set the experimental design - Xprev = Xinit - total_n_samples = init_n_samples - Yprev = initYprev - - Xfull = [] - Yfull = [] - - # Store the initial ModifiedLOO - if pce: - print("\nInitial ModifiedLOO:", init_mod_LOO) - SeqModifiedLOO = np.array(init_mod_LOO) - - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.array(init_valid_error) - - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.array([init_BME]) - SeqKLD = np.array([init_KLD]) - SeqDistHellinger = np.array([init_dist_hellinger]) - - if mc_ref and pce: - seqRMSEMean = np.array([init_rmse_mean]) - seqRMSEStd = np.array([init_rmse_std]) - - # ------- Start Sequential Experimental Design ------- - postcnt = 1 - for itr_no in range(1, n_itrs+1): - print(f'\n>>>> Iteration number {itr_no} <<<<') - - # Save the metamodel prediction before updating - prevMetaModel_dict[itr_no] = deepcopy(MetaModel) - if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] - self._y_hat_prev, _ = pc_model.eval_metamodel( - samples=Xfull[-1].reshape(1, -1)) - - # Optimal Bayesian Design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.opt_SeqDesign(TotalSigma2, - n_canddidate, - util_f) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - MetaModel.seqMinDist.append(S) - print(f"\nmin Dist from OldExpDesign: {S:2f}") - print("\n") - - # Evaluate the full model response at the new sample - Ynew, _ = Model.run_model_parallel( - Xnew, prevRun_No=total_n_samples - ) - total_n_samples += Xnew.shape[0] - # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(MetaModel, 'adapt_verbose') and \ - MetaModel.adapt_verbose: - from .adaptPlot import adaptPlot - y_hat, std_hat = MetaModel.eval_metamodel(samples=Xnew) - adaptPlot(MetaModel, Ynew, y_hat, std_hat, plotED=False) - - # -------- Retrain the surrogate model ------- - # Extend new experimental design - Xfull = np.vstack((Xprev, Xnew)) - - # Updating experimental design Y - for out_name in output_name: - Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - MetaModel.ModelOutputDict[out_name] = Yfull - - # Pass new design to the metamodel object - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = Xfull - MetaModel.ExpDesign.Y = MetaModel.ModelOutputDict - - # Save the Experimental Design for next iteration - Xprev = Xfull - Yprev = MetaModel.ModelOutputDict - - # Pass the new prior as the input - MetaModel.input_obj.poly_coeffs_flag = False - if updatedPrior is not None: - MetaModel.input_obj.poly_coeffs_flag = True - print("updatedPrior:", updatedPrior.shape) - # Arbitrary polynomial chaos - for i in range(updatedPrior.shape[1]): - MetaModel.input_obj.Marginals[i].dist_type = None - x = updatedPrior[:, i] - MetaModel.input_obj.Marginals[i].raw_data = x - - # Train the surrogate model for new ExpDesign - MetaModel.train_norm_design(parallel=False) - m_3 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # -------- Evaluate the retrained surrogate model ------- - # Extract Modified LOO from Output - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = MetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - MetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, - axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - Scores = [item for sublist in Scores_all for item - in sublist] - weights = [item for sublist in varExpDesignY for item - in sublist] - ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] - - print('\n') - print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) - print('\n') - - # Compute the validation error - if len(MetaModel.valid_model_runs) != 0: - rmse, validError = self.__validError(MetaModel) - ValidError = list(validError.values()) - else: - rmse = None - - # Store updated ModifiedLOO - if pce: - SeqModifiedLOO = np.vstack( - (SeqModifiedLOO, ModifiedLOO)) - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.vstack( - (SeqValidError, ValidError)) - m_4 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - # -------- Caclulation of BME as accuracy metric ------- - # Check if data is provided - if len(obs_data) != 0: - # Calculate the initial BME - out = self.__BME_Calculator(MetaModel, obs_data, - TotalSigma2, rmse) - BME, KLD, Posterior, likes, DistHellinger = out - print('\n') - print(f"Updated BME: {BME:.2f}") - print(f"Updated KLD: {KLD:.2f}") - print('\n') - - # Plot some snapshots of the posterior - step_snapshot = MetaModel.ExpDesign.step_snapshot - if post_snapshot and postcnt % step_snapshot == 0: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') - postcnt += 1 - m_5 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # Check the convergence of the Mean&Std - if mc_ref and pce: - print('\n') - RMSE_Mean, RMSE_std = self.__error_Mean_Std() - print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " - f"{RMSE_std:.2f}") - print('\n') - - # Store the updated BME & KLD - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.vstack((SeqBME, BME)) - SeqKLD = np.vstack((SeqKLD, KLD)) - SeqDistHellinger = np.vstack((SeqDistHellinger, - DistHellinger)) - if mc_ref and pce: - seqRMSEMean = np.vstack((seqRMSEMean, RMSE_Mean)) - seqRMSEStd = np.vstack((seqRMSEStd, RMSE_std)) - - if pce and any(LOO < mod_LOO_threshold - for LOO in ModifiedLOO): - break - - print(f"Memory itr {itr_no}: I: {m_2-m_1:.2f} MB") - print(f"Memory itr {itr_no}: II: {m_3-m_2:.2f} MB") - print(f"Memory itr {itr_no}: III: {m_4-m_3:.2f} MB") - print(f"Memory itr {itr_no}: IV: {m_5-m_4:.2f} MB") - m_6 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"Memory itr {itr_no}: total: {m_6:.2f} MB") - - # Clean up - if len(obs_data) != 0: - del out - gc.collect() - print() - print('-'*50) - print() - - # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' - if pce: - MetaModel.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(MetaModel.valid_model_runs) != 0: - MetaModel.seqValidError[strKey] = SeqValidError - - # Check if data is provided - if len(obs_data) != 0: - MetaModel.SeqBME[strKey] = SeqBME - MetaModel.SeqKLD[strKey] = SeqKLD - if len(MetaModel.valid_likelihoods) != 0: - MetaModel.SeqDistHellinger[strKey] = SeqDistHellinger - if mc_ref and pce: - MetaModel.seqRMSEMean[strKey] = seqRMSEMean - MetaModel.seqRMSEStd[strKey] = seqRMSEStd - - return MetaModel - - # ------------------------------------------------------------------------- - def util_VarBasedDesign(self, X_can, index, util_func='Entropy'): - """ - Computes the exploitation scores based on: - active learning MacKay(ALM) and active learning Cohn (ALC) - Paper: Sequential Design with Mutual Information for Computer - Experiments (MICE): Emulation of a Tsunami Model by Beck and Guillas - (2016) - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - index : int - Model output index. - UtilMethod : string, optional - Exploitation utility function. The default is 'Entropy'. - - Returns - ------- - float - Score. - - """ - MetaModel = self.MetaModel - ED_X = MetaModel.ExpDesign.X - out_dict_y = MetaModel.ExpDesign.Y - out_names = MetaModel.ModelObj.Output.names - - # Run the Metamodel for the candidate - X_can = X_can.reshape(1, -1) - Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) - - if util_func.lower() == 'alm': - # ----- Entropy/MMSE/active learning MacKay(ALM) ----- - # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - varPCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - varPCE[KeyIdx] = np.max(canPredVar[key], axis=1) - score = np.max(varPCE, axis=0) - - elif util_func.lower() == 'eigf': - # ----- Expected Improvement for Global fit ----- - # Find closest EDX to the candidate - distances = distance.cdist(ED_X, X_can, 'euclidean') - index = np.argmin(distances) - - # Compute perdiction error and variance of the old model - predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - # Compute perdiction error and variance of the old model - # Eq (5) from Liu et al.(2018) - EIGF_PCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - residual = predError[key] - out_dict_y[key][int(index)] - var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) - score = np.max(EIGF_PCE, axis=0) - - return -1 * score # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianActiveDesign(self, X_can, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian active design criterion (var). - - It is based on the following paper: - Oladyshkin, Sergey, Farid Mohammadi, Ilja Kroeker, and Wolfgang Nowak. - "Bayesian3 active learning for the gaussian process emulator using - information theory." Entropy 22, no. 8 (2020): 890. - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - BAL design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # Evaluate the PCE metamodels at that location ??? - Y_mean_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Get the data - obs_data = self.observations - n_obs = self.Model.n_obs - # TODO: Analytical DKL - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - - # priorMean, priorSigma2, Obs = np.empty((0)),np.empty((0)),np.empty((0)) - - # for key in list(Y_mean_can): - # # concatenate the measurement error - # Obs = np.hstack((Obs,ObservationData[key])) - - # # concatenate the mean and variance of prior predictive - # means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # priorMean = np.hstack((priorSigma2,means)) - # priorSigma2 = np.hstack((priorSigma2,stds**2)) - - # # Covariance Matrix of prior - # covPrior = np.zeros((priorSigma2.shape[0], priorSigma2.shape[0]), float) - # np.fill_diagonal(covPrior, priorSigma2) - - # # Covariance Matrix of Likelihood - # covLikelihood = np.zeros((sigma2Dict.shape[0], sigma2Dict.shape[0]), float) - # np.fill_diagonal(covLikelihood, sigma2Dict) - - # # Calculate moments of the posterior (Analytical derivation) - # n = priorSigma2.shape[0] - # covPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))),covLikelihood/n) - - # meanPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))) , Obs) + \ - # np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))), - # priorMean/n) - # # Compute DKL from prior to posterior - # term1 = np.trace(np.dot(np.linalg.inv(covPrior),covPost)) - # deltaMean = priorMean-meanPost - # term2 = np.dot(np.dot(deltaMean,np.linalg.inv(covPrior)),deltaMean[:,None]) - # term3 = np.log(np.linalg.det(covPrior)/np.linalg.det(covPost)) - # DKL = 0.5 * (term1 + term2 - n + term3)[0] - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = 20000 - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((MCsize)) - for key in list(Y_mean_can): - means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # cov = np.zeros((means.shape[0], means.shape[0]), float) - # np.fill_diagonal(cov, stds**2) - - Y_MC[key] = np.zeros((MCsize, n_obs)) - logsamples = np.zeros((MCsize, n_obs)) - for i in range(n_obs): - NormalDensity = stats.norm(means[i], stds[i]) - Y_MC[key][:, i] = NormalDensity.rvs(MCsize) - logsamples[:, i] = NormalDensity.logpdf(Y_MC[key][:, i]) - - logPriorLikelihoods = np.sum(logsamples, axis=1) - std_MC[key] = np.zeros((MCsize, means.shape[0])) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf(Y_MC, std_MC, obs_data, sigma2Dict) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.nansum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - # Utility function Eq.2 in Ref. (2) - # Posterior covariance matrix after observing data y - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # TODO: Calculate the correction factor for BME - # BMECorrFactor = self.BME_Corr_Weight(PCE_SparseBayes_can, - # ObservationData, sigma2Dict) - # BME += BMECorrFactor - # Haun et al implementation - # U_J_d = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - U_J_d = postExpLikelihoods - logBME - - # Marginal log likelihood - elif var == 'BME': - U_J_d = logBME - - # Entropy-based information gain - elif var == 'infEntropy': - logBME = np.log(np.nanmean(likelihoods)) - infEntropy = logBME - postExpPrior - postExpLikelihoods - U_J_d = infEntropy * -1 # -1 for minimization - - # Bayesian information criterion - elif var == 'BIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxL = np.nanmax(likelihoods) - U_J_d = -2 * np.log(maxL) + np.log(n_obs) * nModelParams - - # Akaike information criterion - elif var == 'AIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxlogL = np.log(np.nanmax(likelihoods)) - AIC = -2 * maxlogL + 2 * nModelParams - # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) - penTerm = 0 - U_J_d = 1*(AIC + penTerm) - - # Deviance information criterion - elif var == 'DIC': - # D_theta_bar = np.mean(-2 * Likelihoods) - N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self.__normpdf( - Y_mean_can, Y_std_can, obs_data, sigma2Dict - ) - DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p - - U_J_d = DIC - - else: - print('The algorithm you requested has not been implemented yet!') - - # Handle inf and NaN (replace by zero) - if np.isnan(U_J_d) or U_J_d == -np.inf or U_J_d == np.inf: - U_J_d = 0.0 - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def update_metamodel(self, MetaModel, output, y_hat_can, univ_p_val, index, - new_pca=False): - BasisIndices = MetaModel.basis_dict[output]["y_"+str(index+1)] - clf_poly = MetaModel.clf_poly[output]["y_"+str(index+1)] - Mn = clf_poly.coef_ - Sn = clf_poly.sigma_ - beta = clf_poly.alpha_ - active = clf_poly.active_ - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - Sn_new_inv = np.linalg.inv(Sn) - Sn_new_inv += beta * np.dot(Psi[:, active].T, Psi[:, active]) - Sn_new = np.linalg.inv(Sn_new_inv) - - Mn_new = np.dot(Sn_new_inv, Mn[active]).reshape(-1, 1) - Mn_new += beta * np.dot(Psi[:, active].T, y_hat_can) - Mn_new = np.dot(Sn_new, Mn_new).flatten() - - # Compute the old and new moments of PCEs - mean_old = Mn[0] - mean_new = Mn_new[0] - std_old = np.sqrt(np.sum(np.square(Mn[1:]))) - std_new = np.sqrt(np.sum(np.square(Mn_new[1:]))) - - # Back transformation if PCA is selected. - if MetaModel.dim_red_method.lower() == 'pca': - old_pca = MetaModel.pca[output] - mean_old = old_pca.mean_[index] - mean_old += np.sum(mean_old * old_pca.components_[:, index]) - std_old = np.sqrt(np.sum(std_old**2 * - old_pca.components_[:, index]**2)) - mean_new = new_pca.mean_[index] - mean_new += np.sum(mean_new * new_pca.components_[:, index]) - std_new = np.sqrt(np.sum(std_new**2 * - new_pca.components_[:, index]**2)) - # print(f"mean_old: {mean_old:.2f} mean_new: {mean_new:.2f}") - # print(f"std_old: {std_old:.2f} std_new: {std_new:.2f}") - # Store the old and new moments of PCEs - results = { - 'mean_old': mean_old, - 'mean_new': mean_new, - 'std_old': std_old, - 'std_new': std_new - } - return results - - # ------------------------------------------------------------------------- - def util_BayesianDesign_old(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - old_EDY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels using the candidate design - Y_PC_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Generate y from posterior predictive - m_size = 100 - y_hat_samples = {} - for idx, key in enumerate(Model.Output.names): - means, stds = Y_PC_can[key][0], Y_std_can[key][0] - y_hat_samples[key] = np.random.multivariate_normal( - means, np.diag(stds), m_size) - - # Create the SparseBayes-based PCE metamodel: - MetaModel.input_obj.poly_coeffs_flag = False - univ_p_val = self.MetaModel.univ_basis_vals(X_can) - G_n_m_all = np.zeros((m_size, len(Model.Output.names), Model.n_obs)) - - for i in range(m_size): - for idx, key in enumerate(Model.Output.names): - if MetaModel.dim_red_method.lower() == 'pca': - # Equal number of components - new_outputs = np.vstack( - (old_EDY[key], y_hat_samples[key][i]) - ) - new_pca, _ = MetaModel.pca_transformation(new_outputs) - target = new_pca.transform( - y_hat_samples[key][i].reshape(1, -1) - )[0] - else: - new_pca, target = False, y_hat_samples[key][i] - - for j in range(len(target)): - - # Update surrogate - result = self.update_metamodel( - MetaModel, key, target[j], univ_p_val, j, new_pca) - - # Compute Expected Information Gain (Eq. 39) - G_n_m = np.log(result['std_old']/result['std_new']) - 1./2 - G_n_m += result['std_new']**2 / (2*result['std_old']**2) - G_n_m += (result['mean_new'] - result['mean_old'])**2 /\ - (2*result['std_old']**2) - - G_n_m_all[i, idx, j] = G_n_m - - U_J_d = G_n_m_all.mean(axis=(1, 2)).mean() - return -1 * U_J_d - - # ------------------------------------------------------------------------- - def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - out_names = MetaModel.ModelObj.Output.names - if X_can.ndim == 1: - X_can = X_can.reshape(1, -1) - - # Compute the mean and std based on the MetaModel - # pce_means, pce_stds = self._compute_pce_moments(MetaModel) - if var == 'ALC': - Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - oldExpDesignY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels at that location ??? - Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) - - # Add all suggestion as new ExpDesign - NewExpDesignX = np.vstack((oldExpDesignX, X_can)) - - NewExpDesignY = {} - for key in oldExpDesignY.keys(): - try: - NewExpDesignY[key] = np.vstack((oldExpDesignY[key], - Y_PC_can[key])) - except: - NewExpDesignY[key] = oldExpDesignY[key] - - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = NewExpDesignX - MetaModel.ExpDesign.Y = NewExpDesignY - - # Train the model for the observed data using x_can - MetaModel.input_obj.poly_coeffs_flag = False - MetaModel.train_norm_design(parallel=False) - PCE_Model_can = MetaModel - - if var.lower() == 'mi': - # Mutual information based on Krause et al - # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = PCE_Model_can.eval_metamodel(samples=X_can) - std_can = {key: std_PC_can[key] for key in out_names} - - std_old = {key: Y_std_can[key] for key in out_names} - - varPCE = np.zeros((len(out_names))) - for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) - score = np.mean(varPCE) - - return -1 * score - - elif var.lower() == 'alc': - # Active learning based on Gramyc and Lee - # Adaptive design and analysis of supercomputer experiments Techno- - # metrics, 51 (2009), pp. 130–145. - - # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Compute the score - score = [] - for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) - score = np.mean(score) - - return -1 * score - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = X_MC.shape[0] - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Enriching Monte Carlo samples if need be - if ESS != 0: - X_MC = self.MetaModel.ExpDesign.generate_samples( - MCsize, 'random' - ) - - # Evaluate the MetaModel at the given samples - Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf( - Y_MC, std_MC, self.observations, sigma2Dict - ) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - print("--- increasing MC size---") - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # -------------------- Utility functions -------------------- - # Utility function Eq.2 in Ref. (2) - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.float128)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Haun et al implementation - U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) - - # U_J_d = np.sum(G_n_m_all) - # Ryan et al (2014) implementation - # importanceWeights = Likelihoods[Likelihoods!=0]/np.sum(Likelihoods[Likelihoods!=0]) - # U_J_d = np.mean(importanceWeights*np.log(Likelihoods[Likelihoods!=0])) - logBME - - # U_J_d = postExpLikelihoods - logBME - - # Marginal likelihood - elif var == 'BME': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - U_J_d = logBME - - # Bayes risk likelihood - elif var == 'BayesRisk': - - U_J_d = -1 * np.var(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] / np.nansum(likelihoods[accepted]) - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - infEntropy = logBME - postExpPrior - postExpLikelihoods - - U_J_d = infEntropy * -1 # -1 for minimization - - # D-Posterior-precision - elif var == 'DPP': - X_Posterior = X_MC[accepted] - # covariance of the posterior parameters - U_J_d = -np.log(np.linalg.det(np.cov(X_Posterior))) - - # A-Posterior-precision - elif var == 'APP': - X_Posterior = X_MC[accepted] - # trace of the posterior parameters - U_J_d = -np.log(np.trace(np.cov(X_Posterior))) - - else: - print('The algorithm you requested has not been implemented yet!') - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def subdomain(self, Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : TYPE - DESCRIPTION. - - Returns - ------- - Subdomains : TYPE - DESCRIPTION. - - """ - n_params = self.MetaModel.n_params - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains - - # ------------------------------------------------------------------------- - def run_util_func(self, method, candidates, index, sigma2Dict=None, - var=None, X_MC=None): - """ - Runs the utility function based on the given method. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - candidates : array of shape (n_samples, n_params) - All candidate parameter sets. - index : int - ExpDesign index. - sigma2Dict : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - var : string, optional - Utility function. The default is None. - X_MC : TYPE, optional - DESCRIPTION. The default is None. - - Returns - ------- - index : TYPE - DESCRIPTION. - List - Scores. - - """ - - if method.lower() == 'varoptdesign': - # U_J_d = self.util_VarBasedDesign(candidates, index, var) - U_J_d = np.zeros((candidates.shape[0])) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="varoptdesign"): - U_J_d[idx] = self.util_VarBasedDesign(X_can, index, var) - - elif method.lower() == 'bayesactdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianActiveDesign(X_can, sigma2Dict, - var) - elif method.lower() == 'bayesoptdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, - var) - return (index, -1 * U_J_d) - - # ------------------------------------------------------------------------- - def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, - verbose=False): - """ - Exploration algorithim to find the optimum parameter space. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - Bounds : list of tuples - List of lower and upper boundaries of parameters. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - Run_No : int - Run number. - verbose : bool, optional - Print out a summary. The default is False. - - Returns - ------- - Run_No : int - Run number. - array - Optimial candidate. - - """ - - Model = self.Model - max_func_itr = self.MetaModel.ExpDesign.max_func_itr - - if method == 'VarOptDesign': - Res_Global = opt.dual_annealing(self.util_VarBasedDesign, - bounds=Bounds, - args=(Model, var), - maxfun=max_func_itr) - - elif method == 'BayesOptDesign': - Res_Global = opt.dual_annealing(self.util_BayesianDesign, - bounds=Bounds, - args=(Model, sigma2Dict, var), - maxfun=max_func_itr) - - if verbose: - print(f"Global minimum: xmin = {Res_Global.x}, " - f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - - return (Run_No, Res_Global.x) - - # ------------------------------------------------------------------------- - def tradoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): - """ - Calculates weights for exploration scores based on the requested - scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. - - `None`: No exploration. - `equal`: Same weights for exploration and exploitation scores. - `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay - function - `adaptive`: An adaptive method based on: - Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling - approach for Kriging metamodeling by maximizing expected prediction - error." Computers & Chemical Engineering 106 (2017): 171-182. - - Parameters - ---------- - tradeoff_scheme : string - Trade-off scheme for exloration and exploitation scores. - old_EDX : array (n_samples, n_params) - Old experimental design (training points). - old_EDY : dict - Old model responses (targets). - - Returns - ------- - exploration_weight : float - Exploration weight. - exploitation_weight: float - Exploitation weight. - - """ - if tradeoff_scheme is None: - exploration_weight = 0 - - elif tradeoff_scheme == 'equal': - exploration_weight = 0.5 - - elif tradeoff_scheme == 'epsilon-decreasing': - # epsilon-decreasing scheme - # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, - 0, tau2, False)[itrNumber] - - elif tradeoff_scheme == 'adaptive': - - # Extract itrNumber - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - if itrNumber == 0: - exploration_weight = 0.5 - else: - # New adaptive trade-off according to Liu et al. (2017) - # Mean squared error for last design point - last_EDX = old_EDX[-1].reshape(1, -1) - lastPCEY, _ = self.MetaModel.eval_metamodel(samples=last_EDX) - pce_y = np.array(list(lastPCEY.values()))[:, 0] - y = np.array(list(old_EDY.values()))[:, -1, :] - mseError = mean_squared_error(pce_y, y) - - # Mean squared CV - error for last design point - pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] - mseCVError = mean_squared_error(pce_y_prev, y) - - exploration_weight = min([0.5*mseError/mseCVError, 1]) - - # Exploitation weight - exploitation_weight = 1 - exploration_weight - - return exploration_weight, exploitation_weight - - # ------------------------------------------------------------------------- - def opt_SeqDesign(self, sigma2, n_candidates=5, var='DKL'): - """ - Runs optimal sequential design. - - Parameters - ---------- - sigma2 : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - n_candidates : int, optional - Number of candidate samples. The default is 5. - var : string, optional - Utility function. The default is None. - - Raises - ------ - NameError - Wrong utility function. - - Returns - ------- - Xnew : array (n_samples, n_params) - Selected new training point(s). - """ - - # Initialization - MetaModel = self.MetaModel - Bounds = MetaModel.bound_tuples - n_new_samples = MetaModel.ExpDesign.n_new_samples - explore_method = MetaModel.ExpDesign.explore_method - exploit_method = MetaModel.ExpDesign.exploit_method - n_cand_groups = MetaModel.ExpDesign.n_cand_groups - tradeoff_scheme = MetaModel.ExpDesign.tradeoff_scheme - - old_EDX = MetaModel.ExpDesign.X - old_EDY = MetaModel.ExpDesign.Y.copy() - ndim = MetaModel.ExpDesign.X.shape[1] - OutputNames = MetaModel.ModelObj.Output.names - - # ----------------------------------------- - # ----------- CUSTOMIZED METHODS ---------- - # ----------------------------------------- - # Utility function exploit_method provided by user - if exploit_method.lower() == 'user': - - Xnew, filteredSamples = MetaModel.ExpDesign.ExploitFunction(self) - - print("\n") - print("\nXnew:\n", Xnew) - - return Xnew, filteredSamples - - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- - if explore_method == 'dual annealing': - # ------- EXPLORATION: OPTIMIZATION ------- - import time - start_time = time.time() - - # Divide the domain to subdomains - args = [] - subdomains = self.subdomain(Bounds, n_new_samples) - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() - - # Close the pool - pool.close() - - Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - - print("\nXnew:\n", Xnew) - - elapsed_time = time.time() - start_time - print("\n") - print(f"Elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) - - elif explore_method == 'LOOCV': - # ----------------------------------------------------------------- - # TODO: LOOCV model construnction based on Feng et al. (2020) - # 'LOOCV': - # Initilize the ExploitScore array - - # Generate random samples - allCandidates = MetaModel.ExpDesign.generate_samples(n_candidates, - 'random') - - # Construct error model based on LCerror - errorModel = MetaModel.create_ModelError(old_EDX, self.LCerror) - self.errorModel.append(copy(errorModel)) - - # Evaluate the error models for allCandidates - eLCAllCands, _ = errorModel.eval_errormodel(allCandidates) - # Select the maximum as the representative error - eLCAllCands = np.dstack(eLCAllCands.values()) - eLCAllCandidates = np.max(eLCAllCands, axis=1)[:, 0] - - # Normalize the error w.r.t the maximum error - scoreExploration = eLCAllCandidates / np.sum(eLCAllCandidates) - - else: - # ------- EXPLORATION: SPACE-FILLING DESIGN ------- - # Generate candidate samples from Exploration class - explore = Exploration(MetaModel, n_candidates) - explore.w = 100 # * ndim #500 - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - allCandidates, scoreExploration = explore.get_exploration_samples() - - # Temp: ---- Plot all candidates ----- - if ndim == 2: - def plotter(points, allCandidates, Method, - scoreExploration=None): - if Method == 'Voronoi': - from scipy.spatial import Voronoi, voronoi_plot_2d - vor = Voronoi(points) - fig = voronoi_plot_2d(vor) - ax1 = fig.axes[0] - else: - fig = plt.figure() - ax1 = fig.add_subplot(111) - ax1.scatter(points[:, 0], points[:, 1], s=10, c='r', - marker="s", label='Old Design Points') - ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, - c='b', marker="o", label='Design candidates') - for i in range(points.shape[0]): - txt = 'p'+str(i+1) - ax1.annotate(txt, (points[i, 0], points[i, 1])) - if scoreExploration is not None: - for i in range(allCandidates.shape[0]): - txt = str(round(scoreExploration[i], 5)) - ax1.annotate(txt, (allCandidates[i, 0], - allCandidates[i, 1])) - - plt.xlim(self.bound_tuples[0]) - plt.ylim(self.bound_tuples[1]) - # plt.show() - plt.legend(loc='upper left') - - # ----------------------------------------- - # --------- EXPLOITATION METHODS ---------- - # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\n Exploration weight={explore_w:0.3f} " - f"Exploitation weight={exploit_w:0.3f}\n") - - # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- - if explore_w != 1.0: - - # Create a sample pool for rejection sampling - MCsize = 15000 - X_MC = MetaModel.ExpDesign.generate_samples(MCsize, 'random') - candidates = MetaModel.ExpDesign.generate_samples( - MetaModel.ExpDesign.max_func_itr, 'latin_hypercube') - - # Split the candidates in groups for multiprocessing - split_cand = np.array_split( - candidates, n_cand_groups, axis=0 - ) - - results = Parallel(n_jobs=-1, backend='threading')( - delayed(self.run_util_func)( - exploit_method, split_cand[i], i, sigma2, var, X_MC) - for i in range(n_cand_groups)) - # out = map(self.run_util_func, - # [exploit_method]*n_cand_groups, - # split_cand, - # range(n_cand_groups), - # [sigma2] * n_cand_groups, - # [var] * n_cand_groups, - # [X_MC] * n_cand_groups - # ) - # results = list(out) - - # Retrieve the results and append them - U_J_d = np.concatenate([results[NofE][1] for NofE in - range(n_cand_groups)]) - - # Check if all scores are inf - if np.isinf(U_J_d).all() or np.isnan(U_J_d).all(): - U_J_d = np.ones(len(U_J_d)) - - # Get the expected value (mean) of the Utility score - # for each cell - if explore_method == 'Voronoi': - U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - - # create surrogate model for U_J_d - from sklearn.preprocessing import MinMaxScaler - # Take care of inf entries - good_indices = [i for i, arr in enumerate(U_J_d) - if np.isfinite(arr).all()] - scaler = MinMaxScaler() - X_S = scaler.fit_transform(candidates[good_indices]) - gp = MetaModel.gaussian_process_emulator( - X_S, U_J_d[good_indices], autoSelect=True - ) - U_J_d = gp.predict(scaler.transform(allCandidates)) - - # Normalize U_J_d - norm_U_J_d = U_J_d / np.sum(U_J_d) - print("norm_U_J_d:\n", norm_U_J_d) - else: - norm_U_J_d = np.zeros((len(scoreExploration))) - - # ------- Calculate Total score ------- - # ------- Trade off between EXPLORATION & EXPLOITATION ------- - # Total score - totalScore = exploit_w * norm_U_J_d - totalScore += explore_w * scoreExploration - - # temp: Plot - # dim = self.ExpDesign.X.shape[1] - # if dim == 2: - # plotter(self.ExpDesign.X, allCandidates, explore_method) - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - # select the requested number of samples - if explore_method == 'Voronoi': - Xnew = np.zeros((n_new_samples, ndim)) - for i, idx in enumerate(bestIdx): - X_can = explore.closestPoints[idx] - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - elif exploit_method == 'VarOptDesign': - # ------- EXPLOITATION: VarOptDesign ------- - UtilMethod = var - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\nweightExploration={explore_w:0.3f} " - f"weightExploitation={exploit_w:0.3f}") - - # Generate candidate samples from Exploration class - nMeasurement = old_EDY[OutputNames[0]].shape[1] - - # Find sensitive region - if UtilMethod == 'LOOCV': - LCerror = MetaModel.LCerror - allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), - nMeasurement)) - for y_idx, y_key in enumerate(OutputNames): - for idx, key in enumerate(LCerror[y_key].keys()): - allModifiedLOO[:, y_idx, idx] = abs( - LCerror[y_key][key]) - - ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) - - elif UtilMethod in ['EIGF', 'ALM']: - # ----- All other in ['EIGF', 'ALM'] ----- - # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) - - # Split the candidates in groups for multiprocessing - if explore_method != 'Voronoi': - split_cand = np.array_split(allCandidates, - n_cand_groups, - axis=0) - goodSampleIdx = range(n_cand_groups) - else: - # Find indices of the Vornoi cells with samples - goodSampleIdx = [] - for idx in range(len(explore.closest_points)): - if len(explore.closest_points[idx]) != 0: - goodSampleIdx.append(idx) - split_cand = explore.closest_points - - # Split the candidates in groups for multiprocessing - args = [] - for index in goodSampleIdx: - args.append((exploit_method, split_cand[index], index, - sigma2, var)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.run_util_func, args).get() - - # Close the pool - pool.close() - # out = map(self.run_util_func, - # [exploit_method]*len(goodSampleIdx), - # split_cand, - # range(len(goodSampleIdx)), - # [sigma2] * len(goodSampleIdx), - # [var] * len(goodSampleIdx) - # ) - # results = list(out) - - # Retrieve the results and append them - if explore_method == 'Voronoi': - ExploitScore = [np.mean(results[k][1]) for k in - range(len(goodSampleIdx))] - else: - ExploitScore = np.concatenate( - [results[k][1] for k in range(len(goodSampleIdx))]) - - else: - raise NameError('The requested utility function is not ' - 'available.') - - # print("ExploitScore:\n", ExploitScore) - - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - # Total score - # Normalize U_J_d - ExploitScore = ExploitScore / np.sum(ExploitScore) - totalScore = exploit_w * ExploitScore - totalScore += explore_w * scoreExploration - - temp = totalScore.copy() - sorted_idxtotalScore = np.argsort(temp, axis=0)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - Xnew = np.zeros((n_new_samples, ndim)) - if explore_method != 'Voronoi': - Xnew = allCandidates[bestIdx] - else: - for i, idx in enumerate(bestIdx.flatten()): - X_can = explore.closest_points[idx] - # plotter(self.ExpDesign.X, X_can, explore_method, - # scoreExploration=None) - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - - elif exploit_method == 'alphabetic': - # ------- EXPLOITATION: ALPHABETIC ------- - Xnew = self.util_AlphOptDesign(allCandidates, var) - - elif exploit_method == 'Space-filling': - # ------- EXPLOITATION: SPACE-FILLING ------- - totalScore = scoreExploration - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - - # select the requested number of samples - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - else: - raise NameError('The requested design method is not available.') - - print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) - print("Xnew:\n", Xnew) - gc.collect() - - return Xnew, None - - # ------------------------------------------------------------------------- - def util_AlphOptDesign(self, candidates, var='D-Opt'): - """ - Enriches the Experimental design with the requested alphabetic - criterion based on exploring the space with number of sampling points. - - Ref: Hadigol, M., & Doostan, A. (2018). Least squares polynomial chaos - expansion: A review of sampling strategies., Computer Methods in - Applied Mechanics and Engineering, 332, 382-407. - - Arguments - --------- - NCandidate : int - Number of candidate points to be searched - - var : string - Alphabetic optimality criterion - - Returns - ------- - X_new : array of shape (1, n_params) - The new sampling location in the input space. - """ - MetaModelOrig = self - Model = self.Model - n_new_samples = MetaModelOrig.ExpDesign.n_new_samples - NCandidate = candidates.shape[0] - - # TODO: Loop over outputs - OutputName = Model.Output.names[0] - - # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - - # TODO: Only one psi can be selected. - # Suggestion: Go for the one with the highest LOO error - Scores = list(MetaModel.score_dict[OutputName].values()) - ModifiedLOO = [1-score for score in Scores] - outIdx = np.argmax(ModifiedLOO) - - # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) - - BasisIndices = MetaModelOrig.basis_dict[OutputName]["y_"+str(outIdx+1)] - P = len(BasisIndices) - - # ------ Old Psi ------------ - univ_p_val = MetaModelOrig.univ_basis_vals(oldExpDesignX) - Psi = MetaModelOrig.create_psi(BasisIndices, univ_p_val) - - # ------ New candidates (Psi_c) ------------ - # Assemble Psi_c - univ_p_val_c = self.univ_basis_vals(candidates) - Psi_c = self.create_psi(BasisIndices, univ_p_val_c) - - for idx in range(NCandidate): - - # Include the new row to the original Psi - Psi_cand = np.vstack((Psi, Psi_c[idx])) - - # Information matrix - PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) - - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: - # faster - invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - invM = np.linalg.pinv(M) - - # ---------- Calculate optimality criterion ---------- - # Optimality criteria according to Section 4.5.1 in Ref. - - # D-Opt - if var == 'D-Opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) - - # A-Opt - elif var == 'A-Opt': - Phi[idx] = np.trace(invM) - - # K-Opt - elif var == 'K-Opt': - Phi[idx] = np.linalg.cond(M) - - else: - raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') - - # find an optimal point subset to add to the initial design - # by minimization of the Phi - sorted_idxtotalScore = np.argsort(Phi) - - # select the requested number of samples - Xnew = candidates[sorted_idxtotalScore[:n_new_samples]] - - return Xnew - - # ------------------------------------------------------------------------- - def __normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): - - Model = self.Model - likelihoods = 1.0 - - # Loop over the outputs - for idx, out in enumerate(Model.Output.names): - - # (Meta)Model Output - nsamples, nout = y_hat_pce[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout].values - - # Surrogate error if valid dataset is given. - if rmse is not None: - tot_sigma2s += rmse[out]**2 - - likelihoods *= stats.multivariate_normal.pdf( - y_hat_pce[out], data, np.diag(tot_sigma2s), - allow_singular=True) - self.Likelihoods = likelihoods - - return likelihoods - - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = MetaModel.ExpDesign.X # valid_samples - model_outputs = MetaModel.ExpDesign.Y # valid_model_runs - Model = MetaModel.ModelObj - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names - - # TODO: Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) - covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) - - # Compute likelilhood output vs data - logLik_data[i] += self.__logpdf( - y_m_hat, data, covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += self.__logpdf(y_m_hat, y_m, covMatrix) - - # Weight - logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) - - return np.log(np.mean(weights)) - - # ------------------------------------------------------------------------- - def __logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - - # ------------------------------------------------------------------------- - def __posteriorPlot(self, posterior, par_names, key): - - # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') - os.makedirs(newpath, exist_ok=True) - - bound_tuples = self.MetaModel.bound_tuples - n_params = len(par_names) - font_size = 40 - if n_params == 2: - - figPosterior, ax = plt.subplots(figsize=(15, 15)) - - sns.kdeplot(x=posterior[:, 0], y=posterior[:, 1], - fill=True, ax=ax, cmap=plt.cm.jet, - clip=bound_tuples) - # Axis labels - plt.xlabel(par_names[0], fontsize=font_size) - plt.ylabel(par_names[1], fontsize=font_size) - - # Set axis limit - plt.xlim(bound_tuples[0]) - plt.ylim(bound_tuples[1]) - - # Increase font size - plt.xticks(fontsize=font_size) - plt.yticks(fontsize=font_size) - - # Switch off the grids - plt.grid(False) - - else: - import corner - figPosterior = corner.corner(posterior, labels=par_names, - title_fmt='.2e', show_titles=True, - title_kwargs={"fontsize": 12}) - - figPosterior.savefig(f'./{newpath}/{key}.pdf', bbox_inches='tight') - plt.close() - - # Save the posterior as .npy - np.save(f'./{newpath}/{key}.npy', posterior) - - return figPosterior - - # ------------------------------------------------------------------------- - def __hellinger_distance(self, P, Q): - """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) - - Parameters - ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. - - Returns - ------- - float - Hellinger distance of two distributions. - - """ - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - # ------------------------------------------------------------------------- - def __BME_Calculator(self, MetaModel, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - - """ - # Initializations - valid_likelihoods = MetaModel.valid_likelihoods - - post_snapshot = MetaModel.ExpDesign.post_snapshot - if post_snapshot or len(valid_likelihoods) != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') - os.makedirs(newpath, exist_ok=True) - - SamplingMethod = 'random' - MCsize = 10000 - ESS = 0 - - # Estimation of the integral via Monte Varlo integration - while (ESS > MCsize) or (ESS < 1): - - # Generate samples for Monte Carlo simulation - X_MC = MetaModel.ExpDesign.generate_samples( - MCsize, SamplingMethod - ) - - # Monte Carlo simulation for the candidate design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - Y_MC, std_MC = MetaModel.eval_metamodel(samples=X_MC) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel in BME: {m_2-m_1:.2f} MB") - - # Likelihood computation (Comparison of data and - # simulation results via PCE with candidate design) - Likelihoods = self.__normpdf( - Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) - - # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if (ESS > MCsize) or (ESS < 1): - print(f'ESS={ESS} MC size should be larger.') - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - X_Posterior = X_MC[accepted] - - # ------------------------------------------------------------ - # --- Kullback-Leibler Divergence & Information Entropy ------ - # ------------------------------------------------------------ - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - - # TODO: Correction factor - # log_weight = self.__corr_factor_BME(obs_data, sigma2Dict, logBME) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(MetaModel.ExpDesign.JDist.pdf(X_Posterior.T)) - ) - - # Calculate Kullback-Leibler Divergence - # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - KLD = postExpLikelihoods - logBME - - # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods - - # If post_snapshot is True, plot likelihood vs refrence - if post_snapshot or len(valid_likelihoods) != 0: - # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) - est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = self.__hellinger_distance(ref_like, est_like) - - idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' - in name and os.path.isfile(os.path.join(newpath, name))]) - fig, ax = plt.subplots() - try: - sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), - shade=True, color="g", label='Ref. Likelihood') - sns.kdeplot(np.log(Likelihoods[Likelihoods > 0]), shade=True, - color="b", label='Likelihood with PCE') - except: - pass - - text = f"Hellinger Dist.={distHellinger:.3f}\n logBME={logBME:.3f}" - "\n DKL={KLD:.3f}" - - plt.text(0.05, 0.75, text, bbox=dict(facecolor='wheat', - edgecolor='black', - boxstyle='round,pad=1'), - transform=ax.transAxes) - - fig.savefig(f'./{newpath}/Likelihoods_{idx}.pdf', - bbox_inches='tight') - plt.close() - - else: - distHellinger = 0.0 - - # Bayesian inference with Emulator only for 2D problem - if post_snapshot and MetaModel.n_params == 2 and not idx % 5: - from bayes_inference.bayes_inference import BayesInference - from bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(MetaModel) - BayesOpts.emulator = True - BayesOpts.plot_post_pred = False - - # Select the inference method - import emcee - BayesOpts.inference_method = "MCMC" - # Set the MCMC parameters passed to self.mcmc_params - BayesOpts.mcmc_params = { - 'n_steps': 1e5, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'verbose': False - } - - # ----- Define the discrepancy model ------- - obs_data = pd.DataFrame(obs_data, columns=self.Model.Output.names) - BayesOpts.measurement_error = obs_data - - # # -- (Option B) -- - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 - BayesOpts.Discrepancy = DiscrepancyOpts - # Start the calibration/inference - Bayes_PCE = BayesOpts.create_inference() - X_Posterior = Bayes_PCE.posterior_df.values - - # Clean up - del Y_MC, std_MC - gc.collect() - - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - # ------------------------------------------------------------------------- - def __validError(self, MetaModel): - - # MetaModel = self.MetaModel - Model = MetaModel.ModelObj - OutputName = Model.Output.names - - # Extract the original model with the generated samples - valid_samples = MetaModel.valid_samples - valid_model_runs = MetaModel.valid_model_runs - - # Run the PCE model with the generated samples - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - valid_PCE_runs, valid_PCE_std = MetaModel.eval_metamodel(samples=valid_samples) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel: {m_2-m_1:.2f} MB") - - rms_error = {} - valid_error = {} - # Loop over the keys and compute RMSE error. - for key in OutputName: - rms_error[key] = mean_squared_error( - valid_model_runs[key], valid_PCE_runs[key], - multioutput='raw_values', - sample_weight=None, - squared=False) - - # Validation error - valid_error[key] = (rms_error[key]**2) - valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Updated Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(rms_error[key], - valid_error[key])))) - - return rms_error, valid_error - - # ------------------------------------------------------------------------- - def __error_Mean_Std(self): - - MetaModel = self.MetaModel - # Extract the mean and std provided by user - df_MCReference = MetaModel.ModelObj.mc_reference - - # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self._compute_pce_moments(MetaModel) - - # Compute the root mean squared error - for output in MetaModel.ModelObj.Output.names: - - # Compute the error between mean and std of MetaModel and OrigModel - RMSE_Mean = mean_squared_error( - df_MCReference['mean'], pce_means[output], squared=False - ) - RMSE_std = mean_squared_error( - df_MCReference['std'], pce_means[output], squared=False - ) - - return RMSE_Mean, RMSE_std - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self, MetaModel): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - outputs = MetaModel.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.mean_ + np.dot( - pce_mean, PCA.components_) - stds[output] = np.sqrt(np.dot(pce_var, - PCA.components_**2)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/surrogate_models.py b/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/surrogate_models.py deleted file mode 100644 index a6d31ccd1..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/bayesvalidrox/surrogate_models/surrogate_models.py +++ /dev/null @@ -1,1473 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import warnings -import numpy as np -import math -import h5py -import matplotlib.pyplot as plt -from sklearn.preprocessing import MinMaxScaler -import scipy as sp -from tqdm import tqdm -from sklearn.decomposition import PCA as sklearnPCA -import sklearn.linear_model as lm -from sklearn.gaussian_process import GaussianProcessRegressor -import sklearn.gaussian_process.kernels as kernels -import os -from joblib import Parallel, delayed -import copy - -from .input_space import InputSpace -from .glexindex import glexindex -from .eval_rec_rule import eval_univ_basis -from .reg_fast_ard import RegressionFastARD -from .reg_fast_laplace import RegressionFastLaplace -from .orthogonal_matching_pursuit import OrthogonalMatchingPursuit -from .bayes_linear import VBLinearRegression, EBLinearRegression -from .apoly_construction import apoly_construction -warnings.filterwarnings("ignore") -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class MetaModel(): - """ - Meta (surrogate) model - - This class trains a surrogate model. It accepts an input object (input_obj) - containing the specification of the distributions for uncertain parameters - and a model object with instructions on how to run the computational model. - - Attributes - ---------- - input_obj : obj - Input object with the information on the model input parameters. - meta_model_type : str - Surrogate model types. Three surrogate model types are supported: - polynomial chaos expansion (`PCE`), arbitrary PCE (`aPCE`) and - Gaussian process regression (`GPE`). Default is PCE. - pce_reg_method : str - PCE regression method to compute the coefficients. The following - regression methods are available: - - 1. OLS: Ordinary Least Square method - 2. BRR: Bayesian Ridge Regression - 3. LARS: Least angle regression - 4. ARD: Bayesian ARD Regression - 5. FastARD: Fast Bayesian ARD Regression - 6. VBL: Variational Bayesian Learning - 7. EBL: Emperical Bayesian Learning - Default is `OLS`. - bootstrap_method : str - Bootstraping method. Options are `'normal'` and `'fast'`. The default - is `'fast'`. It means that in each iteration except the first one, only - the coefficent are recalculated with the ordinary least square method. - n_bootstrap_itrs : int - Number of iterations for the bootstrap sampling. The default is `1`. - pce_deg : int or list of int - Polynomial degree(s). If a list is given, an adaptive algorithm is used - to find the best degree with the lowest Leave-One-Out cross-validation - (LOO) error (or the highest score=1-LOO). Default is `1`. - pce_q_norm : float - Hyperbolic (or q-norm) truncation for multi-indices of multivariate - polynomials. Default is `1.0`. - dim_red_method : str - Dimensionality reduction method for the output space. The available - method is based on principal component analysis (PCA). The Default is - `'no'`. There are two ways to select number of components: use - percentage of the explainable variance threshold (between 0 and 100) - (Option A) or direct prescription of components' number (Option B): - - >>> MetaModelOpts.dim_red_method = 'PCA' - >>> MetaModelOpts.var_pca_threshold = 99.999 # Option A - >>> MetaModelOpts.n_pca_components = 12 # Option B - - verbose : bool - Prints summary of the regression results. Default is `False`. - - Note - ------- - To define the sampling methods and the training set, an experimental design - instance shall be defined. This can be done by: - - >>> MetaModelOpts.add_InputSpace() - - Two experimental design schemes are supported: one-shot (`normal`) and - adaptive sequential (`sequential`) designs. - For experimental design refer to `InputSpace`. - - """ - - def __init__(self, input_obj, meta_model_type='PCE', - pce_reg_method='OLS', bootstrap_method='fast', - n_bootstrap_itrs=1, pce_deg=1, pce_q_norm=1.0, - dim_red_method='no', verbose=False): - - self.input_obj = input_obj - self.meta_model_type = meta_model_type - self.pce_reg_method = pce_reg_method - self.bootstrap_method = bootstrap_method - self.n_bootstrap_itrs = n_bootstrap_itrs - self.pce_deg = pce_deg - self.pce_q_norm = pce_q_norm - self.dim_red_method = dim_red_method - self.verbose = verbose - - def build_metamodel(self, n_init_samples = None) -> None: - """ - Builds the parts for the metamodel (polynomes,...) that are neede before fitting. - - Returns - ------- - None - DESCRIPTION. - - """ - - # Add InputSpace to MetaModel if it does not have any - if not hasattr(self, 'InputSpace'): - self.InputSpace = InputSpace(self.input_obj) - self.InputSpace.n_init_samples = n_init_samples - self.InputSpace.init_param_space(np.max(self.pce_deg)) - - self.ndim = self.InputSpace.ndim - - if not hasattr(self, 'CollocationPoints'): - raise AttributeError('Please provide samples to the metamodel before building it.') - - self.n_params = len(self.input_obj.Marginals) - - # Generate polynomials - if self.meta_model_type.lower() != 'gpe': - self.generate_polynomials(np.max(self.pce_deg)) - - # Initialize the nested dictionaries - if self.meta_model_type.lower() == 'gpe': - self.gp_poly = self.auto_vivification() - self.x_scaler = self.auto_vivification() - self.LCerror = self.auto_vivification() - else: - self.deg_dict = self.auto_vivification() - self.q_norm_dict = self.auto_vivification() - self.coeffs_dict = self.auto_vivification() - self.basis_dict = self.auto_vivification() - self.score_dict = self.auto_vivification() - self.clf_poly = self.auto_vivification() - self.LCerror = self.auto_vivification() - if self.dim_red_method.lower() == 'pca': - self.pca = self.auto_vivification() - - # Define an array containing the degrees - self.CollocationPoints = np.array(self.CollocationPoints) - self.n_samples, ndim = self.CollocationPoints.shape - if self.ndim != ndim: - raise AttributeError('The given samples do not match the given number of priors. The samples should be a 2D array of size (#samples, #priors)') - - self.deg_array = self.__select_degree(ndim, self.n_samples) - - # Generate all basis indices - self.allBasisIndices = self.auto_vivification() - for deg in self.deg_array: - keys = self.allBasisIndices.keys() - if deg not in np.fromiter(keys, dtype=float): - # Generate the polynomial basis indices - for qidx, q in enumerate(self.pce_q_norm): - basis_indices = glexindex(start=0, stop=deg+1, - dimensions=self.n_params, - cross_truncation=q, - reverse=False, graded=True) - self.allBasisIndices[str(deg)][str(q)] = basis_indices - - - - def fit(self, X, y, parallel = True, verbose = False): - """ - Fits the surrogate to the given data (samples X, outputs y). - Note here that the samples X should be the transformed samples provided - by the experimental design if the transformation is used there. - - Parameters - ---------- - X : 2D list or np.array of shape (#samples, #dim) - The parameter value combinations that the model was evaluated at. - y : dict of 2D lists or arrays of shape (#samples, #timesteps) - The respective model evaluations. - - Returns - ------- - None. - - """ - X = np.array(X) - for key in y.keys(): - y_val = np.array(y[key]) - if y_val.ndim !=2: - raise ValueError('The given outputs y should be 2D') - y[key] = np.array(y[key]) - - # Output names are the same as the keys in y - self.out_names = list(y.keys()) - - # Build the MetaModel on the static samples - self.CollocationPoints = X - - # TODO: other option: rebuild every time - if not hasattr(self, 'deg_array'): - self.build_metamodel(n_init_samples = X.shape[1]) - - # Evaluate the univariate polynomials on InputSpace - if self.meta_model_type.lower() != 'gpe': - self.univ_p_val = self.univ_basis_vals(self.CollocationPoints) - - # --- Loop through data points and fit the surrogate --- - if verbose: - print(f"\n>>>> Training the {self.meta_model_type} metamodel " - "started. <<<<<<\n") - - # --- Bootstrap sampling --- - # Correct number of bootstrap if PCA transformation is required. - if self.dim_red_method.lower() == 'pca' and self.n_bootstrap_itrs == 1: - self.n_bootstrap_itrs = 100 - - # Check if fast version (update coeffs with OLS) is selected. - if self.bootstrap_method.lower() == 'fast': - fast_bootstrap = True - first_out = {} - n_comp_dict = {} - else: - fast_bootstrap = False - - # Prepare tqdm iteration maessage - if verbose and self.n_bootstrap_itrs > 1: - enum_obj = tqdm(range(self.n_bootstrap_itrs), - total=self.n_bootstrap_itrs, - desc="Bootstrapping the metamodel", - ascii=True) - else: - enum_obj = range(self.n_bootstrap_itrs) - - # Loop over the bootstrap iterations - for b_i in enum_obj: - if b_i > 0: - b_indices = np.random.randint(self.n_samples, size=self.n_samples) - else: - b_indices = np.arange(len(X)) - - X_train_b = X[b_indices] - - if verbose and self.n_bootstrap_itrs == 1: - items = tqdm(y.items(), desc="Fitting regression") - else: - items = y.items() - - # For loop over the components/outputs - for key, Output in items: - - # Dimensionality reduction with PCA, if specified - if self.dim_red_method.lower() == 'pca': - - # Use the stored n_comp for fast bootsrtrapping - if fast_bootstrap and b_i > 0: - self.n_pca_components = n_comp_dict[key] - - # Start transformation - pca, target, n_comp = self.pca_transformation( - Output[b_indices], verbose=False - ) - self.pca[f'b_{b_i+1}'][key] = pca - # Store the number of components for fast bootsrtrapping - if fast_bootstrap and b_i == 0: - n_comp_dict[key] = n_comp - else: - target = Output[b_indices] - - # Parallel fit regression - if self.meta_model_type.lower() == 'gpe': - # Prepare the input matrix - scaler = MinMaxScaler() - X_S = scaler.fit_transform(X_train_b) - - self.x_scaler[f'b_{b_i+1}'][key] = scaler - if parallel: - out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.gaussian_process_emulator)( - X_S, target[:, idx]) for idx in - range(target.shape[1])) - else: - results = map(self.gaussian_process_emulator, - [X_train_b]*target.shape[1], - [target[:, idx] for idx in - range(target.shape[1])] - ) - out = list(results) - - for idx in range(target.shape[1]): - self.gp_poly[f'b_{b_i+1}'][key][f"y_{idx+1}"] = out[idx] - - else: - self.univ_p_val = self.univ_p_val[b_indices] - if parallel and (not fast_bootstrap or b_i == 0): - out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.adaptive_regression)(X_train_b, - target[:, idx], - idx) - for idx in range(target.shape[1])) - elif not parallel and (not fast_bootstrap or b_i == 0): - results = map(self.adaptive_regression, - [X_train_b]*target.shape[1], - [target[:, idx] for idx in - range(target.shape[1])], - range(target.shape[1])) - out = list(results) - - # Store the first out dictionary - if fast_bootstrap and b_i == 0: - first_out[key] = copy.deepcopy(out) - - if b_i > 0 and fast_bootstrap: - - # fast bootstrap - out = self.update_pce_coeffs( - X_train_b, target, first_out[key]) - - for i in range(target.shape[1]): - # Create a dict to pass the variables - self.deg_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['degree'] - self.q_norm_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['qnorm'] - self.coeffs_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['coeffs'] - self.basis_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['multi_indices'] - self.score_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LOOCVScore'] - self.clf_poly[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['clf_poly'] - #self.LCerror[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LCerror'] - - if verbose: - print(f"\n>>>> Training the {self.meta_model_type} metamodel" - " sucessfully completed. <<<<<<\n") - - # ------------------------------------------------------------------------- - def update_pce_coeffs(self, X, y, out_dict = None): - """ - Updates the PCE coefficents using only the ordinary least square method - for the fast version of the bootstrapping. - - Parameters - ---------- - X : array of shape (n_samples, n_params) - Training set. - y : array of shape (n_samples, n_outs) - The (transformed) model responses. - out_dict : dict - The training output dictionary of the first iteration, i.e. - the surrogate model for the original experimental design. - - Returns - ------- - final_out_dict : dict - The updated training output dictionary. - - """ - # Make a copy - final_out_dict = copy.deepcopy(out_dict) - - # Loop over the points - for i in range(y.shape[1]): - - - # Extract nonzero basis indices - nnz_idx = np.nonzero(out_dict[i]['coeffs'])[0] - if len(nnz_idx) != 0: - basis_indices = out_dict[i]['multi_indices'] - - # Evaluate the multivariate polynomials on CollocationPoints - psi = self.create_psi(basis_indices, self.univ_p_val) - - # Calulate the cofficients of surrogate model - updated_out = self.regression( - psi, y[:, i], basis_indices, reg_method='OLS', - sparsity=False - ) - - # Update coeffs in out_dict - final_out_dict[i]['coeffs'][nnz_idx] = updated_out['coeffs'] - - return final_out_dict - - # ------------------------------------------------------------------------- - def add_InputSpace(self): - """ - Instanciates experimental design object. - - Returns - ------- - None. - - """ - self.InputSpace = InputSpace(self.input_obj, - meta_Model_type=self.meta_model_type) - - # ------------------------------------------------------------------------- - def univ_basis_vals(self, samples, n_max=None): - """ - Evaluates univariate regressors along input directions. - - Parameters - ---------- - samples : array of shape (n_samples, n_params) - Samples. - n_max : int, optional - Maximum polynomial degree. The default is `None`. - - Returns - ------- - univ_basis: array of shape (n_samples, n_params, n_max+1) - All univariate regressors up to n_max. - """ - # Extract information - poly_types = self.InputSpace.poly_types - if samples.ndim != 2: - samples = samples.reshape(1, len(samples)) - n_max = np.max(self.pce_deg) if n_max is None else n_max - - # Extract poly coeffs - if self.InputSpace.input_data_given or self.InputSpace.apce: - apolycoeffs = self.polycoeffs - else: - apolycoeffs = None - - # Evaluate univariate basis - univ_basis = eval_univ_basis(samples, n_max, poly_types, apolycoeffs) - - return univ_basis - - # ------------------------------------------------------------------------- - def create_psi(self, basis_indices, univ_p_val): - """ - This function assemble the design matrix Psi from the given basis index - set INDICES and the univariate polynomial evaluations univ_p_val. - - Parameters - ---------- - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - univ_p_val : array of (n_samples, n_params, n_max+1) - All univariate regressors up to `n_max`. - - Raises - ------ - ValueError - n_terms in arguments do not match. - - Returns - ------- - psi : array of shape (n_samples, n_terms) - Multivariate regressors. - - """ - # Check if BasisIndices is a sparse matrix - sparsity = sp.sparse.issparse(basis_indices) - if sparsity: - basis_indices = basis_indices.toarray() - - # Initialization and consistency checks - # number of input variables - n_params = univ_p_val.shape[1] - - # Size of the experimental design - n_samples = univ_p_val.shape[0] - - # number of basis terms - n_terms = basis_indices.shape[0] - - # check that the variables have consistent sizes - if n_params != basis_indices.shape[1]: - raise ValueError( - f"The shapes of basis_indices ({basis_indices.shape[1]}) and " - f"univ_p_val ({n_params}) don't match!!" - ) - - # Preallocate the Psi matrix for performance - psi = np.ones((n_samples, n_terms)) - # Assemble the Psi matrix - for m in range(basis_indices.shape[1]): - aa = np.where(basis_indices[:, m] > 0)[0] - try: - basisIdx = basis_indices[aa, m] - bb = univ_p_val[:, m, basisIdx].reshape(psi[:, aa].shape) - psi[:, aa] = np.multiply(psi[:, aa], bb) - except ValueError as err: - raise err - return psi - - # ------------------------------------------------------------------------- - def regression(self, X, y, basis_indices, reg_method=None, sparsity=True): - """ - Fit regression using the regression method provided. - - Parameters - ---------- - X : array of shape (n_samples, n_features) - Training vector, where n_samples is the number of samples and - n_features is the number of features. - y : array of shape (n_samples,) - Target values. - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - reg_method : str, optional - DESCRIPTION. The default is None. - - Returns - ------- - return_out_dict : Dict - Fitted estimator, spareMulti-Index, sparseX and coefficients. - - """ - if reg_method is None: - reg_method = self.pce_reg_method - - bias_term = self.dim_red_method.lower() != 'pca' - - compute_score = True if self.verbose else False - - # inverse of the observed variance of the data - if np.var(y) != 0: - Lambda = 1 / np.var(y) - else: - Lambda = 1e-6 - - # Bayes sparse adaptive aPCE - if reg_method.lower() == 'ols': - clf_poly = lm.LinearRegression(fit_intercept=False) - elif reg_method.lower() == 'brr': - clf_poly = lm.BayesianRidge(n_iter=1000, tol=1e-7, - fit_intercept=False, - #normalize=True, - compute_score=compute_score, - alpha_1=1e-04, alpha_2=1e-04, - lambda_1=Lambda, lambda_2=Lambda) - clf_poly.converged = True - - elif reg_method.lower() == 'ard': - if X.shape[0]<2: - raise ValueError('Regression with ARD can only be performed for more than 2 samples') - clf_poly = lm.ARDRegression(fit_intercept=False, - #normalize=True, - compute_score=compute_score, - n_iter=1000, tol=0.0001, - alpha_1=1e-3, alpha_2=1e-3, - lambda_1=Lambda, lambda_2=Lambda) - - elif reg_method.lower() == 'fastard': - clf_poly = RegressionFastARD(fit_intercept=False, - normalize=True, - compute_score=compute_score, - n_iter=300, tol=1e-10) - - elif reg_method.lower() == 'bcs': - if X.shape[0]<10: - raise ValueError('Regression with BCS can only be performed for more than 10 samples') - clf_poly = RegressionFastLaplace(fit_intercept=False, - bias_term=bias_term, - n_iter=1000, tol=1e-7) - - elif reg_method.lower() == 'lars': - if X.shape[0]<10: - raise ValueError('Regression with LARS can only be performed for more than 5 samples') - clf_poly = lm.LassoLarsCV(fit_intercept=False) - - elif reg_method.lower() == 'sgdr': - clf_poly = lm.SGDRegressor(fit_intercept=False, - max_iter=5000, tol=1e-7) - - elif reg_method.lower() == 'omp': - clf_poly = OrthogonalMatchingPursuit(fit_intercept=False) - - elif reg_method.lower() == 'vbl': - clf_poly = VBLinearRegression(fit_intercept=False) - - elif reg_method.lower() == 'ebl': - clf_poly = EBLinearRegression(optimizer='em') - - # Fit - clf_poly.fit(X, y) - - # Select the nonzero entries of coefficients - if sparsity: - nnz_idx = np.nonzero(clf_poly.coef_)[0] - else: - nnz_idx = np.arange(clf_poly.coef_.shape[0]) - - # This is for the case where all outputs are zero, thereby - # all coefficients are zero - if (y == 0).all(): - nnz_idx = np.insert(np.nonzero(clf_poly.coef_)[0], 0, 0) - - sparse_basis_indices = basis_indices[nnz_idx] - sparse_X = X[:, nnz_idx] - coeffs = clf_poly.coef_[nnz_idx] - clf_poly.coef_ = coeffs - - # Create a dict to pass the outputs - return_out_dict = dict() - return_out_dict['clf_poly'] = clf_poly - return_out_dict['spareMulti-Index'] = sparse_basis_indices - return_out_dict['sparePsi'] = sparse_X - return_out_dict['coeffs'] = coeffs - return return_out_dict - - # -------------------------------------------------------------------------------------------------------- - def adaptive_regression(self, ED_X, ED_Y, varIdx, verbose=False): - """ - Adaptively fits the PCE model by comparing the scores of different - degrees and q-norm. - - Parameters - ---------- - ED_X : array of shape (n_samples, n_params) - Experimental design. - ED_Y : array of shape (n_samples,) - Target values, i.e. simulation results for the Experimental design. - varIdx : int - Index of the output. - verbose : bool, optional - Print out summary. The default is False. - - Returns - ------- - returnVars : Dict - Fitted estimator, best degree, best q-norm, LOOCVScore and - coefficients. - - """ - - n_samples, n_params = ED_X.shape - # Initialization - qAllCoeffs, AllCoeffs = {}, {} - qAllIndices_Sparse, AllIndices_Sparse = {}, {} - qAllclf_poly, Allclf_poly = {}, {} - qAllnTerms, AllnTerms = {}, {} - qAllLCerror, AllLCerror = {}, {} - - # Extract degree array and qnorm array - deg_array = np.array([*self.allBasisIndices], dtype=int) - qnorm = [*self.allBasisIndices[str(int(deg_array[0]))]] - - # Some options for EarlyStop - errorIncreases = False - # Stop degree, if LOO error does not decrease n_checks_degree times - n_checks_degree = 3 - # Stop qNorm, if criterion isn't fulfilled n_checks_qNorm times - n_checks_qNorm = 2 - nqnorms = len(qnorm) - qNormEarlyStop = True - if nqnorms < n_checks_qNorm+1: - qNormEarlyStop = False - - # ===================================================================== - # basis adaptive polynomial chaos: repeat the calculation by increasing - # polynomial degree until the highest accuracy is reached - # ===================================================================== - # For each degree check all q-norms and choose the best one - scores = -np.inf * np.ones(deg_array.shape[0]) - qNormScores = -np.inf * np.ones(nqnorms) - - for degIdx, deg in enumerate(deg_array): - - for qidx, q in enumerate(qnorm): - - # Extract the polynomial basis indices from the pool of - # allBasisIndices - BasisIndices = self.allBasisIndices[str(deg)][str(q)] - - # Assemble the Psi matrix - Psi = self.create_psi(BasisIndices, self.univ_p_val) - - # Calulate the cofficients of the meta model - outs = self.regression(Psi, ED_Y, BasisIndices) - - # Calculate and save the score of LOOCV - score, LCerror = self.corr_loocv_error(outs['clf_poly'], - outs['sparePsi'], - outs['coeffs'], - ED_Y) - - # Check the convergence of noise for FastARD - if self.pce_reg_method == 'FastARD' and \ - outs['clf_poly'].alpha_ < np.finfo(np.float32).eps: - score = -np.inf - - qNormScores[qidx] = score - qAllCoeffs[str(qidx+1)] = outs['coeffs'] - qAllIndices_Sparse[str(qidx+1)] = outs['spareMulti-Index'] - qAllclf_poly[str(qidx+1)] = outs['clf_poly'] - qAllnTerms[str(qidx+1)] = BasisIndices.shape[0] - qAllLCerror[str(qidx+1)] = LCerror - - # EarlyStop check - # if there are at least n_checks_qNorm entries after the - # best one, we stop - if qNormEarlyStop and \ - sum(np.isfinite(qNormScores)) > n_checks_qNorm: - # If the error has increased the last two iterations, stop! - qNormScores_nonInf = qNormScores[np.isfinite(qNormScores)] - deltas = np.sign(np.diff(qNormScores_nonInf)) - if sum(deltas[-n_checks_qNorm+1:]) == 2: - # stop the q-norm loop here - break - if np.var(ED_Y) == 0: - break - - # Store the score in the scores list - best_q = np.nanargmax(qNormScores) - scores[degIdx] = qNormScores[best_q] - - AllCoeffs[str(degIdx+1)] = qAllCoeffs[str(best_q+1)] - AllIndices_Sparse[str(degIdx+1)] = qAllIndices_Sparse[str(best_q+1)] - Allclf_poly[str(degIdx+1)] = qAllclf_poly[str(best_q+1)] - AllnTerms[str(degIdx+1)] = qAllnTerms[str(best_q+1)] - AllLCerror[str(degIdx+1)] = qAllLCerror[str(best_q+1)] - - # Check the direction of the error (on average): - # if it increases consistently stop the iterations - if len(scores[scores != -np.inf]) > n_checks_degree: - scores_nonInf = scores[scores != -np.inf] - ss = np.sign(scores_nonInf - np.max(scores_nonInf)) - # ss<0 error decreasing - errorIncreases = np.sum(np.sum(ss[-2:])) <= -1*n_checks_degree - - if errorIncreases: - break - - # Check only one degree, if target matrix has zero variance - if np.var(ED_Y) == 0: - break - - # ------------------ Summary of results ------------------ - # Select the one with the best score and save the necessary outputs - best_deg = np.nanargmax(scores)+1 - coeffs = AllCoeffs[str(best_deg)] - basis_indices = AllIndices_Sparse[str(best_deg)] - clf_poly = Allclf_poly[str(best_deg)] - LOOCVScore = np.nanmax(scores) - P = AllnTerms[str(best_deg)] - LCerror = AllLCerror[str(best_deg)] - degree = deg_array[np.nanargmax(scores)] - qnorm = float(qnorm[best_q]) - - # ------------------ Print out Summary of results ------------------ - if self.verbose: - # Create PSI_Sparse by removing redundent terms - nnz_idx = np.nonzero(coeffs)[0] - BasisIndices_Sparse = basis_indices[nnz_idx] - - print(f'Output variable {varIdx+1}:') - print('The estimation of PCE coefficients converged at polynomial ' - f'degree {deg_array[best_deg-1]} with ' - f'{len(BasisIndices_Sparse)} terms (Sparsity index = ' - f'{round(len(BasisIndices_Sparse)/P, 3)}).') - - print(f'Final ModLOO error estimate: {1-max(scores):.3e}') - print('\n'+'-'*50) - - if verbose: - print('='*50) - print(' '*10 + ' Summary of results ') - print('='*50) - - print("Scores:\n", scores) - print("Degree of best score:", self.deg_array[best_deg-1]) - print("No. of terms:", len(basis_indices)) - print("Sparsity index:", round(len(basis_indices)/P, 3)) - print("Best Indices:\n", basis_indices) - - if self.pce_reg_method in ['BRR', 'ARD']: - fig, ax = plt.subplots(figsize=(12, 10)) - plt.title("Marginal log-likelihood") - plt.plot(clf_poly.scores_, color='navy', linewidth=2) - plt.ylabel("Score") - plt.xlabel("Iterations") - if self.pce_reg_method.lower() == 'bbr': - text = f"$\\alpha={clf_poly.alpha_:.1f}$\n" - f"$\\lambda={clf_poly.lambda_:.3f}$\n" - f"$L={clf_poly.scores_[-1]:.1f}$" - else: - text = f"$\\alpha={clf_poly.alpha_:.1f}$\n$" - f"\\L={clf_poly.scores_[-1]:.1f}$" - - plt.text(0.75, 0.5, text, fontsize=18, transform=ax.transAxes) - plt.show() - print('='*80) - - # Create a dict to pass the outputs - returnVars = dict() - returnVars['clf_poly'] = clf_poly - returnVars['degree'] = degree - returnVars['qnorm'] = qnorm - returnVars['coeffs'] = coeffs - returnVars['multi_indices'] = basis_indices - returnVars['LOOCVScore'] = LOOCVScore - returnVars['LCerror'] = LCerror - - return returnVars - - # ------------------------------------------------------------------------- - def corr_loocv_error(self, clf, psi, coeffs, y): - """ - Calculates the corrected LOO error for regression on regressor - matrix `psi` that generated the coefficients based on [1] and [2]. - - [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for - uncertainty propagation and sensitivity analysis (Doctoral - dissertation, Clermont-Ferrand 2). - - [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos - expansion based on least angle regression. Journal of computational - Physics, 230(6), pp.2345-2367. - - Parameters - ---------- - clf : object - Fitted estimator. - psi : array of shape (n_samples, n_features) - The multivariate orthogonal polynomials (regressor). - coeffs : array-like of shape (n_features,) - Estimated cofficients. - y : array of shape (n_samples,) - Target values. - - Returns - ------- - R_2 : float - LOOCV Validation score (1-LOOCV erro). - residual : array of shape (n_samples,) - Residual values (y - predicted targets). - - """ - psi = np.array(psi, dtype=float) - - # Create PSI_Sparse by removing redundent terms - nnz_idx = np.nonzero(coeffs)[0] - if len(nnz_idx) == 0: - nnz_idx = [0] - psi_sparse = psi[:, nnz_idx] - - # NrCoeffs of aPCEs - P = len(nnz_idx) - # NrEvaluation (Size of experimental design) - N = psi.shape[0] - - # Build the projection matrix - PsiTPsi = np.dot(psi_sparse.T, psi_sparse) - - if np.linalg.cond(PsiTPsi) > 1e-12: #and \ - # np.linalg.cond(PsiTPsi) < 1/sys.float_info.epsilon: - # faster - try: - M = sp.linalg.solve(PsiTPsi, - sp.sparse.eye(PsiTPsi.shape[0]).toarray()) - except: - raise AttributeError('There are too few samples for the corrected loo-cv error. Fit surrogate on at least as many samples as parameters to use this') - else: - # stabler - M = np.linalg.pinv(PsiTPsi) - - # h factor (the full matrix is not calculated explicitly, - # only the trace is, to save memory) - PsiM = np.dot(psi_sparse, M) - - h = np.sum(np.multiply(PsiM, psi_sparse), axis=1, dtype=np.longdouble)#float128) - - # ------ Calculate Error Loocv for each measurement point ---- - # Residuals - try: - residual = clf.predict(psi) - y - except: - residual = np.dot(psi, coeffs) - y - - # Variance - var_y = np.var(y) - - if var_y == 0: - norm_emp_error = 0 - loo_error = 0 - LCerror = np.zeros((y.shape)) - return 1-loo_error, LCerror - else: - norm_emp_error = np.mean(residual**2)/var_y - - # LCerror = np.divide(residual, (1-h)) - LCerror = residual / (1-h) - loo_error = np.mean(np.square(LCerror)) / var_y - # if there are NaNs, just return an infinite LOO error (this - # happens, e.g., when a strongly underdetermined problem is solved) - if np.isnan(loo_error): - loo_error = np.inf - - # Corrected Error for over-determined system - tr_M = np.trace(M) - if tr_M < 0 or abs(tr_M) > 1e6: - tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) - - # Over-determined system of Equation - if N > P: - T_factor = N/(N-P) * (1 + tr_M) - - # Under-determined system of Equation - else: - T_factor = np.inf - - corrected_loo_error = loo_error * T_factor - - R_2 = 1 - corrected_loo_error - - return R_2, LCerror - - # ------------------------------------------------------------------------- - def pca_transformation(self, target, verbose=False): - """ - Transforms the targets (outputs) via Principal Component Analysis - - Parameters - ---------- - target : array of shape (n_samples,) - Target values. - - Returns - ------- - pca : obj - Fitted sklearnPCA object. - OutputMatrix : array of shape (n_samples,) - Transformed target values. - n_pca_components : int - Number of selected principal components. - - """ - # Transform via Principal Component Analysis - if hasattr(self, 'var_pca_threshold'): - var_pca_threshold = self.var_pca_threshold - else: - var_pca_threshold = 100.0 - n_samples, n_features = target.shape - - if hasattr(self, 'n_pca_components'): - n_pca_components = self.n_pca_components - else: - # Instantiate and fit sklearnPCA object - covar_matrix = sklearnPCA(n_components=None) - covar_matrix.fit(target) - var = np.cumsum(np.round(covar_matrix.explained_variance_ratio_, - decimals=5)*100) - # Find the number of components to explain self.varPCAThreshold of - # variance - try: - n_components = np.where(var >= var_pca_threshold)[0][0] + 1 - except IndexError: - n_components = min(n_samples, n_features) - - n_pca_components = min(n_samples, n_features, n_components) - - # Print out a report - if verbose: - print() - print('-' * 50) - print(f"PCA transformation is performed with {n_pca_components}" - " components.") - print('-' * 50) - print() - - # Fit and transform with the selected number of components - pca = sklearnPCA(n_components=n_pca_components, svd_solver='arpack') - scaled_target = pca.fit_transform(target) - - return pca, scaled_target, n_pca_components - - # ------------------------------------------------------------------------- - def gaussian_process_emulator(self, X, y, nug_term=None, autoSelect=False, - varIdx=None): - """ - Fits a Gaussian Process Emulator to the target given the training - points. - - Parameters - ---------- - X : array of shape (n_samples, n_params) - Training points. - y : array of shape (n_samples,) - Target values. - nug_term : float, optional - Nugget term. The default is None, i.e. variance of y. - autoSelect : bool, optional - Loop over some kernels and select the best. The default is False. - varIdx : int, optional - The index number. The default is None. - - Returns - ------- - gp : object - Fitted estimator. - - """ - - nug_term = nug_term if nug_term else np.var(y) - - Kernels = [nug_term * kernels.RBF(length_scale=1.0, - length_scale_bounds=(1e-25, 1e15)), - nug_term * kernels.RationalQuadratic(length_scale=0.2, - alpha=1.0), - nug_term * kernels.Matern(length_scale=1.0, - length_scale_bounds=(1e-15, 1e5), - nu=1.5)] - - # Automatic selection of the kernel - if autoSelect: - gp = {} - BME = [] - for i, kernel in enumerate(Kernels): - gp[i] = GaussianProcessRegressor(kernel=kernel, - n_restarts_optimizer=3, - normalize_y=False) - - # Fit to data using Maximum Likelihood Estimation - gp[i].fit(X, y) - - # Store the MLE as BME score - BME.append(gp[i].log_marginal_likelihood()) - - gp = gp[np.argmax(BME)] - - else: - gp = GaussianProcessRegressor(kernel=Kernels[0], - n_restarts_optimizer=3, - normalize_y=False) - gp.fit(X, y) - - # Compute score - if varIdx is not None: - Score = gp.score(X, y) - print('-'*50) - print(f'Output variable {varIdx}:') - print('The estimation of GPE coefficients converged,') - print(f'with the R^2 score: {Score:.3f}') - print('-'*50) - - return gp - - # ------------------------------------------------------------------------- - def eval_metamodel(self, samples): - """ - Evaluates meta-model at the requested samples. One can also generate - nsamples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate meta-model at. The default is None. - nsamples : int, optional - Number of samples to generate, if no `samples` is provided. The - default is None. - sampling_method : str, optional - Type of sampling, if no `samples` is provided. The default is - 'random'. - return_samples : bool, optional - Retun samples, if no `samples` is provided. The default is False. - - Returns - ------- - mean_pred : dict - Mean of the predictions. - std_pred : dict - Standard deviatioon of the predictions. - """ - # Transform into np array - can also be given as list - samples = np.array(samples) - - # Transform samples to the independent space - samples = self.InputSpace.transform( - samples, - method='user' - ) - # Compute univariate bases for the given samples - if self.meta_model_type.lower() != 'gpe': - univ_p_val = self.univ_basis_vals( - samples, - n_max=np.max(self.pce_deg) - ) - - mean_pred_b = {} - std_pred_b = {} - # Loop over bootstrap iterations - for b_i in range(self.n_bootstrap_itrs): - - # Extract model dictionary - if self.meta_model_type.lower() == 'gpe': - model_dict = self.gp_poly[f'b_{b_i+1}'] - else: - model_dict = self.coeffs_dict[f'b_{b_i+1}'] - - # Loop over outputs - mean_pred = {} - std_pred = {} - for output, values in model_dict.items(): - - mean = np.empty((len(samples), len(values))) - std = np.empty((len(samples), len(values))) - idx = 0 - for in_key, InIdxValues in values.items(): - - # Prediction with GPE - if self.meta_model_type.lower() == 'gpe': - X_T = self.x_scaler[f'b_{b_i+1}'][output].transform(samples) - gp = self.gp_poly[f'b_{b_i+1}'][output][in_key] - y_mean, y_std = gp.predict(X_T, return_std=True) - - else: - # Prediction with PCE - # Assemble Psi matrix - basis = self.basis_dict[f'b_{b_i+1}'][output][in_key] - psi = self.create_psi(basis, univ_p_val) - - # Prediction - if self.bootstrap_method != 'fast' or b_i == 0: - # with error bar, i.e. use clf_poly - clf_poly = self.clf_poly[f'b_{b_i+1}'][output][in_key] - try: - y_mean, y_std = clf_poly.predict( - psi, return_std=True - ) - except TypeError: - y_mean = clf_poly.predict(psi) - y_std = np.zeros_like(y_mean) - else: - # without error bar - coeffs = self.coeffs_dict[f'b_{b_i+1}'][output][in_key] - y_mean = np.dot(psi, coeffs) - y_std = np.zeros_like(y_mean) - - mean[:, idx] = y_mean - std[:, idx] = y_std - idx += 1 - - # Save predictions for each output - if self.dim_red_method.lower() == 'pca': - PCA = self.pca[f'b_{b_i+1}'][output] - mean_pred[output] = PCA.inverse_transform(mean) - std_pred[output] = np.zeros(mean.shape) - else: - mean_pred[output] = mean - std_pred[output] = std - - # Save predictions for each bootstrap iteration - mean_pred_b[b_i] = mean_pred - std_pred_b[b_i] = std_pred - - # Change the order of nesting - mean_pred_all = {} - for i in sorted(mean_pred_b): - for k, v in mean_pred_b[i].items(): - if k not in mean_pred_all: - mean_pred_all[k] = [None] * len(mean_pred_b) - mean_pred_all[k][i] = v - - # Compute the moments of predictions over the predictions - for output in self.out_names: - # Only use bootstraps with finite values - finite_rows = np.isfinite( - mean_pred_all[output]).all(axis=2).all(axis=1) - outs = np.asarray(mean_pred_all[output])[finite_rows] - # Compute mean - mean_pred[output] = np.mean(outs, axis=0) - # Compute standard deviation - if self.n_bootstrap_itrs > 1: - std_pred[output] = np.std(outs, axis=0) - else: - std_pred[output] = std_pred_b[b_i][output] - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - def create_model_error(self, X, y, Model, name='Calib'): - """ - Fits a GPE-based model error. - - Parameters - ---------- - X : array of shape (n_outputs, n_inputs) - Input array. It can contain any forcing inputs or coordinates of - extracted data. - y : array of shape (n_outputs,) - The model response for the MAP parameter set. - name : str, optional - Calibration or validation. The default is `'Calib'`. - - Returns - ------- - self: object - Self object. - - """ - outputNames = self.out_names - self.errorRegMethod = 'GPE' - self.errorclf_poly = self.auto_vivification() - self.errorScale = self.auto_vivification() - - # Read data - # TODO: do this call outside the metamodel - MeasuredData = Model.read_observation(case=name) - - # Fitting GPR based bias model - for out in outputNames: - nan_idx = ~np.isnan(MeasuredData[out]) - # Select data - try: - data = MeasuredData[out].values[nan_idx] - except AttributeError: - data = MeasuredData[out][nan_idx] - - # Prepare the input matrix - scaler = MinMaxScaler() - delta = data # - y[out][0] - BiasInputs = np.hstack((X[out], y[out].reshape(-1, 1))) - X_S = scaler.fit_transform(BiasInputs) - gp = self.gaussian_process_emulator(X_S, delta) - - self.errorScale[out]["y_1"] = scaler - self.errorclf_poly[out]["y_1"] = gp - - return self - - # ------------------------------------------------------------------------- - def eval_model_error(self, X, y_pred): - """ - Evaluates the error model. - - Parameters - ---------- - X : array - Inputs. - y_pred : dict - Predictions. - - Returns - ------- - mean_pred : dict - Mean predition of the GPE-based error model. - std_pred : dict - standard deviation of the GPE-based error model. - - """ - mean_pred = {} - std_pred = {} - - for Outkey, ValuesDict in self.errorclf_poly.items(): - - pred_mean = np.zeros_like(y_pred[Outkey]) - pred_std = np.zeros_like(y_pred[Outkey]) - - for Inkey, InIdxValues in ValuesDict.items(): - - gp = self.errorclf_poly[Outkey][Inkey] - scaler = self.errorScale[Outkey][Inkey] - - # Transform Samples using scaler - for j, pred in enumerate(y_pred[Outkey]): - BiasInputs = np.hstack((X[Outkey], pred.reshape(-1, 1))) - Samples_S = scaler.transform(BiasInputs) - y_hat, y_std = gp.predict(Samples_S, return_std=True) - pred_mean[j] = y_hat - pred_std[j] = y_std - # pred_mean[j] += pred - - mean_pred[Outkey] = pred_mean - std_pred[Outkey] = pred_std - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - class auto_vivification(dict): - """ - Implementation of perl's AutoVivification feature. - - Source: https://stackoverflow.com/a/651879/18082457 - """ - - def __getitem__(self, item): - try: - return dict.__getitem__(self, item) - except KeyError: - value = self[item] = type(self)() - return value - - # ------------------------------------------------------------------------- - def copy_meta_model_opts(self): - """ - This method is a convinient function to copy the metamodel options. - - Returns - ------- - new_MetaModelOpts : object - The copied object. - - """ - # TODO: what properties should be moved to the new object? - new_MetaModelOpts = copy.deepcopy(self) - new_MetaModelOpts.input_obj = self.input_obj#InputObj - new_MetaModelOpts.InputSpace = self.InputSpace - #new_MetaModelOpts.InputSpace.meta_Model = 'aPCE' - #new_MetaModelOpts.InputSpace.InputObj = self.input_obj - #new_MetaModelOpts.InputSpace.ndim = len(self.input_obj.Marginals) - new_MetaModelOpts.n_params = len(self.input_obj.Marginals) - #new_MetaModelOpts.InputSpace.hdf5_file = None - - return new_MetaModelOpts - - # ------------------------------------------------------------------------- - def __select_degree(self, ndim, n_samples): - """ - Selects degree based on the number of samples and parameters in the - sequential design. - - Parameters - ---------- - ndim : int - Dimension of the parameter space. - n_samples : int - Number of samples. - - Returns - ------- - deg_array: array - Array containing the arrays. - - """ - # Define the deg_array - max_deg = np.max(self.pce_deg) - min_Deg = np.min(self.pce_deg) - - # TODO: remove the options for sequential? - #nitr = n_samples - self.InputSpace.n_init_samples - - # Check q-norm - if not np.isscalar(self.pce_q_norm): - self.pce_q_norm = np.array(self.pce_q_norm) - else: - self.pce_q_norm = np.array([self.pce_q_norm]) - - def M_uptoMax(maxDeg): - n_combo = np.zeros(maxDeg) - for i, d in enumerate(range(1, maxDeg+1)): - n_combo[i] = math.factorial(ndim+d) - n_combo[i] /= math.factorial(ndim) * math.factorial(d) - return n_combo - - deg_new = max_deg - #d = nitr if nitr != 0 and self.n_params > 5 else 1 - # d = 1 - # min_index = np.argmin(abs(M_uptoMax(max_deg)-ndim*n_samples*d)) - # deg_new = range(1, max_deg+1)[min_index] - - if deg_new > min_Deg and self.pce_reg_method.lower() != 'fastard': - deg_array = np.arange(min_Deg, deg_new+1) - else: - deg_array = np.array([deg_new]) - - return deg_array - - def generate_polynomials(self, max_deg=None): - # Check for InputSpace - if not hasattr(self, 'InputSpace'): - raise AttributeError('Generate or add InputSpace before generating polynomials') - - ndim = self.InputSpace.ndim - # Create orthogonal polynomial coefficients if necessary - if (self.meta_model_type.lower()!='gpe') and max_deg is not None:# and self.input_obj.poly_coeffs_flag: - self.polycoeffs = {} - for parIdx in tqdm(range(ndim), ascii=True, - desc="Computing orth. polynomial coeffs"): - poly_coeffs = apoly_construction( - self.InputSpace.raw_data[parIdx], - max_deg - ) - self.polycoeffs[f'p_{parIdx+1}'] = poly_coeffs - else: - raise AttributeError('MetaModel cannot generate polynomials in the given scenario!') - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - - # Check if its truly a pce-surrogate - if self.meta_model_type.lower() == 'gpe': - raise AttributeError('Moments can only be computed for pce-type surrogates') - - outputs = self.out_names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(self.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = self.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = self.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = self.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if self.dim_red_method.lower() == 'pca': - PCA = self.pca[f'b_{b_i+1}'][output] - means[output] = PCA.inverse_transform(pce_mean) - stds[output] = PCA.inverse_transform(np.sqrt(pce_var)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/examples/umbridge_tsunamitutorial - Copy/test_umbridge.py b/examples/umbridge_tsunamitutorial - Copy/test_umbridge.py deleted file mode 100644 index b83175cf7..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/test_umbridge.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Mon Dec 11 14:03:23 2023 - -Example and test for using umbridge with bayesvalidrox. -Example model is the tsunami model by -docker run -it -p 4242:4242 -v ~/tsunami_output:/output linusseelinger/model-exahype-tsunami - -@author: rkohlhaas -""" - -import joblib -import numpy as np -import umbridge - -import bayesvalidrox as bv - - -if __name__ == '__main__': - - # This model has 2 inputs and four outputs - n_prior_sample = 1000 - priors = bv.Input() - priors.add_marginals() - priors.Marginals[0].name = 'x' - priors.Marginals[0].input_data = np.random.uniform(50,150,n_prior_sample) - priors.add_marginals() - priors.Marginals[1].name = 'y' - priors.Marginals[1].input_data = np.random.uniform(50,150,n_prior_sample) - - # Define the model - level 0 - model0 = bv.PyLinkForwardModel() - #model.link_type = 'Function' - model0.link_type = 'umbridge' - model0.py_file = 'tsunami_model' - model0.name = 'tsunami_model' - model0.Output.names = ['T1', 'T2', 'H1', 'H2'] - #model.observations = data_dict1_times - - # Define the model - level 1 - model1 = bv.PyLinkForwardModel() - #model.link_type = 'Function' - model1.link_type = 'umbridge' - model1.py_file = 'tsunami_model1' - model1.name = 'tsunami_model1' - model1.Output.names = ['T1', 'T2', 'H1', 'H2'] - #model.observations = data_dict1_times - - # Create the surrogate - surrogate_opts0 = bv.MetaModel(priors, model0) - - # Select your metamodel method - surrogate_opts0.meta_model_type = 'aPCE' - surrogate_opts0.pce_reg_method = 'FastARD' - surrogate_opts0.pce_deg = np.arange(1, 5) - surrogate_opts0.pce_q_norm = 0.4#1.0 - - # Select your metamodel method - surrogate_opts0.add_ExpDesign() - surrogate_opts0.ExpDesign.method = 'normal' - surrogate_opts0.ExpDesign.n_init_samples = 50 - surrogate_opts0.ExpDesign.sampling_method = 'latin-hypercube' - surrogate0 = surrogate_opts0.create_metamodel() - print('Surrogate 0 completed') - print('') - - # Create the surrogate - surrogate_opts1 = bv.MetaModel(priors, model1) - - # Select your metamodel method - surrogate_opts1.meta_model_type = 'aPCE' - surrogate_opts1.pce_reg_method = 'FastARD' - surrogate_opts1.pce_deg = np.arange(1, 5) - surrogate_opts1.pce_q_norm = 0.4#1.0 - - # Select your metamodel method - surrogate_opts1.add_ExpDesign() - surrogate_opts1.ExpDesign.method = 'normal' - surrogate_opts1.ExpDesign.n_init_samples = 50 - surrogate_opts1.ExpDesign.sampling_method = 'latin-hypercube' - surrogate1 = surrogate_opts1.create_metamodel() - print('Surrogate 1 completed') - print('') - - # Save surrogate - with open('tsunami0.pk1', 'wb') as output: - joblib.dump(surrogate0, output, 2) - - # Save surrogate - with open('tsunami1.pk1', 'wb') as output: - joblib.dump(surrogate1, output, 2) - - if 0: - # Post processing - L2_PostPCE = bv.PostProcessing(surrogate1) - L2_PostPCE.plot_moments(plot_type='line') - # Plot to check validation visually. - L2_PostPCE.valid_metamodel(n_samples=1) - # Compute and print RMSE error - L2_PostPCE.check_accuracy(n_samples=300) - total_sobol = L2_PostPCE.sobol_indices() - - # Test BayesInference - import copy - from tsunami_model import tsunami_model - true_data = tsunami_model(np.array([[90.0,60.0]])) - model0.observations = true_data - model1.observations = true_data - true_data_nox = copy.deepcopy(true_data) - true_data_nox.pop('x_values') - - # Test surrogate output shape - mean, std = surrogate1.eval_metamodel(np.array([[90.0,60.0]])) - - # Bayesian Inference - if 0: - # Set uncertainty - import pandas as pd - obsData = pd.DataFrame(true_data_nox, columns=model0.Output.names) - DiscrepancyOpts = bv.Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = (obsData*0.15)**2 - - # Parameter estimation / single model validation via TOM - BayesOpts = bv.BayesInference(surrogate1) - BayesOpts.emulator= True - BayesOpts.plot_post_pred = True - #BayesOpts.inference_method = 'rejection' - BayesOpts.Discrepancy = DiscrepancyOpts - BayesOpts.bootstrap = True - BayesOpts.n_bootstrap_itrs = 10 - BayesOpts.bootstrap_noise = 0.05 - BayesOpts.out_dir = '' - - # Set the MCMC parameters - import emcee - BayesOpts.inference_method = "MCMC" - BayesOpts.mcmc_params = { - 'n_steps': 1e3, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'multiprocessing': False, - 'verbose': False - } - - Bayes = BayesOpts.create_inference() - # Pkl the inference results - with open(f'Bayes_{model0.name}.pkl', 'wb') as output: - joblib.dump(Bayes, output, 2) - - # Model Comparison - if 1: - # Set the models - meta_models = { - "M0": surrogate0, - "M1": surrogate1, - } - - # BME Bootstrap options - opts_bootstrap = { - "bootstrap": True, - "n_samples": 1000, - "Discrepancy": DiscrepancyOpts, - "emulator": True, - "plot_post_pred": False - } - - # Run model comparison - BayesOpts = bv.BayesModelComparison( - justifiability=True, - n_bootstarp=10, - just_n_meas=2 - ) - output_dict = BayesOpts.create_model_comparison( - meta_models, - opts_bootstrap - ) - - import pickle as pkl - # save model comparison results - with open('ModelComparison.pkl', 'wb') as f: - pkl.dump(output_dict, f) - \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial - Copy/test_umbridge_testmodel.py b/examples/umbridge_tsunamitutorial - Copy/test_umbridge_testmodel.py deleted file mode 100644 index 68b288f0a..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/test_umbridge_testmodel.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Mon Dec 11 14:03:23 2023 - -Example and test for using umbridge with bayesvalidrox. -Example model is the tsunami model by -docker run -it -p 4242:4242 -v ~/tsunami_output:/output linusseelinger/model-exahype-tsunami - -@author: rkohlhaas -""" - -import joblib -import numpy as np -import umbridge -import bayesvalidrox as bv - -from bayesvalidrox.pylink.pylink import PyLinkForwardModel -from bayesvalidrox.surrogate_models.inputs import Input -from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns -from bayesvalidrox.surrogate_models.surrogate_models import MetaModel -from bayesvalidrox.post_processing.post_processing import PostProcessing -from bayesvalidrox.surrogate_models.engine import Engine - - -if __name__ == '__main__': - - # This model has 2 inputs and four outputs - n_prior_sample = 1000 - priors = bv.Input() - priors.add_marginals() - priors.Marginals[0].name = 'x' - priors.Marginals[0].input_data = np.random.uniform(50,150,n_prior_sample) - priors.add_marginals() - priors.Marginals[1].name = 'y' - priors.Marginals[1].input_data = np.random.uniform(50,150,n_prior_sample) - - # Define the model - level 0 - model = PyLinkForwardModel() - model.link_type = 'Function' - model.py_file = 'testmodel' - model.name = 'testmodel' - #model.link_type = 'um-bridge' - #model.host = 'http://testmodel.linusseelinger.de' - #model.modelparams = {} - #model.name = 'testmodel' - model.Output.names = ['y'] - #model.output_type = 'single-valued' - - # Create the surrogate - surrogate_opts = MetaModel(priors) - - # Select your metamodel method - surrogate_opts.meta_model_type = 'aPCE' - surrogate_opts.pce_reg_method = 'FastARD' - surrogate_opts.pce_deg = np.arange(1, 5) - surrogate_opts.pce_q_norm = 0.4 - - # Select your metamodel method - ExpDesign = ExpDesigns(priors) - ExpDesign.n_init_samples = 50 - ExpDesign.sampling_method = 'latin-hypercube' - - engine = Engine(surrogate_opts, model, ExpDesign) - engine.start_engine() - engine.train_normal(parallel = False) - print('Surrogate completed') - print('') - - # Save surrogate - with open('testmodel.pk1', 'wb') as output: - joblib.dump(engine.MetaModel, output, 2) - - # Post processing - L2_PostPCE = PostProcessing(engine) - L2_PostPCE.plot_moments(plot_type='line') - # Plot to check validation visually. - L2_PostPCE.valid_metamodel(n_samples=1) - # Compute and print RMSE error - L2_PostPCE.check_accuracy(n_samples=300) - total_sobol = L2_PostPCE.sobol_indices() diff --git a/examples/umbridge_tsunamitutorial - Copy/testmodel.py b/examples/umbridge_tsunamitutorial - Copy/testmodel.py deleted file mode 100644 index e4da164cf..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/testmodel.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Runs the umbridge command for the tsunami model - -@author: Rebecca Kohlhaas -""" -import umbridge -import numpy as np - -def testmodel(params): - model = umbridge.HTTPModel('http://testmodel.linusseelinger.de', 'forward') - - out = np.array(model([[11.0]])) - - return {'y':out,'x_values':[0]} - - - \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial - Copy/tsunami_model.py b/examples/umbridge_tsunamitutorial - Copy/tsunami_model.py deleted file mode 100644 index 7f8e54170..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/tsunami_model.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Runs the umbridge command for the tsunami model - -@author: Rebecca Kohlhaas -""" -import umbridge -import numpy as np - -def tsunami_model(params): - model = umbridge.HTTPModel('http://localhost:4242', 'forward') - out = np.array(model(np.ndarray.tolist(params), {'level':0})) - - return {'T1':out[:,0], 'T2':out[:,1], 'H1':out[:,2], 'H2':out[:,3], - 'x_values':[0]} - - - \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial - Copy/tsunami_model1.py b/examples/umbridge_tsunamitutorial - Copy/tsunami_model1.py deleted file mode 100644 index 3e56801e5..000000000 --- a/examples/umbridge_tsunamitutorial - Copy/tsunami_model1.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Runs the umbridge command for the tsunami model - -@author: Rebecca Kohlhaas -""" -import umbridge -import numpy as np - -def tsunami_model1(params): - model = umbridge.HTTPModel('http://localhost:4242', 'forward') - out = np.array(model(np.ndarray.tolist(params), {'level':1})) - - return {'T1': out[:,0], 'T2': out[:,1], 'H1': out[:,2], 'H2': out[:,3], 'x_values': [0]} - - \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/__init__.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/__init__.py deleted file mode 100644 index 8e865af80..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -__version__ = "0.0.5" - -from .pylink.pylink import PyLinkForwardModel -from .surrogate_models.surrogate_models import MetaModel -#from .surrogate_models.meta_model_engine import MetaModelEngine -from .surrogate_models.engine import Engine -from .surrogate_models.inputs import Input -from .post_processing.post_processing import PostProcessing -from .bayes_inference.bayes_inference import BayesInference -from .bayes_inference.bayes_model_comparison import BayesModelComparison -from .bayes_inference.discrepancy import Discrepancy - -__all__ = [ - "__version__", - "PyLinkForwardModel", - "Input", - "Discrepancy", - "MetaModel", - #"MetaModelEngine", - "Engine", - "PostProcessing", - "BayesInference", - "BayesModelComparison" - ] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index beaab3c798a63fcfbc361982388fdf10830a787e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmZWn%Wl*#6m>Gm%w#4reNc%7iwY!=W|MT&9YUy-LJ>tHAvWGvZenJv`VrYl%kVku z_$5oMSn&(2uy5%A!BI}mJ-L3IBkS30g8WGCJ!aoxguaL3@8LD{+`qQ*P$P`$sE$P> zV;o0;55zzwI02rBR1WbFcq&G6jK{!-B9jw50X`B_nd2PzSj^-c&w*!RNABX?2(3^( z`4Zv1diowM^3Ul}aa0`ti2Ux0$n7sTZ@IcU)8>Yn`a;)Ccs09VExjvtw#7@e;)?nI z>A7mU)|2^C+jePm#jNFO6_gXYVfI{oWQM6KG#`KhtG&>&p@v(nygohUwlb`ts@g0v zHznkn8OyaI#DtJc8XyZW2#^FA1{ehxdw93lHz92|Yc|5$C~iM6-95COF?vN?Mr811 zi@pHsx<`Gvkly|69Kygd?CtLV*T_Q*77pqT8y^K}wpkRt8jkJ`FGD<p-{n*EYVhWs z^wi&7V1rcK5FrEipx<2o$ra*rBSNSUgnUKjAVe47=bKWhwyeqz)~8;YE4>zLN^N<n zt4=c2+VT}|Uw4<~nb0>&+OA93=b8#$8~v#y-UM$6@tM2vQ-8EhuxH^`*|2;P<#8VU H^TfXZNO$QO diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 522dab9e775d3ce6f28ac1ac7102d1843b71523e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmZuvO>5LZ7@q7$vb)(`Yw-(uC|-nB3_U1_iU(V@1uF~UB?N}qWV#(XA7Lh`T~GTj zyn7KZ`d4yXa$4}@ZK1cGoEf{7geEV~Jnxe?Gw=H(-v@&p(AQ-C6K^#E_-&H))wm?* zQj@PB0U=17q(L3l2pf*!P1<Cwuw{9RwwW8cmba<LI$_6hmv&h%>{;$npY_AO<sCX; z!*FPMm)>9-;f4dIAnAQ`!kdZz5sdm@+B?Bc@br(P&mTGE=6Lp=@RPSfenv7m6bYtU z?H=L`trPbRpAwF>+&<uGo@p{13zdzfh_O<HPmS^#&9FM)M_6JWo8ntmv777)mLf@% z;9B?hh>9gn5szo1Zs|jKilrigLnyUdK)MEugR*6yZNM|oG0@fUVYDfIy_SP?Ms@eW zzs0^@-dDMlVu~^hnHfg~b;0gi-mS|4wsYD8uX#$$?8<gmZl`*Fm|htW)N<QzxjiwS zK(aO^sO5H`@<C0#tg^ks_{upuc)3+CPX3!|Ju5v35v36R0O#5vaKUz;N1v2-IFcvg zm>wgfqCFAk4D(Dy??|?vPa?bPDWW8i;w-{vh@}*(C}$H%k|~Cn$~j^r%QGPfqP2Rc zM<f}9`ZHW~Uh2kkieJfl`gHS?sb3maO~-MT!`pLz2_6^KSb%3mHJ0E}QH=$7SX5&H gUKG{1PT4O&B^KaGQH@p0_uUm(!`w5syrX;m3*dMy2><{9 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index d5ebaedb4c8b77b5d7dbd0a6945f09079d8b10e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmZWm&x_MQ6i(8gY18gn1P>k-JqSG{?6T}dM8vK_!Ae02G6aU%%(M=jnS`07Zujif zf5Mypf>*&mqE}D;3!Z#4b*sh+`SQIlZ{E!N9vKXJ9;^>vzS3`j=Y6-q-wQPF8N8+d zpdRw5PXpo000q9~4bhNI)O5TlTC$DWj<-Zdc2U>ywg_bp^&IbrzKl@hcvlSM5Dgs< z#gRNl$G*4nXz!Dc?$G`lZyepUPLtE*;)f5XkNw?fzJ0~j`em-)6HRA1WdhW2#!7M< z936reYQ+_U|E;MisuIX>o||&6^Nbn8)ygW*$(EU^S~AU4W|Qwa#Z{Z+vLKq9T!G%d z<R;UsAS&CA!(AWa4bz6_3S(_e(k%<2g@%Qug|>x`g)YGB@km>@(V*B0Xd~Hw+;;T9 zR9fdNQZg)UUnZ#wt}c35mlFxy@AqKlT6Slnd;cYJYlCqYMJEMVfs2C|NiB9)M<-X- z9?Wn3Nouj{4Lz!<zq4E$I6Ii=JV5vB$@Gt}&c0m-V<H5`pFJH}>n!~IIC-2d3^<-@ zw$9H|TFL5qkFkU?Ya;j!DPbP*l995~ES^s0@#SK+czd2)q*oOeG|nVhvy>EtNO@MI z3?P=vbjcMFnwd(JW^?uq+bmtF)LnH0m8s6JQw%=v5@Q(KuKNVKs|0&$M{h;|%^>ps Gd4gX;Q2|8& diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__init__.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__init__.py deleted file mode 100644 index df8d93568..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- - -from .bayes_inference import BayesInference -from .mcmc import MCMC - -__all__ = [ - "BayesInference", - "MCMC" - ] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 430b9885a8c8bd658da24bbc4ac1a6a0a74f69e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmYjNJ5B>J5cMx4LJ1UHffU=|3m}9D;!`9-LNwc0j&0Z#_8Qq<AV=W{T*)mJSD-+Q z7ez4AJilkZnbFwKX1fT29n8%eoF7H}4+7#8G9ChGq_IT~*BBR0EOE4^z^P^rq-J__ zi>jSZ4Au(gy)(Hn@w&S=!F0;N4O=dji%?ny3b3k1d4F9@qTRZN*UX%9YVhQ-5Yk#9 z-ccBr!UA74cU|I&-$fH550AdFjg*m}d(}JBrN}Sabk(o<h4n8tGBtb{^DJ$vgMa;1 ie?z$d-X<ZAo;G=M?7Z%+IVo$z@;g&9#e@<(`ThY0HBIvX diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b22adcbe445e7b81edc8dac6cb9ba03678c61ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmZ3^%ge<81T4a;sWXA}V-N=hn4pZ$YCy(xh7^Vr#vF!R#wbQc5SuB7DVI5l8OUZ% zVM%9-Vo6~QX3%7N$p}=e$#{#;DX}uO*fTFJwJ0?&ITa|v;_K||T*M5NE@A-^ewwVe z_>(}2;xl2Yz_Pbka+7nD!D?=?$Hyn;<iy9XWcUo!!tg81*(xTqIJKxarYJi<BPSy< zu{g#hKe;qFHLs*N#yzvdqckbTEhoP`Ah9GP25fp+VoqjCQGNx4hp;Oq9>~rtiI3MS zsQkrYlbfGXnv-f*#0|6t<b`58An}2jk&*EO8v~=x1qN+obb~?c0xANkVimo?!u5fb PnVYSF9R!OwfkprT7ZzXr diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 287257c1ca9b3f3a6d7e176e006ad432f8c685bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmYk1K}rKL6ow}=(^{m}OStJ`3Ps$Ah&XP#s0cD3Lm;G+HyWDE49TRlE<J%4@Bm)H zt+$x1E3e=}d}$GVkT3tA{CT|a(P%%wdU|^o&$xeh^S?qg7r5*ZLIi@SK$DyhuR|5; zD34G_BEApvSoCg#asQKGbWFN~OTGa+t4c6X6@Vx4Je{Y;w=@yrdfe*{7e2(~Z)$s+ z$GXtPHq-4f#+731H86eu(BtbRJ*AliW2u2<J*C2Fx85<)vI4`EeB`aHtE2?pIs?fp zy-BXJd3JX^IiU+Dl}HNBmq2;bC@PDF0wU2REoH@(0qaz2SJMaPQ^r+vJLw8L3sbLm h?r(0&P|KFFNwet&XSx<n!MXpX9Uz8e7=<MK{sG1iY1;q* diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-310.pyc deleted file mode 100644 index e89dfb5e6b3a873ac2f40dcc2084aa52caaedcd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31276 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-311.pyc deleted file mode 100644 index f059bde3e71ad6231b8a26e02849bd6298052797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60952 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_inference.cpython-39.pyc deleted file mode 100644 index a37330680c29bbfdba5a1bfd98041dda24957604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31419 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-310.pyc deleted file mode 100644 index 57322b839ff7d50ea32d3b36ce011c09cf91e232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15645 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-311.pyc deleted file mode 100644 index 37d75830876e7d6e44eb45cc242d1f6636c8d2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27157 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%0A5<{ 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 Kk9o_6!v6ugi7!zA diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/bayes_model_comparison.cpython-39.pyc deleted file mode 100644 index b58f792ac36504c702205afc34228600f9bbba77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15716 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-310.pyc deleted file mode 100644 index bc71688a4cae4f74ec3a67838fca659881c520c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3806 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 I`#)>`7Zrzs-v9sr diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-311.pyc deleted file mode 100644 index 4f1c5c8635a64bcf45f856426c8597e67374b985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4661 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 BCMo~` diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/discrepancy.cpython-39.pyc deleted file mode 100644 index f154800917aeaef9c499abf13d47fcca6ffc639b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3869 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 C(w;v6 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-310.pyc deleted file mode 100644 index 1d2122246d54ec5697803cbce28900e077b2306a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18924 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 W6YnAs1G%l!A8`@AH@FHoxc@Kt+VTSc diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-311.pyc deleted file mode 100644 index 4e0ec7bf61abc72bc8218d603f606f1eca2cc9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35893 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 IcNqr$ACvc7^8f$< diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/__pycache__/mcmc.cpython-39.pyc deleted file mode 100644 index b9fe4689524895c2149048d489b22b08e85026df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18959 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	o4MB>fKYEXpNq!HIDoLFs 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_inference.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_inference.py deleted file mode 100644 index 1898a8ae6..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_inference.py +++ /dev/null @@ -1,1532 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import os -import copy -import pandas as pd -from tqdm import tqdm -from scipy import stats -import scipy.linalg as spla -import joblib -import seaborn as sns -import corner -import h5py -import multiprocessing -import gc -from sklearn.metrics import mean_squared_error, r2_score -from sklearn import preprocessing -from matplotlib.patches import Patch -import matplotlib.lines as mlines -from matplotlib.backends.backend_pdf import PdfPages -import matplotlib.pylab as plt - -from .mcmc import MCMC - -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class BayesInference: - """ - A class to perform Bayesian Analysis. - - - Attributes - ---------- - MetaModel : obj - Meta model object. - discrepancy : obj - The discrepancy object for the sigma2s, i.e. the diagonal entries - of the variance matrix for a multivariate normal likelihood. - name : str, optional - The type of analysis, either calibration (`Calib`) or validation - (`Valid`). The default is `'Calib'`. - emulator : bool, optional - Analysis with emulator (MetaModel). The default is `True`. - bootstrap : bool, optional - Bootstrap the analysis. The default is `False`. - req_outputs : list, optional - The list of requested output to be used for the analysis. - The default is `None`. If None, all the defined outputs for the model - object is used. - selected_indices : dict, optional - A dictionary with the selected indices of each model output. The - default is `None`. If `None`, all measurement points are used in the - analysis. - samples : array of shape (n_samples, n_params), optional - The samples to be used in the analysis. The default is `None`. If - None the samples are drawn from the probablistic input parameter - object of the MetaModel object. - n_samples : int, optional - Number of samples to be used in the analysis. The default is `500000`. - If samples is not `None`, this argument will be assigned based on the - number of samples given. - measured_data : dict, optional - A dictionary containing the observation data. The default is `None`. - if `None`, the observation defined in the Model object of the - MetaModel is used. - inference_method : str, optional - A method for approximating the posterior distribution in the Bayesian - inference step. The default is `'rejection'`, which stands for - rejection sampling. A Markov Chain Monte Carlo sampler can be simply - selected by passing `'MCMC'`. - mcmc_params : dict, optional - A dictionary with args required for the Bayesian inference with - `MCMC`. The default is `None`. - - Pass the mcmc_params like the following: - - >>> mcmc_params:{ - 'init_samples': None, # initial samples - 'n_walkers': 100, # number of walkers (chain) - 'n_steps': 100000, # number of maximum steps - 'n_burn': 200, # number of burn-in steps - 'moves': None, # Moves for the emcee sampler - 'multiprocessing': False, # multiprocessing - 'verbose': False # verbosity - } - The items shown above are the default values. If any parmeter is - not defined, the default value will be assigned to it. - bayes_loocv : bool, optional - Bayesian Leave-one-out Cross Validation. The default is `False`. If - `True`, the LOOCV procedure is used to estimate the bayesian Model - Evidence (BME). - n_bootstrap_itrs : int, optional - Number of bootstrap iteration. The default is `1`. If bayes_loocv is - `True`, this is qualt to the total length of the observation data - set. - perturbed_data : array of shape (n_bootstrap_itrs, n_obs), optional - User defined perturbed data. The default is `[]`. - bootstrap_noise : float, optional - A noise level to perturb the data set. The default is `0.05`. - just_analysis : bool, optional - Justifiability analysis. The default is False. - valid_metrics : list, optional - List of the validation metrics. The following metrics are supported: - - 1. log_BME : logarithm of the Bayesian model evidence - 2. KLD : Kullback-Leibler Divergence - 3. inf_entropy: Information entropy - The default is `['log_BME']`. - plot_post_pred : bool, optional - Plot posterior predictive plots. The default is `True`. - plot_map_pred : bool, optional - Plot the model outputs vs the metamodel predictions for the maximum - a posteriori (defined as `max_a_posteriori`) parameter set. The - default is `False`. - max_a_posteriori : str, optional - Maximum a posteriori. `'mean'` and `'mode'` are available. The default - is `'mean'`. - corner_title_fmt : str, optional - Title format for the posterior distribution plot with python - package `corner`. The default is `'.2e'`. - - """ - - def __init__(self, engine, MetaModel = None, discrepancy=None, emulator=True, - name='Calib', bootstrap=False, req_outputs=None, - selected_indices=None, samples=None, n_samples=100000, - measured_data=None, inference_method='rejection', - mcmc_params=None, bayes_loocv=False, n_bootstrap_itrs=1, - perturbed_data=[], bootstrap_noise=0.05, just_analysis=False, - valid_metrics=['BME'], plot_post_pred=True, - plot_map_pred=False, max_a_posteriori='mean', - corner_title_fmt='.2e'): - - self.engine = engine - self.MetaModel = engine.MetaModel - self.Discrepancy = discrepancy - self.emulator = emulator - self.name = name - self.bootstrap = bootstrap - self.req_outputs = req_outputs - self.selected_indices = selected_indices - self.samples = samples - self.n_samples = n_samples - self.measured_data = measured_data - self.inference_method = inference_method - self.mcmc_params = mcmc_params - self.perturbed_data = perturbed_data - self.bayes_loocv = bayes_loocv - self.n_bootstrap_itrs = n_bootstrap_itrs - self.bootstrap_noise = bootstrap_noise - self.just_analysis = just_analysis - self.valid_metrics = valid_metrics - self.plot_post_pred = plot_post_pred - self.plot_map_pred = plot_map_pred - self.max_a_posteriori = max_a_posteriori - self.corner_title_fmt = corner_title_fmt - - # ------------------------------------------------------------------------- - def create_inference(self): - """ - Starts the inference. - - Returns - ------- - BayesInference : obj - The Bayes inference object. - - """ - - # Set some variables - MetaModel = self.MetaModel - Model = self.engine.Model - n_params = MetaModel.n_params - output_names = Model.Output.names - par_names = self.engine.ExpDesign.par_names - - # If the prior is set by the user, take it. - if self.samples is None: - self.samples = self.engine.ExpDesign.generate_samples( - self.n_samples, 'random') - else: - try: - samples = self.samples.values - except AttributeError: - samples = self.samples - - # Take care of an additional Sigma2s - self.samples = samples[:, :n_params] - - # Update number of samples - self.n_samples = self.samples.shape[0] - - # ---------- Preparation of observation data ---------- - # Read observation data and perturb it if requested. - if self.measured_data is None: - self.measured_data = Model.read_observation(case=self.name) - # Convert measured_data to a data frame - if not isinstance(self.measured_data, pd.DataFrame): - self.measured_data = pd.DataFrame(self.measured_data) - - # Extract the total number of measurement points - if self.name.lower() == 'calib': - self.n_tot_measurement = Model.n_obs - else: - self.n_tot_measurement = Model.n_obs_valid - - # Find measurement error (if not given) for post predictive plot - if not hasattr(self, 'measurement_error'): - if isinstance(self.Discrepancy, dict): - Disc = self.Discrepancy['known'] - else: - Disc = self.Discrepancy - if isinstance(Disc.parameters, dict): - self.measurement_error = {k: np.sqrt(Disc.parameters[k]) for k - in Disc.parameters.keys()} - else: - try: - self.measurement_error = np.sqrt(Disc.parameters) - except TypeError: - pass - - # ---------- Preparation of variance for covariance matrix ---------- - # Independent and identically distributed - total_sigma2 = dict() - opt_sigma_flag = isinstance(self.Discrepancy, dict) - opt_sigma = None - for key_idx, key in enumerate(output_names): - - # Find opt_sigma - if opt_sigma_flag and opt_sigma is None: - # Option A: known error with unknown bias term - opt_sigma = 'A' - known_discrepancy = self.Discrepancy['known'] - self.Discrepancy = self.Discrepancy['infer'] - sigma2 = np.array(known_discrepancy.parameters[key]) - - elif opt_sigma == 'A' or self.Discrepancy.parameters is not None: - # Option B: The sigma2 is known (no bias term) - if opt_sigma == 'A': - sigma2 = np.array(known_discrepancy.parameters[key]) - else: - opt_sigma = 'B' - sigma2 = np.array(self.Discrepancy.parameters[key]) - - elif not isinstance(self.Discrepancy.InputDisc, str): - # Option C: The sigma2 is unknown (bias term including error) - opt_sigma = 'C' - self.Discrepancy.opt_sigma = opt_sigma - n_measurement = self.measured_data[key].values.shape - sigma2 = np.zeros((n_measurement[0])) - - total_sigma2[key] = sigma2 - - self.Discrepancy.opt_sigma = opt_sigma - self.Discrepancy.total_sigma2 = total_sigma2 - - # If inferred sigma2s obtained from e.g. calibration are given - try: - self.sigma2s = self.Discrepancy.get_sample(self.n_samples) - except: - pass - - # ---------------- Bootstrap & TOM -------------------- - if self.bootstrap or self.bayes_loocv or self.just_analysis: - if len(self.perturbed_data) == 0: - # zero mean noise Adding some noise to the observation function - self.perturbed_data = self._perturb_data( - self.measured_data, output_names - ) - else: - self.n_bootstrap_itrs = len(self.perturbed_data) - - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() != 'calib': - # Select posterior mean as MAP - MAP_theta = self.samples.mean(axis=0).reshape((1, n_params)) - # MAP_theta = stats.mode(self.samples,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=MAP_theta) - - # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) - - # ----------------------------------------------------- - # ----- Loop over the perturbed observation data ------ - # ----------------------------------------------------- - # Initilize arrays - logLikelihoods = np.zeros((self.n_samples, self.n_bootstrap_itrs), - dtype=np.float16) - BME_Corr = np.zeros((self.n_bootstrap_itrs)) - log_BME = np.zeros((self.n_bootstrap_itrs)) - KLD = np.zeros((self.n_bootstrap_itrs)) - inf_entropy = np.zeros((self.n_bootstrap_itrs)) - - # Compute the prior predtions - # Evaluate the MetaModel - if self.emulator: - y_hat, y_std = MetaModel.eval_metamodel(samples=self.samples) - self.__mean_pce_prior_pred = y_hat - self._std_pce_prior_pred = y_std - - # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: - y_hat_corr, y_std = self.error_MetaModel.eval_model_error( - self.bias_inputs, self.__mean_pce_prior_pred - ) - self.__mean_pce_prior_pred = y_hat_corr - self._std_pce_prior_pred = y_std - - # Surrogate model's error using RMSE of test data - if hasattr(MetaModel, 'rmse'): - surrError = MetaModel.rmse - else: - surrError = None - - else: - # Evaluate the original model - self.__model_prior_pred = self._eval_model( - samples=self.samples, key='PriorPred' - ) - surrError = None - - # Start the likelihood-BME computations for the perturbed data - for itr_idx, data in tqdm( - enumerate(self.perturbed_data), - total=self.n_bootstrap_itrs, - desc="Bootstrapping the BME calculations", ascii=True - ): - - # ---------------- Likelihood calculation ---------------- - if self.emulator: - model_evals = self.__mean_pce_prior_pred - else: - model_evals = self.__model_prior_pred - - # Leave one out - if self.bayes_loocv or self.just_analysis: - self.selected_indices = np.nonzero(data)[0] - - # Prepare data dataframe - nobs = list(self.measured_data.count().values[1:]) - numbers = list(np.cumsum(nobs)) - indices = list(zip([0] + numbers, numbers)) - data_dict = { - output_names[i]: data[j:k] for i, (j, k) in - enumerate(indices) - } - #print(output_names) - #print(indices) - #print(numbers) - #print(nobs) - #print(self.measured_data) - #for i, (j, k) in enumerate(indices): - # print(i,j,k) - #print(data) - #print(data_dict) - #stop - - # Unknown sigma2 - if opt_sigma == 'C' or hasattr(self, 'sigma2s'): - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - sigma2=self.sigma2s, std=surrError - ) - else: - # known sigma2 - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - std=surrError - ) - - # ---------------- BME Calculations ---------------- - # BME (log) - log_BME[itr_idx] = np.log( - np.nanmean(np.exp(logLikelihoods[:, itr_idx], - dtype=np.longdouble))#float128)) - ) - - # BME correction when using Emulator - if self.emulator: - BME_Corr[itr_idx] = self.__corr_factor_BME( - data_dict, total_sigma2, log_BME[itr_idx] - ) - - # Rejection Step - if 'kld' in list(map(str.lower, self.valid_metrics)) and\ - 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - # Random numbers between 0 and 1 - unif = np.random.rand(1, self.n_samples)[0] - - # Reject the poorly performed prior - Likelihoods = np.exp(logLikelihoods[:, itr_idx], - dtype=np.float64) - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - posterior = self.samples[accepted] - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean( - logLikelihoods[:, itr_idx][accepted] - ) - - # Calculate Kullback-Leibler Divergence - KLD[itr_idx] = postExpLikelihoods - log_BME[itr_idx] - - # Posterior-based expectation of prior densities - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - n_thread = int(0.875 * multiprocessing.cpu_count()) - with multiprocessing.Pool(n_thread) as p: - postExpPrior = np.mean(np.concatenate( - p.map( - self.engine.ExpDesign.JDist.pdf, - np.array_split(posterior.T, n_thread, axis=1)) - ) - ) - # Information Entropy based on Entropy paper Eq. 38 - inf_entropy[itr_idx] = log_BME[itr_idx] - postExpPrior - \ - postExpLikelihoods - - # Clear memory - gc.collect(generation=2) - - # ---------- Store metrics for perturbed data set ---------------- - # Likelihoods (Size: n_samples, n_bootstrap_itr) - self.log_likes = logLikelihoods - - # BME (log), KLD, infEntropy (Size: 1,n_bootstrap_itr) - self.log_BME = log_BME - - # BMECorrFactor (log) (Size: 1,n_bootstrap_itr) - if self.emulator: - self.log_BME_corr_factor = BME_Corr - - if 'kld' in list(map(str.lower, self.valid_metrics)): - self.KLD = KLD - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - self.inf_entropy = inf_entropy - - # BME = BME + BMECorrFactor - if self.emulator: - self.log_BME += self.log_BME_corr_factor - - # ---------------- Parameter Bayesian inference ---------------- - if self.inference_method.lower() == 'mcmc': - # Instantiate the MCMC object - MCMC_Obj = MCMC(self) - self.posterior_df = MCMC_Obj.run_sampler( - self.measured_data, total_sigma2 - ) - - elif self.name.lower() == 'valid': - # Convert to a dataframe if samples are provided after calibration. - self.posterior_df = pd.DataFrame(self.samples, columns=par_names) - - else: - # Rejection sampling - self.posterior_df = self._rejection_sampling() - - # Provide posterior's summary - print('\n') - print('-'*15 + 'Posterior summary' + '-'*15) - pd.options.display.max_columns = None - pd.options.display.max_rows = None - print(self.posterior_df.describe()) - print('-'*50) - - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() == 'calib': - if self.inference_method.lower() == 'mcmc': - self.error_MetaModel = MCMC_Obj.error_MetaModel - else: - # Select posterior mean as MAP - if opt_sigma == "B": - posterior_df = self.posterior_df.values - else: - posterior_df = self.posterior_df.values[:, :-Model.n_outputs] - - # Select posterior mean as Maximum a posteriori - map_theta = posterior_df.mean(axis=0).reshape((1, n_params)) - # map_theta = stats.mode(Posterior_df,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=map_theta) - - # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) - - # -------- Posterior perdictive ----------- - self._posterior_predictive() - - # ----------------------------------------------------- - # ------------------ Visualization -------------------- - # ----------------------------------------------------- - # Create Output directory, if it doesn't exist already. - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # -------- Posteior parameters -------- - if opt_sigma != "B": - par_names.extend( - [self.Discrepancy.InputDisc.Marginals[i].name for i - in range(len(self.Discrepancy.InputDisc.Marginals))] - ) - # Pot with corner - figPosterior = corner.corner(self.posterior_df.to_numpy(), - labels=par_names, - quantiles=[0.15, 0.5, 0.85], - show_titles=True, - title_fmt=self.corner_title_fmt, - labelpad=0.2, - use_math_text=True, - title_kwargs={"fontsize": 28}, - plot_datapoints=False, - plot_density=False, - fill_contours=True, - smooth=0.5, - smooth1d=0.5) - - # Loop over axes and set x limits - if opt_sigma == "B": - axes = np.array(figPosterior.axes).reshape( - (len(par_names), len(par_names)) - ) - for yi in range(len(par_names)): - ax = axes[yi, yi] - ax.set_xlim(self.engine.ExpDesign.bound_tuples[yi]) - for xi in range(yi): - ax = axes[yi, xi] - ax.set_xlim(self.engine.ExpDesign.bound_tuples[xi]) - plt.close() - - # Turn off gridlines - for ax in figPosterior.axes: - ax.grid(False) - - if self.emulator: - plotname = f'/Posterior_Dist_{Model.name}_emulator' - else: - plotname = f'/Posterior_Dist_{Model.name}' - - figPosterior.set_size_inches((24, 16)) - figPosterior.savefig(f'./{out_dir}{plotname}.pdf', - bbox_inches='tight') - - # -------- Plot MAP -------- - if self.plot_map_pred: - self._plot_max_a_posteriori() - - # -------- Plot log_BME dist -------- - if self.bootstrap: - - # Computing the TOM performance - self.log_BME_tom = stats.chi2.rvs( - self.n_tot_measurement, size=self.log_BME.shape[0] - ) - - fig, ax = plt.subplots() - sns.kdeplot(self.log_BME_tom, ax=ax, color="green", shade=True) - sns.kdeplot( - self.log_BME, ax=ax, color="blue", shade=True, - label='Model BME') - - ax.set_xlabel('log$_{10}$(BME)') - ax.set_ylabel('Probability density') - - legend_elements = [ - Patch(facecolor='green', edgecolor='green', label='TOM BME'), - Patch(facecolor='blue', edgecolor='blue', label='Model BME') - ] - ax.legend(handles=legend_elements) - - if self.emulator: - plotname = f'/BME_hist_{Model.name}_emulator' - else: - plotname = f'/BME_hist_{Model.name}' - - plt.savefig(f'./{out_dir}{plotname}.pdf', bbox_inches='tight') - plt.show() - plt.close() - - # -------- Posteior perdictives -------- - if self.plot_post_pred: - # Plot the posterior predictive - self._plot_post_predictive() - - return self - - # ------------------------------------------------------------------------- - def _perturb_data(self, data, output_names): - """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. - The first row includes the original observation data. - If `self.bayes_loocv` is True, a 2d-array will be returned with - repeated rows and zero diagonal entries. - - Parameters - ---------- - data : pandas DataFrame - Observation data. - output_names : list - List of the output names. - - Returns - ------- - final_data : array - Perturbed data set. - - """ - noise_level = self.bootstrap_noise - obs_data = data[output_names].values - n_measurement, n_outs = obs_data.shape - self.n_tot_measurement = obs_data[~np.isnan(obs_data)].shape[0] - # Number of bootstrap iterations - if self.bayes_loocv: - self.n_bootstrap_itrs = self.n_tot_measurement - - # Pass loocv dataset - if self.bayes_loocv: - obs = obs_data.T[~np.isnan(obs_data.T)] - final_data = np.repeat(np.atleast_2d(obs), self.n_bootstrap_itrs, - axis=0) - np.fill_diagonal(final_data, 0) - return final_data - - else: - final_data = np.zeros( - (self.n_bootstrap_itrs, self.n_tot_measurement) - ) - final_data[0] = obs_data.T[~np.isnan(obs_data.T)] - for itrIdx in range(1, self.n_bootstrap_itrs): - data = np.zeros((n_measurement, n_outs)) - for idx in range(len(output_names)): - std = np.nanstd(obs_data[:, idx]) - if std == 0: - std = 0.001 - noise = std * noise_level - data[:, idx] = np.add( - obs_data[:, idx], - np.random.normal(0, 1, obs_data.shape[0]) * noise, - ) - - final_data[itrIdx] = data.T[~np.isnan(data.T)] - - return final_data - - # ------------------------------------------------------------------------- - def _logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = spla.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(spla.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - return log_lik - - # ------------------------------------------------------------------------- - def _eval_model(self, samples=None, key='MAP'): - """ - Evaluates Forward Model. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Parameter sets. The default is None. - key : str, optional - Key string to be passed to the run_model_parallel method. - The default is 'MAP'. - - Returns - ------- - model_outputs : dict - Model outputs. - - """ - MetaModel = self.MetaModel - Model = self.engine.Model - - if samples is None: - self.samples = self.engine.ExpDesign.generate_samples( - self.n_samples, 'random') - else: - self.samples = samples - self.n_samples = len(samples) - - model_outputs, _ = Model.run_model_parallel( - self.samples, key_str=key+self.name) - - # Clean up - # Zip the subdirectories - try: - dir_name = f'{Model.name}MAP{self.name}' - key = dir_name + '_' - Model.zip_subdirs(dir_name, key) - except: - pass - - return model_outputs - - # ------------------------------------------------------------------------- - def _kernel_rbf(self, X, hyperparameters): - """ - Isotropic squared exponential kernel. - - Higher l values lead to smoother functions and therefore to coarser - approximations of the training data. Lower l values make functions - more wiggly with wide uncertainty regions between training data points. - - sigma_f controls the marginal variance of b(x) - - Parameters - ---------- - X : ndarray of shape (n_samples_X, n_features) - - hyperparameters : Dict - Lambda characteristic length - sigma_f controls the marginal variance of b(x) - sigma_0 unresolvable error nugget term, interpreted as random - error that cannot be attributed to measurement error. - Returns - ------- - var_cov_matrix : ndarray of shape (n_samples_X,n_samples_X) - Kernel k(X, X). - - """ - from sklearn.gaussian_process.kernels import RBF - min_max_scaler = preprocessing.MinMaxScaler() - X_minmax = min_max_scaler.fit_transform(X) - - nparams = len(hyperparameters) - # characteristic length (0,1] - Lambda = hyperparameters[0] - # sigma_f controls the marginal variance of b(x) - sigma2_f = hyperparameters[1] - - # cov_matrix = sigma2_f*rbf_kernel(X_minmax, gamma = 1/Lambda**2) - - rbf = RBF(length_scale=Lambda) - cov_matrix = sigma2_f * rbf(X_minmax) - if nparams > 2: - # (unresolvable error) nugget term that is interpreted as random - # error that cannot be attributed to measurement error. - sigma2_0 = hyperparameters[2:] - for i, j in np.ndindex(cov_matrix.shape): - cov_matrix[i, j] += np.sum(sigma2_0) if i == j else 0 - - return cov_matrix - - # ------------------------------------------------------------------------- - def normpdf(self, outputs, obs_data, total_sigma2s, sigma2=None, std=None): - """ - Calculates the likelihood of simulation outputs compared with - observation data. - - Parameters - ---------- - outputs : dict - A dictionary containing the simulation outputs as array of shape - (n_samples, n_measurement) for each model output. - obs_data : dict - A dictionary/dataframe containing the observation data. - total_sigma2s : dict - A dictionary with known values of the covariance diagonal entries, - a.k.a sigma^2. - sigma2 : array, optional - An array of the sigma^2 samples, when the covariance diagonal - entries are unknown and are being jointly inferred. The default is - None. - std : dict, optional - A dictionary containing the root mean squared error as array of - shape (n_samples, n_measurement) for each model output. The default - is None. - - Returns - ------- - logLik : array of shape (n_samples) - Likelihoods. - - """ - Model = self.engine.Model - logLik = 0.0 - - # Extract the requested model outputs for likelihood calulation - if self.req_outputs is None: - req_outputs = Model.Output.names - else: - req_outputs = list(self.req_outputs) - - # Loop over the outputs - for idx, out in enumerate(req_outputs): - - # (Meta)Model Output - nsamples, nout = outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Add the std of the PCE is chosen as emulator. - if self.emulator: - if std is not None: - tot_sigma2s += std[out]**2 - - # Covariance Matrix - covMatrix = np.diag(tot_sigma2s) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - - # If sigma2 is not given, use given total_sigma2s - if sigma2 is None: - logLik += stats.multivariate_normal.logpdf( - outputs[out][:, indices], data[indices], covMatrix) - continue - - # Loop over each run/sample and calculate logLikelihood - logliks = np.zeros(nsamples) - for s_idx in range(nsamples): - - # Simulation run - tot_outputs = outputs[out] - - # Covariance Matrix - covMatrix = np.diag(tot_sigma2s) - - if sigma2 is not None: - # Check the type error term - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): - # Infer a Bias model usig Gaussian Process Regression - bias_inputs = np.hstack( - (self.bias_inputs[out], - tot_outputs[s_idx].reshape(-1, 1))) - - params = sigma2[s_idx, idx*3:(idx+1)*3] - covMatrix = self._kernel_rbf(bias_inputs, params) - else: - # Infer equal sigma2s - try: - sigma_2 = sigma2[s_idx, idx] - except TypeError: - sigma_2 = 0.0 - - covMatrix += sigma_2 * np.eye(nout) - # covMatrix = np.diag(sigma2 * total_sigma2s) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - - # Compute loglikelihood - logliks[s_idx] = self._logpdf( - tot_outputs[s_idx, indices], data[indices], covMatrix - ) - - logLik += logliks - return logLik - - # ------------------------------------------------------------------------- - def _corr_factor_BME_old(self, Data, total_sigma2s, posterior): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - OrigModelOutput = self.engine.ExpDesign.Y - Model = self.engine.Model - - # Posterior with guassian-likelihood - postDist = stats.gaussian_kde(posterior.T) - - # Remove NaN - Data = Data[~np.isnan(Data)] - total_sigma2s = total_sigma2s[~np.isnan(total_sigma2s)] - - # Covariance Matrix - covMatrix = np.diag(total_sigma2s[:self.n_tot_measurement]) - - # Extract the requested model outputs for likelihood calulation - if self.req_outputs is None: - OutputType = Model.Output.names - else: - OutputType = list(self.req_outputs) - - # SampleSize = OrigModelOutput[OutputType[0]].shape[0] - - - # Flatten the OutputType for OrigModel - TotalOutputs = np.concatenate([OrigModelOutput[x] for x in OutputType], 1) - - NrofBayesSamples = self.n_samples - # Evaluate MetaModel on the experimental design - Samples = self.engine.ExpDesign.X - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=Samples) - - # Reset the NrofSamples to NrofBayesSamples - self.n_samples = NrofBayesSamples - - # Flatten the OutputType for MetaModel - TotalPCEOutputs = np.concatenate([OutputRS[x] for x in OutputRS], 1) - TotalPCEstdOutputRS= np.concatenate([stdOutputRS[x] for x in stdOutputRS], 1) - - logweight = 0 - for i, sample in enumerate(Samples): - # Compute likelilhood output vs RS - covMatrix = np.diag(TotalPCEstdOutputRS[i]**2) - logLik = self._logpdf(TotalOutputs[i], TotalPCEOutputs[i], covMatrix) - # Compute posterior likelihood of the collocation points - logpostLik = np.log(postDist.pdf(sample[:, None]))[0] - if logpostLik != -np.inf: - logweight += logLik + logpostLik - return logweight - - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = self.engine.ExpDesign.X - model_outputs = self.engine.ExpDesign.Y - Model = self.engine.Model - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names - - # Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - covMatrix = np.eye(len(y_m)) * 1/(2*np.pi) - - # Select the data points to compare - try: - indices = self.selected_indices[out] - except: - indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - covMatrix_data = np.diag(covMatrix_data[indices, indices]) - - # Compute likelilhood output vs data - logLik_data[i] += self._logpdf( - y_m_hat[indices], data[indices], - covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += self._logpdf( - y_m_hat[indices], y_m[indices], - covMatrix - ) - - # Weight - logLik_data -= logBME - weights = np.mean(np.exp(logLik_model+logLik_data)) - - return np.log(weights) - - # ------------------------------------------------------------------------- - def _rejection_sampling(self): - """ - Performs rejection sampling to update the prior distribution on the - input parameters. - - Returns - ------- - posterior : pandas.dataframe - Posterior samples of the input parameters. - - """ - - MetaModel = self.MetaModel - try: - sigma2_prior = self.Discrepancy.sigma2_prior - except: - sigma2_prior = None - - # Check if the discrepancy is defined as a distribution: - samples = self.samples - - if sigma2_prior is not None: - samples = np.hstack((samples, sigma2_prior)) - - # Take the first column of Likelihoods (Observation data without noise) - if self.just_analysis or self.bayes_loocv: - index = self.n_tot_measurement-1 - likelihoods = np.exp(self.log_likes[:, index], dtype=np.longdouble)#np.float128) - else: - likelihoods = np.exp(self.log_likes[:, 0], dtype=np.longdouble)#np.float128) - - n_samples = len(likelihoods) - norm_ikelihoods = likelihoods / np.max(likelihoods) - - # Normalize based on min if all Likelihoods are zero - if all(likelihoods == 0.0): - likelihoods = self.log_likes[:, 0] - norm_ikelihoods = likelihoods / np.min(likelihoods) - - # Random numbers between 0 and 1 - unif = np.random.rand(1, n_samples)[0] - - # Reject the poorly performed prior - accepted_samples = samples[norm_ikelihoods >= unif] - - # Output the Posterior - par_names = self.engine.ExpDesign.par_names - if sigma2_prior is not None: - for name in self.Discrepancy.name: - par_names.append(name) - - return pd.DataFrame(accepted_samples, columns=sigma2_prior) - - # ------------------------------------------------------------------------- - def _posterior_predictive(self): - """ - Stores the prior- and posterior predictive samples, i.e. model - evaluations using the samples, into hdf5 files. - - priorPredictive.hdf5 : Prior predictive samples. - postPredictive_wo_noise.hdf5 : Posterior predictive samples without - the additive noise. - postPredictive.hdf5 : Posterior predictive samples with the additive - noise. - - Returns - ------- - None. - - """ - - MetaModel = self.MetaModel - Model = self.engine.Model - - # Make a directory to save the prior/posterior predictive - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # Read observation data and perturb it if requested - if self.measured_data is None: - self.measured_data = Model.read_observation(case=self.name) - - if not isinstance(self.measured_data, pd.DataFrame): - self.measured_data = pd.DataFrame(self.measured_data) - - # X_values - x_values = self.engine.ExpDesign.x_values - - try: - sigma2_prior = self.Discrepancy.sigma2_prior - except: - sigma2_prior = None - - # Extract posterior samples - posterior_df = self.posterior_df - - # Take care of the sigma2 - if sigma2_prior is not None: - try: - sigma2s = posterior_df[self.Discrepancy.name].values - posterior_df = posterior_df.drop( - labels=self.Discrepancy.name, axis=1 - ) - except: - sigma2s = self.sigma2s - - # Posterior predictive - if self.emulator: - if self.inference_method == 'rejection': - prior_pred = self.__mean_pce_prior_pred - if self.name.lower() != 'calib': - post_pred = self.__mean_pce_prior_pred - post_pred_std = self._std_pce_prior_pred - else: - post_pred, post_pred_std = MetaModel.eval_metamodel( - samples=posterior_df.values - ) - - else: - if self.inference_method == 'rejection': - prior_pred = self.__model_prior_pred - if self.name.lower() != 'calib': - post_pred = self.__mean_pce_prior_pred, - post_pred_std = self._std_pce_prior_pred - else: - post_pred = self._eval_model( - samples=posterior_df.values, key='PostPred' - ) - # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: - y_hat, y_std = self.error_MetaModel.eval_model_error( - self.bias_inputs, post_pred - ) - post_pred, post_pred_std = y_hat, y_std - - # Add discrepancy from likelihood Sample to the current posterior runs - total_sigma2 = self.Discrepancy.total_sigma2 - post_pred_withnoise = copy.deepcopy(post_pred) - for varIdx, var in enumerate(Model.Output.names): - for i in range(len(post_pred[var])): - pred = post_pred[var][i] - - # Known sigma2s - clean_sigma2 = total_sigma2[var][~np.isnan(total_sigma2[var])] - tot_sigma2 = clean_sigma2[:len(pred)] - cov = np.diag(tot_sigma2) - - # Check the type error term - if sigma2_prior is not None: - # Inferred sigma2s - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): - # TODO: Infer a Bias model usig GPR - bias_inputs = np.hstack(( - self.bias_inputs[var], pred.reshape(-1, 1))) - params = sigma2s[i, varIdx*3:(varIdx+1)*3] - cov = self._kernel_rbf(bias_inputs, params) - else: - # Infer equal sigma2s - try: - sigma2 = sigma2s[i, varIdx] - except TypeError: - sigma2 = 0.0 - - # Convert biasSigma2s to a covMatrix - cov += sigma2 * np.eye(len(pred)) - - if self.emulator: - if hasattr(MetaModel, 'rmse') and \ - MetaModel.rmse is not None: - stdPCE = MetaModel.rmse[var] - else: - stdPCE = post_pred_std[var][i] - # Expected value of variance (Assump: i.i.d stds) - cov += np.diag(stdPCE**2) - - # Sample a multivariate normal distribution with mean of - # prediction and variance of cov - post_pred_withnoise[var][i] = np.random.multivariate_normal( - pred, cov, 1 - ) - - # ----- Prior Predictive ----- - if self.inference_method.lower() == 'rejection': - # Create hdf5 metadata - hdf5file = f'{out_dir}/priorPredictive.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=prior_pred[var]) - - # ----- Posterior Predictive only model evaluations ----- - # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive_wo_noise.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=post_pred[var]) - - # ----- Posterior Predictive with noise ----- - # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive.hdf5' - hdf5_exist = os.path.exists(hdf5file) - if hdf5_exist: - os.remove(hdf5file) - file = h5py.File(hdf5file, 'a') - - # Store x_values - if type(x_values) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(Model.Output.names): - grp_x_values.create_dataset(var, data=x_values[var]) - else: - file.create_dataset("x_values", data=x_values) - - # Store posterior predictive - grpY = file.create_group("EDY/") - for varIdx, var in enumerate(Model.Output.names): - grpY.create_dataset(var, data=post_pred_withnoise[var]) - - return - - # ------------------------------------------------------------------------- - def _plot_max_a_posteriori(self): - """ - Plots the response of the model output against that of the metamodel at - the maximum a posteriori sample (mean or mode of posterior.) - - Returns - ------- - None. - - """ - - MetaModel = self.MetaModel - Model = self.engine.Model - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - opt_sigma = self.Discrepancy.opt_sigma - - # -------- Find MAP and run MetaModel and origModel -------- - # Compute the MAP - if self.max_a_posteriori.lower() == 'mean': - if opt_sigma == "B": - Posterior_df = self.posterior_df.values - else: - Posterior_df = self.posterior_df.values[:, :-Model.n_outputs] - map_theta = Posterior_df.mean(axis=0).reshape( - (1, MetaModel.n_params)) - else: - map_theta = stats.mode(Posterior_df.values, axis=0)[0] - # Prin report - print("\nPoint estimator:\n", map_theta[0]) - - # Run the models for MAP - # MetaModel - map_metamodel_mean, map_metamodel_std = MetaModel.eval_metamodel( - samples=map_theta) - self.map_metamodel_mean = map_metamodel_mean - self.map_metamodel_std = map_metamodel_std - - # origModel - map_orig_model = self._eval_model(samples=map_theta) - self.map_orig_model = map_orig_model - - # Extract slicing index - x_values = map_orig_model['x_values'] - - # List of markers and colors - Color = ['k', 'b', 'g', 'r'] - Marker = 'x' - - # Create a PdfPages object - pdf = PdfPages(f'./{out_dir}MAP_PCE_vs_Model_{self.name}.pdf') - fig = plt.figure() - for i, key in enumerate(Model.Output.names): - - y_val = map_orig_model[key] - y_pce_val = map_metamodel_mean[key] - y_pce_val_std = map_metamodel_std[key] - - plt.plot(x_values, y_val, color=Color[i], marker=Marker, - lw=2.0, label='$Y_{MAP}^{M}$') - - plt.plot( - x_values, y_pce_val[i], color=Color[i], lw=2.0, - marker=Marker, linestyle='--', label='$Y_{MAP}^{PCE}$' - ) - # plot the confidence interval - plt.fill_between( - x_values, y_pce_val[i] - 1.96*y_pce_val_std[i], - y_pce_val[i] + 1.96*y_pce_val_std[i], - color=Color[i], alpha=0.15 - ) - - # Calculate the adjusted R_squared and RMSE - R2 = r2_score(y_pce_val.reshape(-1, 1), y_val.reshape(-1, 1)) - rmse = np.sqrt(mean_squared_error(y_pce_val, y_val)) - - plt.ylabel(key) - plt.xlabel("Time [s]") - plt.title(f'Model vs MetaModel {key}') - - ax = fig.axes[0] - leg = ax.legend(loc='best', frameon=True) - fig.canvas.draw() - p = leg.get_window_extent().inverse_transformed(ax.transAxes) - ax.text( - p.p0[1]-0.05, p.p1[1]-0.25, - f'RMSE = {rmse:.3f}\n$R^2$ = {R2:.3f}', - transform=ax.transAxes, color='black', - bbox=dict(facecolor='none', edgecolor='black', - boxstyle='round,pad=1')) - - plt.show() - - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - pdf.close() - - # ------------------------------------------------------------------------- - def _plot_post_predictive(self): - """ - Plots the posterior predictives against the observation data. - - Returns - ------- - None. - - """ - - Model = self.engine.Model - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - # Plot the posterior predictive - for out_idx, out_name in enumerate(Model.Output.names): - fig, ax = plt.subplots() - with sns.axes_style("ticks"): - x_key = list(self.measured_data)[0] - - # --- Read prior and posterior predictive --- - if self.inference_method == 'rejection' and \ - self.name.lower() != 'valid': - # --- Prior --- - # Load posterior predictive - f = h5py.File( - f'{out_dir}/priorPredictive.hdf5', 'r+') - - try: - x_coords = np.array(f[f"x_values/{out_name}"]) - except: - x_coords = np.array(f["x_values"]) - - X_values = np.repeat(x_coords, 10000) - - prior_pred_df = {} - prior_pred_df[x_key] = X_values - prior_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"])[:10000].flatten('F') - prior_pred_df = pd.DataFrame(prior_pred_df) - - tags_post = ['prior'] * len(prior_pred_df) - prior_pred_df.insert( - len(prior_pred_df.columns), "Tags", tags_post, - True) - f.close() - - # --- Posterior --- - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') - - X_values = np.repeat( - x_coords, np.array(f[f"EDY/{out_name}"]).shape[0]) - - post_pred_df = {} - post_pred_df[x_key] = X_values - post_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"]).flatten('F') - - post_pred_df = pd.DataFrame(post_pred_df) - - tags_post = ['posterior'] * len(post_pred_df) - post_pred_df.insert( - len(post_pred_df.columns), "Tags", tags_post, True) - f.close() - # Concatenate two dataframes based on x_values - frames = [prior_pred_df, post_pred_df] - all_pred_df = pd.concat(frames) - - # --- Plot posterior predictive --- - sns.violinplot( - x_key, y=out_name, data=all_pred_df, hue="Tags", - legend=False, ax=ax, split=True, inner=None, - color=".8") - - # --- Plot Data --- - # Find the x,y coordinates for each point - x_coords = np.arange(x_coords.shape[0]) - first_header = list(self.measured_data)[0] - obs_data = self.measured_data.round({first_header: 6}) - sns.pointplot( - x=first_header, y=out_name, color='g', markers='x', - linestyles='', capsize=16, data=obs_data, ax=ax) - - ax.errorbar( - x_coords, obs_data[out_name].values, - yerr=1.96*self.measurement_error[out_name], - ecolor='g', fmt=' ', zorder=-1) - - # Add labels to the legend - handles, labels = ax.get_legend_handles_labels() - labels.append('Data') - - data_marker = mlines.Line2D( - [], [], color='lime', marker='+', linestyle='None', - markersize=10) - handles.append(data_marker) - - # Add legend - ax.legend(handles=handles, labels=labels, loc='best', - fontsize='large', frameon=True) - - else: - # Load posterior predictive - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') - - try: - x_coords = np.array(f[f"x_values/{out_name}"]) - except: - x_coords = np.array(f["x_values"]) - - mu = np.mean(np.array(f[f"EDY/{out_name}"]), axis=0) - std = np.std(np.array(f[f"EDY/{out_name}"]), axis=0) - - # --- Plot posterior predictive --- - plt.plot( - x_coords, mu, marker='o', color='b', - label='Mean Post. Predictive') - plt.fill_between( - x_coords, mu-1.96*std, mu+1.96*std, color='b', - alpha=0.15) - - # --- Plot Data --- - ax.plot( - x_coords, self.measured_data[out_name].values, - 'ko', label='data', markeredgecolor='w') - - # --- Plot ExpDesign --- - orig_ED_Y = self.engine.ExpDesign.Y[out_name] - for output in orig_ED_Y: - plt.plot( - x_coords, output, color='grey', alpha=0.15 - ) - - # Add labels for axes - plt.xlabel('Time [s]') - plt.ylabel(out_name) - - # Add labels to the legend - handles, labels = ax.get_legend_handles_labels() - - patch = Patch(color='b', alpha=0.15) - handles.insert(1, patch) - labels.insert(1, '95 $\\%$ CI') - - # Add legend - ax.legend(handles=handles, labels=labels, loc='best', - frameon=True) - - # Save figure in pdf format - if self.emulator: - plotname = f'/Post_Prior_Perd_{Model.name}_emulator' - else: - plotname = f'/Post_Prior_Perd_{Model.name}' - - fig.savefig(f'./{out_dir}{plotname}_{out_name}.pdf', - bbox_inches='tight') diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_model_comparison.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_model_comparison.py deleted file mode 100644 index b946281c5..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/bayes_model_comparison.py +++ /dev/null @@ -1,658 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Sat Aug 24 16:04:06 2019 - -@author: farid -""" -import numpy as np -import os -from scipy import stats -import seaborn as sns -import matplotlib.patches as patches -import matplotlib.colors as mcolors -import matplotlib.pylab as plt -from .bayes_inference import BayesInference - -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class BayesModelComparison: - """ - A class to perform Bayesian Analysis. - - - Attributes - ---------- - justifiability : bool, optional - Whether to perform the justifiability analysis. The default is - `True`. - perturbed_data : array of shape (n_bootstrap_itrs, n_obs), optional - User defined perturbed data. The default is `None`. - n_bootstarp : int - Number of bootstrap iteration. The default is `1000`. - data_noise_level : float - A noise level to perturb the data set. The default is `0.01`. - just_n_meas : int - Number of measurements considered for visualization of the - justifiability results. - - """ - - def __init__(self, justifiability=True, perturbed_data=None, - n_bootstarp=1000, data_noise_level=0.01, just_n_meas=2): - - self.justifiability = justifiability - self.perturbed_data = perturbed_data - self.n_bootstarp = n_bootstarp - self.data_noise_level = data_noise_level - self.just_n_meas = just_n_meas - - # -------------------------------------------------------------------------- - def create_model_comparison(self, model_dict, opts_dict): - """ - Starts the two-stage model comparison. - Stage I: Compare models using Bayes factors. - Stage II: Compare models via justifiability analysis. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - opts_dict : dict - A dictionary given the `BayesInference` options. - - Example: - - >>> opts_bootstrap = { - "bootstrap": True, - "n_samples": 10000, - "Discrepancy": DiscrepancyOpts, - "emulator": True, - "plot_post_pred": True - } - - Returns - ------- - output : dict - A dictionary containing the objects and the model weights for the - comparison using Bayes factors and justifiability analysis. - - """ - - # Bayes factor - bayes_dict_bf, model_weights_dict_bf = self.compare_models( - model_dict, opts_dict - ) - - output = { - 'Bayes objects BF': bayes_dict_bf, - 'Model weights BF': model_weights_dict_bf - } - - # Justifiability analysis - if self.justifiability: - bayes_dict_ja, model_weights_dict_ja = self.compare_models( - model_dict, opts_dict, justifiability=True - ) - - output['Bayes objects JA'] = bayes_dict_ja - output['Model weights JA'] = model_weights_dict_ja - - return output - - # -------------------------------------------------------------------------- - def compare_models(self, model_dict, opts_dict, justifiability=False): - """ - Passes the options to instantiates the BayesInference class for each - model and passes the options from `opts_dict`. Then, it starts the - computations. - It also creates a folder and saves the diagrams, e.g., Bayes factor - plot, confusion matrix, etc. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - opts_dict : dict - A dictionary given the `BayesInference` options. - justifiability : bool, optional - Whether to perform the justifiability analysis. The default is - `False`. - - Returns - ------- - bayes_dict : dict - A dictionary with `BayesInference` objects. - model_weights_dict : dict - A dictionary containing the model weights. - - """ - - if not isinstance(model_dict, dict): - raise Exception("To run model comparsion, you need to pass a " - "dictionary of models.") - - # Extract model names - self.model_names = [*model_dict] - - # Compute total number of the measurement points - Engine = list(model_dict.items())[0][1] - Engine.Model.read_observation() - self.n_meas = Engine.Model.n_obs - - # ----- Generate data ----- - # Find n_bootstrap - if self.perturbed_data is None: - n_bootstarp = self.n_bootstarp - else: - n_bootstarp = self.perturbed_data.shape[0] - - # Create dataset - justData = self.generate_dataset( - model_dict, justifiability, n_bootstarp=n_bootstarp) - - # Run create Interface for each model - bayes_dict = {} - for model in model_dict.keys(): - print("-"*20) - print("Bayesian inference of {}.\n".format(model)) - - BayesOpts = BayesInference(model_dict[model]) - - # Set BayesInference options - for key, value in opts_dict.items(): - if key in BayesOpts.__dict__.keys(): - if key == "Discrepancy" and isinstance(value, dict): - setattr(BayesOpts, key, value[model]) - else: - setattr(BayesOpts, key, value) - - # Pass justifiability data as perturbed data - BayesOpts.perturbed_data = justData - BayesOpts.just_analysis = justifiability - - bayes_dict[model] = BayesOpts.create_inference() - print("-"*20) - - # Compute model weights - BME_Dict = dict() - for modelName, bayesObj in bayes_dict.items(): - BME_Dict[modelName] = np.exp(bayesObj.log_BME, dtype=np.longdouble)#float128) - - # BME correction in BayesInference class - model_weights = self.cal_model_weight( - BME_Dict, justifiability, n_bootstarp=n_bootstarp) - - # Plot model weights - if justifiability: - model_names = self.model_names - model_names.insert(0, 'Observation') - - # Split the model weights and save in a dict - list_ModelWeights = np.split( - model_weights, model_weights.shape[1]/self.n_meas, axis=1) - model_weights_dict = {key: weights for key, weights in - zip(model_names, list_ModelWeights)} - - #self.plot_just_analysis(model_weights_dict) - else: - # Create box plot for model weights - self.plot_model_weights(model_weights, 'model_weights') - - # Create kde plot for bayes factors - self.plot_bayes_factor(BME_Dict, 'kde_plot') - - # Store model weights in a dict - model_weights_dict = {key: weights for key, weights in - zip(self.model_names, model_weights)} - - return bayes_dict, model_weights_dict - - # ------------------------------------------------------------------------- - def generate_dataset(self, model_dict, justifiability=False, - n_bootstarp=1): - """ - Generates the perturbed data set for the Bayes factor calculations and - the data set for the justifiability analysis. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - bool, optional - Whether to perform the justifiability analysis. The default is - `False`. - n_bootstarp : int, optional - Number of bootstrap iterations. The default is `1`. - - Returns - ------- - all_just_data: array - Created data set. - - """ - # Compute some variables - all_just_data = [] - Engine = list(model_dict.items())[0][1] - out_names = Engine.Model.Output.names - - # Perturb observations for Bayes Factor - if self.perturbed_data is None: - self.perturbed_data = self.__perturb_data( - Engine.Model.observations, out_names, n_bootstarp, - noise_level=self.data_noise_level) - - # Only for Bayes Factor - if not justifiability: - return self.perturbed_data - - # Evaluate metamodel - runs = {} - for key, metaModel in model_dict.items(): - y_hat, _ = metaModel.eval_metamodel(nsamples=n_bootstarp) - runs[key] = y_hat - - # Generate data - for i in range(n_bootstarp): - y_data = self.perturbed_data[i].reshape(1, -1) - justData = np.tril(np.repeat(y_data, y_data.shape[1], axis=0)) - # Use surrogate runs for data-generating process - for key, metaModel in model_dict.items(): - model_data = np.array( - [runs[key][out][i] for out in out_names]).reshape(y_data.shape) - justData = np.vstack(( - justData, - np.tril(np.repeat(model_data, model_data.shape[1], axis=0)) - )) - # Save in a list - all_just_data.append(justData) - - # Squeeze the array - all_just_data = np.array(all_just_data).transpose(1, 0, 2).reshape( - -1, np.array(all_just_data).shape[2] - ) - - return all_just_data - - # ------------------------------------------------------------------------- - def __perturb_data(self, data, output_names, n_bootstrap, noise_level): - """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. - The first row includes the original observation data. - If `self.bayes_loocv` is True, a 2d-array will be returned with - repeated rows and zero diagonal entries. - - Parameters - ---------- - data : pandas DataFrame - Observation data. - output_names : list - List of the output names. - - Returns - ------- - final_data : array - Perturbed data set. - - """ - obs_data = data[output_names].values - n_measurement, n_outs = obs_data.shape - n_tot_measurement = obs_data[~np.isnan(obs_data)].shape[0] - final_data = np.zeros( - (n_bootstrap, n_tot_measurement) - ) - final_data[0] = obs_data.T[~np.isnan(obs_data.T)] - for itrIdx in range(1, n_bootstrap): - data = np.zeros((n_measurement, n_outs)) - for idx in range(len(output_names)): - std = np.nanstd(obs_data[:, idx]) - if std == 0: - std = 0.001 - noise = std * noise_level - data[:, idx] = np.add( - obs_data[:, idx], - np.random.normal(0, 1, obs_data.shape[0]) * noise, - ) - - final_data[itrIdx] = data.T[~np.isnan(data.T)] - - return final_data - - # ------------------------------------------------------------------------- - def cal_model_weight(self, BME_Dict, justifiability=False, n_bootstarp=1): - """ - Normalize the BME (Asumption: Model Prior weights are equal for models) - - Parameters - ---------- - BME_Dict : dict - A dictionary containing the BME values. - - Returns - ------- - model_weights : array - Model weights. - - """ - # Stack the BME values for all models - all_BME = np.vstack(list(BME_Dict.values())) - - if justifiability: - # Compute expected log_BME for justifiabiliy analysis - all_BME = all_BME.reshape( - all_BME.shape[0], -1, n_bootstarp).mean(axis=2) - - # Model weights - model_weights = np.divide(all_BME, np.nansum(all_BME, axis=0)) - - return model_weights - - # ------------------------------------------------------------------------- - def plot_just_analysis(self, model_weights_dict): - """ - Visualizes the confusion matrix and the model wights for the - justifiability analysis. - - Parameters - ---------- - model_weights_dict : dict - Model weights. - - Returns - ------- - None. - - """ - - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - Color = [*mcolors.TABLEAU_COLORS] - names = [*model_weights_dict] - - model_names = [model.replace('_', '$-$') for model in self.model_names] - for name in names: - fig, ax = plt.subplots() - for i, model in enumerate(model_names[1:]): - plt.plot(list(range(1, self.n_meas+1)), - model_weights_dict[name][i], - color=Color[i], marker='o', - ms=10, linewidth=2, label=model - ) - - plt.title(f"Data generated by: {name.replace('_', '$-$')}") - plt.ylabel("Weights") - plt.xlabel("No. of measurement points") - ax.set_xticks(list(range(1, self.n_meas+1))) - plt.legend(loc="best") - fig.savefig( - f'{directory}modelWeights_{name}.svg', bbox_inches='tight' - ) - plt.close() - - # Confusion matrix for some measurement points - epsilon = 1 if self.just_n_meas != 1 else 0 - for index in range(0, self.n_meas+epsilon, self.just_n_meas): - weights = np.array( - [model_weights_dict[key][:, index] for key in model_weights_dict] - ) - g = sns.heatmap( - weights.T, annot=True, cmap='Blues', xticklabels=model_names, - yticklabels=model_names[1:], annot_kws={"size": 24} - ) - - # x axis on top - g.xaxis.tick_top() - g.xaxis.set_label_position('top') - g.set_xlabel(r"\textbf{Data generated by:}", labelpad=15) - g.set_ylabel(r"\textbf{Model weight for:}", labelpad=15) - g.figure.savefig( - f"{directory}confusionMatrix_ND_{index+1}.pdf", - bbox_inches='tight' - ) - plt.close() - - # ------------------------------------------------------------------------- - def plot_model_weights(self, model_weights, plot_name): - """ - Visualizes the model weights resulting from BMS via the observation - data. - - Parameters - ---------- - model_weights : array - Model weights. - plot_name : str - Plot name. - - Returns - ------- - None. - - """ - font_size = 40 - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - - # Create figure - fig, ax = plt.subplots() - - # Filter data using np.isnan - mask = ~np.isnan(model_weights.T) - filtered_data = [d[m] for d, m in zip(model_weights, mask.T)] - - # Create the boxplot - bp = ax.boxplot(filtered_data, patch_artist=True, showfliers=False) - - # change outline color, fill color and linewidth of the boxes - for box in bp['boxes']: - # change outline color - box.set(color='#7570b3', linewidth=4) - # change fill color - box.set(facecolor='#1b9e77') - - # change color and linewidth of the whiskers - for whisker in bp['whiskers']: - whisker.set(color='#7570b3', linewidth=2) - - # change color and linewidth of the caps - for cap in bp['caps']: - cap.set(color='#7570b3', linewidth=2) - - # change color and linewidth of the medians - for median in bp['medians']: - median.set(color='#b2df8a', linewidth=2) - - # change the style of fliers and their fill - # for flier in bp['fliers']: - # flier.set(marker='o', color='#e7298a', alpha=0.75) - - # Custom x-axis labels - model_names = [model.replace('_', '$-$') for model in self.model_names] - ax.set_xticklabels(model_names) - - ax.set_ylabel('Weight', fontsize=font_size) - - # Title - plt.title('Posterior Model Weights') - - # Set y lim - ax.set_ylim((-0.05, 1.05)) - - # Set size of the ticks - for t in ax.get_xticklabels(): - t.set_fontsize(font_size) - for t in ax.get_yticklabels(): - t.set_fontsize(font_size) - - # Save the figure - fig.savefig( - f'./{directory}{plot_name}.pdf', bbox_inches='tight' - ) - - plt.close() - - # ------------------------------------------------------------------------- - def plot_bayes_factor(self, BME_Dict, plot_name=''): - """ - Plots the Bayes factor distibutions in a :math:`N_m \\times N_m` - matrix, where :math:`N_m` is the number of the models. - - Parameters - ---------- - BME_Dict : dict - A dictionary containing the BME values of the models. - plot_name : str, optional - Plot name. The default is ''. - - Returns - ------- - None. - - """ - - font_size = 40 - - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - - Colors = ["blue", "green", "gray", "brown"] - - model_names = list(BME_Dict.keys()) - nModels = len(model_names) - - # Plots - fig, axes = plt.subplots( - nrows=nModels, ncols=nModels, sharex=True, sharey=True - ) - - for i, key_i in enumerate(model_names): - - for j, key_j in enumerate(model_names): - ax = axes[i, j] - # Set size of the ticks - for t in ax.get_xticklabels(): - t.set_fontsize(font_size) - for t in ax.get_yticklabels(): - t.set_fontsize(font_size) - - if j != i: - - # Null hypothesis: key_j is the better model - BayesFactor = np.log10( - np.divide(BME_Dict[key_i], BME_Dict[key_j]) - ) - - # sns.kdeplot(BayesFactor, ax=ax, color=Colors[i], shade=True) - # sns.histplot(BayesFactor, ax=ax, stat="probability", - # kde=True, element='step', - # color=Colors[j]) - - # taken from seaborn's source code (utils.py and - # distributions.py) - def seaborn_kde_support(data, bw, gridsize, cut, clip): - if clip is None: - clip = (-np.inf, np.inf) - support_min = max(data.min() - bw * cut, clip[0]) - support_max = min(data.max() + bw * cut, clip[1]) - return np.linspace(support_min, support_max, gridsize) - - kde_estim = stats.gaussian_kde( - BayesFactor, bw_method='scott' - ) - - # manual linearization of data - # linearized = np.linspace( - # quotient.min(), quotient.max(), num=500) - - # or better: mimic seaborn's internal stuff - bw = kde_estim.scotts_factor() * np.std(BayesFactor) - linearized = seaborn_kde_support( - BayesFactor, bw, 100, 3, None) - - # computes values of the estimated function on the - # estimated linearized inputs - Z = kde_estim.evaluate(linearized) - - # https://stackoverflow.com/questions/29661574/normalize- - # numpy-array-columns-in-python - def normalize(x): - return (x - x.min(0)) / x.ptp(0) - - # normalize so it is between 0;1 - Z2 = normalize(Z) - ax.plot(linearized, Z2, "-", color=Colors[i], linewidth=4) - ax.fill_between( - linearized, 0, Z2, color=Colors[i], alpha=0.25 - ) - - # Draw BF significant levels according to Jeffreys 1961 - # Strong evidence for both models - ax.axvline( - x=np.log10(3), ymin=0, linewidth=4, color='dimgrey' - ) - # Strong evidence for one model - ax.axvline( - x=np.log10(10), ymin=0, linewidth=4, color='orange' - ) - # Decisive evidence for one model - ax.axvline( - x=np.log10(100), ymin=0, linewidth=4, color='r' - ) - - # legend - BF_label = key_i.replace('_', '$-$') + \ - '/' + key_j.replace('_', '$-$') - legend_elements = [ - patches.Patch(facecolor=Colors[i], edgecolor=Colors[i], - label=f'BF({BF_label})') - ] - ax.legend( - loc='upper left', handles=legend_elements, - fontsize=font_size-(nModels+1)*5 - ) - - elif j == i: - # build a rectangle in axes coords - left, width = 0, 1 - bottom, height = 0, 1 - - # axes coordinates are 0,0 is bottom left and 1,1 is upper - # right - p = patches.Rectangle( - (left, bottom), width, height, color='white', - fill=True, transform=ax.transAxes, clip_on=False - ) - ax.grid(False) - ax.add_patch(p) - # ax.text(0.5*(left+right), 0.5*(bottom+top), key_i, - fsize = font_size+20 if nModels < 4 else font_size - ax.text(0.5, 0.5, key_i.replace('_', '$-$'), - horizontalalignment='center', - verticalalignment='center', - fontsize=fsize, color=Colors[i], - transform=ax.transAxes) - - # Defining custom 'ylim' values. - custom_ylim = (0, 1.05) - - # Setting the values for all axes. - plt.setp(axes, ylim=custom_ylim) - - # set labels - for i in range(nModels): - axes[-1, i].set_xlabel('log$_{10}$(BF)', fontsize=font_size) - axes[i, 0].set_ylabel('Probability', fontsize=font_size) - - # Adjust subplots - plt.subplots_adjust(wspace=0.2, hspace=0.1) - - plt.savefig( - f'./{directory}Bayes_Factor{plot_name}.pdf', bbox_inches='tight' - ) - - plt.close() diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/discrepancy.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/discrepancy.py deleted file mode 100644 index ac1b400c1..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/discrepancy.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import scipy.stats as stats -from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns - - -class Discrepancy: - """ - Discrepancy class for Bayesian inference method. - We define the reference or reality to be equal to what we can model and a - descripancy term \\( \\epsilon \\). We consider the followin format: - - $$\\textbf{y}_{\\text{reality}} = \\mathcal{M}(\\theta) + \\epsilon,$$ - - where \\( \\epsilon \\in R^{N_{out}} \\) represents the the effects of - measurement error and model inaccuracy. For simplicity, it can be defined - as an additive Gaussian disrepancy with zeromean and given covariance - matrix \\( \\Sigma \\): - - $$\\epsilon \\sim \\mathcal{N}(\\epsilon|0, \\Sigma). $$ - - In the context of model inversion or calibration, an observation point - \\( \\textbf{y}_i \\in \\mathcal{y} \\) is a realization of a Gaussian - distribution with mean value of \\(\\mathcal{M}(\\theta) \\) and covariance - matrix of \\( \\Sigma \\). - - $$ p(\\textbf{y}|\\theta) = \\mathcal{N}(\\textbf{y}|\\mathcal{M} - (\\theta))$$ - - The following options are available: - - * Option A: With known redidual covariance matrix \\(\\Sigma\\) for - independent measurements. - - * Option B: With unknown redidual covariance matrix \\(\\Sigma\\), - paramethrized as \\(\\Sigma(\\theta_{\\epsilon})=\\sigma^2 \\textbf{I}_ - {N_{out}}\\) with unknown residual variances \\(\\sigma^2\\). - This term will be jointly infer with the uncertain input parameters. For - the inversion, you need to define a prior marginal via `Input` class. Note - that \\(\\sigma^2\\) is only a single scalar multiplier for the diagonal - entries of the covariance matrix \\(\\Sigma\\). - - Attributes - ---------- - InputDisc : obj - Input object. When the \\(\\sigma^2\\) is expected to be inferred - jointly with the parameters (`Option B`).If multiple output groups are - defined by `Model.Output.names`, each model output needs to have. - a prior marginal using the `Input` class. The default is `''`. - disc_type : str - Type of the noise definition. `'Gaussian'` is only supported so far. - parameters : dict or pandas.DataFrame - Known residual variance \\(\\sigma^2\\), i.e. diagonal entry of the - covariance matrix of the multivariate normal likelihood in case of - `Option A`. - - """ - - def __init__(self, InputDisc='', disc_type='Gaussian', parameters=None): - self.InputDisc = InputDisc - self.disc_type = disc_type - self.parameters = parameters - - # ------------------------------------------------------------------------- - def get_sample(self, n_samples): - """ - Generate samples for the \\(\\sigma^2\\), i.e. the diagonal entries of - the variance-covariance matrix in the multivariate normal distribution. - - Parameters - ---------- - n_samples : int - Number of samples (parameter sets). - - Returns - ------- - sigma2_prior: array of shape (n_samples, n_params) - \\(\\sigma^2\\) samples. - - """ - self.n_samples = n_samples # TODO: not used again in here - needed from the outside? - - # Create and store BoundTuples - self.ExpDesign = ExpDesigns(self.InputDisc) - self.ExpDesign.sampling_method = 'random' - self.ExpDesign.generate_ED( - n_samples, max_pce_deg=1 - ) - # TODO: need to recheck the following line - # This used to simply be the return from the call above - self.sigma2_prior = self.ExpDesign.X - - # Naive approach: Fit a gaussian kernel to the provided data - self.ExpDesign.JDist = stats.gaussian_kde(self.ExpDesign.raw_data) - - # Save the names of sigmas - if len(self.InputDisc.Marginals) != 0: - self.name = [] - for Marginalidx in range(len(self.InputDisc.Marginals)): - self.name.append(self.InputDisc.Marginals[Marginalidx].name) - - return self.sigma2_prior diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/mcmc.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/mcmc.py deleted file mode 100644 index fe22a152f..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayes_inference/mcmc.py +++ /dev/null @@ -1,909 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import numpy as np -import emcee -import pandas as pd -import matplotlib.pyplot as plt -from matplotlib.backends.backend_pdf import PdfPages -import multiprocessing -import scipy.stats as st -from scipy.linalg import cholesky as chol -import warnings -import shutil -os.environ["OMP_NUM_THREADS"] = "1" - - -class MCMC: - """ - A class for bayesian inference via a Markov-Chain Monte-Carlo (MCMC) - Sampler to approximate the posterior distribution of the Bayes theorem: - $$p(\\theta|\\mathcal{y}) = \\frac{p(\\mathcal{y}|\\theta) p(\\theta)} - {p(\\mathcal{y})}.$$ - - This class make inference with emcee package [1] using an Affine Invariant - Ensemble sampler (AIES) [2]. - - [1] Foreman-Mackey, D., Hogg, D.W., Lang, D. and Goodman, J., 2013.emcee: - the MCMC hammer. Publications of the Astronomical Society of the - Pacific, 125(925), p.306. https://emcee.readthedocs.io/en/stable/ - - [2] Goodman, J. and Weare, J., 2010. Ensemble samplers with affine - invariance. Communications in applied mathematics and computational - science, 5(1), pp.65-80. - - - Attributes - ---------- - BayesOpts : obj - Bayes object. - """ - - def __init__(self, BayesOpts): - - self.BayesOpts = BayesOpts - - def run_sampler(self, observation, total_sigma2): - - BayesObj = self.BayesOpts - MetaModel = BayesObj.engine.MetaModel - Model = BayesObj.engine.Model - Discrepancy = self.BayesOpts.Discrepancy - n_cpus = Model.n_cpus - priorDist = BayesObj.engine.ExpDesign.JDist - ndim = MetaModel.n_params - self.counter = 0 - output_dir = f'Outputs_Bayes_{Model.name}_{self.BayesOpts.name}' - if not os.path.exists(output_dir): - os.makedirs(output_dir) - - self.observation = observation - self.total_sigma2 = total_sigma2 - - # Unpack mcmc parameters given to BayesObj.mcmc_params - self.initsamples = None - self.nwalkers = 100 - self.nburn = 200 - self.nsteps = 100000 - self.moves = None - self.mp = False - self.verbose = False - - # Extract initial samples - if 'init_samples' in BayesObj.mcmc_params: - self.initsamples = BayesObj.mcmc_params['init_samples'] - if isinstance(self.initsamples, pd.DataFrame): - self.initsamples = self.initsamples.values - - # Extract number of steps per walker - if 'n_steps' in BayesObj.mcmc_params: - self.nsteps = int(BayesObj.mcmc_params['n_steps']) - # Extract number of walkers (chains) - if 'n_walkers' in BayesObj.mcmc_params: - self.nwalkers = int(BayesObj.mcmc_params['n_walkers']) - # Extract moves - if 'moves' in BayesObj.mcmc_params: - self.moves = BayesObj.mcmc_params['moves'] - # Extract multiprocessing - if 'multiprocessing' in BayesObj.mcmc_params: - self.mp = BayesObj.mcmc_params['multiprocessing'] - # Extract verbose - if 'verbose' in BayesObj.mcmc_params: - self.verbose = BayesObj.mcmc_params['verbose'] - - # Set initial samples - np.random.seed(0) - if self.initsamples is None: - try: - initsamples = priorDist.sample(self.nwalkers).T - except: - # when aPCE selected - gaussian kernel distribution - inputSamples = MetaModel.ExpDesign.raw_data.T - random_indices = np.random.choice( - len(inputSamples), size=self.nwalkers, replace=False - ) - initsamples = inputSamples[random_indices] - - else: - if self.initsamples.ndim == 1: - # When MAL is given. - theta = self.initsamples - initsamples = [theta + 1e-1*np.multiply( - np.random.randn(ndim), theta) for i in - range(self.nwalkers)] - else: - # Pick samples based on a uniform dist between min and max of - # each dim - initsamples = np.zeros((self.nwalkers, ndim)) - bound_tuples = [] - for idx_dim in range(ndim): - lower = np.min(self.initsamples[:, idx_dim]) - upper = np.max(self.initsamples[:, idx_dim]) - bound_tuples.append((lower, upper)) - dist = st.uniform(loc=lower, scale=upper-lower) - initsamples[:, idx_dim] = dist.rvs(size=self.nwalkers) - - # Update lower and upper - MetaModel.ExpDesign.bound_tuples = bound_tuples - - # Check if sigma^2 needs to be inferred - if Discrepancy.opt_sigma != 'B': - sigma2_samples = Discrepancy.get_sample(self.nwalkers) - - # Update initsamples - initsamples = np.hstack((initsamples, sigma2_samples)) - - # Update ndim - ndim = initsamples.shape[1] - - # Discrepancy bound - disc_bound_tuple = Discrepancy.ExpDesign.bound_tuples - - # Update bound_tuples - BayesObj.engine.ExpDesign.bound_tuples += disc_bound_tuple - - print("\n>>>> Bayesian inference with MCMC for " - f"{self.BayesOpts.name} started. <<<<<<") - - # Set up the backend - filename = f"{output_dir}/emcee_sampler.h5" - backend = emcee.backends.HDFBackend(filename) - # Clear the backend in case the file already exists - backend.reset(self.nwalkers, ndim) - - # Define emcee sampler - # Here we'll set up the computation. emcee combines multiple "walkers", - # each of which is its own MCMC chain. The number of trace results will - # be nwalkers * nsteps. - if self.mp: - # Run in parallel - if n_cpus is None: - n_cpus = multiprocessing.cpu_count() - - with multiprocessing.Pool(n_cpus) as pool: - sampler = emcee.EnsembleSampler( - self.nwalkers, ndim, self.log_posterior, moves=self.moves, - pool=pool, backend=backend - ) - - # Check if a burn-in phase is needed! - if self.initsamples is None: - # Burn-in - print("\n Burn-in period is starting:") - pos = sampler.run_mcmc( - initsamples, self.nburn, progress=True - ) - - # Reset sampler - sampler.reset() - pos = pos.coords - else: - pos = initsamples - - # Production run - print("\n Production run is starting:") - pos, prob, state = sampler.run_mcmc( - pos, self.nsteps, progress=True - ) - - else: - # Run in series and monitor the convergence - sampler = emcee.EnsembleSampler( - self.nwalkers, ndim, self.log_posterior, moves=self.moves, - backend=backend, vectorize=True - ) - - # Check if a burn-in phase is needed! - if self.initsamples is None: - # Burn-in - print("\n Burn-in period is starting:") - pos = sampler.run_mcmc( - initsamples, self.nburn, progress=True - ) - - # Reset sampler - sampler.reset() - pos = pos.coords - else: - pos = initsamples - - # Production run - print("\n Production run is starting:") - - # Track how the average autocorrelation time estimate changes - autocorrIdx = 0 - autocorr = np.empty(self.nsteps) - tauold = np.inf - autocorreverynsteps = 50 - - # sample step by step using the generator sampler.sample - for sample in sampler.sample(pos, - iterations=self.nsteps, - tune=True, - progress=True): - - # only check convergence every autocorreverynsteps steps - if sampler.iteration % autocorreverynsteps: - continue - - # Train model discrepancy/error - if hasattr(BayesObj, 'errorModel') and BayesObj.errorModel \ - and not sampler.iteration % 3 * autocorreverynsteps: - try: - self.error_MetaModel = self.train_error_model(sampler) - except: - pass - - # Print the current mean acceptance fraction - if self.verbose: - print("\nStep: {}".format(sampler.iteration)) - acc_fr = np.mean(sampler.acceptance_fraction) - print(f"Mean acceptance fraction: {acc_fr:.3f}") - - # compute the autocorrelation time so far - # using tol=0 means that we'll always get an estimate even if - # it isn't trustworthy - tau = sampler.get_autocorr_time(tol=0) - # average over walkers - autocorr[autocorrIdx] = np.nanmean(tau) - autocorrIdx += 1 - - # output current autocorrelation estimate - if self.verbose: - print(f"Mean autocorr. time estimate: {np.nanmean(tau):.3f}") - list_gr = np.round(self.gelman_rubin(sampler.chain), 3) - print("Gelman-Rubin Test*: ", list_gr) - - # check convergence - converged = np.all(tau*autocorreverynsteps < sampler.iteration) - converged &= np.all(np.abs(tauold - tau) / tau < 0.01) - converged &= np.all(self.gelman_rubin(sampler.chain) < 1.1) - - if converged: - break - tauold = tau - - # Posterior diagnostics - try: - tau = sampler.get_autocorr_time(tol=0) - except emcee.autocorr.AutocorrError: - tau = 5 - - if all(np.isnan(tau)): - tau = 5 - - burnin = int(2*np.nanmax(tau)) - thin = int(0.5*np.nanmin(tau)) if int(0.5*np.nanmin(tau)) != 0 else 1 - finalsamples = sampler.get_chain(discard=burnin, flat=True, thin=thin) - acc_fr = np.nanmean(sampler.acceptance_fraction) - list_gr = np.round(self.gelman_rubin(sampler.chain[:, burnin:]), 3) - - # Print summary - print('\n') - print('-'*15 + 'Posterior diagnostics' + '-'*15) - print(f"Mean auto-correlation time: {np.nanmean(tau):.3f}") - print(f"Thin: {thin}") - print(f"Burn-in: {burnin}") - print(f"Flat chain shape: {finalsamples.shape}") - print(f"Mean acceptance fraction*: {acc_fr:.3f}") - print("Gelman-Rubin Test**: ", list_gr) - - print("\n* This value must lay between 0.234 and 0.5.") - print("** These values must be smaller than 1.1.") - print('-'*50) - - print(f"\n>>>> Bayesian inference with MCMC for {self.BayesOpts.name} " - "successfully completed. <<<<<<\n") - - # Extract parameter names and their prior ranges - par_names = self.BayesOpts.engine.ExpDesign.par_names - - if Discrepancy.opt_sigma != 'B': - for i in range(len(Discrepancy.InputDisc.Marginals)): - par_names.append(Discrepancy.InputDisc.Marginals[i].name) - - params_range = self.BayesOpts.engine.ExpDesign.bound_tuples - - # Plot traces - if self.verbose and self.nsteps < 10000: - pdf = PdfPages(output_dir+'/traceplots.pdf') - fig = plt.figure() - for parIdx in range(ndim): - # Set up the axes with gridspec - fig = plt.figure() - grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2) - main_ax = fig.add_subplot(grid[:-1, :3]) - y_hist = fig.add_subplot(grid[:-1, -1], xticklabels=[], - sharey=main_ax) - - for i in range(self.nwalkers): - samples = sampler.chain[i, :, parIdx] - main_ax.plot(samples, '-') - - # histogram on the attached axes - y_hist.hist(samples[burnin:], 40, histtype='stepfilled', - orientation='horizontal', color='gray') - - main_ax.set_ylim(params_range[parIdx]) - main_ax.set_title('traceplot for ' + par_names[parIdx]) - main_ax.set_xlabel('step number') - - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - pdf.close() - - # plot development of autocorrelation estimate - if not self.mp: - fig1 = plt.figure() - steps = autocorreverynsteps*np.arange(1, autocorrIdx+1) - taus = autocorr[:autocorrIdx] - plt.plot(steps, steps / autocorreverynsteps, "--k") - plt.plot(steps, taus) - plt.xlim(0, steps.max()) - plt.ylim(0, np.nanmax(taus)+0.1*(np.nanmax(taus)-np.nanmin(taus))) - plt.xlabel("number of steps") - plt.ylabel(r"mean $\hat{\tau}$") - fig1.savefig(f"{output_dir}/autocorrelation_time.pdf", - bbox_inches='tight') - - # logml_dict = self.marginal_llk_emcee(sampler, self.nburn, logp=None, - # maxiter=5000) - # print('\nThe Bridge Sampling Estimation is " - # f"{logml_dict['logml']:.5f}.') - - # # Posterior-based expectation of posterior probablity - # postExpPostLikelihoods = np.mean(sampler.get_log_prob(flat=True) - # [self.nburn*self.nwalkers:]) - - # # Posterior-based expectation of prior densities - # postExpPrior = np.mean(self.log_prior(emcee_trace.T)) - - # # Posterior-based expectation of likelihoods - # postExpLikelihoods_emcee = postExpPostLikelihoods - postExpPrior - - # # Calculate Kullback-Leibler Divergence - # KLD_emcee = postExpLikelihoods_emcee - logml_dict['logml'] - # print("Kullback-Leibler divergence: %.5f"%KLD_emcee) - - # # Information Entropy based on Entropy paper Eq. 38 - # infEntropy_emcee = logml_dict['logml'] - postExpPrior - - # postExpLikelihoods_emcee - # print("Information Entropy: %.5f" %infEntropy_emcee) - - Posterior_df = pd.DataFrame(finalsamples, columns=par_names) - - return Posterior_df - - # ------------------------------------------------------------------------- - def log_prior(self, theta): - """ - Calculates the log prior likelihood \\( p(\\theta)\\) for the given - parameter set(s) \\( \\theta \\). - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter sets, i.e. proposals of MCMC chains. - - Returns - ------- - logprior: float or array of shape n_samples - Log prior likelihood. If theta has only one row, a single value is - returned otherwise an array. - - """ - - MetaModel = self.BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy - - # Find the number of sigma2 parameters - if Discrepancy.opt_sigma != 'B': - disc_bound_tuples = Discrepancy.ExpDesign.bound_tuples - disc_marginals = Discrepancy.ExpDesign.InputObj.Marginals - disc_prior_space = Discrepancy.ExpDesign.prior_space - n_sigma2 = len(disc_bound_tuples) - else: - n_sigma2 = -len(theta) - prior_dist = self.BayesOpts.engine.ExpDesign.prior_space - params_range = self.BayesOpts.engine.ExpDesign.bound_tuples - theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) - nsamples = theta.shape[0] - logprior = -np.inf*np.ones(nsamples) - - for i in range(nsamples): - # Check if the sample is within the parameters' range - if self._check_ranges(theta[i], params_range): - # Check if all dists are uniform, if yes priors are equal. - if all(MetaModel.input_obj.Marginals[i].dist_type == 'uniform' - for i in range(MetaModel.n_params)): - logprior[i] = 0.0 - else: - logprior[i] = np.log( - prior_dist.pdf(theta[i, :-n_sigma2].T) - ) - - # Check if bias term needs to be inferred - if Discrepancy.opt_sigma != 'B': - if self._check_ranges(theta[i, -n_sigma2:], - disc_bound_tuples): - if all('unif' in disc_marginals[i].dist_type for i in - range(Discrepancy.ExpDesign.ndim)): - logprior[i] = 0.0 - else: - logprior[i] += np.log( - disc_prior_space.pdf(theta[i, -n_sigma2:]) - ) - - if nsamples == 1: - return logprior[0] - else: - return logprior - - # ------------------------------------------------------------------------- - def log_likelihood(self, theta): - """ - Computes likelihood \\( p(\\mathcal{Y}|\\theta)\\) of the performance - of the (meta-)model in reproducing the observation data. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - log_like : array of shape (n_samples) - Log likelihood. - - """ - - BayesOpts = self.BayesOpts - MetaModel = BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy - - # Find the number of sigma2 parameters - if Discrepancy.opt_sigma != 'B': - disc_bound_tuples = Discrepancy.ExpDesign.bound_tuples - n_sigma2 = len(disc_bound_tuples) - else: - n_sigma2 = -len(theta) - # Check if bias term needs to be inferred - if Discrepancy.opt_sigma != 'B': - sigma2 = theta[:, -n_sigma2:] - theta = theta[:, :-n_sigma2] - else: - sigma2 = None - theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) - - # Evaluate Model/MetaModel at theta - mean_pred, BayesOpts._std_pce_prior_pred = self.eval_model(theta) - - # Surrogate model's error using RMSE of test data - surrError = MetaModel.rmse if hasattr(MetaModel, 'rmse') else None - - # Likelihood - log_like = BayesOpts.normpdf( - mean_pred, self.observation, self.total_sigma2, sigma2, - std=surrError - ) - return log_like - - # ------------------------------------------------------------------------- - def log_posterior(self, theta): - """ - Computes the posterior likelihood \\(p(\\theta| \\mathcal{Y})\\) for - the given parameterset. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - log_like : array of shape (n_samples) - Log posterior likelihood. - - """ - - nsamples = 1 if theta.ndim == 1 else theta.shape[0] - - if nsamples == 1: - if self.log_prior(theta) == -np.inf: - return -np.inf - else: - # Compute log prior - log_prior = self.log_prior(theta) - # Compute log Likelihood - log_likelihood = self.log_likelihood(theta) - - return log_prior + log_likelihood - else: - # Compute log prior - log_prior = self.log_prior(theta) - - # Initialize log_likelihood - log_likelihood = -np.inf*np.ones(nsamples) - - # find the indices for -inf sets - non_inf_idx = np.where(log_prior != -np.inf)[0] - - # Compute loLikelihoods - if non_inf_idx.size != 0: - log_likelihood[non_inf_idx] = self.log_likelihood( - theta[non_inf_idx] - ) - - return log_prior + log_likelihood - - # ------------------------------------------------------------------------- - def eval_model(self, theta): - """ - Evaluates the (meta-) model at the given theta. - - Parameters - ---------- - theta : array of shape (n_samples, n_params) - Parameter set, i.e. proposals of the MCMC chains. - - Returns - ------- - mean_pred : dict - Mean model prediction. - std_pred : dict - Std of model prediction. - - """ - - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - Model = BayesObj.engine.Model - - if BayesObj.emulator: - # Evaluate the MetaModel - mean_pred, std_pred = MetaModel.eval_metamodel(samples=theta) - else: - # Evaluate the origModel - mean_pred, std_pred = dict(), dict() - - model_outs, _ = Model.run_model_parallel( - theta, prevRun_No=self.counter, - key_str='_MCMC', mp=False, verbose=False) - - # Save outputs in respective dicts - for varIdx, var in enumerate(Model.Output.names): - mean_pred[var] = model_outs[var] - std_pred[var] = np.zeros((mean_pred[var].shape)) - - # Remove the folder - if Model.link_type.lower() != 'function': - shutil.rmtree(f"{Model.name}_MCMC_{self.counter+1}") - - # Add one to the counter - self.counter += 1 - - if hasattr(self, 'error_MetaModel') and BayesObj.error_model: - meanPred, stdPred = self.error_MetaModel.eval_model_error( - BayesObj.BiasInputs, mean_pred - ) - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - def train_error_model(self, sampler): - """ - Trains an error model using a Gaussian Process Regression. - - Parameters - ---------- - sampler : obj - emcee sampler. - - Returns - ------- - error_MetaModel : obj - A error model. - - """ - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - - # Prepare the poster samples - try: - tau = sampler.get_autocorr_time(tol=0) - except emcee.autocorr.AutocorrError: - tau = 5 - - if all(np.isnan(tau)): - tau = 5 - - burnin = int(2*np.nanmax(tau)) - thin = int(0.5*np.nanmin(tau)) if int(0.5*np.nanmin(tau)) != 0 else 1 - finalsamples = sampler.get_chain(discard=burnin, flat=True, thin=thin) - posterior = finalsamples[:, :MetaModel.n_params] - - # Select posterior mean as MAP - map_theta = posterior.mean(axis=0).reshape((1, MetaModel.n_params)) - # MAP_theta = st.mode(Posterior_df,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_map, y_std_map = MetaModel.eval_metamodel(samples=map_theta) - - # Train a GPR meta-model using MAP - error_MetaModel = MetaModel.create_model_error( - BayesObj.BiasInputs, y_map, name='Calib') - - return error_MetaModel - - # ------------------------------------------------------------------------- - def gelman_rubin(self, chain, return_var=False): - """ - The potential scale reduction factor (PSRF) defined by the variance - within one chain, W, with the variance between chains B. - Both variances are combined in a weighted sum to obtain an estimate of - the variance of a parameter \\( \\theta \\).The square root of the - ratio of this estimates variance to the within chain variance is called - the potential scale reduction. - For a well converged chain it should approach 1. Values greater than - 1.1 typically indicate that the chains have not yet fully converged. - - Source: http://joergdietrich.github.io/emcee-convergence.html - - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py - - Parameters - ---------- - chain : array (n_walkers, n_steps, n_params) - The emcee ensamples. - - Returns - ------- - R_hat : float - The Gelman-Robin values. - - """ - m_chains, n_iters = chain.shape[:2] - - # Calculate between-chain variance - θb = np.mean(chain, axis=1) - θbb = np.mean(θb, axis=0) - B_over_n = ((θbb - θb)**2).sum(axis=0) - B_over_n /= (m_chains - 1) - - # Calculate within-chain variances - ssq = np.var(chain, axis=1, ddof=1) - W = np.mean(ssq, axis=0) - - # (over) estimate of variance - var_θ = W * (n_iters - 1) / n_iters + B_over_n - - if return_var: - return var_θ - else: - # The square root of the ratio of this estimates variance to the - # within chain variance - R_hat = np.sqrt(var_θ / W) - return R_hat - - # ------------------------------------------------------------------------- - def marginal_llk_emcee(self, sampler, nburn=None, logp=None, maxiter=1000): - """ - The Bridge Sampling Estimator of the Marginal Likelihood based on - https://gist.github.com/junpenglao/4d2669d69ddfe1d788318264cdcf0583 - - Parameters - ---------- - sampler : TYPE - MultiTrace, result of MCMC run. - nburn : int, optional - Number of burn-in step. The default is None. - logp : TYPE, optional - Model Log-probability function. The default is None. - maxiter : int, optional - Maximum number of iterations. The default is 1000. - - Returns - ------- - marg_llk : dict - Estimated Marginal log-Likelihood. - - """ - r0, tol1, tol2 = 0.5, 1e-10, 1e-4 - - if logp is None: - logp = sampler.log_prob_fn - - # Split the samples into two parts - # Use the first 50% for fiting the proposal distribution - # and the second 50% in the iterative scheme. - if nburn is None: - mtrace = sampler.chain - else: - mtrace = sampler.chain[:, nburn:, :] - - nchain, len_trace, nrofVars = mtrace.shape - - N1_ = len_trace // 2 - N1 = N1_*nchain - N2 = len_trace*nchain - N1 - - samples_4_fit = np.zeros((nrofVars, N1)) - samples_4_iter = np.zeros((nrofVars, N2)) - effective_n = np.zeros((nrofVars)) - - # matrix with already transformed samples - for var in range(nrofVars): - - # for fitting the proposal - x = mtrace[:, :N1_, var] - - samples_4_fit[var, :] = x.flatten() - # for the iterative scheme - x2 = mtrace[:, N1_:, var] - samples_4_iter[var, :] = x2.flatten() - - # effective sample size of samples_4_iter, scalar - effective_n[var] = self._my_ESS(x2) - - # median effective sample size (scalar) - neff = np.median(effective_n) - - # get mean & covariance matrix and generate samples from proposal - m = np.mean(samples_4_fit, axis=1) - V = np.cov(samples_4_fit) - L = chol(V, lower=True) - - # Draw N2 samples from the proposal distribution - gen_samples = m[:, None] + np.dot( - L, st.norm.rvs(0, 1, size=samples_4_iter.shape) - ) - - # Evaluate proposal distribution for posterior & generated samples - q12 = st.multivariate_normal.logpdf(samples_4_iter.T, m, V) - q22 = st.multivariate_normal.logpdf(gen_samples.T, m, V) - - # Evaluate unnormalized posterior for posterior & generated samples - q11 = logp(samples_4_iter.T) - q21 = logp(gen_samples.T) - - # Run iterative scheme: - tmp = self._iterative_scheme( - N1, N2, q11, q12, q21, q22, r0, neff, tol1, maxiter, 'r' - ) - if ~np.isfinite(tmp['logml']): - warnings.warn( - "Logml could not be estimated within maxiter, rerunning with " - "adjusted starting value. Estimate might be more variable than" - " usual.") - # use geometric mean as starting value - r0_2 = np.sqrt(tmp['r_vals'][-2]*tmp['r_vals'][-1]) - tmp = self._iterative_scheme( - q11, q12, q21, q22, r0_2, neff, tol2, maxiter, 'logml' - ) - - marg_llk = dict( - logml=tmp['logml'], niter=tmp['niter'], method="normal", - q11=q11, q12=q12, q21=q21, q22=q22 - ) - return marg_llk - - # ------------------------------------------------------------------------- - def _iterative_scheme(self, N1, N2, q11, q12, q21, q22, r0, neff, tol, - maxiter, criterion): - """ - Iterative scheme as proposed in Meng and Wong (1996) to estimate the - marginal likelihood - - """ - l1 = q11 - q12 - l2 = q21 - q22 - # To increase numerical stability, - # subtracting the median of l1 from l1 & l2 later - lstar = np.median(l1) - s1 = neff/(neff + N2) - s2 = N2/(neff + N2) - r = r0 - r_vals = [r] - logml = np.log(r) + lstar - criterion_val = 1 + tol - - i = 0 - while (i <= maxiter) & (criterion_val > tol): - rold = r - logmlold = logml - numi = np.exp(l2 - lstar)/(s1 * np.exp(l2 - lstar) + s2 * r) - deni = 1/(s1 * np.exp(l1 - lstar) + s2 * r) - if np.sum(~np.isfinite(numi))+np.sum(~np.isfinite(deni)) > 0: - warnings.warn( - """Infinite value in iterative scheme, returning NaN. - Try rerunning with more samples.""") - r = (N1/N2) * np.sum(numi)/np.sum(deni) - r_vals.append(r) - logml = np.log(r) + lstar - i += 1 - if criterion == 'r': - criterion_val = np.abs((r - rold)/r) - elif criterion == 'logml': - criterion_val = np.abs((logml - logmlold)/logml) - - if i >= maxiter: - return dict(logml=np.NaN, niter=i, r_vals=np.asarray(r_vals)) - else: - return dict(logml=logml, niter=i) - - # ------------------------------------------------------------------------- - def _my_ESS(self, x): - """ - Compute the effective sample size of estimand of interest. - Vectorised implementation. - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py - - - Parameters - ---------- - x : array of shape (n_walkers, n_steps) - MCMC Samples. - - Returns - ------- - int - Effective sample size. - - """ - m_chains, n_iters = x.shape - - def variogram(t): - variogram = ((x[:, t:] - x[:, :(n_iters - t)])**2).sum() - variogram /= (m_chains * (n_iters - t)) - return variogram - - post_var = self.gelman_rubin(x, return_var=True) - - t = 1 - rho = np.ones(n_iters) - negative_autocorr = False - - # Iterate until the sum of consecutive estimates of autocorrelation is - # negative - while not negative_autocorr and (t < n_iters): - rho[t] = 1 - variogram(t) / (2 * post_var) - - if not t % 2: - negative_autocorr = sum(rho[t-1:t+1]) < 0 - - t += 1 - - return int(m_chains*n_iters / (1 + 2*rho[1:t].sum())) - - # ------------------------------------------------------------------------- - def _check_ranges(self, theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayesvalidrox.mplstyle b/examples/umbridge_tsunamitutorial/bayesvalidrox/bayesvalidrox.mplstyle deleted file mode 100644 index 1f31c01f2..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/bayesvalidrox.mplstyle +++ /dev/null @@ -1,16 +0,0 @@ -figure.titlesize : 30 -axes.titlesize : 30 -axes.labelsize : 30 -axes.linewidth : 3 -axes.grid : True -lines.linewidth : 3 -lines.markersize : 10 -xtick.labelsize : 30 -ytick.labelsize : 30 -legend.fontsize : 30 -font.family : serif -font.serif : Arial -font.size : 30 -text.usetex : True -grid.linestyle : - -figure.figsize : 24, 16 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__init__.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__init__.py deleted file mode 100644 index 81c982542..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .post_processing import PostProcessing - -__all__ = [ - "PostProcessing" - ] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index c8590a242166b2e8d40de7ee2eece71980bd1571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmZ8bu};G<5Vf5GRYl8y)IVUz!u<fM7!d7*A|aM6CpWel3nz|z4z!=dFJ)!o7g*rZ ziSnd-r+4q2?!tUN6O76AjZNG?NAVYm#XT1-nT#;fi$<1G3Zr(iR3>{C`Q%Honag2O z1WH8=l_hfRE{@Ajc{W^iJjd?T7%mXC_lO@No^kL<-z79{f(l;9MuPYnYF}$j@DQrL zv27w)yR_-I@aV&Pp;HZ8eX#VVy)!ZF;ol`dbgfH>x7}fw-ZjDW-mb=X>740Oscic5 E3kw-WVE_OC diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9d21ad3c9193151d5353eea7e29d38f3b43e4b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmZ3^%ge<81T4a;sU<-AF^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%zJUDVl7OQ8<kaHg%)Im>W}vX2Ci5-+0-$(&0jk6;_W1b3oSgXhl?<Oj z*8B={wu%WYPAw{qDay{z$jL}dERJ!>PcF?(%_}L6anCIAC{2oS%gHYfNG!>SNlL6t zEiOyU$xJEAuZTgjASOOOGcU6wK3=b&@)w6qZhlH>PO4oIC(s&@Q;Ri$#0O?ZM#c|p d42(J#7_^ZQP>fad12YphTLU`?7O?|W0{}&mQW5|F diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 58a0eb24635d0b97a14d13708e616de6a0659976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZ9G&q@O^5XO_;ibbs6e1|=xP{fOf2=(GYS&#)Ofsk&pH8lT7Hl_9IbNB$hg4e#q zUOo8=UUarz)Pea8Gv7DE@X_c1K|H^0g@O9sH@_o;<_a>N00a_PBZFrcBatoeEED-X zDh3}I!~%CmrHgGDTrFc%b`kpJyCUz7J<OT^D|GveajhA9MPUz&JAA%O&uJB9h&0Hh zn^2KVTK|w3Wo6)6J@HmKOB%`B6ePKsmgKs+tsYLtXLO#F7Nj<ODJl0}Q&oE^0mL-4 zQI_i<W72J0O&(eA3dzzr-^jRv%Obcn{r4<oOj*@3HujrtcwwAKT3+VxaU1{+^X%&z DlmueV diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-310.pyc deleted file mode 100644 index 0924d8afac04d4fe82ebe791bc55a8ae48d7c117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28679 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-311.pyc deleted file mode 100644 index 2922ed407a89b026bf4d9e031464e011a7ad4a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58838 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 C=CgqS diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/__pycache__/post_processing.cpython-39.pyc deleted file mode 100644 index 312575d7655db85df423489051f494f3dce62692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28771 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/post_processing.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/post_processing.py deleted file mode 100644 index 6520a40f9..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/post_processing/post_processing.py +++ /dev/null @@ -1,1338 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import math -import os -from itertools import combinations, cycle -import pandas as pd -import scipy.stats as stats -from sklearn.linear_model import LinearRegression -from sklearn.metrics import mean_squared_error, r2_score -import matplotlib.pyplot as plt -import matplotlib.ticker as ticker -from matplotlib.offsetbox import AnchoredText -from matplotlib.patches import Patch -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class PostProcessing: - """ - This class provides many helper functions to post-process the trained - meta-model. - - Attributes - ---------- - MetaModel : obj - MetaModel object to do postprocessing on. - name : str - Type of the anaylsis. The default is `'calib'`. If a validation is - expected to be performed change this to `'valid'`. - """ - - def __init__(self, engine, name='calib'): - self.engine = engine - self.MetaModel = engine.MetaModel - self.ExpDesign = engine.ExpDesign - self.ModelObj = engine.Model - self.name = name - - # ------------------------------------------------------------------------- - def plot_moments(self, xlabel='Time [s]', plot_type=None): - """ - Plots the moments in a pdf format in the directory - `Outputs_PostProcessing`. - - Parameters - ---------- - xlabel : str, optional - String to be displayed as x-label. The default is `'Time [s]'`. - plot_type : str, optional - Options: bar or line. The default is `None`. - - Returns - ------- - pce_means: dict - Mean of the model outputs. - pce_means: dict - Standard deviation of the model outputs. - - """ - - bar_plot = True if plot_type == 'bar' else False - meta_model_type = self.MetaModel.meta_model_type - Model = self.ModelObj - - # Read Monte-Carlo reference - self.mc_reference = Model.read_observation('mc_ref') - - # Set the x values - x_values_orig = self.engine.ExpDesign.x_values - - # Compute the moments with the PCEModel object - self.pce_means, self.pce_stds = self.compute_pce_moments() - - # Get the variables - out_names = Model.Output.names - - # Open a pdf for the plots - newpath = (f'Outputs_PostProcessing_{self.name}/') - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Plot the best fit line, set the linewidth (lw), color and - # transparency (alpha) of the line - for key in out_names: - fig, ax = plt.subplots(nrows=1, ncols=2) - - # Extract mean and std - mean_data = self.pce_means[key] - std_data = self.pce_stds[key] - - # Extract a list of x values - if type(x_values_orig) is dict: - x = x_values_orig[key] - else: - x = x_values_orig - - # Plot: bar plot or line plot - if bar_plot: - ax[0].bar(list(map(str, x)), mean_data, color='b', - width=0.25) - ax[1].bar(list(map(str, x)), std_data, color='b', - width=0.25) - ax[0].legend(labels=[meta_model_type]) - ax[1].legend(labels=[meta_model_type]) - else: - ax[0].plot(x, mean_data, lw=3, color='k', marker='x', - label=meta_model_type) - ax[1].plot(x, std_data, lw=3, color='k', marker='x', - label=meta_model_type) - - if self.mc_reference is not None: - if bar_plot: - ax[0].bar(list(map(str, x)), self.mc_reference['mean'], - color='r', width=0.25) - ax[1].bar(list(map(str, x)), self.mc_reference['std'], - color='r', width=0.25) - ax[0].legend(labels=[meta_model_type]) - ax[1].legend(labels=[meta_model_type]) - else: - ax[0].plot(x, self.mc_reference['mean'], lw=3, marker='x', - color='r', label='Ref.') - ax[1].plot(x, self.mc_reference['std'], lw=3, marker='x', - color='r', label='Ref.') - - # Label the axes and provide a title - ax[0].set_xlabel(xlabel) - ax[1].set_xlabel(xlabel) - ax[0].set_ylabel(key) - ax[1].set_ylabel(key) - - # Provide a title - ax[0].set_title('Mean of ' + key) - ax[1].set_title('Std of ' + key) - - if not bar_plot: - ax[0].legend(loc='best') - ax[1].legend(loc='best') - - plt.tight_layout() - - # save the current figure - fig.savefig( - f'./{newpath}Mean_Std_PCE_{key}.pdf', - bbox_inches='tight' - ) - - return self.pce_means, self.pce_stds - - # ------------------------------------------------------------------------- - def valid_metamodel(self, n_samples=1, samples=None, model_out_dict=None, - x_axis='Time [s]'): - """ - Evaluates and plots the meta model and the PCEModel outputs for the - given number of samples or the given samples. - - Parameters - ---------- - n_samples : int, optional - Number of samples to be evaluated. The default is 1. - samples : array of shape (n_samples, n_params), optional - Samples to be evaluated. The default is None. - model_out_dict: dict - The model runs using the samples provided. - x_axis : str, optional - Label of x axis. The default is `'Time [s]'`. - - Returns - ------- - None. - - """ - MetaModel = self.MetaModel - Model = self.ModelObj - - if samples is None: - self.n_samples = n_samples - samples = self._get_sample() - else: - self.n_samples = samples.shape[0] - - # Extract x_values - x_values = self.engine.ExpDesign.x_values - - if model_out_dict is not None: - self.model_out_dict = model_out_dict - else: - self.model_out_dict = self._eval_model(samples, key_str='valid') - self.pce_out_mean, self.pce_out_std = MetaModel.eval_metamodel(samples) - - try: - key = Model.Output.names[1] - except IndexError: - key = Model.Output.names[0] - - n_obs = self.model_out_dict[key].shape[1] - - if n_obs == 1: - self._plot_validation() - else: - self._plot_validation_multi(x_values=x_values, x_axis=x_axis) - - # ------------------------------------------------------------------------- - def check_accuracy(self, n_samples=None, samples=None, outputs=None): - """ - Checks accuracy of the metamodel by computing the root mean square - error and validation error for all outputs. - - Parameters - ---------- - n_samples : int, optional - Number of samples. The default is None. - samples : array of shape (n_samples, n_params), optional - Parameter sets to be checked. The default is None. - outputs : dict, optional - Output dictionary with model outputs for all given output types in - `Model.Output.names`. The default is None. - - Raises - ------ - Exception - When neither n_samples nor samples are provided. - - Returns - ------- - rmse: dict - Root mean squared error for each output. - valid_error : dict - Validation error for each output. - - """ - MetaModel = self.MetaModel - Model = self.ModelObj - - # Set the number of samples - if n_samples: - self.n_samples = n_samples - elif samples is not None: - self.n_samples = samples.shape[0] - else: - raise Exception("Please provide either samples or pass the number" - " of samples!") - - # Generate random samples if necessary - Samples = self._get_sample() if samples is None else samples - - # Run the original model with the generated samples - if outputs is None: - outputs = self._eval_model(Samples, key_str='validSet') - - # Run the PCE model with the generated samples - pce_outputs, _ = MetaModel.eval_metamodel(samples=Samples) - - self.rmse = {} - self.valid_error = {} - # Loop over the keys and compute RMSE error. - for key in Model.Output.names: - # Root mena square - self.rmse[key] = mean_squared_error(outputs[key], pce_outputs[key], - squared=False, - multioutput='raw_values') - # Validation error - self.valid_error[key] = (self.rmse[key]**2) / \ - np.var(outputs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(self.rmse[key], - self.valid_error[key])))) - # Save error dicts in PCEModel object - self.MetaModel.rmse = self.rmse - self.MetaModel.valid_error = self.valid_error - - return - - # ------------------------------------------------------------------------- - def plot_seq_design_diagnostics(self, ref_BME_KLD=None): - """ - Plots the Bayesian Model Evidence (BME) and Kullback-Leibler divergence - (KLD) for the sequential design. - - Parameters - ---------- - ref_BME_KLD : array, optional - Reference BME and KLD . The default is `None`. - - Returns - ------- - None. - - """ - engine = self.engine - PCEModel = self.MetaModel - n_init_samples = engine.ExpDesign.n_init_samples - n_total_samples = engine.ExpDesign.X.shape[0] - - newpath = f'Outputs_PostProcessing_{self.name}/seq_design_diagnostics/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - plotList = ['Modified LOO error', 'Validation error', 'KLD', 'BME', - 'RMSEMean', 'RMSEStd', 'Hellinger distance'] - seqList = [engine.SeqModifiedLOO, engine.seqValidError, - engine.SeqKLD, engine.SeqBME, engine.seqRMSEMean, - engine.seqRMSEStd, engine.SeqDistHellinger] - - markers = ('x', 'o', 'd', '*', '+') - colors = ('k', 'darkgreen', 'b', 'navy', 'darkred') - - # Plot the evolution of the diagnostic criteria of the - # Sequential Experimental Design. - for plotidx, plot in enumerate(plotList): - fig, ax = plt.subplots() - seq_dict = seqList[plotidx] - name_util = list(seq_dict.keys()) - - if len(name_util) == 0: - continue - - # Box plot when Replications have been detected. - if any(int(name.split("rep_", 1)[1]) > 1 for name in name_util): - # Extract the values from dict - sorted_seq_opt = {} - # Number of replications - n_reps = engine.ExpDesign.n_replication - - # Get the list of utility function names - # Handle if only one UtilityFunction is provided - if not isinstance(engine.ExpDesign.util_func, list): - util_funcs = [engine.ExpDesign.util_func] - else: - util_funcs = engine.ExpDesign.util_func - - for util in util_funcs: - sortedSeq = {} - # min number of runs available from reps - n_runs = min([seq_dict[f'{util}_rep_{i+1}'].shape[0] - for i in range(n_reps)]) - - for runIdx in range(n_runs): - values = [] - for key in seq_dict.keys(): - if util in key: - values.append(seq_dict[key][runIdx].mean()) - sortedSeq['SeqItr_'+str(runIdx)] = np.array(values) - sorted_seq_opt[util] = sortedSeq - - # BoxPlot - def draw_plot(data, labels, edge_color, fill_color, idx): - pos = labels - (idx-1) - bp = plt.boxplot(data, positions=pos, labels=labels, - patch_artist=True, sym='', widths=0.75) - elements = ['boxes', 'whiskers', 'fliers', 'means', - 'medians', 'caps'] - for element in elements: - plt.setp(bp[element], color=edge_color[idx]) - - for patch in bp['boxes']: - patch.set(facecolor=fill_color[idx]) - - if engine.ExpDesign.n_new_samples != 1: - step1 = engine.ExpDesign.n_new_samples - step2 = 1 - else: - step1 = 5 - step2 = 5 - edge_color = ['red', 'blue', 'green'] - fill_color = ['tan', 'cyan', 'lightgreen'] - plot_label = plot - # Plot for different Utility Functions - for idx, util in enumerate(util_funcs): - all_errors = np.empty((n_reps, 0)) - - for key in list(sorted_seq_opt[util].keys()): - errors = sorted_seq_opt.get(util, {}).get(key)[:, None] - all_errors = np.hstack((all_errors, errors)) - - # Special cases for BME and KLD - if plot == 'KLD' or plot == 'BME': - # BME convergence if refBME is provided - if ref_BME_KLD is not None: - if plot == 'BME': - refValue = ref_BME_KLD[0] - plot_label = r'BME/BME$^{Ref.}$' - if plot == 'KLD': - refValue = ref_BME_KLD[1] - plot_label = '$D_{KL}[p(\\theta|y_*),p(\\theta)]'\ - ' / D_{KL}^{Ref.}[p(\\theta|y_*), '\ - 'p(\\theta)]$' - - # Difference between BME/KLD and the ref. values - all_errors = np.divide(all_errors, - np.full((all_errors.shape), - refValue)) - - # Plot baseline for zero, i.e. no difference - plt.axhline(y=1.0, xmin=0, xmax=1, c='green', - ls='--', lw=2) - - # Plot each UtilFuncs - labels = np.arange(n_init_samples, n_total_samples+1, step1) - draw_plot(all_errors[:, ::step2], labels, edge_color, - fill_color, idx) - - plt.xticks(labels, labels) - # Set the major and minor locators - ax.xaxis.set_major_locator(ticker.AutoLocator()) - ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) - ax.xaxis.grid(True, which='major', linestyle='-') - ax.xaxis.grid(True, which='minor', linestyle='--') - - # Legend - legend_elements = [] - for idx, util in enumerate(util_funcs): - legend_elements.append(Patch(facecolor=fill_color[idx], - edgecolor=edge_color[idx], - label=util)) - plt.legend(handles=legend_elements[::-1], loc='best') - - if plot != 'BME' and plot != 'KLD': - plt.yscale('log') - plt.autoscale(True) - plt.xlabel('\\# of training samples') - plt.ylabel(plot_label) - plt.title(plot) - - # save the current figure - plot_name = plot.replace(' ', '_') - fig.savefig( - f'./{newpath}/seq_{plot_name}.pdf', - bbox_inches='tight' - ) - # Destroy the current plot - plt.clf() - # Save arrays into files - f = open(f'./{newpath}/seq_{plot_name}.txt', 'w') - f.write(str(sorted_seq_opt)) - f.close() - else: - for idx, name in enumerate(name_util): - seq_values = seq_dict[name] - if engine.ExpDesign.n_new_samples != 1: - step = engine.ExpDesign.n_new_samples - else: - step = 1 - x_idx = np.arange(n_init_samples, n_total_samples+1, step) - if n_total_samples not in x_idx: - x_idx = np.hstack((x_idx, n_total_samples)) - - if plot == 'KLD' or plot == 'BME': - # BME convergence if refBME is provided - if ref_BME_KLD is not None: - if plot == 'BME': - refValue = ref_BME_KLD[0] - plot_label = r'BME/BME$^{Ref.}$' - if plot == 'KLD': - refValue = ref_BME_KLD[1] - plot_label = '$D_{KL}[p(\\theta|y_*),p(\\theta)]'\ - ' / D_{KL}^{Ref.}[p(\\theta|y_*), '\ - 'p(\\theta)]$' - - # Difference between BME/KLD and the ref. values - values = np.divide(seq_values, - np.full((seq_values.shape), - refValue)) - - # Plot baseline for zero, i.e. no difference - plt.axhline(y=1.0, xmin=0, xmax=1, c='green', - ls='--', lw=2) - - # Set the limits - plt.ylim([1e-1, 1e1]) - - # Create the plots - plt.semilogy(x_idx, values, marker=markers[idx], - color=colors[idx], ls='--', lw=2, - label=name.split("_rep", 1)[0]) - else: - plot_label = plot - - # Create the plots - plt.plot(x_idx, seq_values, marker=markers[idx], - color=colors[idx], ls='--', lw=2, - label=name.split("_rep", 1)[0]) - - else: - plot_label = plot - seq_values = np.nan_to_num(seq_values) - - # Plot the error evolution for each output - plt.semilogy(x_idx, seq_values.mean(axis=1), - marker=markers[idx], ls='--', lw=2, - color=colors[idx], - label=name.split("_rep", 1)[0]) - - # Set the major and minor locators - ax.xaxis.set_major_locator(ticker.AutoLocator()) - ax.xaxis.set_minor_locator(ticker.AutoMinorLocator()) - ax.xaxis.grid(True, which='major', linestyle='-') - ax.xaxis.grid(True, which='minor', linestyle='--') - - ax.tick_params(axis='both', which='major', direction='in', - width=3, length=10) - ax.tick_params(axis='both', which='minor', direction='in', - width=2, length=8) - plt.xlabel('Number of runs') - plt.ylabel(plot_label) - plt.title(plot) - plt.legend(frameon=True) - - # save the current figure - plot_name = plot.replace(' ', '_') - fig.savefig( - f'./{newpath}/seq_{plot_name}.pdf', - bbox_inches='tight' - ) - # Destroy the current plot - plt.clf() - - # ---------------- Saving arrays into files --------------- - np.save(f'./{newpath}/seq_{plot_name}.npy', seq_values) - - return - - # ------------------------------------------------------------------------- - def sobol_indices(self, xlabel='Time [s]', plot_type=None): - """ - Provides Sobol indices as a sensitivity measure to infer the importance - of the input parameters. See Eq. 27 in [1] for more details. For the - case with Principal component analysis refer to [2]. - - [1] Global sensitivity analysis: A flexible and efficient framework - with an example from stochastic hydrogeology S. Oladyshkin, F.P. - de Barros, W. Nowak https://doi.org/10.1016/j.advwatres.2011.11.001 - - [2] Nagel, J.B., Rieckermann, J. and Sudret, B., 2020. Principal - component analysis and sparse polynomial chaos expansions for global - sensitivity analysis and model calibration: Application to urban - drainage simulation. Reliability Engineering & System Safety, 195, - p.106737. - - Parameters - ---------- - xlabel : str, optional - Label of the x-axis. The default is `'Time [s]'`. - plot_type : str, optional - Plot type. The default is `None`. This corresponds to line plot. - Bar chart can be selected by `bar`. - - Returns - ------- - sobol_cell: dict - Sobol indices. - total_sobol: dict - Total Sobol indices. - - """ - # Extract the necessary variables - PCEModel = self.MetaModel - basis_dict = PCEModel.basis_dict - coeffs_dict = PCEModel.coeffs_dict - n_params = PCEModel.n_params - max_order = np.max(PCEModel.pce_deg) - sobol_cell_b = {} - total_sobol_b = {} - cov_Z_p_q = np.zeros((n_params)) - - for b_i in range(PCEModel.n_bootstrap_itrs): - - sobol_cell_, total_sobol_ = {}, {} - - for output in self.ModelObj.Output.names: - - n_meas_points = len(coeffs_dict[f'b_{b_i+1}'][output]) - - # Initialize the (cell) array containing the (total) Sobol indices. - sobol_array = dict.fromkeys(range(1, max_order+1), []) - sobol_cell_array = dict.fromkeys(range(1, max_order+1), []) - - for i_order in range(1, max_order+1): - n_comb = math.comb(n_params, i_order) - - sobol_cell_array[i_order] = np.zeros((n_comb, n_meas_points)) - - total_sobol_array = np.zeros((n_params, n_meas_points)) - - # Initialize the cell to store the names of the variables - TotalVariance = np.zeros((n_meas_points)) - # Loop over all measurement points and calculate sobol indices - for pIdx in range(n_meas_points): - - # Extract the basis indices (alpha) and coefficients - Basis = basis_dict[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - - try: - clf_poly = PCEModel.clf_poly[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - PCECoeffs = clf_poly.coef_ - except: - PCECoeffs = coeffs_dict[f'b_{b_i+1}'][output][f'y_{pIdx+1}'] - - # Compute total variance - TotalVariance[pIdx] = np.sum(np.square(PCECoeffs[1:])) - - nzidx = np.where(PCECoeffs != 0)[0] - # Set all the Sobol indices equal to zero in the presence of a - # null output. - if len(nzidx) == 0: - # This is buggy. - for i_order in range(1, max_order+1): - sobol_cell_array[i_order][:, pIdx] = 0 - - # Otherwise compute them by summing well-chosen coefficients - else: - nz_basis = Basis[nzidx] - for i_order in range(1, max_order+1): - idx = np.where(np.sum(nz_basis > 0, axis=1) == i_order) - subbasis = nz_basis[idx] - Z = np.array(list(combinations(range(n_params), i_order))) - - for q in range(Z.shape[0]): - Zq = Z[q] - subsubbasis = subbasis[:, Zq] - subidx = np.prod(subsubbasis, axis=1) > 0 - sum_ind = nzidx[idx[0][subidx]] - if TotalVariance[pIdx] == 0.0: - sobol_cell_array[i_order][q, pIdx] = 0.0 - else: - sobol = np.sum(np.square(PCECoeffs[sum_ind])) - sobol /= TotalVariance[pIdx] - sobol_cell_array[i_order][q, pIdx] = sobol - - # Compute the TOTAL Sobol indices. - for ParIdx in range(n_params): - idx = nz_basis[:, ParIdx] > 0 - sum_ind = nzidx[idx] - - if TotalVariance[pIdx] == 0.0: - total_sobol_array[ParIdx, pIdx] = 0.0 - else: - sobol = np.sum(np.square(PCECoeffs[sum_ind])) - sobol /= TotalVariance[pIdx] - total_sobol_array[ParIdx, pIdx] = sobol - - # ----- if PCA selected: Compute covariance ----- - if PCEModel.dim_red_method.lower() == 'pca': - # Extract the basis indices (alpha) and coefficients for - # next component - if pIdx < n_meas_points-1: - nextBasis = basis_dict[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - if PCEModel.bootstrap_method != 'fast' or b_i == 0: - clf_poly = PCEModel.clf_poly[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - nextPCECoeffs = clf_poly.coef_ - else: - nextPCECoeffs = coeffs_dict[f'b_{b_i+1}'][output][f'y_{pIdx+2}'] - - # Choose the common non-zero basis - mask = (Basis[:, None] == nextBasis).all(-1).any(-1) - n_mask = (nextBasis[:, None] == Basis).all(-1).any(-1) - - # Compute the covariance in Eq 17. - for ParIdx in range(n_params): - idx = (mask) & (Basis[:, ParIdx] > 0) - n_idx = (n_mask) & (nextBasis[:, ParIdx] > 0) - try: - cov_Z_p_q[ParIdx] += np.sum(np.dot( - PCECoeffs[idx], nextPCECoeffs[n_idx]) - ) - except: - pass - - # Compute the sobol indices according to Ref. 2 - if PCEModel.dim_red_method.lower() == 'pca': - n_c_points = self.engine.ExpDesign.Y[output].shape[1] - PCA = PCEModel.pca[f'b_{b_i+1}'][output] - compPCA = PCA.components_ - nComp = compPCA.shape[0] - var_Z_p = PCA.explained_variance_ - - # Extract the sobol index of the components - for i_order in range(1, max_order+1): - n_comb = math.comb(n_params, i_order) - sobol_array[i_order] = np.zeros((n_comb, n_c_points)) - Z = np.array(list(combinations(range(n_params), i_order))) - - # Loop over parameters - for q in range(Z.shape[0]): - S_Z_i = sobol_cell_array[i_order][q] - - for tIdx in range(n_c_points): - var_Y_t = np.var( - self.engine.ExpDesign.Y[output][:, tIdx]) - if var_Y_t == 0.0: - term1, term2 = 0.0, 0.0 - else: - # Eq. 17 - term1 = 0.0 - for i in range(nComp): - a = S_Z_i[i] * var_Z_p[i] - a *= compPCA[i, tIdx]**2 - term1 += a - - # TODO: Term 2 - # term2 = 0.0 - # for i in range(nComp-1): - # term2 += cov_Z_p_q[q] * compPCA[i, tIdx] - # term2 *= compPCA[i+1, tIdx] - # term2 *= 2 - - sobol_array[i_order][q, tIdx] = term1 #+ term2 - - # Devide over total output variance Eq. 18 - sobol_array[i_order][q, tIdx] /= var_Y_t - - # Compute the TOTAL Sobol indices. - total_sobol = np.zeros((n_params, n_c_points)) - for ParIdx in range(n_params): - S_Z_i = total_sobol_array[ParIdx] - - for tIdx in range(n_c_points): - var_Y_t = np.var(self.engine.ExpDesign.Y[output][:, tIdx]) - if var_Y_t == 0.0: - term1, term2 = 0.0, 0.0 - else: - term1 = 0 - for i in range(nComp): - term1 += S_Z_i[i] * var_Z_p[i] * \ - (compPCA[i, tIdx]**2) - - # Term 2 - term2 = 0 - for i in range(nComp-1): - term2 += cov_Z_p_q[ParIdx] * compPCA[i, tIdx] \ - * compPCA[i+1, tIdx] - term2 *= 2 - - total_sobol[ParIdx, tIdx] = term1 #+ term2 - - # Devide over total output variance Eq. 18 - total_sobol[ParIdx, tIdx] /= var_Y_t - - sobol_cell_[output] = sobol_array - total_sobol_[output] = total_sobol - else: - sobol_cell_[output] = sobol_cell_array - total_sobol_[output] = total_sobol_array - - # Save for each bootsrtap iteration - sobol_cell_b[b_i] = sobol_cell_ - total_sobol_b[b_i] = total_sobol_ - - # Average total sobol indices - total_sobol_all = {} - for i in sorted(total_sobol_b): - for k, v in total_sobol_b[i].items(): - if k not in total_sobol_all: - total_sobol_all[k] = [None] * len(total_sobol_b) - total_sobol_all[k][i] = v - - self.total_sobol = {} - for output in self.ModelObj.Output.names: - self.total_sobol[output] = np.mean(total_sobol_all[output], axis=0) - - # ---------------- Plot ----------------------- - par_names = self.engine.ExpDesign.par_names - x_values_orig = self.engine.ExpDesign.x_values - - newpath = (f'Outputs_PostProcessing_{self.name}/') - if not os.path.exists(newpath): - os.makedirs(newpath) - - fig = plt.figure() - - for outIdx, output in enumerate(self.ModelObj.Output.names): - - # Extract total Sobol indices - total_sobol = self.total_sobol[output] - - # Compute quantiles - q_5 = np.quantile(total_sobol_all[output], q=0.05, axis=0) - q_97_5 = np.quantile(total_sobol_all[output], q=0.975, axis=0) - - # Extract a list of x values - if type(x_values_orig) is dict: - x = x_values_orig[output] - else: - x = x_values_orig - - if plot_type == 'bar': - ax = fig.add_axes([0, 0, 1, 1]) - dict1 = {xlabel: x} - dict2 = {param: sobolIndices for param, sobolIndices - in zip(par_names, total_sobol)} - - df = pd.DataFrame({**dict1, **dict2}) - df.plot(x=xlabel, y=par_names, kind="bar", ax=ax, rot=0, - colormap='Dark2', yerr=q_97_5-q_5) - ax.set_ylabel('Total Sobol indices, $S^T$') - - else: - for i, sobolIndices in enumerate(total_sobol): - plt.plot(x, sobolIndices, label=par_names[i], - marker='x', lw=2.5) - plt.fill_between(x, q_5[i], q_97_5[i], alpha=0.15) - - plt.ylabel('Total Sobol indices, $S^T$') - plt.xlabel(xlabel) - - plt.title(f'Sensitivity analysis of {output}') - if plot_type != 'bar': - plt.legend(loc='best', frameon=True) - - # Save indices - np.savetxt(f'./{newpath}totalsobol_' + - output.replace('/', '_') + '.csv', - total_sobol.T, delimiter=',', - header=','.join(par_names), comments='') - - # save the current figure - fig.savefig( - f'./{newpath}Sobol_indices_{output}.pdf', - bbox_inches='tight' - ) - - # Destroy the current plot - plt.clf() - - return self.total_sobol - - # ------------------------------------------------------------------------- - def check_reg_quality(self, n_samples=1000, samples=None): - """ - Checks the quality of the metamodel for single output models based on: - https://towardsdatascience.com/how-do-you-check-the-quality-of-your-regression-model-in-python-fa61759ff685 - - - Parameters - ---------- - n_samples : int, optional - Number of parameter sets to use for the check. The default is 1000. - samples : array of shape (n_samples, n_params), optional - Parameter sets to use for the check. The default is None. - - Returns - ------- - None. - - """ - MetaModel = self.MetaModel - - if samples is None: - self.n_samples = n_samples - samples = self._get_sample() - else: - self.n_samples = samples.shape[0] - - # Evaluate the original and the surrogate model - y_val = self._eval_model(samples, key_str='valid') - y_pce_val, _ = MetaModel.eval_metamodel(samples=samples) - - # Open a pdf for the plots - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Fit the data(train the model) - for key in y_pce_val.keys(): - - y_pce_val_ = y_pce_val[key] - y_val_ = y_val[key] - residuals = y_val_ - y_pce_val_ - - # ------ Residuals vs. predicting variables ------ - # Check the assumptions of linearity and independence - fig1 = plt.figure() - for i, par in enumerate(self.engine.ExpDesign.par_names): - plt.title(f"{key}: Residuals vs. {par}") - plt.scatter( - x=samples[:, i], y=residuals, color='blue', edgecolor='k') - plt.grid(True) - xmin, xmax = min(samples[:, i]), max(samples[:, i]) - plt.hlines(y=0, xmin=xmin*0.9, xmax=xmax*1.1, color='red', - lw=3, linestyle='--') - plt.xlabel(par) - plt.ylabel('Residuals') - plt.show() - - # save the current figure - fig1.savefig(f'./{newpath}/Residuals_vs_Par_{i+1}.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Fitted vs. residuals ------ - # Check the assumptions of linearity and independence - fig2 = plt.figure() - plt.title(f"{key}: Residuals vs. fitted values") - plt.scatter(x=y_pce_val_, y=residuals, color='blue', edgecolor='k') - plt.grid(True) - xmin, xmax = min(y_val_), max(y_val_) - plt.hlines(y=0, xmin=xmin*0.9, xmax=xmax*1.1, color='red', lw=3, - linestyle='--') - plt.xlabel(key) - plt.ylabel('Residuals') - plt.show() - - # save the current figure - fig2.savefig(f'./{newpath}/Fitted_vs_Residuals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Histogram of normalized residuals ------ - fig3 = plt.figure() - resid_pearson = residuals / (max(residuals)-min(residuals)) - plt.hist(resid_pearson, bins=20, edgecolor='k') - plt.ylabel('Count') - plt.xlabel('Normalized residuals') - plt.title(f"{key}: Histogram of normalized residuals") - - # Normality (Shapiro-Wilk) test of the residuals - ax = plt.gca() - _, p = stats.shapiro(residuals) - if p < 0.01: - annText = "The residuals seem to come from a Gaussian Process." - else: - annText = "The normality assumption may not hold." - at = AnchoredText(annText, prop=dict(size=30), frameon=True, - loc='upper left') - at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") - ax.add_artist(at) - - plt.show() - - # save the current figure - fig3.savefig(f'./{newpath}/Hist_NormResiduals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------ Q-Q plot of the normalized residuals ------ - plt.figure() - stats.probplot(residuals[:, 0], plot=plt) - plt.xticks() - plt.yticks() - plt.xlabel("Theoretical quantiles") - plt.ylabel("Sample quantiles") - plt.title(f"{key}: Q-Q plot of normalized residuals") - plt.grid(True) - plt.show() - - # save the current figure - plt.savefig(f'./{newpath}/QQPlot_NormResiduals.pdf', - bbox_inches='tight') - # Destroy the current plot - plt.clf() - - # ------------------------------------------------------------------------- - def eval_pce_model_3d(self): - - self.n_samples = 1000 - - PCEModel = self.MetaModel - Model = self.ModelObj - n_samples = self.n_samples - - # Create 3D-Grid - # TODO: Make it general - x = np.linspace(-5, 10, n_samples) - y = np.linspace(0, 15, n_samples) - - X, Y = np.meshgrid(x, y) - PCE_Z = np.zeros((self.n_samples, self.n_samples)) - Model_Z = np.zeros((self.n_samples, self.n_samples)) - - for idxMesh in range(self.n_samples): - sample_mesh = np.vstack((X[:, idxMesh], Y[:, idxMesh])).T - - univ_p_val = PCEModel.univ_basis_vals(sample_mesh) - - for Outkey, ValuesDict in PCEModel.coeffs_dict.items(): - - pce_out_mean = np.zeros((len(sample_mesh), len(ValuesDict))) - pce_out_std = np.zeros((len(sample_mesh), len(ValuesDict))) - model_outs = np.zeros((len(sample_mesh), len(ValuesDict))) - - for Inkey, InIdxValues in ValuesDict.items(): - idx = int(Inkey.split('_')[1]) - 1 - basis_deg_ind = PCEModel.basis_dict[Outkey][Inkey] - clf_poly = PCEModel.clf_poly[Outkey][Inkey] - - PSI_Val = PCEModel.create_psi(basis_deg_ind, univ_p_val) - - # Perdiction with error bar - y_mean, y_std = clf_poly.predict(PSI_Val, return_std=True) - - pce_out_mean[:, idx] = y_mean - pce_out_std[:, idx] = y_std - - # Model evaluation - model_out_dict, _ = Model.run_model_parallel(sample_mesh, - key_str='Valid3D') - model_outs[:, idx] = model_out_dict[Outkey].T - - PCE_Z[:, idxMesh] = y_mean - Model_Z[:, idxMesh] = model_outs[:, 0] - - # ---------------- 3D plot for PCEModel ----------------------- - fig_PCE = plt.figure() - ax = plt.axes(projection='3d') - ax.plot_surface(X, Y, PCE_Z, rstride=1, cstride=1, - cmap='viridis', edgecolor='none') - ax.set_title('PCEModel') - ax.set_xlabel('$x_1$') - ax.set_ylabel('$x_2$') - ax.set_zlabel('$f(x_1,x_2)$') - - plt.grid() - plt.show() - - # Saving the figure - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # save the figure to file - fig_PCE.savefig(f'./{newpath}/3DPlot_PCEModel.pdf', - bbox_inches='tight') - plt.close(fig_PCE) - - # ---------------- 3D plot for Model ----------------------- - fig_Model = plt.figure() - ax = plt.axes(projection='3d') - ax.plot_surface(X, Y, PCE_Z, rstride=1, cstride=1, - cmap='viridis', edgecolor='none') - ax.set_title('Model') - ax.set_xlabel('$x_1$') - ax.set_ylabel('$x_2$') - ax.set_zlabel('$f(x_1,x_2)$') - - plt.grid() - plt.show() - - # Save the figure - fig_Model.savefig(f'./{newpath}/3DPlot_Model.pdf', - bbox_inches='tight') - plt.close(fig_Model) - - return - - # ------------------------------------------------------------------------- - def compute_pce_moments(self): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moments (mean) of outpust. - pce_means: dict - The first moments (mean) of outpust. - - """ - - MetaModel = self.MetaModel - outputs = self.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.inverse_transform(pce_mean) - stds[output] = np.sqrt(np.dot(pce_var, - PCA.components_**2)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - # Print a report table - print("\n>>>>> Moments of {} <<<<<".format(output)) - print("\nIndex | Mean | Std. deviation") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(pce_means[output], - pce_stds[output])))) - print('-'*40) - - return pce_means, pce_stds - - # ------------------------------------------------------------------------- - def _get_sample(self, n_samples=None): - """ - Generates random samples taken from the input parameter space. - - Returns - ------- - samples : array of shape (n_samples, n_params) - Generated samples. - - """ - if n_samples is None: - n_samples = self.n_samples - self.samples = self.ExpDesign.generate_samples( - n_samples, - sampling_method='random') - return self.samples - - # ------------------------------------------------------------------------- - def _eval_model(self, samples=None, key_str='Valid'): - """ - Evaluates Forward Model for the given number of self.samples or given - samples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate the model at. The default is None. - key_str : str, optional - Key string pass to the model. The default is 'Valid'. - - Returns - ------- - model_outs : dict - Dictionary of results. - - """ - Model = self.ModelObj - - if samples is None: - samples = self._get_sample() - self.samples = samples - else: - self.n_samples = len(samples) - - model_outs, _ = Model.run_model_parallel(samples, key_str=key_str) - - return model_outs - - # ------------------------------------------------------------------------- - def _plot_validation(self): - """ - Plots outputs for visual comparison of metamodel outputs with that of - the (full) original model. - - Returns - ------- - None. - - """ - PCEModel = self.MetaModel - - # get the samples - x_val = self.samples - y_pce_val = self.pce_out_mean - y_val = self.model_out_dict - - # Open a pdf for the plots - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - fig = plt.figure() - # Fit the data(train the model) - for key in y_pce_val.keys(): - - y_pce_val_ = y_pce_val[key] - y_val_ = y_val[key] - - regression_model = LinearRegression() - regression_model.fit(y_pce_val_, y_val_) - - # Predict - x_new = np.linspace(np.min(y_pce_val_), np.max(y_val_), 100) - y_predicted = regression_model.predict(x_new[:, np.newaxis]) - - plt.scatter(y_pce_val_, y_val_, color='gold', linewidth=2) - plt.plot(x_new, y_predicted, color='k') - - # Calculate the adjusted R_squared and RMSE - # the total number of explanatory variables in the model - # (not including the constant term) - length_list = [] - for key, value in PCEModel.coeffs_dict['b_1'][key].items(): - length_list.append(len(value)) - n_predictors = min(length_list) - n_samples = x_val.shape[0] - - R2 = r2_score(y_pce_val_, y_val_) - AdjR2 = 1 - (1 - R2) * (n_samples - 1) / \ - (n_samples - n_predictors - 1) - rmse = mean_squared_error(y_pce_val_, y_val_, squared=False) - - plt.annotate(f'RMSE = {rmse:.3f}\n Adjusted $R^2$ = {AdjR2:.3f}', - xy=(0.05, 0.85), xycoords='axes fraction') - - plt.ylabel("Original Model") - plt.xlabel("PCE Model") - plt.grid() - plt.show() - - # save the current figure - plot_name = key.replace(' ', '_') - fig.savefig(f'./{newpath}/Model_vs_PCEModel_{plot_name}.pdf', - bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - # ------------------------------------------------------------------------- - def _plot_validation_multi(self, x_values=[], x_axis="x [m]"): - """ - Plots outputs for visual comparison of metamodel outputs with that of - the (full) multioutput original model - - Parameters - ---------- - x_values : list or array, optional - List of x values. The default is []. - x_axis : str, optional - Label of the x axis. The default is "x [m]". - - Returns - ------- - None. - - """ - Model = self.ModelObj - - newpath = f'Outputs_PostProcessing_{self.name}/' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # List of markers and colors - color = cycle((['b', 'g', 'r', 'y', 'k'])) - marker = cycle(('x', 'd', '+', 'o', '*')) - - fig = plt.figure() - # Plot the model vs PCE model - for keyIdx, key in enumerate(Model.Output.names): - - y_pce_val = self.pce_out_mean[key] - y_pce_val_std = self.pce_out_std[key] - y_val = self.model_out_dict[key] - try: - x = self.model_out_dict['x_values'][key] - except (TypeError, IndexError): - x = x_values - - for idx in range(y_val.shape[0]): - Color = next(color) - Marker = next(marker) - - plt.plot(x, y_val[idx], color=Color, marker=Marker, - label='$Y_{%s}^M$'%(idx+1)) - - plt.plot(x, y_pce_val[idx], color=Color, marker=Marker, - linestyle='--', - label='$Y_{%s}^{PCE}$'%(idx+1)) - plt.fill_between(x, y_pce_val[idx]-1.96*y_pce_val_std[idx], - y_pce_val[idx]+1.96*y_pce_val_std[idx], - color=Color, alpha=0.15) - - # Calculate the RMSE - rmse = mean_squared_error(y_pce_val, y_val, squared=False) - R2 = r2_score(y_pce_val[idx].reshape(-1, 1), - y_val[idx].reshape(-1, 1)) - - plt.annotate(f'RMSE = {rmse:.3f}\n $R^2$ = {R2:.3f}', - xy=(0.85, 0.1), xycoords='axes fraction') - - plt.ylabel(key) - plt.xlabel(x_axis) - plt.legend(loc='best') - plt.grid() - - # save the current figure - plot_name = key.replace(' ', '_') - fig.savefig(f'./{newpath}/Model_vs_PCEModel_{plot_name}.pdf', - bbox_inches='tight') - - # Destroy the current plot - plt.clf() - - # Zip the subdirectories - Model.zip_subdirs(f'{Model.name}valid', f'{Model.name}valid_') diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__init__.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__init__.py deleted file mode 100644 index 4bd81739f..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .pylink import PyLinkForwardModel - -__all__ = [ - "PyLinkForwardModel" - ] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 5b7c1b3926506fb279b856f55ca6120df31b8888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYk0F>V4e5Jhb-0ThKMNZf#88|DHCrHFtcL7*rNjb*UKTFkDI?G5aaa;0rk<q9+~ z3k_eIKl*yo{BgbBGb6S7LlbEKHQ`Z$!W&H(kZGnlvYf9uXIkv|TIl49rLBKXFy-~@ zvih*ae(L;DdHw0MLEju$q)FXAR7mWW>yDHPQOaNDpNQY=yn?)lu!Zknd;q_98D>fa zcz4?}H$@CEvvFQ-V2bXzR562%s!aG%Xtj4IxEFwwwy;sk(V?ol<J{>I&7^rSw8>tC HNV=CRubV&? diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2ce3317406e07859bf08a42b738674e05d5c4339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmZ3^%ge<81T4a;sl`D0F^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%p@2%C%)D&3{G#&2q7>i!l+>IeW}uXxCi5+}g327A9GHKLJw84$Cnr9B zCBtWs4ZnPytztrpQ;UjYin8-FaxxMVi(_2!lS^|`^Gb?i+%ro&N|R#Ta`MXq5=$~- zk`gOZi^~#oGE<83D`Ft##>B^G=4F<|$LkeT{^GF7%}*)KNwq8D1ey+VT(KsQ_`uA_ g$oPScfl>VegBmgdim^(5U}oZGYhVY#B6gr^0M-CYtpET3 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 0bbb522855ad250ad55bca46123c0f5023076291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmYk0%}N6?6or$S`h(bw3*TWDDHL%dB0@zFtQ2HGN+6_7M#J1>hGbGZZhZw`!dGzX zTg=v#ui!@Sv>Pwn?{YYo!;!<`0l|6w_*8)Rs~7(#L2-#2juDC|3dGVmr9>r<be^d6 zo@9e>ie^T;qgi`vTzOsjXX(|nQW|_8aF?asZruWU8{O>*ApwMVCw>S04SwDxXFLzu z2kv!Qjk$_8uD4{?IPE2v7ulG~u|mrxdd+SoGj^3v^M{ksDPKebiY=`yHJ5b_+$?LZ z5zH36FiwKkAwm;Y<0sL7`RMpUwmPgZS@~+sw;j0<#+gQlQQda?=eAN2^hJtA!vJxZ GCcl4{ja-8O diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-310.pyc deleted file mode 100644 index b6ae7c14b35b60388e38fcbd3af64d04771a947c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18654 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-311.pyc deleted file mode 100644 index 196cda321394e0169190078c23aeee5b564efdfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35776 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 SVDoUH{A(8Tt1aRgKK@@2*W9!K diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/__pycache__/pylink.cpython-39.pyc deleted file mode 100644 index 746c82eb52be2e437c61bd201433f9d38b8ab177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18646 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/pylink.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/pylink.py deleted file mode 100644 index 8b826c5ce..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/pylink/pylink.py +++ /dev/null @@ -1,797 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -from dataclasses import dataclass - -import os -import shutil -import h5py -import numpy as np -import time -import zipfile -import pandas as pd -import multiprocessing -from functools import partial -import tqdm - -import umbridge # TODO: add this to the imports!? -#from multiprocessing import get_context -from multiprocess import get_context - - - -def within_range(out, minout, maxout): - """ - Checks if all the values in out lie between minout and maxout - - Parameters - ---------- - out : array or list - Data to check against range - minout : int - Lower bound of the range - maxout : int - Upper bound of the range - - Returns - ------- - inside : bool - True if all values in out are in the specified range - - """ - try: - out = np.array(out) - except: - raise AttributeError('The given values should be a 1D array, but are not') - if out.ndim != 1: - raise AttributeError('The given values should be a 1D array, but are not') - - if minout > maxout: - raise ValueError('The lower and upper bounds do not form a valid range, they might be switched') - - inside = False - if (out > minout).all() and (out < maxout).all(): - inside = True - return inside - - -class PyLinkForwardModel(object): - """ - A forward model binder - - This calss serves as a code wrapper. This wrapper allows the execution of - a third-party software/solver within the scope of BayesValidRox. - - Attributes - ---------- - link_type : str - The type of the wrapper. The default is `'pylink'`. This runs the - third-party software or an executable using a shell command with given - input files. - Second option is `'function'` which assumed that model can be run using - a function written separately in a Python script. - name : str - Name of the model. - py_file : str - Python file name without `.py` extension to be run for the `'function'` - wrapper. Note that the name of the python file and that of the function - must be simillar. This function must recieve the parameters in an array - of shape `(n_samples, n_params)` and returns a dictionary with the - x_values and output arrays for given output names. - func_args : dict - Additional arguments for the python file. The default is `{}`. - shell_command : str - Shell command to be executed for the `'pylink'` wrapper. - input_file : str or list - The input file to be passed to the `'pylink'` wrapper. - input_template : str or list - A template input file to be passed to the `'pylink'` wrapper. This file - must be a copy of `input_file` with `<Xi>` place holder for the input - parameters defined using `inputs` class, with i being the number of - parameter. The file name ending should include `.tpl` before the actual - extension of the input file, for example, `params.tpl.input`. - aux_file : str or list - The list of auxiliary files needed for the `'pylink'` wrapper. - exe_path : str - Execution path if you wish to run the model for the `'pylink'` wrapper - in another directory. The default is `None`, which corresponds to the - currecnt working directory. - output_file_names : list of str - List of the name of the model output text files for the `'pylink'` - wrapper. - output_names : list of str - List of the model outputs to be used for the analysis. - output_parser : str - Name of the model parser file (without `.py` extension) that recieves - the `output_file_names` and returns a 2d-array with the first row being - the x_values, e.g. x coordinates or time and the rest of raws pass the - simulation output for each model output defined in `output_names`. Note - that again here the name of the file and that of the function must be - the same. - multi_process: bool - Whether the model runs to be executed in parallel for the `'pylink'` - wrapper. The default is `True`. - n_cpus: int - The number of cpus to be used for the parallel model execution for the - `'pylink'` wrapper. The default is `None`, which corresponds to all - available cpus. - meas_file : str - The name of the measurement text-based file. This file must contain - x_values as the first column and one column for each model output. The - default is `None`. Only needed for the Bayesian Inference. - meas_file_valid : str - The name of the measurement text-based file for the validation. The - default is `None`. Only needed for the validation with Bayesian - Inference. - mc_ref_file : str - The name of the text file for the Monte-Carlo reference (mean and - standard deviation) values. It must contain `x_values` as the first - column, `mean` as the second column and `std` as the third. It can be - used to compare the estimated moments using meta-model in the post- - processing step. This is only available for one output. - obs_dict : dict - A dictionary containing the measurement text-based file. It must - contain `x_values` as the first item and one item for each model output - . The default is `{}`. Only needed for the Bayesian Inference. - obs_dict_valid : dict - A dictionary containing the validation measurement text-based file. It - must contain `x_values` as the first item and one item for each model - output. The default is `{}`. - mc_ref_dict : dict - A dictionary containing the Monte-Carlo reference (mean and standard - deviation) values. It must contain `x_values` as the first item and - `mean` as the second item and `std` as the third. The default is `{}`. - This is only available for one output. - """ - - # Nested class - @dataclass - class OutputData(object): - parser: str = "" - names: list = None - file_names: list = None - - def __init__(self, link_type='pylink', name=None, py_file=None, - func_args={}, shell_command='', input_file=None, - input_template=None, aux_file=None, exe_path='', - output_file_names=[], output_names=[], output_parser='', - multi_process=True, n_cpus=None, meas_file=None, - meas_file_valid=None, mc_ref_file=None, obs_dict={}, - obs_dict_valid={}, mc_ref_dict={}): - self.link_type = link_type - self.name = name - self.shell_command = shell_command - self.py_file = py_file - self.func_args = func_args - self.input_file = input_file - self.input_template = input_template - self.aux_file = aux_file - self.exe_path = exe_path - self.multi_process = multi_process - self.n_cpus = n_cpus - self.Output = self.OutputData( - parser=output_parser, - names=output_names, - file_names=output_file_names, - ) - self.n_outputs = len(self.Output.names) - self.meas_file = meas_file - self.meas_file_valid = meas_file_valid - self.mc_ref_file = mc_ref_file - self.observations = obs_dict - self.observations_valid = obs_dict_valid - self.mc_reference = mc_ref_dict - - # ------------------------------------------------------------------------- - def read_observation(self, case='calib'): - """ - Reads/prepare the observation/measurement data for - calibration. - - Parameters - ---------- - case : str - The type of observation to read in. Can be either 'calib', - 'valid' or 'mc_ref' - - Returns - ------- - DataFrame - A dataframe with the calibration data. - - """ - # TOOD: check that what is read in/transformed matches the expected form of data/reference - if case.lower() == 'calib': - if isinstance(self.observations, dict) and bool(self.observations): - self.observations = pd.DataFrame.from_dict(self.observations) - elif self.meas_file is not None: - file_path = os.path.join(os.getcwd(), self.meas_file) - self.observations = pd.read_csv(file_path, delimiter=',') - elif isinstance(self.observations, pd.DataFrame): - self.observations = self.observations - else: - raise Exception("Please provide the observation data as a " - "dictionary via observations attribute or pass" - " the csv-file path to MeasurementFile " - "attribute") - # Compute the number of observation - self.n_obs = self.observations[self.Output.names].notnull().sum().values.sum() - return self.observations - - elif case.lower() == 'valid': - if isinstance(self.observations_valid, dict) and \ - bool(self.observations_valid): - self.observations_valid = pd.DataFrame.from_dict(self.observations_valid) - elif self.meas_file_valid is not None: - file_path = os.path.join(os.getcwd(), self.meas_file_valid) - self.observations_valid = pd.read_csv(file_path, delimiter=',') - elif isinstance(self.observations_valid, pd.DataFrame): - self.observations_valid = self.observations_valid - else: - raise Exception("Please provide the observation data as a " - "dictionary via observations attribute or pass" - " the csv-file path to MeasurementFile " - "attribute") - # Compute the number of observation - self.n_obs_valid = self.observations_valid[self.Output.names].notnull().sum().values.sum() - return self.observations_valid - - elif case.lower() == 'mc_ref': - if self.mc_ref_file is None and \ - isinstance(self.mc_reference, pd.DataFrame): - return self.mc_reference - elif isinstance(self.mc_reference, dict) and bool(self.mc_reference): - self.mc_reference = pd.DataFrame.from_dict(self.mc_reference) - elif self.mc_ref_file is not None: - file_path = os.path.join(os.getcwd(), self.mc_ref_file) - self.mc_reference = pd.read_csv(file_path, delimiter=',') - else: - self.mc_reference = None - return self.mc_reference - - - # ------------------------------------------------------------------------- - def read_output(self): - """ - Reads the the parser output file and returns it as an - executable function. It is required when the models returns the - simulation outputs in csv files. - - Returns - ------- - Output : func - Output parser function. - - """ - output_func_name = self.Output.parser - - output_func = getattr(__import__(output_func_name), output_func_name) - - file_names = [] - for File in self.Output.file_names: - file_names.append(os.path.join(self.exe_path, File)) - try: - output = output_func(self.name, file_names) - except TypeError: - output = output_func(file_names) - return output - - # ------------------------------------------------------------------------- - def update_input_params(self, new_input_file, param_set): - """ - Finds this pattern with <X1> in the new_input_file and replace it with - the new value from the array param_sets. - - Parameters - ---------- - new_input_file : list - List of the input files with the adapted names. - param_set : array of shape (n_params) - Parameter set. - - Returns - ------- - None. - - """ - NofPa = param_set.shape[0] - text_to_search_list = [f'<X{i+1}>' for i in range(NofPa)] - - for filename in new_input_file: - # Read in the file - with open(filename, 'r') as file: - filedata = file.read() - - # Replace the target string - for text_to_search, params in zip(text_to_search_list, param_set): - filedata = filedata.replace(text_to_search, f'{params:0.4e}') - - # Write the file out again - with open(filename, 'w') as file: - file.write(filedata) - - # ------------------------------------------------------------------------- - def run_command(self, command, output_file_names): - """ - Runs the execution command given by the user to run the given model. - It checks if the output files have been generated. If yes, the jobe is - done and it extracts and returns the requested output(s). Otherwise, - it executes the command again. - - Parameters - ---------- - command : str - The shell command to be executed. - output_file_names : list - Name of the output file names. - - Returns - ------- - simulation_outputs : array of shape (n_obs, n_outputs) - Simulation outputs. - - """ - - # Check if simulation is finished - while True: - time.sleep(3) - files = os.listdir(".") - if all(elem in files for elem in output_file_names): - break - else: - # Run command - Process = os.system(f'./../{command}') - if Process != 0: - print('\nMessage 1:') - print(f'\tIf the value of \'{Process}\' is a non-zero value' - ', then compilation problems occur \n' % Process) - os.chdir("..") - - # Read the output - simulation_outputs = self.read_output() - - return simulation_outputs - - # ------------------------------------------------------------------------- - def run_forwardmodel(self, xx): - """ - This function creates subdirectory for the current run and copies the - necessary files to this directory and renames them. Next, it executes - the given command. - - Parameters - ---------- - xx : tuple - A tuple including parameter set, simulation number and key string. - - Returns - ------- - output : array of shape (n_outputs+1, n_obs) - An array passed by the output paraser containing the x_values as - the first row and the simulations results stored in the the rest of - the array. - - """ - c_points, run_no, key_str = xx - - # Handle if only one imput file is provided - if not isinstance(self.input_template, list): - self.input_template = [self.input_template] - if not isinstance(self.input_file, list): - self.input_file = [self.input_file] - - new_input_file = [] - # Loop over the InputTemplates: - for in_temp in self.input_template: - if '/' in in_temp: - in_temp = in_temp.split('/')[-1] - new_input_file.append(in_temp.split('.tpl')[0] + key_str + - f"_{run_no+1}" + in_temp.split('.tpl')[1]) - - # Create directories - newpath = self.name + key_str + f'_{run_no+1}' - if not os.path.exists(newpath): - os.makedirs(newpath) - - # Copy the necessary files to the directories - print(self.input_template) - for in_temp in self.input_template: - # Input file(s) of the model - shutil.copy2(in_temp, newpath) - # Auxiliary file - if self.aux_file is not None: - shutil.copy2(self.aux_file, newpath) # Auxiliary file - - # Rename the Inputfile and/or auxiliary file - os.chdir(newpath) - for input_tem, input_file in zip(self.input_template, new_input_file): - if '/' in input_tem: - input_tem = input_tem.split('/')[-1] - os.rename(input_tem, input_file) - - # Update the parametrs in Input file - self.update_input_params(new_input_file, c_points) - - # Update the user defined command and the execution path - try: - new_command = self.shell_command.replace(self.input_file[0], - new_input_file[0]) - new_command = new_command.replace(self.input_file[1], - new_input_file[1]) - except: - new_command = self.shell_command.replace(self.input_file[0], - new_input_file[0]) - # Set the exe path if not provided - if not bool(self.exe_path): - self.exe_path = os.getcwd() - - # Run the model - print(new_command) - output = self.run_command(new_command, self.Output.file_names) - - return output - - # ------------------------------------------------------------------------- - def run_model_parallel(self, c_points, prevRun_No=0, key_str='', - mp=True, verbose=True): - """ - Runs model simulations. If mp is true (default), then the simulations - are started in parallel. - - Parameters - ---------- - c_points : array of shape (n_samples, n_params) - Collocation points (training set). - prevRun_No : int, optional - Previous run number, in case the sequential design is selected. - The default is `0`. - key_str : str, optional - A descriptive string for validation runs. The default is `''`. - mp : bool, optional - Multiprocessing. The default is `True`. - verbose: bool, optional - Verbosity. The default is `True`. - - Returns - ------- - all_outputs : dict - A dictionary with x values (time step or point id) and all outputs. - Each key contains an array of the shape `(n_samples, n_obs)`. - new_c_points : array - Updated collocation points (training set). If a simulation does not - executed successfully, the parameter set is removed. - - """ - - # Initilization - n_c_points = len(c_points) - all_outputs = {} - - # TODO: if umbridge, just run, no parallel from here - # If the link type is UM-Bridge, then no parallel needs to be started from here - if self.link_type.lower() == 'umbridge': - # Init model - #model = umbridge.HTTPModel('http://localhost:4242', 'forward') - self.model = umbridge.HTTPModel(self.host, 'forward') # TODO: is this always forward? - Function = self.uMBridge_model - - # Extract the function - if self.link_type.lower() == 'function': - # Prepare the function - Function = getattr(__import__(self.py_file), self.py_file) - # --------------------------------------------------------------- - # -------------- Multiprocessing with Pool Class ---------------- - # --------------------------------------------------------------- - # Start a pool with the number of CPUs - if self.n_cpus is None: - n_cpus = multiprocessing.cpu_count() - else: - n_cpus = self.n_cpus - - # Run forward model - if n_c_points == 1 or not mp: - if n_c_points== 1: - if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': - group_results = Function(c_points, **self.func_args) - else: - group_results = self.run_forwardmodel( - (c_points[0], prevRun_No, key_str) - ) - else: - for i in range(c_points.shape[0]): - if i == 0: - if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': - group_results = Function(np.array([c_points[0]]), **self.func_args) - else: - group_results = self.run_forwardmodel( - (c_points[0], prevRun_No, key_str) - ) - for key in group_results: - if key != 'x_values': - group_results[key] = [group_results[key]] - else: - if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': - res = Function(np.array([c_points[i]]), **self.func_args) - else: - res = self.run_forwardmodel( - (c_points[i], prevRun_No, key_str) - ) - for key in res: - if key != 'x_values': - group_results[key].append(res[key]) - - for key in group_results: - if key != 'x_values': - group_results[key]= np.array(group_results[key]) - - elif self.multi_process or mp: - with get_context('spawn').Pool(n_cpus) as p: - #with multiprocessing.Pool(n_cpus) as p: - - if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': - imap_var = p.imap(partial(Function, **self.func_args), - c_points[:, np.newaxis]) - else: - args = zip(c_points, - [prevRun_No+i for i in range(n_c_points)], - [key_str]*n_c_points) - imap_var = p.imap(self.run_forwardmodel, args) - - if verbose: - desc = f'Running forward model {key_str}' - group_results = list(tqdm.tqdm(imap_var, total=n_c_points, - desc=desc)) - else: - group_results = list(imap_var) - - # Check for NaN - for var_i, var in enumerate(self.Output.names): - # If results are given as one dictionary - if isinstance(group_results, dict): - Outputs = np.asarray(group_results[var]) - # If results are given as list of dictionaries - elif isinstance(group_results, list): - Outputs = np.asarray([item[var] for item in group_results], - dtype=np.float64) - NaN_idx = np.unique(np.argwhere(np.isnan(Outputs))[:, 0]) - new_c_points = np.delete(c_points, NaN_idx, axis=0) - all_outputs[var] = np.atleast_2d( - np.delete(Outputs, NaN_idx, axis=0) - ) - - # Print the collocation points whose simulations crashed - if len(NaN_idx) != 0: - print('\n') - print('*'*20) - print("\nThe following parameter sets have been removed:\n", - c_points[NaN_idx]) - print("\n") - print('*'*20) - - # Save time steps or x-values - if isinstance(group_results, dict): - all_outputs["x_values"] = group_results["x_values"] - elif any(isinstance(i, dict) for i in group_results): - all_outputs["x_values"] = group_results[0]["x_values"] - - # Store simulations in a hdf5 file - self._store_simulations( - c_points, all_outputs, NaN_idx, key_str, prevRun_No - ) - - return all_outputs, new_c_points - - def uMBridge_model(self, params): - """ - Function that calls a UMBridge model and transforms its output into the - shape expected for the surrogate. - - Parameters - ---------- - params : 2d np.array, shape (#samples, #params) - The parameter values for which the model is run. - - Returns - ------- - dict - The transformed model outputs. - - """ - # Run the model - #out = np.array(model(np.ndarray.tolist(params), {'level':0})) - out = np.array(self.model(np.ndarray.tolist(params), self.modelparams)) - - # Sort into dict - out_dict = {} - cnt = 0 - for key in self.Output.names: - # If needed resort into single-value outputs - if self.output_type == 'single-valued': - if out.shape[1]>1: # TODO: this doesn't fully seem correct?? - for i in range(out[:,key]): # TODO: this doesn't fully seem correct?? - new_key = key+str(i) - if new_key not in self.Output.names: - self.Output.names.append(new_key) - if i == 0: - self.Ouptut.names.remove(key) - out_dict[new_key] = out[:,cnt,i] # TODO: not sure about this, need to test - else: - out_dict[key] = out[:,cnt] - - - else: - out_dict[key] = out[:,cnt] - cnt += 1 - - - # TODO: how to deal with the x-values? - if self.output_type == 'single-valued': - out_dict['x_values'] = [0] - else: - out_dict['x_values'] = np.arange(0,out[:,0].shape[0],1) - - #return {'T1':out[:,0], 'T2':out[:,1], 'H1':out[:,2], 'H2':out[:,3], - # 'x_values':[0]} - return out_dict - - # ------------------------------------------------------------------------- - def _store_simulations(self, c_points, all_outputs, NaN_idx, key_str, - prevRun_No): - """ - - - Parameters - ---------- - c_points : TYPE - DESCRIPTION. - all_outputs : TYPE - DESCRIPTION. - NaN_idx : TYPE - DESCRIPTION. - key_str : TYPE - DESCRIPTION. - prevRun_No : TYPE - DESCRIPTION. - - Returns - ------- - None. - - """ - - # Create hdf5 metadata - if key_str == '': - hdf5file = f'ExpDesign_{self.name}.hdf5' - else: - hdf5file = f'ValidSet_{self.name}.hdf5' - hdf5_exist = os.path.exists(hdf5file) - file = h5py.File(hdf5file, 'a') - - # ---------- Save time steps or x-values ---------- - if not hdf5_exist: - if type(all_outputs["x_values"]) is dict: - grp_x_values = file.create_group("x_values/") - for varIdx, var in enumerate(self.Output.names): - grp_x_values.create_dataset( - var, data=all_outputs["x_values"][var] - ) - else: - file.create_dataset("x_values", data=all_outputs["x_values"]) - - # ---------- Save outputs ---------- - for varIdx, var in enumerate(self.Output.names): - if not hdf5_exist: - grpY = file.create_group("EDY/"+var) - else: - grpY = file.get("EDY/"+var) - - if prevRun_No == 0 and key_str == '': - grpY.create_dataset(f'init_{key_str}', data=all_outputs[var]) - else: - try: - oldEDY = np.array(file[f'EDY/{var}/adaptive_{key_str}']) - del file[f'EDY/{var}/adaptive_{key_str}'] - data = np.vstack((oldEDY, all_outputs[var])) - except KeyError: - data = all_outputs[var] - grpY.create_dataset('adaptive_'+key_str, data=data) - - if prevRun_No == 0 and key_str == '': - grpY.create_dataset(f"New_init_{key_str}", - data=all_outputs[var]) - else: - try: - name = f'EDY/{var}/New_adaptive_{key_str}' - oldEDY = np.array(file[name]) - del file[f'EDY/{var}/New_adaptive_{key_str}'] - data = np.vstack((oldEDY, all_outputs[var])) - except KeyError: - data = all_outputs[var] - grpY.create_dataset(f'New_adaptive_{key_str}', data=data) - - # ---------- Save CollocationPoints ---------- - new_c_points = np.delete(c_points, NaN_idx, axis=0) - grpX = file.create_group("EDX") if not hdf5_exist else file.get("EDX") - if prevRun_No == 0 and key_str == '': - grpX.create_dataset("init_"+key_str, data=c_points) - if len(NaN_idx) != 0: - grpX.create_dataset("New_init_"+key_str, data=new_c_points) - - else: - try: - name = f'EDX/adaptive_{key_str}' - oldCollocationPoints = np.array(file[name]) - del file[f'EDX/adaptive_{key_str}'] - data = np.vstack((oldCollocationPoints, new_c_points)) - except KeyError: - data = new_c_points - grpX.create_dataset('adaptive_'+key_str, data=data) - - if len(NaN_idx) != 0: - try: - name = f'EDX/New_adaptive_{key_str}' - oldCollocationPoints = np.array(file[name]) - del file[f'EDX/New_adaptive_{key_str}'] - data = np.vstack((oldCollocationPoints, new_c_points)) - except KeyError: - data = new_c_points - grpX.create_dataset('New_adaptive_'+key_str, data=data) - - # Close h5py file - file.close() - - # ------------------------------------------------------------------------- - def zip_subdirs(self, dir_name, key): - """ - Zips all the files containing the key(word). - - Parameters - ---------- - dir_name : str - Directory name. - key : str - Keyword to search for. - - Returns - ------- - None. - - """ - # setup file paths variable - dir_list = [] - file_paths = [] - - # Read all directory, subdirectories and file lists - dir_path = os.getcwd() - - for root, directories, files in os.walk(dir_path): - for directory in directories: - # Create the full filepath by using os module. - if key in directory: - folderPath = os.path.join(dir_path, directory) - dir_list.append(folderPath) - - # Loop over the identified directories to store the file paths - for direct_name in dir_list: - for root, directories, files in os.walk(direct_name): - for filename in files: - # Create the full filepath by using os module. - filePath = os.path.join(root, filename) - file_paths.append('.'+filePath.split(dir_path)[1]) - - # writing files to a zipfile - if len(file_paths) != 0: - zip_file = zipfile.ZipFile(dir_name+'.zip', 'w') - with zip_file: - # writing each file one by one - for file in file_paths: - zip_file.write(file) - - file_paths = [path for path in os.listdir('.') if key in path] - - for path in file_paths: - shutil.rmtree(path) - - print("\n") - print(f'{dir_name}.zip has been created successfully!\n') - - return diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__init__.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__init__.py deleted file mode 100644 index 70bfb20f5..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -from .surrogate_models import MetaModel - -__all__ = [ - "MetaModel" - ] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 8c10c82287a57ba1e3b4dd428962e57cdfbc5c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmZ8bL23d)5S*DcQG-Gt;14|P#r}Xu4ncEKgy2OF&FBp7;_ObCo;C4Ferd0s{DPOH z*HcJAS5s6M)xO_<5{%Z%&>nbS8u1s3#VZdDn2a#ei9)WW6h`gkTAAcSq^+xDGnI9B zZlj)iV_j%+i!`a9sS3gGb+lMC2Hl;yji{YNJd5zamv_2tpeQ5kU_~|%goDpqrZvHv z-&KVzBf%_>@6{Hj&VMa+%wVfemX6xxCirjoUj>MHnMcIY=c(?DxxaFD()>z~Og*KN G&d)E$kVM1) diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fe3d14f8dfc5304350b98b23bc52ca5b2315a871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmZ3^%ge<81T4a;so6mKF^B^LOi;#W2_R!SLkdF*V-7<uV-zDJLkd$mV-!;gb1;J@ z%S%R}v?k*%PT$m$MBn_B)SMz_popI)^DTkm(xRgL^u&_X_*{@gF<9mndwhIiPELIM zN`}uMD}IGLTg8MHrxq2*6lLdU<YXi!7RR{cCzs}?=9Lu3xM!AllqSWv<>Z$KB$i~v zBqdg+7MCUFWTq75SHz&(5ECDtnU`4-AFo$X`HRB_Xl-dus$CH$&>oOGi#3772WCb_ g#t&=^j2agh)R7TTj8)(RGZQyk13L&7u>(~D0K~CSSO5S3 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index f1a3fcc2eed66172304cd27ab5fe111ca0198bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmZ9Hy-EW?5XX1#B7R`N%6GV813_#=M2L;Wi693O7M4wRE-u;KJN6?aw!VkGuV9<E zxYo*7u+h2Lhy(K*hX2g)A2}Qz5sa7jtx{M&`sQzB*j!_VQ-mUl8e-{`Qlhd2on|V3 zAjRO5qFB)Gu!JbfMuGAD-d&M*Cn0&?EMx>>dm-$UZeIv#j1X_c@8RSQU$2u3UIp-h zdssGOu98jbUoxv5cxm*rjJk2G1{sqFc00LeH&t0Zo{i4=ENP?I+{z_z*|vu3dCLL8 zY|U%!r121viD5N<68)4<j?d%<!U``d->mt6w_FJAbQEILZn}d@d?6XQ%F%KdAdd6w F`v>INVKD#z diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/adaptPlot.cpython-311.pyc deleted file mode 100644 index 2854217e56fecb2456011a91a984951fed9cbcbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4921 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-310.pyc deleted file mode 100644 index ffab8b4f67e52a3128aa8740301f958a0d72c502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 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 C4-2yZ diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-311.pyc deleted file mode 100644 index 92db2e7e7390700d4b6b25bcdc0db1906dee37bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5228 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 H>m>gNxx5;C diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/apoly_construction.cpython-39.pyc deleted file mode 100644 index 82737a42dd7351d06b703b3da838031ba95979da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2886 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 UGiz{V6;d({`I`N<wKeJd7wkkSHUIzs diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-310.pyc deleted file mode 100644 index 92d0cc0e7a0a07123fdfbc2c777d1b9281a43344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14412 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-311.pyc deleted file mode 100644 index 51c4ea4a7b9eb757b303782de26abffc022df39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21706 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/bayes_linear.cpython-39.pyc deleted file mode 100644 index 063355b16a397fb5fd89d38daa0d3ca5a8506766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14506 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 B<oN&q diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/engine.cpython-311.pyc deleted file mode 100644 index 973173b304ddea1307ffa400cc1815eb81399423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84465 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 B$2|Z5 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-310.pyc deleted file mode 100644 index cbfe4d97e8e83ebc276e45ba6e84f514784f1d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5560 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 Z-$TZ+G!?TsR$7>|U8i)t^vVlo{{y+urp*8V diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-311.pyc deleted file mode 100644 index aaf7d2d285e24e4d2e31c3dab3b1b071be7c5ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 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 bd8inaNFU$G@89A|r0WO|$^Hun+x`CllJEy5 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/eval_rec_rule.cpython-39.pyc deleted file mode 100644 index 27878248cbdaa2abf0af9d51d061aa6e2db86f43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5648 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 Qn=09pu6MokM(NCd0M{nQGXMYp diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-310.pyc deleted file mode 100644 index fc01f0f01b8bc70d438a3317b87d304883456f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17477 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т#dTfa#8J56>f8$ut6T)8sKb87ka10Av zlR9TG-(8QbT8%V{S}j0t!DC2F%T(|6pI0}gaYzRSgZUwiI&I|PUj~^he!PXBLS|z! zRGMn2Me0p#=B6IO3UW*D8!su5(S#L3<^M?8G-RDEwVCM~uMA47nlq0R!JtAq-q{@n ziR+CJk_S+wBW)Cbl>zFGl*)^V5h5Y94d01&=Pnu)m5o#}LCQBa4rCT-5|QkjDs4Lw zU}~@h9I<^?-JOx-Lv<Ia@o20&gp(_eOALV}AQ>~ZekTBnYY*7vT}VSqlGUWZwAOGS zg@cv&K-DE@3DRW%IhEAFbTxU#c^pZHG|-gnaODhaJS4v)6`uFPp6Ez}4OJejYEnK} zq9>tpK(ruU9jrPqi5yDS`UsYt#JzSP;g_h;-|$5z%PcKV7)_&twU_L^L1v_JD-yN6 zt;Hrx2vC$`L-bl+)r_<CRmTso^UFh%*6?M=I#jwi=ZnV5r%qvI;*wnWLAi+4OVx~c z5IZ@}C8OqZALo)KjI)E8^6{0)Lueu%NAeba0l|Z|$54x^b;mT#|E{Q}ws9bJnzoOt zPA6&jS3t(Zk5AQ?VTQy>Qu>)tjWSJ*&Q(nh!5CcirWVZ5DRZ^Gs8h>?CY`%JoxJR( zwFQIcRZTqN5);XFbeGsjPEv8reM&QbQxzZL(!!t=45e8RmqW0WrhZdBrM!BuZ-x__ zCF(iiHd|^xizky~Pb{z{YegGAtCg>P9A|tgGPcyu5IZB5GYu@rVmw{Yp6Sy#ay*wk zofF*a*HLbvypNW%k&1qDoe$$#?y44i0oOdrejR0di7Lt-+bD)}&3(i)oBL5-xTQA_ z^m8vMoqa=;Y3|=VNR;ULD@q3}vRMfJc(+!OE`EU02f#ozw|GnI=W)eogYV&KF8B*P z&o66>3Rr87uQ^y$C!BD1v;zKaH~t0oA?zP1o5EO7wHe8vZVb?Da3DvA?f(YFk};$W zN_2|;pP<>f_r|TAz&Qjdngjh2SBFpr_O}Au#9_Y+Y!3CEiziP*<7usT{5C9Zz`qsY z!E8(#KpG1dVEp<Spb$fN-&nZlwWMI2ysH7)q>wl+btFq40uhOxvEg9mm(B=sT*L-h zGlfN2{o=_Bv2lL!<OT5v?yD+`G}Q+M0Zpv8yiT0EFtqB&28>(nIJ@cu4s7(|80v^a zl#mD%XCQ)r?guHKXGE@%RXi?_@-^nqaR$h`;>B908|!U=vyN92=NbLkLqJU+l<<RE zK*p2Uf{|U4D=zsx2zFtQ+z_$)vN%E`I8413y7l%Dt_2A*47+iL@m%~ORk5HqGP@Q> zaa%1gpi2@g!qL;XklHG-$)X;5YQ#Cru*TiTR<A2_VxC&$Lowtd+mJslB!GVU)E}X4 z;36?+i)x;DfLhWmaDXzWre0DjdPT**Zs{h<O<Yk+vyj&eQ#DjgHQv=U^Ia45Of9eB z{*I<<cMOBdG}U~!WLRinXdAP;ah21j>ZDl=|A-wWV%j@Hh5}%2s(pxPO|5UZYCp3= zOoUjAg#Kb58b?##%%FzJ;Gf-6RpnYGQeCYF)`3zhGF<%@K)#>tGZWAV?nw)Q4gyxv z1}i~p*8sbjV7M=ZlbdDIZknZKZ42OCn@W1L`{o9fSCSqls77-tGLI`SDc7D&fIUa! z*_@6tqw-f!-pPeC%{`<qHFIv}7L5fuPjgmm4aU3$%6r9DgJwDx?vp*k6_<6bTRPa? z4A|X%+2cOwV>h*aj&!Q#oQoda{9fg&%Gb2x%C#>hV?KZulbZ*IZNQrHxIdV>Cw;5{ z<_IP(*Rl4%wclS+`o)CC;r;~Acmk{Rpj!Z=i<A2gU~NnN$xazmZKjG^=!Mqlq163k zRK%MqMU%9ucuU_8AC8K=;*W4GrTGXku4>WwHEe)HW;-Wc4UG+$#*?!N^COO93UBU@ z8PS2dU)=q90qqbmc12pAP(VWG04K+#&gaKmdc-}_r~``9R0fA0!%(tjRP%%^O!*-h z7}@;*M;B}~ObbrL<<Yvr?U4{^T>NuIA!l<Qh77N>)FQMc<OV!Hip!;qhfczp30)W} z4*X`T^JzX+_r2xipsK|gC#W|Xu>p0j9&6ni8zBJxoyKzYQ3iPNOQ06#pHF&;b6A%e zIYtBVF)A}147lTpkI;=l1#y0<*J!yl_Kcq9_Ur^FmuVoL!~^kRN<K<O=7p1s*gxVp z-DHsQ195`$%==<<fW-+`OYTt~xYcPQwdIzx0_FflEN3PNz67b7vC;M%aE~B#<80e! zeK^k1z-lxa@d>K<aY{)4j5GYM#52fO%Tkcf4)&$^B-P^8m>jLS>^j@7*8)r;HnBG6 z+#7->EnX&yh157>t=$t>sE9fc=P3CUCC^e~C&@#Udm70k-e~YyWXvhjw+&!@QJqyS zy{wji>=mt|7Bx*Xz$Z#~Ol`lay<_GLXbm&q19>2Q{*DH|K>T3VD56zaoly<YD1(2L zHQa+c6vuUo?QC_76_B|ihac+}-^D5uEcG?Ok&d5%AJ_mOjbInL#wq13_0>oFS-_DV zWdToM6g@>$llu%{U*Cj5ia-ZUB-bIpAJheS4)a+^)T(&O)%u0d+RSYM{yP5{<(S%8 zSML|lw%GYQXd}7J{Fbt&h)=s2s@nv7lD2{r{R5^o)cYRbcv!FJLMG=ns_04jO-Sph zHU)0;O}Ch|`Jy|)w2SF_$d}N=B<vN%&RcFdsr?Oiifd2otc@oXw3)tTpv{^)leGCK z9!Uv$5|6|!O)Fsuj4!!Ej^=~sdjaPM2+}9027Z%nc2qiQae!+w^jpxaCZf_7t;NUO zJxQ<sNh^sptH@RZDziNQ$KAcddT*&>Vo-BBT@(4y3QW3lQSPgXyD!SRSz>(d{;y^F zli^G>c~kv0+8=w~QiDfvodvzeh+dSzPAJk&h)m=PoHLNiF-t1DYGkZoM~U;8<=#lg zT*~3x=Dw(m+!UK9_aillQDGJbqRf|+{uI}k+C1nU*n%zx#+}ru9(4W`2Q0zVlfr`) zO#0yI)DDDtMlJH{zzNlb2N@Ox+yEliYD-Sg2x_pT1p_k@@H!z!+SvsdK`(Hqg^WB& zA^80<#Szkgp^Ujbh>eU;dAo&%5HZ!+y=*UJ(U4L!gEsn-<4q<*y`8WJh7p^E<v|s8 z2H7i4559G$Q@iRS5@ZmnLyhQ<Ay6)(<cect&$CAfd~W-a4;?hjhgs-P&1eBSh9}yM z(2H}9SZYAs5$oc4U{h?hJjm0o@R%VoORH+)SEwk%%oSV;hB2rv{t5~jT!6rUwi9Po z5Cr0Yg0s?tp5na?h*PS1oMBTGF7VKMbk|r8V*@^1CpMc--Ct_FO*&N707oV7uDFgn z?ozagd=_1CpBX6kaH?pcM-|9yA7>Gcuml&)MvhEMmnaHoqr|?9Wa1kY^6reePUahB z*o&$UNG45;n0XU(VX;KF#9hS;lrWPc{u!GK95N&qBl`l_JS{}#EYI3_2J>M)EPSeL z1lI(tUFZE3*(xqTS%4<X(L{0fB{}Rk4=+m3I}IbUki4C>yDStyvg5@X%w)y%_5e#H zkLW;YQ$Hm>gU+fIsbwwDc!|@-7QDJrn=5f{$g+dDz`M1{F)hqw#R?CXG)bO1vtd{X zV~h3_Z9GUgXwR=&bg6O{;!EH_!8A^h{yDkr0BmQ*FQLs6G2_>eF)IdGG5v#uYNVt= z4a3!7Mhvxz?+tZMKIJR1Xky{kyG1BrWj5^<bwmB2dI+qXa&u}4Ez4Brjs^CO6x7j9 zCnXT6Mii_}9_Bzx+t`y*+(y#Y7_%luO&UBi>lZQlP}x-3;H8n2-zS|yCziYq>>JPZ ztBQCcB<+V;_p5vR2F&s1X4ci9aj9E+pUQN2l`_j3SSkf4>R*7DX_<7Iy%At{gG_*6 z&>`6MO){Mo`Wj4X6+;P&>kEngWo=HRYrwdsUI&AVWWO&!XE7l(C}4j`o8>Jn_!cy~ zsb&Q%0Q4y&66U&si&69~(4R<AhEPEL$}+eHhzk5&Oy%o84=UnUK@a9k%z2UKTs57e zX*RMrh<+Sd=Z3+5gK)LhdJ4zxj}0U$2#`4)RYd6ep6-SOY461W1}e_aU~wX27q=!= zqvgxcizHG?n%%c+gbd0I&kJm1l9r`u2|kyxXC;`Opj=1^0~~GUI7=pXtbvrV&rsnZ zO4xK$N&-VA9uc&}IS=s>9GV(W)DS9GzglDCQXs|fM6symQkEVz*%aieB(i<2;ocxK z6KqSA(<vc!$bm`83*$*RP2e^3+@XQVrh#$t5aq}K^+RlxfKaYH38M{+Ic4pjX6)7e zZ5F3|7Dk#fo<U%T*~hp;qP(fi;M@akAj)rh`VKv{vfAfi$k~^|0~(;8Sh>b9fxL`l z%OP$R><4#yLnQ(Jb#+;FVV8N$>g%DpiSz!3a#KZ_e%07gT^*t(e!v5D(}2y!*h}qz z0zi?>>k3+H6r7CKW@u6g8~-1`88)LVtO(o!G$0DP))$D91xi``EE4@8mQi?f7Fd#H zEIAtHnt7BKAkZ6b4kE5bRNXv8QJDTWiy?$v4trMM1^{Yc9H`%%bb(GZx)sfxxTQjv z9gXH7EGFfopCTa`C{5uc7s(<rhxtN;Rw4WrqKOsE*)2hoFI)?wLUS7S616!KmH4R! zF;<0`J?M*9p`7YzPrnEo62x$x5%&~v3Sm^;+yig=lx%bDwj49fZ7||WXoj;9Tr0eS z)qWQ0)O3pW9B7x}v(Ez=nWk&ZDKwY<Of(J4*9?iu=w)v-jWyYG?eDqAO0<W2tX%ss z`hv&|=g#C+4WhIWRr<5hEL;;6S4SD}9JKgJwd_2b#<jDFJGD*`yMqub=?SnQ2}3TX zuxOxx@Dbzz%LU~}Qe6T?(s+}$X51eLjv0s&Y6O872H{7NGMV1l@wc>&IC2lslS$=! zp&;C^2-R;P*a-*|{0v}ta>vr7daq+SlRr9v1ZdOvF(BYgtD!<1&Q<p+H#OK3=fI=Y zO*q6iaUPpS1V`Ogawl^U&ftu)AJ1X6%Y~#u;WQvFLz59D)vUx$5(Hrkf%`wsEhDrB z0*}*@C`*<X@o6LwbagBtLQ=c{LFTdQ!kR?h%n^pc)L-j$Lmw+%26_Y(-C&S08ioby zPF~xnrf?`_YM(z&JEj#pHJ`K}N#|qhLTf~8!|Ot(=a8@ltFli4CV}6IJRU-VCi4zk ziZDnL0B>u;rAONaT)dd*6&IZYG-mvivbu5PUL#F6TzLBq{zQPLFuGxZy3iGOjGM;3 zh+jZsi;(59^6K4IWAz5-WbzPd#Mbea(_V6&ryd=S%TP8bwrLnPvFi#B8)4qW8!;XO z`#*?{R#0zO_w$+z%xMU{f*Qo$j}cd8s~x-%jdqRAZSb|=zy@&+%9IEZS{KAwa55KP ztH8L&tdh3}I)D%zn+Q@x#W>@&yWx7QJ4=D6VH{G|U^Z+7FgeENS`Z@aOxpThry3<n zND-^<m9L3k*a>?24J2_6T2~O%PGJvP^}!(&-=bo+m90`8<06I@&r%Q2Raa_I#1UkH zQ`<&xU~F8%sA9DltH_6xw;CPSyHPuNF)nhOx;)$P!V`shH?DAIoQ$m6Lx2#-#^xfb zzHkyTK-2^^<>S&gTFCeMO&Tq|TyYA?e_=-i&mdz?74?JJ8Lgz1^!@6C>Op-@odKtR z80W@><X^#Wj?8i}(izYQ=AbW-nXasZ#~Y=0x4CLk`(iAjW}3RfkJ<af*i;aF;ieHs zAO>qB7_&be5j7FK{%{mLh;jple{$3SIGS+LKzPnV&_}clKczCV!E7&6o7PZFhX6qW zwgGz`94GxefUE%V9*iFlRsh2)Y!)J`StLf=gi8iM^)#4gVGZA7p+$+)N%3+7*b2*F z$)FA9HId3^5_;btdPJ#TB6bW%(sj64aQ~*#fkN^o`Piv+60Iw*D-dg-EWAea%3#SR zeDYsHJBlRuHho96qJb$-gSAh&d8jl~ZjMvr=M=;QXm6@ahs2}efKH`z5|k!D={ulQ z0;M0}TdX0aJ!wkYC`=|49tMRnDEtHzra<A}VUa|v!afKtJf7M2pi&u9fgnI)3aMZ$ z3P8|;U2b@P94tM3zYhWq#Gh38wN-k{)oJJZ*rf@Jyo3WU1BZxx57Yvi0)sq6Pr)<c zq|Hu<Y~CeaC?N)`Oe$_D#R~6_<G&1b=k6Zx-GhM^hw2v_?2-X^?kF}&MoWM;nFLbb z9g!$;4r0sLpof+{7+@YJY2xuwx&87H+e4I--RvPKnrwsi%c(iuOW1%v_~rLMzvTU- zqso#6KO>&N@n6`%nT8zor^GzpP&RS6NlK8sRE_nzyDYwqBJh;o#AU>z#2@1Jb3l@x z;-}=5jmJ{#DOsrzdml0<(L(h&3$P>;lekSpX%Ny$rIGQi&PK4i4psb!s?&JEJN0f? z4iI^h-8Zjn8{=yjpZGB~X;RWbav!9{UsGk8x%gX3Y)TluY2I%pGzC4shU9-u^GidT z;DH6Ax=0Bbm_(Hl_Lm{fY%SK8ue+?)N)?#gNh4V<W$0sv8X4V2>T{f1Llg*PJTUk- zsN}CGp*7)2RHr5TJxLGVqJ-qQSgnC)VpFof5L?6ZB|Tp}ICg2V`;5)GaR$n74gN!H zA1KE3Ug){_4I=rMMABmIIH<i6XECK3Z8ICsA-?f8`w3O#<vxnsSu9O(2^p(WhW<OJ z8c)vs!1(3-k7Tf^0UO&4xF!PQkSl5y0wVITx>@ARGA!7~;1s(v1FM+@O?n2JHEGlp z)z%-@!9Qnq+qh%OF})5_j%itfe?<aLrZw2N<*L7@f@>P!XvYyt2Nf&Iz`bv7%mP!j ztGYM{p9O?<@R@8UADK-p)S)Wl9*Ao|ZOy_=g%5}6e^e9ZsVq!und6|>%)kVP0BtgD zfwNlV{Q}?3L>8%T;F<Xlel!X;z-PzsW1&tSd>5Pt{G$OX;8~=k@5tdfDa7;~Ji$VM zfFc5LNp3;D61T|FXj^G6aHc_Dq=5nOCmLg4Zt&+NR7CdH6x`h(q_4jhq>nq;$uc|e zyC9q&QM9Sf?uD(0z-CXzt{9)hNJ*n``h#BnWckX#T7Tt;eTA&{bR7U0zC#uX*b={> z53Br6D)3frc+8T7<*}-x1;Up`a4yitDX?VWGiUi7BE~F3w`f@D&x}*^t{UQV*qHJt z^P!IDmY?DMu`+;9G3%@ph?QUmT;YgG6@_$9QZ@IHnzD%-c`%_&Kn-Y1AhhXmf`)%a z$CKJy%Em9G4ijDuuk}tQfKljIy>*E`g#IhP^A-BL{Ryb23so!5uE6C$abg5g06e&H zNE?lHtZHmtMd&nGH2W~fM?VO~iq-YF$UH#msR2V+oaaXzm@x40Q=V~#ams1O>Zw?T zMljqQ+a?)X!<l@AW;%}^4Vd~7DFv7zKRVz?Gd@o-SC$5t0TkhivOG-nWd0wEcpuWL z)4Yd&gf65TGQyDU5`Jqvgeje6<^4F*24rs-%pk!cXo|39pK=wJI?m&CUp0j78Zg)E z8jxgBxn@Q>PH)D!nm)b!RethKAe%g4kY$4mj#R5L`jAxy!?TX}{tYq!0gxMrFymW& zU<id!H29<+U+v-JeL6ApCp$#bjtr0AaaM*-LBg3XTzmMy2Ri4VUFtmC3kT@q$sKM} z$aszLZp(lV(?WbXMzQKPeS#+?JPs61^?PY#y*LAz>9_GJVQC@L17b*MS@^r26^cHr zv+^37GNMQP0qShqc;YK~_CwlpWbZJhh=I+qu~&Q7&^P8%XKl=W4K7Nj_)Jxo*9B>A z_!m5@mgu_;Ismm=oUhTR9SCkmzF4bW!?(7Bl5DN!`t@2(Jd8FR2`Mg6?rBP1qU10o zq{?zIr1%fY(Qs2!u<4djB7<BBKR!Da3_~!+LcQh46{Puhv<EmQ<pY%FuUL!Ls`a7# zv)1#)Cj_;v7UB$S_1$$T$!rnf?@&TE`nZ5trSAGXj0!MTWcVV58?2m+_F*EsjSQ9+ WxdKn&n8;-&>4E+sNkEpU=>G#}NHw+q diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-311.pyc deleted file mode 100644 index 786fb6880e590007f4cc628dab413d62f1590cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19555 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs.cpython-39.pyc deleted file mode 100644 index e7e0226dc1e28c09b9cd09a610599007b2267e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17597 zcmd6PTZ|l6dS2c7-qUmCa5$v6rAt<9nlmfy#aSzgEQuGHD{;hVD2ZxQZq{^F_jFHp zRr6H!kTa>?hou&~G9Z~SHa7O+V8&P&Q64sly$FK9KpvbR#=`K!!Z3n*2n^)K%7bC7 zfqgI*%Y6TTs;jGKh9b4t0PaDbK2_(O|6J;v|NCz>*3?u{!RPLO{WJUZmZJP0x=4R? zT)c>{{}vKkvDL0pQ~6h`Y5c3#bpADJ2LEPy*;-Dex>`5i%h&SA>$cG?^a{0ts=T7u z89V!)VrTDawW6)AE7jb`pslP`)yN2L*}acdT;XEQ>U-Utdc$-5Knxl|+jARKG5wjt z#f$j*A0lyhXc(4?A!*bpb%k$^e+@g2zXI+Q?QBc2i_JN^WS8GlG4RjWQ+5TpjBVP} z_6%}a`*C~Lo<lBY&)W;{DYd+P%wEKA!9H#;;kRf%VV|&<QKMv^v`^tq*?!DEjo&Fd zgK0e(6))cDUvT_(%k`~an^KgbiO;powr@7NmhYP_$904iIKJsyy?z(JP2u&-VAC=C z!tooTz2Vqq&l0V+YjsiT2`=n;w$o)|eM?w9Cvb#s4*a&;;^Lc^-TolBX?hzSrxC0c zx#mkj0CEF##+NI}hcCH>`5ZOjYZ|D$CyAJN3W3#jM_nZSjz@RSY_B@2ri<~MOK8|_ zJUi+Z56=vC`i^P2SmN~Egp_Y$de*kp?phmN#}w9W)3yR@m5E`Jo1Tpkf?h)X8WHrG zJZa}n-x2MegJE_}n-_f*YwaN4v<BV4#H!zX+Vw=w>OOsQ)qEYRJf`IJd4ycYcWw<p zrp@(6om=%QwCJBO0F2P8^OKPy=0}S4svkM@H7wI;=%bouTyyl8A2_9^*X??@K|5KA zgCs2BnEs&O_e9{>&&eG?&-5&o)wR7|((tU=wSu-=-^5ai#$dxqmH6I<C%2hwx@mO- z&rMa>w0b>ky{@y9y4l!tHg^0?XZy^hYt_{KmT21tZVmkS5p3GcFV&lEJoU*3oL(iW zV{)Bf(+Wl#(tqH?=dRtl>)fu7PS<m0+YOQ-tqpn`j-ZEd1{<56chw9;yvh3>s`~Ot zy7iuQ=b=PUr`;Ri^d3b5`=b8Z>#x^?O`PjZuS+|*+4ZdPXlSdVR=e58k?%UzwzJ~7 z_zo~t;elCfTirI!10SS>%57|7hn66j)p+;DrvN9$>&G*}*lfpZHtRl~5;oxEYG0$$ z6%?Csap0L?Q(#}_ZKvJZ46xYVXuZ20I2R3u4m5UZ*J}rSV?2_Ehsk2exyhk%jn=jS z0yfQzhI91up(?UQvbeq@N7JynjRCeWF9OERUE%;q>O3yt9DM{2aF1j{2TtMPfiqh< zd<JDZ-+b`dd&?7^>$Q^=`c$V8+vogSsiyV-jLvdh2m2!C1o2~d#OcP*>mb)TdcH}= z$-LuspETc>tsTdIy&p&nOh}wHx!|S7;exj;aa4V)+uyV{oS@xE5n1nB4QB-$A(=m5 zrdw|g+=krPgeP4<P11(W7}aS9J0?|=hsiTHz%2VtL!P}6_q{o}nt+T;5`GhMW2`zz z6oBqH=9-6X=>vjsOwzl(-V)xR??1wJmlapdi&kUP<O^a~4>}IFu@uSRFehglz=xw@ zV-SS0fz#cg<4E~#*XfSNB%FS?-H@mGK}RrE#|L=2phOGR@Oq%u_A$YOVEe2j-}n5W z?z>hWY%e%4<+nG1>R`d(D&QXh^9iaCAP4OSGL8d1B~!k6O$?lyvRe@8Kd4*U25!Rq zsU|bFPdkL9-;{(APnz(;s?$_3W7>i&+6ZBdf$~ZW7nYgKxIGdGk~<TU5(KQKx#fDd z<ys%r{mtKeH=e&`Tm7KE?T8J}C&s$rrJ($%b!W-N1jFt_-geAw0#?8*wj21GB}+#~ z1DKlh4)KnqLI%tSKQk$U(23xdiS)U`m-Ix&jD=6r_=Jw--m_=ZKy&tNngubPgCft9 z_(*1xa24|mFw<qpl0?Gf3`<dE#k}z9Yv!3(2i@+5)!15j&1pjx73PIDmJ;H6!%6C0 zy=tDhuyS>@T~|ncYWq0qqZ%(!jhBwD!K3BTf#bbw`Hnpv;K~c;#1LJajAWQ{^~{TI zAiVyLc_z+$?#h+*i=VT=YPKDc9t1s;(LgR<e&rHsLO^a1Gq~LA3vV0n?*@E^U+H=q zfRbiA7&Tz1G0(g<A%&c0Ddeq03aQFR%9A+2pRtN7m=CQFe%g?@!Er~#Uy?=qbD-!| zS;RjRMNw7??vdVaI8j#0uxo;p)7GE9|G$3!kAM8V=Xa+j0O4Z;g_jx&NJk&aYxthW z*WX4Gs-aR>LJg@J>PWTFK&posq(+!UnhA4Avtb@-E-WF<hh?ONa0+QLEFdj~MWp4h zf^;gJMp_AHkWPoQNN2)1q_g2X(m7jMS3XkLs`F8v)vMPxI#E^%4pET~np88Q>5)Jm zV|i3aMC52{La3$7lz1A=9uhU93ZI%p42rMYK|(vh&1m|7gcz0G`dC1tzUV3jFuF|P zLNrBuD`C3P)C3R4^b)2RO--<;>Oy4rPPZ9lcuhnZk48XURz!u8X-Z}&nWcnOez8c& zaZ2VXp(iVjQL;qI2}+hJIZ4SWN*+V<ks?g|{Nw)l=We_S-NU~joGtI!8}^_#xFge* zUYm6CZhM#UaHZ*3!9X}Gm(O2ax$x$dH?MzT^-DK42JNoB(&$-R&JC;I@7`!P`ZpXT zE4}88Ch6+nqtH41?PoXfaJC#VaBpmoFvLQ<@b2932SRu)K(bUB{Tp~jb*Z-ctNooQ zU$2u=Qm^|Mu>V;kN<OPT{BL(2=RCGKtd3|j=q!vr8Dw(!@+o)$ncd|;>8ODgs&{c7 zI(i5L$_M(;cw2E#sS5pt%AO(1_tj2jXuPAi+A~UMbjZx1S*tiy%$G<_eC3c$<90iM z@B+r<N;3yIQ_Q%>dg;}~j*$>L01-sneSi{1Wn*nlkp7On2eC(5Ris2fl@6RL;3CWk z=S+{ae`_o}QQdWFJRa*I`R3-+k`2L_kc=6p$Mu1dy%=#HKpKjctR`iy?Y0F$9%$r& zF>hEK5Kw)Hx}-^_t4TJ&<48KBfu_Wdo0niFA`vL5@P>o!>q?ssRgPCRDUX-vIcP1A zP6+P(O$%0)Gs#+?!?Kga*z+X^Co1$AJ?LbarSS@*!3l!Zip?c$vP4Z9qNwdhT9kzq z0=jl&h(Xt>W}{qV)AD@m{F#weZ1k`r9a>>j@I<@yl?zyzs3I3WE*Ft{t(p<1v6G`h zGHPZWQ6X8vC>PI^Ie<(aM-%Zhl6(02#A}penrf)!`$avgE^50cQ)lVms2X&RMxPQg zS$z3S{Q&k$oFiqJ3Dhvt(dbmw^#I6Xt9Ld344pAsJB~W_Opv8hH>7iy+sp66Qo5yy zOE#fU!G-CPekBz<dqU|H@2bM)(o$RsMCz2p4+CIQN589HP~QFWFdIzmRjB8X+w7~u z9PUg{+{pvi@-1z2uRe2Y7pHtSH1^dSgolJ#^WX$IjOTAadtpf9DDYg4xgS!m_f+u) zYUEMlXK1?^s_3cUUc<e@mUd6|XOJsWPMkvdaiWd#FYYb{OPv#hy`5#$D1D%JP7Vv; zHp?S!(^=j-MbzlN<TWlRP>;TQRNGKTAAf`zj{%Q0yZnJREaDeqM~iRaegVJVLs_w@ ztt&w50{yy1SXfu=De$n06&%gOz?BbL6@Bvzc9j%*VTGug%-^8L#5^uOrsE^{|A)6F zV@O-7=xqHH;c=HgnVTJErz6%ybD$523y}5ziY;(cuz&|J(~%-|_54MsQr#Wb>%o)< zuGkU|?9rrJq&egotZKgigTxR%HHTbxx>Dj!o>k0)Qv5lpxDx0`?1^OB$gnW;YnKFh zLL!6Aq#}=OO}~2nO3ip}{rna2B(AF}%Svn2(}Flqq<0-RDqI=)3nBw%vtE?jw0sNJ zfAKlg5oahN;VR0&h77{bP`=2Fx=!}?Xl9(RGi*m0Fx-|CX>LE#As->J?nFff1@=8q z6UZujqwbSgCd$KnFUgfRya7bUU_cIzNWCu3(Fo2`ucdyYH{#-gWE|$kQHI&P_!X*> zha|-)E>>_^Eis>$Bv?44yHP2%SEB4?!W{I}jtZDzox6|ngTBm(RkWxT12KY^1Aq{f z5>9{d!hb+r|F@7Ri&?d-7V*vN6*aGA^%+jHYDJ$@@u$z}d5C9aJ&)hAR#db14Xtcw zxM!%^&&v!bdED3T=MBDxyIErnREpZ};!!|z@j`>NmC=VJ;6!dKqXc|S8G=`L)FEWH zjy5!Gb(m=pt`OQtG*}u!i|Ocl8Pv!!9_02_Rk`(4sM^{9XoAvwXxRD(;QPbeka0mH z8l>4kuK~LJZ=efW+XfJ5iV>g^Oz+K*#?+}awSB_3*`&t{!|d)Ul+PtSPEn1{Y?yss zd0V;ldkL2>(0KOd!_2t+9h5(VuR9kkbdHf8)+yMT4+xQ<OLZ2(=hx)OIj41w({G!` zyA+&|V}OG%XXiiAfrV#*h0C(<6VUeVYQq9)Y@H<=ecQ$3%6FAN(4JTBskfd;#!vV; zy?1id3Yb;IHQ^6ta6-W~>3bz$C)QuCY5g%!c&nuh%L$e1!zrHs6xQstU1Ajc@5!Cd zV67{|X;{Xm_e`dYdZ0|}`grPkIxOSKRl;dnWtGPHz2J$k%+KISuBUXKBrL0zt*?Pu zBx2oV>CkBJ!T_I~Qy4jMG*isy(U6G_*P}AwUl!LLagQU}E>FlOxin^)lY;3R6OKcI zk~9YbMQM<O+mKmOvSw8CC0UsAb~2M>CkNbVummwJxGJ0Db%k>!A=1A3XNp3u>>|u1 zj=Rw%&P!|@y!t8pT-$y8JZz@WxS<8XJGZ%-2CatYG@E`^i!zqqXtyH+8et>S`gJyS z014c7v-%V>d+|k3i;8a~z0?X=mpZv$eer8lmW68SxVHELT^Ljl6<Kqwv;UQ3RWNaK zv6Exg7hlE=@p(%AIg(oT%K3HdAMqU3%OK<V;@3IPKp16XzMSxFMv~f0?6jwe)SF$a zCHs&w6U5L2X`_+Rb1Wc<AJ|c@=aDhWj|wy}9*y{yRPkR>@;uef@Us#xB43@6vVJb! zm*NuDqSdHPkJp^LuH|}-x{pajS**=v`;MSVi)%=LJu<j}#u;h7fv8c@i<G=V$!}0{ znG!Qe9;Y0s%+q+H{taZ5S*em6;O}L15xjp!t!P;dh@h1<QYMP`ajlxf^TGL-fd_;E zMU>@%0EV%om(gYhZJ~G&l4!Wn<_Hzi>c>HVoqz^1i4^dq+4+B-Km!<(j<10)U;%86 z*f7+Q3(7t1-P$k*cBF?nFem`WKp|m1zRmy!^gS58i0J@S3hq);W`Ko`>g6D2tKzG+ zHY^4Cy}~{i;62s-i?G1-e%IEACA6k{{{>1*VXwHaY%AhV?F`lLfQ^z;gA`)`!`8Uw zhhWX4nm@52s&gw<{6zNBfe@c+Rf=0(x67ke0EDOPDej@1u8VvH{Y=BOK_mLCJ(Frt zvuC-*)ZrGmGlzEb9~i^3`}g)js@0EqOckhBJSMv`uLKnUV{(NY%?<aDgT0?57C%Kb z@SV1E<I-`9lU$RbAP;qHDy-~dUEDkNu~ff5qm{)9&dGK$okdy;cg;SY)YQbexaNGi zCi2NjxTo!<u<%{QJ`v{Z908)e{0Eugbg&Rk-&MaxJLcFu&9C8i@t!7ri|B<J?2R(* zjWCN`iE{>W1<KtrZ8bEuvB$*sG0)?nj@irvOM5568RTZ!D7x&P!uU^ynGcoWESJsh zow85vL+JyQFQZPDVeORlpVP2*Ucej&NF!}4CF?W)A}<o0UVV71VSc~`nB{hT!}8mH z9cDK_wmE@wC(N42T!GQ`3fn4Vq)UpIKN>uac@Cgu!p#CaF~|J*pgD(lW2&=<8EVM< zA!Tc3-{?z@H<=9e_L3P}QA`%0<0|ZYGF#RFzI@BAZ`p`Ei9>^^5q-um5aZ(n+1J>E z1;iVxS8~Zm4k1QlRs~WsT7%}{h+aEzqJkwh+R%c;j(8nBD#~{qNZGb<7#bPes+#y! zD#|d-0<U02gF@rAP+)NZ0ug#vlxZR8!~zAYHGuZwd`ys1)uRmCt?+}00Ee#H%^))1 zGq$2^$7*;R?T>Y;X#iWvn=CwBahJj&@;P+HeP*EZ!-=Db9#wF;4B-zOa0%@e$o|A} z1G^RWog@?Aog;73gsWz?Jp<!X^)U(81j&q2jK_k&gK<{;E6Oq45t2sPH4agdi;;U1 zfKLmNd4*?fyo~uUB8wJPHvC&6s1;uGTC!DCf+7J0m!p?zxwqx8qawUE1Lq<v&O)L* z>wGz=g=F-LG}zS2>FrS~^~nPpt8(gB#M|hsIwy6nS82S2xwSmJ$gJblDx4dEw_hvq zZtZXk4a2Rd^KePO<f$_t!=xDHX;0B+f~<q~{HVnyRn9?>@hzyG#s##hO&>S_2Vr>~ zZ8iv&-$O>3BNdDPv>5;@scu=V48@G@m9;$5JgyCO8ENsphWpD}1=pyjW`ABZD35mc zN!>HlXVf!L^eDH)wPv8+<qar&_w!mF^bNg8%AsC_f>$J!4lurZETz<q<*o_fCeS9u zo`L%fj6P8IRJM$1B=NI$rxQG%0F>jtzNLtp0ck}H<L|Bx4cP9pdpTQ!Hm2_DLn_nZ z#mY1_Kr017>R*Rfs|hXV)~fq=yNf6XR0ja=yJTT24K-Nao-&l6yz`wzGt2KyrE5qV zTu=#Rum29(OBUjT0^md1nc3I;??dOC?aYDogFXdb!m3xYF@|9t^iQWKLpY#*Wm)V= zAWHDC5hYmaE_@QLTR(j;ty@2Z?)Xzsg5?wQ{eDQAQPx^XL&$m@X*o97jRFnh(75hS ziibTK1SE<Gm}feIi8$*g`Xv%B`!MbwD>}b`5sK_z+?o`Qt|!AhlBg^;^&HX*nISW4 zUSqqHG&apk#`7ljt7K%P4Tvr!%-m=rM>(?1V-2LFeSr$kP{PKXN)m)Bc@eRdsNf(L zgTr8>sXD^a8e4TXH~CT+C#J||p=u#z`ynGvRFbR05`GO5e!Xqqslo6BYZG#C8z3R2 z$byl{32M{uuE0a-*dvpZNu)V>oN{E6`Vn!EmyuDXarz<7SHM3`Ls(w~4_U%Vuc#!{ z=kI69kORSfi3~jVvn=Y5?=Gtl-%q5@KMl%DY+VyPfV`Mw*CBNBPXo=qsghmi8){Rv zVWW93Khy(t59j-v%3T#@`j)Y;+B(Ead~yEOJp=X|<2bd$sR!4{d_zHNje?%hIvZrE zgna|g;nZfs9P9_&0yH4>+4-*%r93F*@XeFh4>63wrgPvOIp!U;pwKCzv;;xkunQ1p zHKJ-4A#}nsuvZQs*m5|v0xtph1jd2-ooO4~h(_1a?5Pi6J4ub^%dnTsB>j|$V}a5v zPH&m4AxoGq#AOv?ZYi8<Va|31!h7k~--e~mJZvRuXCbWcT@3=O3XwYQi&tSL)zi6Q z8MY*d+&m-hDdZHwr@D6x-uhYD1{Rh#<fv(O@tEg=Y_J%@_rh!V)-VTUYCc8%^PoP1 zsDL84Ayc)DC52`)TnOi32U{Sq82ua%=dmis(8qt|UgyGN-0K|f{9E(~5g8t!Y1oQ1 zQ4Z&Zi*6;Hvvrh!hlAQ;xCnkWW4)T@XRjpw)&@ld$6;L3DPThSg)B^=*Wd!eLm&z4 z7L*@LatRBPrkk`a<I$Mkgn1~TMy&5j9O5J?lNFvlgBv@DRd*1fnN)rl_k({HuK{!s zPzBE7{{l?#{Gp{u_1?g8CLcP5#K`9H_1BQ#S*w9UxMr)zmAe|Oiq8O-)jfF3_i!dV zMhIWtesU#qA<p4~vW)vsh~@%Pm~bKx`=QCGm1<7%OcMTJ3bBICsL(|C4ul*850EiK zGFy7<0>Z71B}CW@2NguB4O<eqJIA~WM*sStA9z^t8E_DvA}AE_DKbqjfKTmKQ@ki; zbYFd*c1+iQVKr$#mdGd8h1Q7HhSy~VnSl5WR^@~Oz66{V^d1SMW-{)uod|;@q3<Io zjdbh4fXi1CUE->BlE#cL#=Lv(VIxg9T>JPwK4J?kVRFL)^`Rdg8aIu79bccu79z`I z<<<L0jnq4G9ZeL9$B{(&=et&K!?s>{3S;^Q+);KZdTJC^apd}qnqbz1h!~B5-S5|o zuHWcYmw82EQyPN1p!l#CWQ?V3v4dBl-K(>y4L%nfSD3`0K8XOqdw!Gye%W{r28KNb zNI{z;GRT@4Wf2C8ic!Yt^@E*Aw>Et74vM9A!QgB7FgHfoZ9hO@o3!%{sYZnoQoX9j z<wN4f#n}EW+^rR$XZe2p0(M}&5g$SEd(?>SWH+gfaTP<WEm9BAPFr=T-iX1#ne8F` zux4Dts3Nr!sXpHDLB5u6yS8(ue*S8$%xxO-WY==>Rc($llVoJo0YZ>Kww7H-XK$Xb zO^s^G+m%UPAs_9(q0!Q#6)z+C8TNz!A~G=E>E+xhZ9ya1epx-OpHi3f1z`LW>H_qI z3Z(c75FXAQ=mG}rFG0G;T{wSGI_b7a?TU$Tn|bt;#h2loB4r@v!et}gg7~bFD9rA5 zgxiD&3V<v9Ig}eP`jgWJOrryL4aDW#FasN$bmUO^L<y`}e}$U)kysA#frM$Y)WLl+ zEP{oVAkG8!!Mqj$R;9gCnD3McW;<}sfJJ>3&{^76{C|%Y6;7wc4?-}kU<QB;+5oPp zR6aAJcTauyI#DEA!wSJMoJxNOCkw9Mhl}0T-zSGVl}@Am+&2`6HBb-UBZ@PC<SaYs zO|)cpy{OSUS}hI0JP&xEwTn<=X6*u}$S)}f7|`BVnHGsi<(SqSf)b|fDW>LvT7_LM zdwADtMD19b+5sxl36<Xfl^Le;Lr|GzDt`-`B!U`FK#1XSEq(%}xe+CZ1SGPM`o%&4 zgs!Ra_45kC0#nx~AnZUCO6o&>`OA>PtLCl$iT#>D<ux3A8DT^)9;*c=MG!d%vx0xZ zN}HSzMSVnIQ9=yrb}GOq1&NP_{MVuGJlH9IbkxxLNd01CT`~a29tTm$01D8iSI1KC zIFU$k8RE;tphs3c7+;<ysp9Ezxq1DZ=^z}+><kcqO?E-^dTNdj6FT4_zW(Xwmpq?z z_*t^xm&CJR1#5>8DnV8P(QhhyU=k!PNK92Dy<s=Sw^0OiA@hdhYRu5Si_3ovt|GpN z%<gAXFqN#+801GFC2UlVa$v7yToS)eBxwkY{qR1)?ABoO*QXjNuvG8&<v@|ovNPwM z17m$}G*+=e9X64Cs!qgzqGq%f;!h|sDM?o1{e*gl?zfTr5~+VUq7I}i5&f%_tW#2@ z<UA4zR@<)W&D%Dsyiz?ThtpWzOBn#!<wnN1v1%O^wh=S}IS^vNSE+<z5O|$<I@Ngz z(l627uTes>UZmD*25ndtE28}9>`C7k501uwS63k{u<5pzfnr>5*9>eeD9xk$;x3W= z0oBd3=IqzsspT-GI&DD{_aWl(7W^Sq<b|gYj90KUJ}rkbM=r3ux~!jqO^lsmu&tHV z1>h<IB4B%~K&#F}KZX{q&KV1^#Q{^HK`&?vxU;CzFI;IrSyO*P+g&(nOHU}!^e9My zrsem4f&_S{wb}P&tAD5hSq<P`h;Te8VPOVA0NLGh;I-P8F1`#8284NFQO;cmvmGta zp-$r(oY;VBn}hLcF*Z0QHDjYy4kowE^Pt(uz%++IaWZ-VgY)De143uQJgIj;*M$JS zHVR9?YtQg=p-vG94P*k||23!p*GQQ^l*4^eoasLBB9AZvMf_i&DYqd1h+R$s*!I;F zN?dBw+i?I0eqChZEfRj!g^I`)n_`EL#`1SQiRDka;mK+n`(*HH0m5-pojr{AA{v~% z97ke65>~|q<B6Ax`St0Wu_gcJIrAo2^yxQdb$BOQB+QubgkJLU+*Aaw-1L|wiPaNT z#|wnFp5S<(7iD1S!YkMEok)yXMtjk)(xXbvyJ`p@8&n==KG*?W@;y91RvYkIXoJ-U z(ee*5FB~(e%8-sqD(MMQXFen%CK74~g`vk6GT|diDDmG$+-vurrH&LH4X^ZJkN_=x z%h{3qhtQ$*op00UqhGITYin!Oe3Wa!8$p3(#HS)1q@;$UV^O2*7DBLr;H2TQBR`Ja ziqsvvCyyn<s{<S(&s+>I)6*@EUXWah^UP`@VpUczQZGa*REN>tI55X3Kbp$7i5HQ2 zrOX+S+9kIkcY9eQYuyYi_6zEaPMl`}w*Ml2%i2WT{D@M6rak%)iy;M)*$nwV;M&#$ z*w|UD{vr;w0qZ*~YY=r2X+;d?gtDdhU*tTF_m&~bwgEf7t|6v=UAa{bbqIJFYb$+p z`QHO1FDJ4+6xLd{+Tc8O+v7KCWk@}%f}h@M0}cRkv3xVR&toeoB&PU(3*hxZ{1*W_ zF7%NdqNyu`><=B3k++bTOdmc!ylDj0G;WtV3=d-h^cLqKe<}pPcJQEOz#DP_USXq% zcaz=)l;R%;mZti>Ha2lwf<W~?9wp2%WS>Bo2`vl1VAP^u#RluRQC0^1i0`1zfo&&# z8~1)hJC5{dW!8X=IFEfso}}HS)IpmtZ39H<0AH%=@)rR^Yjmor6?*Z5PC>mM73=hF z2%_VWFW2k0@V;+clB?HkuTigyCqRUa<Kiondx4U5O3qU9G9`r0;(t&=BTbFoq)X-w z6v<Ab=R*V6m`%rqpqtZwEIx+qdcXJ?PHz_1^PBn4=U*+pk$+ZD%W5ggz=Gf3kuuEh z5ZQf7$Z`)GeWTsqS%uL7#*7UANU;V>CL@8E$Wh~h9Y)Uo1v+-TzI2x9kK~B5{{H~X C=1mCz diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exp_designs_.cpython-311.pyc deleted file mode 100644 index 076580dd7fa9e11559ef202903d44e00e25b8a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20552 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-310.pyc deleted file mode 100644 index af7431ce432969f095d1c07f429b8129cb5a2def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8154 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-311.pyc deleted file mode 100644 index 93c4663b2cd6bd9acef73471231ba305bddf9dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12405 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/exploration.cpython-39.pyc deleted file mode 100644 index 98964152a4ea29f85f061ea6ec7daa3df7487230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8190 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 O{Slolq(+zPr9T4XZ>fI( diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-310.pyc deleted file mode 100644 index 16a383b994853cdb226f7b7fb291cdbef789e1f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7185 zcmds6-E$Pj5#P_d(@DrOU<}wvO-SPC;^Pj1LsGIuj6WcDVUjY~4-(?Ew>zg>-QMmo zyN4vQ_hRfSSEcwHB0c(F+Sfd!c*}Dt4*B)W-j_JQ_{CLOakD#L-90@$-M=29W5>!G z9_z%fd6Q|{Kd3VK%%So=e(_xtp0=)ex@QFXx-Q?wx;|&k+1_!l;1$2t*G=z)SMuiY zWqD<9{%dXBp2MGa(p%vAPGP6$9pfc$5x-YZpKF!8CGXX*?e(%}+|nwqJ@{Msvwo2H z%nv=^<uPkTf_0-X>iSN=_+Bpxd6>kt@`r+ZezM9wjY21BJ0ZKq{jkZ!cDbD-y?C`= z-}aMszgcsmZhc1%YSqJjw-*Kb^=1$?>s=>KxEQtd6F-RS+X3GLYra?O?Ux^8!P?Eo zI?8|2r>6bukJsFS`jlk}Wf8v*@r%DjkwPndP0V>lsu{*W8|aC)qo-P8c;+MHz&z9j znrzW0S}^9oN--C2J2ejVL-USFa|eagL|ehL4)v4Tz)XrXDm5RPgJN3TDTxo#Vls!X za%!cvXFoE}Xw(Bu7Myz!tjzFS=OGtP!r8WPJnk`Cq8p*oYx^#=+9idbpHz6#<};N} z)UJx{cvaG+TAVl{Vas2HeiUx_VNzwJ<NaFbIYK!5o0aiU8h#sugJ_ov7735a79(Cc z?;880#pFEdkks6$kL_kotfr0l60s)wJZT`@aofz<^I;d%K~J1Sy=Ti+WjA3+v!v^S zOt;@<aog#UU~bTd&ZK0p!6f0{s-pegdA0a=a~+_5VZ@yzz*?{b=EtljqWeCmR9Vau zxfVxk^EhEiltBMd6;H2yida6e-|InZ&t16ZcX=3NJ7TsB{xdcJJA{KmDxMhYhjJ%y z!W=n!tVvfyaok8mKXjc0blGw%h#c(n?S3!d8+k>(jw<wvn6vgiL~cfb?=ne=O;C#6 zHt%w%f#EdwU3|e9M&eB=07tbOL!smYatTSp$!^5%J3$|w!V!Ez(=A^>!B9TTO(|@e z+-Nyfw%hgt#X4}X!GcX_S#5k6>@(Pl;#5`rQ{>c+fSVJ?{Vwcf)SI8V<z^HGNA}{n zI*xH95<lFovMzT*d`zAQxhN;tb@pRM<8XSL`@;czZ^T7fe7{>`AJ?{PY-?-zVwKUq z%GMTZ<M22PV$qIYt}+LQX4ek_A|p8bD`!nUMahNnz+MFl$W8?Y!oN17q)n7BRoM#u z5oMx;7OGa+CA5r}E%<#du=}&t{kiIU+7acNm{5e1<P3;9c5|kfP)gi&f?z0VE+l4D zVK8v=jyH5PQLh)pe!`WYpYx<I!U=B{_;E7ru>LIF6tydtB!iNg{qdgD#Q~U@e&xy) z>HZL6YNJ51{7$8o!2IK6xiS)eW8=bRm2Iq0agmBko13G~*<`St<Kwz^aW>H^Q*`t9 z1?<cV2}>8g2J+-G*RZ`WWP`CoHgW}EbMb|2Hee%|cxm&Ql1~Ud{*+6Ag7AJhHdW<r zCLGtA3Qd04`q3hgsnd21rBR=>vV8qF1)+uS^vw1WIKIaQY84|ZC^wK5^K(&|&ul48 zX3Kb&nQ+xvu_YZ)m@PF$<ajOsN<((Xna#VsWIwauh2pH-7+F_l#r^}Hm8gM^Pp03l zlrmfHDf+OZS$Vvl+0s#GE(pB{f-#xi$clL&{!SBT(e&>-^=_Ed-8%fZi0h&gwS%_f z#PyFN7hVp5xqjVG{?u>Quffay1vsqUboO}+hwOVI+N;NXA);+Sk4880_z`%O&5c%Z z49wz_C`y&GejI;i^+jVrFX$(AOBZjV!!=P1p9Or3P}edPp6Ul0kd>JLX+6{jR$}a! zsl=&3T|iQ)=~*33ypDD&G*H?D8zs<{L`?>8R>3no;~VNLwhTg1Nh!6w!fDX^NZYIr zN@+>Fuh15#p*=Oc!Wr$ML|ln+P)>`~-ZBmiAh5#0JY*?81Xeq%9Re>;(VoNjg%r3A zqxC`Y-UZ^+F+>C!KzJRSXmtR(NsjO=Av~-`@zjaupe)<;NjV1d7*$T^ugY0i$1zB| z2ux@kyy6v8>yYqu>A^2QaNG{haTA5x(I&7KB0L57nzZ4YFk9Pcbp24ioV~{yG%YOX zUXWEkeuAg6l$k(GnHlg<P@<4oZs7MayAON*Lsp>I%H^!!2q)a;Suy0h1k*BG)fcDC zk!Kb#IL``#_qdZ}3vLwjyI}*y>~;htDPo>j;1Ef4R#^~aGvYNWUZ);g#$j=a8f<DP zNIng5hAO7-?PYdLL^x`;M4^zA0F^X$RlGq{mrzJV|0{fytdhP2LtKPeE*X}2T3@o5 zwPcpeQ~F8cq`sh^GUSXY6D2i`O!P}KQNz<ac3k>Y^Nff3R|NI-R6o=Yj6);@2Qb$i z%Y!jVpsx}Eq!Jy}#WE6x0zv<WdP`4Ap7jV@DN_X+0TU8;Fk%iSf)wBzgHn)=K}Jk( zO3NM@I2x2%fS*`LN>QE~YtmSx6*LbLK+@79^D`W$)V!tSHpDJC%+rzTz*LE%XLj^~ z>CI7svSU+PGVFOz3(utnS{Go_-{O6Ydf$KnkLQK2DtgqO8YhN*<<xjXLrv0##ELqt zY_t;6Q2gDe+E+MQFz9*bEvQ<C&f5yo@rgjq`Y{2j8;u?dBhgiHyH;aexT<lSNB8nx zg{`qW07(s>rF#v(-fZ~k-5$I9*Ohv2!0rV69$S%Yb_q4HRY_tCqX2^lK~XLe6H-c; z%trD7Ahm^DBI*Z}sRXb(CB$?VHO#%1Z}EG59=e=TsiR=}lRP5^T5bZa=Bu56nhJyx z=&!Qp5xR|2uf`5fyiB5Y{RCMQxrCuOE?{36CB$w5391DU;v}7pvVjrDnVA6b-0A_s zsWf8?I^Q}k_k`WT8ARklm&~=|9BJNYT*wjTjRrz?jxC>pY##tu12>OkhIY2L@&y1g zVo_}d%i!ZY5uJPwpr5u8s~y3viM+%Wz=*<kSUU>5JgJ-w_lBxk%ky3tu9p?i=xz(& z+gM!zSU>^Xllv_K=jT@{wc8`sg!pnw8`CZkyD1^3#7?BIwF{NaiJ6KY;G~2{C?yuD zjwsVM;h}zozi8m*<`{{-4C|E_vi<?wG32EMkm3V(Nd-Jxip|;U9xhjgwFf^7IS`3| zpO4&vv~lDQxR>x`Xp=$ireN^lKynsEtP0-5{hA;kQdv~NuH?imxdVbAiFgGCuovAN zWTq4DXZ8b*<XN1fc8fAVGzWpGP~C*HA=uXvzd*HO$rvSS_!gICf7DNo1}2)ggI`P( zm)`t2P!a-@aZWGmzXeh%8K?Bq_&%+lGnio+ijmdf`|$+MLwKdMXDVD#upEV}byVPd zfu(>>%+wHzKsE>tz%Yb%D3rjxBV?JlsRG(cb@6s;p#?vL0y!38$dVxl$m<b8)ER^@ zjI`jgZRa|!(4>XlqH|B;<&HW}mXBUg$qN!Va^-n$Ik+-FPP?_Gj#-X;DcfuIalI16 z5wcz7Q*wfosOHF9@_jyoY2QrZjbjBJrZ3ff13V2O?y);m%%;a)|NqbNrx%<j_fK6i z{^Ys+Rl1Ly#0D}}lUOq5Nh@@MD8GM+d))O~KCTwV*NQI_0giZNnKq7`at#pV8Bd-i zkKOsudC~YuU%fiKY0b@l7$_>^dxVMDF!KG<`_6QeiY5AK><hRKFE~hhKRM&-@My15 zoS(h^>BY@l|Fnvp5g~J}&su*qzg~Zi6r_9^$mwHtutL8YMdJL3U6_*M2Wn=5;j=U| zA@*#|06i;joEzOcRrb3o-8SMr32<j+_N)z>GfSCI?;`0#Qp+jl1XYxlkzKrlxK$~t z$Xs?3z(U-gT=Zn-m=*JLk`-~MNp>sNFkGCVIktG8zQ<P~HhBY;H69JY$1(En_{EfD zmfyCJ7a}XfRmExDdSd9t6NFtFQ?YL<EJ1kT+O>+VfP;b0`K;Jzc#+#^C|MVj=5Swx z7$<K#WIm~)cR@90bJBm^@H<?*3yMgk)&H<aW)nivy^WwOHY>e{OP7AYuOR!>;<r#( kMyXKJ4b#xePs*1|zcGGq=+^fI2yGa~f6@NEWi9^ae+LhfX#fBK diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-311.pyc deleted file mode 100644 index 1ce136ba4d826073719d19ffbbc87cff8dc02562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7952 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/glexindex.cpython-39.pyc deleted file mode 100644 index c3f24cf9cb753b59f9e226f828a7c3598ac65a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/input_space.cpython-311.pyc deleted file mode 100644 index d2310be6610a4c4824d6749297cdffe80c533a47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16785 zcmd6OYit`=mSz>-lqivUk(5M9C0h^EmgOi)WXrEuwjxXEShiy)mK~>=l8Tb3P^4T% z`Jo}x?o0;54TN2$;YE~Q&4g%pvrI=jquy=wYJvRlVERY@7+|V2H84?t01pQKk$=jj z8weT;?4EOrELKsL<0Os2l&D*;bI(2J+}F9^J@wzJswyZrChz`D`1xZL^{;qSJS>Ha zuaCpUM-)eKbd<VAle6iXiJZ;zmTOj;GErwK&h$RTnLjmA)aUT89@lIfeTfQMzQo({ zslrooD$;y?1a3c~!h|z$rLUQ}3eNmKea*sEa<=z@Kj-4?aBt%r?^D<8TovbpI|pY4 z&eclASZrZ2acO~_3bXIh6ji~%ad|c(FjG-h5SW>8EX=csu)ri{!%PH;83C!8={QfG z&4&~0e4GnMnQ1;gkB<lsE+QoO$mC)o5|0VY0w2E_;ldoVC`4j2B;VVl<hPml<Xm_v z(OW@s4JFh}VS(Hp)DCh>axh0R3%N&G)n_UbW-1;_u#s4?hy|8sLA)@}%(MJVB*sRC z9wyQo?qy=|yhr1qmz7D}SqL+1jAIN>HC6%xdb2m#NR*w7h8do{#c*tb?Iq067NK)! zj1XaSlmR1X#au?t@oCL!I?96jig{rwJZ08ZG}bfTe?3j=IY}p}koG!hf;*@*_24MD zE4B-0Z*Zq^N>bTkdn}TZ^QVx0u05e4*CpyRdOT=V9K^8aC+8G*nO2I01t}FvjEl@G zwNta<sdqv**=U3dMX-4YL9=2J!qI8PN?7nt;4h#gP+Nce>6xR~Ul+o>aGifAJ{z57 zS>gI{d}?t%97_n-&qflXi<8$U**jr@u;k;nuZM55^9#|iaD8!pl8<mR;ZQ<YgbIu# z787wk!bZ#Jg+-o^&p?|Ek!C4eCt`(2tL<I5qc}n!Xe1E|E!7bLN#pM=KJ=rs(3h#Z zRNmi`wk%iW+j`R$*%8>bQ4Njoz?rZ2;|cDaRSz9)n~pZg(JnjM#p3U4$WAFXKAc$O zW8+g=4Z%|@{FD0pKahR|bu@>x<Vev8t-dHKNzZ9@`6+PtT;pP_*Ey|Tv&ehLVXR?} zeur@79UQhDTai3w=gj(hkV}(=v%Et%3+{xwNKa9m)hN|_v|i$2>McHHGU#KPa};wM zb8@zVOifAC95xnmaQ4DeW2p{f-uLK4Loo+M%~ck!fzvLf&AEy+oUO5VN%7@n6YY6p z+0OE^mj$i@tX5TIQ)Yo1Df2GUnZKKKDNEAAw<lVP<v{D8=Co3cQbBF0vOBp-y=*iU z3nnc>y*?*cp0pl*Cv6?j+But^1IS?KEcz$Qyn$Qg6Kl+6ln>g8PIg{Mv>CM0TAeW$ zw5PXIR)aM?#e90JC#|JA-Oa`+n}JWw_vT|y+LHDe({AO5YKxqgL!A8*h5x}S)&m_` zn-b38=*dLXIbkMpGaOSVG#Gaon1jg}$Ry%0ZK@OQ^db)vEYD1_(W%8KOD5N&8aJE| zM_GXp;`3qVTye@Xyw;vFv+T`qp@0QG66e(!7g^vj6pfZRFsfw08Jz$D=1z5%+y|F9 zGBY;?GFt}KNgVUPM#jDp&%#8m$ub^~g-g^tx>1)$zQi$Z>4h_FEEZ2NlZ%n4aTXTP zQn7exHfLBqtP02Dur|KbH4YhBkX@VbnOk9?(fkip)uoqD#}l)t2@!wCY_IwNMc%#4 zg=m<C8km}m$Ke!@Mejfo?)~!r!SN-QymV^V;O|ToR0tC-KqS?4YU!%!xybZ1h!#r_ zTMEHC9!D(291X`5r&dio4rycxRjkoC=t4}TR1XO-iDLD?43izNRH$<tdLoJw9T(z% zD5ltgVr6-ry`xx#S#}|;cuIsJQmcxYofH%+&&FoLig`W~gM_`URFoW^po7P;MzN9E zQc#?lZ50b%!fYQ|3M+I(ae{=Q$@pT7Qyhy6>Xm?6VT-_n#|ebT5qPOZH}~%JAv%CW z=m*Q*rMCT4t@mC_+O}2iTd~RheNuf;t`CwK*g?5Ga%J1Y%FfNoPN}k6uI$bYY*zM( zm3?`CAU(W1mL7Wqvp8J9Z0)IEzO&NzK`Ncvs%6CXD^l%*TstAUCg5EYBR2-ODZA54 zlJwY?yEZc@*L6$oeX@IBZfMheP;?*6*9GLdu3X1vU9VWzyVbN$3|^F)UXz<%6YF1l z?5<h9z2cPpJ(ByNjKBW%A=y2!O_{2^8)NeE^Wvo|o5!z+$FFR8JH*bY<eitj^P*?| zn{5Zxz8AfWmVAAaT;H)xRXO*QBt87NuHoL1mEqO%QeBUXzvtKc<hmEr!;jo`g!NyU zSBB+4pX7gD_CLRVannB_`Ump+f*FhK>CAf?GFI?d2;~YVxAw2Io2`e%*26}MI^Q-$ zSMApxB5&ROH;*daawU@;0z-?Hoy34sQY|Ofa-xd^@v$P9ZOY<2OK&wat-P>0C^dA- z4V~MRx#}#frWtxG(7HO39gz2;W%j~(ND7>m1E(|2t>%{1fozw&2esStqP*vn)I20N z4`m$r=Z|enh<zg&o9tn-HL_=~?CBLfz1vPKOf7QTR4RqX5q*ldIdFl8=5!6i6*^s6 z^0+)Px=J)ovYOMC0(Yt8kfqGvU}#fS%EHkp>kQC`G-oWKxgs!Gn|DlRJt>%4b*`J{ zi0Ng5GVI0sq|RB{ZDOOT<%3E3r~5!Z&5bJN$8*xMRwl`Huu{sNawP3Z#}qn*WI0P{ zsgR}tNUAwa{Qpcemw4(W<Se?Wx4KAU)Er9CT*yRwkp>*M(j*LS=$u9~ZQ7Avn^eEW z!aq*goRp!Ax?*{HsSS4BRq8pd)T9lU^UKferAYfI*-KYH+4^Eh`g5|(VFo?RxL&1} zuirLbrEbwNCUKyYcg|b9PFf+CR_2=32p52LHICn6ovYvk>Fw{+N-#)Os!?M-q@0G_ zxMm`UQKwyVS0tUu3UHis{p-msJ*2T%zBWUpD!)amzfQRfb?efyQ*%v48MWm`->$S; z3)i>lRMj)k+e;;;s$(Y&Rtgj)Fjz?^W0{Ss47oMu{~2>vCo8j09#yK6)#d#PMvhMs zCyMgHNKt8&1zMKorgJ86V;$^!Ff?l3+!(B<VIdA~06;w&=%TK;OJ3fE;+q|AA$W%x zFYrD>TzCdxo=7aw!^9WR%VDG1d-NmDv9}}hi}MW7@nL{-E`wXjg{RrYXae2lx6!+N zyMU=6{TV)t7?#GP+#3ZHCxpHe6iU1$L}`e>#O#ZOh(Z7y#X<#tF{trD-me)DAbdhR zpip9w_?AbRD7a$;_8|`pd56@OI@pT%cm#f0Tvz}{pYQ_AX}V-rL8n;c!rz128>E#A z9z4_7BrFLM#1)1|HZDF7V3=ZAj76q-9Fu|!@x6$nNgPY1;x#Rs;sixQ2#g8*9w1h1 zEJzUJc<kMP_P`6pO?>juLOgm0U1abZUqQbYyhV6ITuy;!fSkwigvV~A*v_4~1nq*y z_N!RoA}%P7qP_W6LZaGLu}{siaRCq-PZ4!2S{xkBFbkfkkl+;iJgja2EaI_0@tv6L z#ROeO#Y(KMxb#&JbgTZWz0k7wE+og<O>vj37MhN-Gr)W*M7&uW7-NjP%?}{$VWc(9 zFY+(p-DynrV}fHe-vfz&GZt38?jXJ{`r80CktU=fP)p4^$G80D4D$K~Ov>Q)cI-r# z9@R9UBb;~FE#FC7^5C;J9Z0+LwZ60+UDyEl#MN8g=9S?O-?{e=xNpuOaE~xekK|pR z<?)BE_Dxs2>SPVbdydL`UXom=WY;N?{LqW56DwQuOvgj!g-zy#2X2vhL1He*%mvBS zl72aJG{67QdXwnt29Nrc70aqy^$NEsw{w)<YHC@TmRoysH{{knx%IfzbV6=A0hB*N zuWvNV<%ZXOBz7K=0)uj35T2iV+|-t}e0*T_z&2&8IuEj9nz3zLEH&rpt)AYs(Y(JE zJpP<l_CF{4k9}pP51#lv1xaT3-nncStOUgR;5XYA8tC&q&#k?(epBu_`LO5Z&7PMZ z%t$@sa?iM)6sf=YX1fZ@`9nR`(jf<4Sih1#e(H-?w#{_QDE$?MDHH)IO85r{<qH(; zX?C7MM;6lb$W~3=J>N?GYD@N}+}JDC9Fl7erB83w*5B(YJ*_<?*B(lr$sZov=wFW@ zKiRc6J0iOd$gY0T)en{CZ%VtiYP^}mht2nzw<(A7FiFxwd3S^CZp+fLdynkyS+{Mv z2SoQkKCnj)^yDtefkSfO=tiF$IFWJYo7?5)13B=Pd*$ZA4Y)a;abz5iiLd>_{S)go z;BQNT7eLvfpWSi);5rSyw$$7&H}_{8k6iwTuC`5ATedMbDl#uht^wIKAd=tXKzp`F z!U7NB3Z+pbKLK6BzaQus-fQ~p-u*ATtp<-9{ZI6dzy1w)D`haJ31)IL{9E83yk_u3 zG*6lUThRQ~!#D>GQyI%!AEoRt3v2XA-F#c}rtj|Gl?GP=<N%-7yvzJp1~CFCPN$r) zj$L_bK7Y!&D~;yIrz(;(@8eA1%V<6?_`jOJZd`+;Tp4rhACk_yHqM-?1Uc~jw*bO9 zvzixJ)CkYU+&3wHg0n(Nns)~!X`Xzt!f4+Tpr{8%0fr?u1MpY#KmhzLvk}0sdTliS zJz1gW1$WMpf3#L%^j?W>Zvbfdth&WG*E7=6{KUV74R){9r`n-vhaF6@O|JSGb))zY z=l+3p?D-ybT!LSpQpcdTu7|GGd<s4HbFKG6jhkX`akbB^>GTh(#kyzHlB+N4n_A0$ zS}htig*%U~r8j&EW5nmBal)0MWB<Z=pIPsJBrWUTq8IDS(AJVhy*c|5KzfFnD6Omw zZ9%1k+`3+`K3l@E3KkHb!@qhgfj?$^lB#-g8HT5tj2x^ecb4-c$+4uJ<(HLRZ5YqA z^?VZ6PUXEd_J29wGuPx5&i@1Z>h~FswJkEEJ&YDxYuusPf8v^+S+gH=O+Qex?=uRO zkP$=6GinBRPaTC~&0KTR`Clk5khF77Y#VUh@>kZBJ8`JkKEX3_8`}uk$kLDx!4B(k zt;_Q!oUfDCT|A7kEipinY`ajFt;2!RvI}L|<|GZ?((=a~owR@#Fk<L48WK{DOQt-4 znBiKdaLknu3y)FvR86cN5iq@dxK<<0d$fvWC2IgZ(0qs31w+rm^&dHs*8fPQYIZHZ zCad8O#T<C%+Kgoy?+oScl$SA5>*TdfBgWCr{zi{+6fgv`1%}JrSbQEJ4|Vefx9BEe zmkA<fAjSpv>td0cp-EPV2pAe6Fc3m98|PpduPy&^C+!@Bi;!p$V-O53A}>4>R#IBN z0&+1Kj~h{v(%PO$!2XT^5j*o_%aFmft`0@`w#_<-vY1g<uOZx9QX_C6Xh%~9B_4w9 zF|vGT2qsWaiA2jVGwh-uMA%s99S*k73IRWu36BzX0E`hVF|d8LfS&9yc`^QotgSJ~ zM~{n)D|Xl>g%FXj;$->B2<Xq>;h%#hqd1~rfEPGEOmGq&N06ls{q7xX&%th8JkCsq zZ|P8%b`?S~@z~21D}iSK76F^Wo?Uz<XyVV37eZuao>i<f>^z(tVCY5Iv<rWUUQf`> zV>5=mIM}}p<Ca`xI-yu5p&5LM-hpD9W2fSik)Q>3?V<~_EdK^PB?a>5@Vy-hA|+bG zw-@3urIMTg4S|*j0$fJw*9qaRFvMO(qf1WIj07GnRg;h{&0I^h2$kVRs}{}FyL1?l zwBoj?wrL6tnl#tqjxu0l@kQ91g(lxOOtwQKo^CMXfYxepV|fw4K-{0jBFIK|4+Dr8 z?xPCf1nd_Vwm+kH0G7f{LV`M}`<*zfs`w6KNPIsg1nD^rSBh;M8*)^&3yv%VMk1!= zad1=YuLI(R6=OY1YQb_EEX<$BR~F$0pHQ5y#%EL}O6ALFN!5gk{fcTfrQ!{gpX{xw zfEF&d6gw-Zo2e$iyj=Q5tyGe&UA2=a^eg-^pbyp(;EC^rYXUkc4%nI|K%-JkuApvI z)J&-)eQYicn5RJSCVqs7i>M^Ago20^I}hL)_5?)V6bp7n((3pNL_C1*1Qxb&EyK7E z>@MrJ0y;~i#~BiJPxeK4x74JArpl1MU%`7}0hWRUnNl}oAJsLa9r?!QbameAPgmv} zeCdkE2tTckN!~8m+qF%dr=17CB58W$k&0;8WOujh?i1aEd0&g{>(1F^-yzv|G-Jto z{2#f0=FVCqPbchLim-VZU^32(^O1^rya51)95@MpM`Ii8*5<n8#y+|6c*gd~-MCGi zfX&P1j*Mf=*Lv?=$=406GnNl6k7}C4nmzgEF4#!)HLFj2D}$fB^z)ab<{r7ZN36kL zzPS^#Hr~6PwW*n9-@zO!`<`2G-}Lp1zJ9XVdtPd~AU9nQ>n~t2KgqqZKD2gqWBS3x zFCwCERPv3=zR}&wsPV2uK8gQ4F0~$#TMvmf`1>wpmh{Vc*Xgy!jjjhZUj#+pu;d$- zeZy+O{*|#$&j0+p6gVgc4vIDS`(DbWas%t_YlHa%eY(@O)#M-eih|_#m|%&38rJ%E z8uYvAwO6gTWUgzyW-X}dmEZpyxfyuS{>31`bN&&8=O6`m4pLIKjjC<lY14w8zC&d; z`0l;2GLr3E9n0SM_|^YjyXIT>ZqUDO+!*>*;DPPIjo&(d*Y|fWsqa-Ocuo$UlLF_Y zhH<%JJY(AOH?7+LtLeTidqXwYI{VpiRe=W=|96jcU_|O3k(jeGb5`<?%Kp)e6`GFh z+n1}&y)OCsWnX{BlCc03Sljrdn%noCo2BgAuL}R5>vuK3h34_9<a<^2y^6&^Z}?M~ ztGw;!55j)_+EuKiBUndAu!@cly&QDlSoRLU(1Bwl$+vc7FMd1=q=g6MX~zE8%Vd3$ zHz<39q9+KU4YC`eAn2;@oMp{PE=V5+J5>Qx*}Ca!T}eo;4%yWqx;pYM??YG1rmJOT zR&sUAu5N&+^RA`>-W`-&J+iAuboIamFmQP?C&kKk_+e<pQOHx*4Urz{VT>ZUPH*k$ zxPNH9L)vp#-g7wP&bYtXHqrRp3qd2-B=4KD_f66BCIHD889FSx0-`JMxV3XNl4}-Q zUre7zHgD2fdpqyHwEoh={;|#evEOw{{TJl^3)0?;^4^OWn8Ao1hA;+7WPDZfUX#7o zM9(!~{K(y!tq|S&MaO;t=fZ#T)?Ye6{nLS(OUKQ!x94>;_0Q&-*Xzww8m0h5h%us< z@%1$uMg3*nU)Fy_CA9T5BC8y2T;Tzxr(rSROPB4n8v{Byb0MtIn8#A?Lqjl}#*@<p z<H71k!*!p?$+m-&E<R#T!)^IbAi4qc+j($yBL|FafE7Rqd9@_XoTCt;coO76pMxB` zL`zVmJ?ST-t)MIJB9X&bw(+h+m9iq@1!Zee?OJw8x+fyN-?QvCef^N=4;vurI!gmC zuCojv+B(EIRRL&yr6K;K%;pfL*$sQ}m02y4qG%sHCmp58j-+nidrrd=jdp`w>3x9f zRNkb7YLG+2;mBHBLw<M&z`R5y!2c{Bb0xe+*BXty0bTm8Ijm3DJVU>=fV%57OI0VU zf9iy22c5Pb)WuAk^Mkr%h5jjE4SIPr#3o%gO>-6Rm*MRxPtwg5!fgdxvYK-h+VxrZ zyu&(UO4TF|7Oer8zlQ21Yq)A$zNiP>>3gW*-4e9AHMeoR_@I6l8S6nt&kh-DV}Aou z)~J#ZDQk<pkE?!ylp2=uG%3H6Om$C?i36GHbuu*+WSU4qtrV_}W1QF6a^9mkE70mJ zx5M6=iT`Ap_;zYyqLQ8@%{e*eUzn1vX_HoH8IGES4}OX?xO{?qwfbkf=Cc~}WoQWZ z#*c>l?C<or$mJrmphX9hxQCk&mI+5-*$7|DFghdxzn+P~$}<kD%Sm=Jf(!o0l(ytI z0u?%pLR(tyh~m%(k4!u<f}^mY?J34`7y~#i6{3Ju3`Y|n%&Fh>;9{u&-;mFF;Nv1q zT6{MK!P`X>sOU<88dlfc5Vy^Dm)<iIJxn+XE8w|BfKd=GVkUGtej5&x;6oEnicopF zep&?qG*zI~l}RETFy<P9rl%KUQy6UnkvGPm1!g(|k@^U1O_4|%72;8`lfXm~4j>Wb ziCb}4+e3tgfFFJl%w*|0K^4Lf=7RCug?AX!qGbgn0TBie4-yC$DF#f(;F}+4K|rbn z9fNR$maJ7FPJRReT)@i4&uq{K!Ci^3aqaz|>5r)YKxg4<=aDSyEte=B=Vl0>F;8*R zL6bt?=6QG^p!dSuC5z=hI*v!#`ALpFxzwdwF>9@$_joi80FQ7IE>yZ0bQl5WuW#;B zxyye$@yiKVCA_)z=3R;etMaeHE5(j+I)Ga6IQXkUJSK#erU<TM_=@O<s`nYFx3Dn% znTbcV8zO}eh`6fPk^eJz@vQ3I0`<NwsJH&c|GM@+u05cC_13T7DysJiDl`tspHvC{ zC&>1vkbG~!lOQ<%=g0=7=U>C*A|y+vhByvF+A#1;2LY;q`|3D>7*-L2Bv>E$0;2fE zWBb21P5<1WX|M_KQ2?_bSPVWTD1LLP!d>Xns#qEU<@)dz(ILf&coM;O$(W&-Be9!` zdHNQo(3e%nY7f#9u&xB)G58E!SP}uo55kq=yb0hjaD!;DS$vbk1ltEOey~A}*P<u* z1*EpA<EcW26bp`kic^ckQyj%1T@C6=BM;ocP(Okw#Hayq7K$hq=+Czm2R3zl&fh@V zJ4owLk+slO#SSWkfR1!|{ylgpU}wZ(zU(-4N{#PwYQ27`{)uA&*j@Mu^w)2o>;IvP z^7t}|l`E3FQ+7jWJng(n@B9|QRkb{jx%k1c^fB`8C8_q5T#GSUxOS~tKAh=WJ_^BC z&P}q0B{V<z3dXx3)9*>TO;J@tCJ4=1J|S1`1!T-QsD*T`zb-MyWab#ga}6(#uV9?f zig(l9Cc4`IAG^2o(Yrr;H_P3RJ?uKN*>z;2=8HP1>xA5OLh_xI@pr0#yZ8h5-hJo` zZu)|`j<x-N+xyF2Lc9NjynhGn-j4g-lB+E}mbsm8XuS6pgroTbs}<?7d}GUMTl$qp z5Ct{1)!4dn`{TCNHeBovW8fO3@acl5@u7#=gvfud+}^j|DYqYy+fPfLGqUH5NPb`y zPkrW&=w{%T9hN%=;k<GAi>q+T`}`0HMLwXoxOzpZ>w>R0(!*Qj4<47w?x-64ih?9# z1-^mK?CTI(1<+w#vsl*+xRQE5oEd)9+?E*zU@aR43=uFIum4_D+<Qd(N!~%(JD4#8 zJXRlAS=y`%igm%<#75)h!PDZw(~p=v*`bwNnbED5w$*F7(e;aKKg#zGtlwCBXJg-k zzAp|)y)Oes(s~v#FGvAUfiyGnxRqIriU&?>KdJSM+<GQ+Hgon-Lrb=Cvths3us=7u z(Y4uoO6)zAXWFxUD>v10uH^iH<uz}N0$%wev1L?h8I@Z`Gb3A1XWF#ca6oK0kh{Hc zc=OO{@z7}iZnO12dpGm$R%?%V5a7%OxphJGFJNH<x%T^mEAOfWPUQBj_pKe+n0UZ` z@ut`^Cbf*oEn`n95Ny7uGh3Ivn7x62xz6nE`)^9^eNgp)CSAn86>DbV!)hc9W_`K( z9E*SJ4Y}F1Rteh%!cIEE532!7N>`ErK1lNjB*0Dyt{%tLncg%$9(3YI!5HBh3MmyK z{BC$Lir21C=*A)&ExfUZLR@?*6ykBcsz%a|;uVgL{Kt@dR+vXH{)tCuh9nr<C430U zUF~n%<gz-pDNF)R>z-}OnD|dx@xzuK>4@npZGCQ=+L2y1EzwqpqSU2J=C^2T{WkTq zRGsxu(4bwhg0Ho3M;)bcouE_-Q;~%`y+VRbK%g%<slzqV?5}}D&5zoGOQag@B>xMz zg+Y%J<{*J4Ow-T>=sJ<AReyP^`Y!p)Q-0C-+qRvy(IE4a)33<$-|zC4$nyUI4RpBa diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-310.pyc deleted file mode 100644 index ed2b0f6f101965fb42fe059ec79e8084a4b3a9bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 zcmc&$&2HO95GE<=$Exk5b`J%5Sp;rf0g2e4$i-+38*SqTXoVt4f!2mWued9jDYYx_ zE*;y*EqR6B+hbmdKu>*(o;ow6D5(mJ-ns_IoZZ>knc4Y1N^fj*Js9Ekr}DS9=lzAs z;%I<!0FPxLjy&NB|1CUkf@9PI(EzOhnlHlVUay&e)zSz+JAlXTfRG;8dB=h9j~gO5 z4n;$RZ@uHDXo?p6Z;3Ye=oHPTYMML#C+zJq7>6v$xV6k_CgdnplDTuqa+OHqc&b>6 z=4{FhpGYT-?RU#<&Y5(WJ84OMP!Cdn;AWgEo>{iX^zbFk;bF6RoRo>PefC^Rc1CB| z{%rNEPaB?TE7dUL&ViSq)>-Z5>4?E%z3L2CcBIXOyHrEOmKk}Gr$!0}vy_jJQ>lbh zuFR+Qw364iS9~(fma`)3S#XvmT(P07swEh=a7vcxSE(BBmBrcL-)B^2+vh^WlUX%B z?~$v8<=X4X7pHv%C1#J=?$7bV-CGSsYF+HEr(~V06m!3Q$2?Cs;N-!h`|Qza87tHh zF5E~go6;=NlL^#NaK~|mU-B&F!%W_%GM3Fii&YiI>7`T@?Eg>)3MZy;9+wwO3Wf6` z@c|UGf$xZxui>$GL5#iEUJO_R38(>N1cN8NpjfLfr0CB3@10+SR%WAjo@v3}zki7) z%0)@^lLbIT=2v~5opWxZZ*-DRpvi1>l)CToVe|yr;z#bzqanYR7HcVtzKU#aj2?3* z<B1kBvrz?r>2=YG<5Z<Cj_+ZlA&8dW^=~$*o%*xImE4d?D7P(mdF{RQe)nDQ#{0wf zAxF&a=7Oq%AUqTTE|w|z>fd-o5<v8q*IZ(>!aHt!CS7h+33${i%-4<wTFC|TL9b!3 z=0%H75q(8xR$PO5Q7KCS+~^e>OHla?rY!E>TD#dUlV4gN^x9Y}giIV4-54vGXZXGz z#}_%zs+D#e3!T99-Koy5<3!8R$i}0Lk4*=I_y7f7>Vm*<40a5LX_3M^Ug(FPbb|Ge z<`bA&8W`vSJoaM{%S4PM4rELOZqOJ12&}1QhpOU1K%GLe1qPw|+o?>_QJN5+S*8i1 ztfmoSHOZ6nIZczl8sz_pqls<ym<1kJ<M|yT2UQ2o{jnF&74UiBc?Jw>+1c*SRs3*g zw_@r!AKmH?&FG^6EZtvmiQQBAs}IKSM+Up<@V*CSB|M;HZH%;2tpt^@?Bd1a7_udu zS-V<HXW?w>{gPAm7&nGr*E<d`d72>^RsccbS<U0*w8~<li3@H^p)x7IcPpUAt|Cz1 zgBPMI_=!*w7RZ1otU)tjMPWBhx|d$F2=RK0wfbg??!2f)cb;U?u3~r}CJ7=(a5#aW z<(GdzM<33RTr<+3*EH*3X*N)7qPT;CK=wX-Ar!uZ$KoR5YkiyGG3W(^F;W&lNj``u SI$xDo-$#fNMQ%2>qJID($9<0g diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-311.pyc deleted file mode 100644 index 43d077e6552c249ec0d115a4d34f47de65e354cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2860 zcmc&$&2Jk;6rXjxjbobhD~L8UFhW&>p|z+`IYcy4MWIwGIkZJWsmo@(Gj=wtcioxY zwuySkp@$rLMG+E6oPw%K{4E6`5v|0Df526G>WTN>?v9ffMcf$2&olGhym|9JelNdF zPSzQW_QtR3`*Ftp#zi@*#bkFLCR?n+t~1G=FzIYp7<&%id@SXh3UI~_a2#2^%^I#> zisG+REOy_6$re*=$&qZSBAul%Sy`&eu_tWFl~tfeqzk8yWbTcqpC;ljxUtS*T;+Z! zjNwVlrRoHc;>n8QY2+)Nh#=wtiu1nEqNft2O|zaKOA;Nl(?l6sUbKUjUkTj}A`u!s z&*Szg?crtRK5i;MF-?A3DZWg1m}bdcZqk8Uu~AVw6iEVF+Ho9OH8(mOn3kJp5t&Y` zdm;&9u-I^|?x%rPlEW^&N2<Pxq>7UKJyz4myFPy;di`+!t4O*u&TwBuysZjvNiGcB z5{B`^AnMNN&RJMk;N)i06jFM<(i`tLNYx&;)q3}%d(8-3%&+jdZ@f!$hYHHTBwn)C zC+Rc_@a>167`_uOxO?&P1%CNnZY%f_0<IOhEsD7x_j=$%DH4G@;(-VQ(GJxGa$}wh z#4Nnf4IZe7jQt<{K<0R4&Xqi{v><ct_+@QiiC}$=!MCWBE_=*8+@~QOSXpVwpiU}_ zUo<M&gbhztA7<k-C#xD2b_^cjuOELl-}>4>Wwi8n@k+QNglS!i{j>+!W?I*S<jb_( zYKt{x(3eujk6NlovR2w_>p*sumzWfyA0%lK>p+AD<V~t|+!cxPda+cYX%z+2U(0Hq z7eqngdFxY@am{j#fMBM9Y_Od(Z*NwgPVLOR3qQv;;j@eH-sd2MCvwm&m~4T2R#Ak; z&(<~N4*n+YaJ3E7=XSXb^3UxV2Otg|x_+O+LXaaRWEPLq!-If;D1`8n=UEOC1>oSp zTPjI)lp_wV3(&EO7vo6n5npVKX|yssBKlbVS*?tx26Se5{PYA$Ozx}G^;5Yo_idiX zBj<o@u)#?-G5K`r&)V$owb`Fmepvl+^|xB%k6PnJ`KR9i!NtZn#s|yV^Rl{!(Mv;| zAN9QZsR#?sxaY~(hwbD2I9&7mSamwa>x81Kv7hK;K%OyDN!Dr%6cLP?xdvpzeg>5p zw>Dr%K4GWNzNk(Qsuh<Hm?gCd_k#f&CHV!Y+lQ|mWh8e`!`8tT1C0fm48*spr+_V{ zZCi;7j0Z%Cu#o^dQfN(I`9UY}39Ai{34XYRNJ4BS{FPw~qVQS(`%nFckaV6K=uuI3 zm>!6)#f3wC{0<}>v_6rB&>ak4o;&x*yL4`@=t4uRJyaixQA30d)ErTXiCO5g7h`V> z;gmJ+CM-tGgLV^ZtxP|TB)KpzkiFM&>;!bDRkimyd+w&P%JFiZ3$4YPJ#qDc2tow< zqV^C}N8fSxUh#@vOz?Kt6AF>Mm+!+G3&uAoqX>R&x=DoQGUwo5Bv_$54T5b<P#VO; z3Mf_t+v_exui<7@OoD8}#xJW6U7yv5uE@p<OAmqq72o=a5;H8aUWfZk0|+4NG$QN7 z&Y9U9VBbN2-I+N{KW`!L=q7v$G;sBCIHgY@If>*H5-RaGafX<Y7dX}u71YNtF&BaC zE$|aq;7HE9?%4qwCAlV4ve>BPXh9nH-}1WlX%0vWdKN^{=VlqmV9arxLG42aP-2w4 Z#JyKT#<$KH2aFgcFLCeHzc9$Ue*o51>5l*a diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/inputs.cpython-39.pyc deleted file mode 100644 index b0c91ff3182adb1245aa7f20656e8e94336a438c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2474 zcmc&$&2HO95GM6w$!hGRO%DZnSp-I10g+lG@Wp5h8*UpIXoMn(fxxCgued9jF}b97 zmyRvu<~&9Z?J=*=Yu|!EPkoD?Iy0mwsS1qVy2g&Vf3rK^&iAeO+FHkfa{K!q;;`j7 ze_><3)S<Bl)i5y69N`G}J=ELUF}7-=4y`)0T+w*xbejRpS|~MW?LjpgV59@{oa35s zkL#j#+z@rqc<&rHMN_Q6{}s^!AMLz(sM5^xKVfZ$LD^?P#EoG#VM2~VC7C^!EK`Bh zmWPUkIGv?j^H^G`O}|qtvsQ=0%t}MeUR9|1oa=F@cx2cPONMW#4>z0kW2X$P>9dzo zvNPJl^rxd|eOmA$F;Wd9ZY_8jCP`GeIUF$<tVXTo%8U{na~mdbV#Bn&%t9>%gI<b9 z$W$sJl`Z0_JT1lb!!?i7XfZ09Jw2RZ0at7&OSA;z26l;}<ZY<NI|VqqySt2FHhnIH zA5YQvx=XI+hAXcp-=6jrK+K-9&DZ|c=A9EoXsmB<QktEq5M#f4#Vk(P;H0<xm~EdH zX9X<b!nH)$RKkKJjsZi#Eyo^y#iNi9Bl(zMERul+OBBZ8l~i=t{{aU&j!(yVT3jqO z=s2$e7f3NJ_>F8ifNCCq89VPBAGih<SOd(c4Swv_^401>^3E*(KDc?q$Y}Jz(JQd_ z?_Umfydwi-@U*;0wmgx=*>z!iF;GYYXcJ1t-biwrY1unG___D}(etC%Px{;5FbgBm z3u1mDJ)WkK7Y3;(!Sv#h2OQ*)mL`j=x!O91?75ISQ{Ir@NQ2iQbaL&POzULKt@PtW z$jEplhtiw8?fan$t?xg=U>jf@cg3BoQ%3fugG=zB7!f?5!N)u2jq|H(Yq!pCt_v_B zK$A-X7J0lc1mp%&^6kGVjXHt?Qe;X&^HMT!;R^|9s6sQaUCKt~c#tSLH+|5pYrM96 z1z-XK=k4kJXpD<)qc9+^PQJFlwy&Ve;A&@e@~{YgVSLbSAy&vb-_JWfBAG?_eb4tV zGai*AE#DVO0NoGLB)ai~M2<$rA4Pnu+u&S(f(G+q&fsx0CLJEr;Iy{e__9%JH>fv& zj)j89+=FVq0JEs%_zHlU(+i;SJ>j3jY(i{bl|l-%RjAe=L4>|ZWe|?SfO62VggDMB z9U@tjJUE}}Jo&3s;y;Nz$<+=s@DQl+>;_T9$_;1!*el2hcwabVHR{UQ=Ek+ZwXs=B z{Y=pA^oP^v)d89BFS*3rDg9L&;{z1Is_J+@L1XE7py`PQ%B6`C1YwcG^V>0$TiUa7 zH6PC0-jw-;DD5z=HNUA=>|gOPLNzVvfy%WU$H{3KMV!R&V%-@+Ii+|omne-{MU;L7 zAEb5g8>3J>ur<=aI`uS44V*OTUb@Y^f!CX_RyUJ(W}xPsS&(_FJj2HrNd$QYn;ZHe z1Ts|oO+KCSxYDCRx2f;JOudF?9nF0-M6r*t3q3x8N(u+;dPw9LbZf*gYRnOmJdjAV PzbkmYOVmV&*1!1&Ix?AS diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/loss_function.cpython-311.pyc deleted file mode 100644 index a1e26394365e683dbec6da95fbe223ebcee10ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13488 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 Bp;Z6? diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-310.pyc deleted file mode 100644 index 7ebbfad9c34b1f9e6c819ea7cf7852af65591444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42392 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 J{$pjC|2Gc|fYty2 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-311.pyc deleted file mode 100644 index ff5e3935b0dd191141f8dfb60bedbeb9a3441d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87304 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 VVvQP|=-}`ZcKvS-xy!oPe*=NpfUp1n diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/meta_model_engine.cpython-39.pyc deleted file mode 100644 index bd6eb8fcd459fd95ff1b85514f996344b6e4880c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42705 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 X0Qd@E+a(_g`Az8O{>jTCN=^RXpccWy diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-310.pyc deleted file mode 100644 index 543416416ef052c2402c2e9a97976dc4aab22866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8915 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 StX4>a*409eT+%Xuv;M!r+lnOs diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-311.pyc deleted file mode 100644 index e2b6e8e274e98df5f28013ef45589d246125aff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14832 zcmb_@Yitu)o^O?3aU3Vk`vnP=03it>O#%c6uMP>}(G4^W-ObYUdMd7RVsPwGRR)|X z&-RBIsc4}c(_)0_4LfF(o^{{mt}-iDVx?VaKJ2&qCDpPtR!Qh0t$L-AR;!G9T36aH zcYo)UU3LWm+q+YakE>3d^FROdKj-}4`J38WAA@V=)4vt}bvMKO3wbDAp5o1SS8(%y z5tu8CzzU8id&PlYXVf|Gy5eF<oh#~|_gwMNdv~;I-h0K1d(TgqE7cC>BqLP)lo7n5 zM|Az##V}vvYhG7;g5x4HP`$X%Hz|p{A_`nQ#!X8R?o1-ejqKw__Kxp9Fuv~~H@bUt z)aQGfPbhP7X`Bo5Qbh3mo<KP_z#4V$i?fm_%W>&!<aQ*6nwobbF_D+f#sx8o$Li3W z7`h(39888B#j(kc8($~B-+h7N0i&?^DPAg*t#~TcGK|Xp8uedW@9a+sfmpn*5y<pX zL83)3!(^?Am)?-yU*r3=Rbhv>Si>+NkmKC%3EBg0!^zLchEs?uh9kCMxa1p>VmRf* z{D8w?ZyRh<Cha)xKkiMAU;RK9CHbm!Jw6wm<9Ye&R6LZJ7h{Ti^<+djm6*9Y!zV@g zCLfImQvCK+@isrd5EbRCiTN2&cUBB4aw5jhN0fvTmm++0U3)npN%2`MT5z6FS-u*V zusE~v7#|JJ^Gawg5}OS!BqTWzQHB?ihAR}8B&i<w)!{4eLGdZ`yrxdO@$<xIiS&g# zx9{G*bL8%kM~zEu*`Dl$$J_p<^H-gZH!pA2JBITe!+Oo|s%!W=bYnuKC|#um{q8Vo z9xx(vg~d+A4!z>6W~v#XMsWR<z2Xww*o|(wCp~08Ua1niD7`{8%4)#}GW(5=^VS^B z7N_u@IRpM3ES`_URorV4?9^KkWsWO%;YxkDVkhq7kxzzwwAXvQ#LtTgR)jw8vM%}< zjwr!M3~xi?g2Ih+Gx2y-<YPlzd_loLe3a{-Ix#)*!Mm5ZBitn^Ar8=P1f5%RqB18+ zoD%0kd^D7ZVnsOAaAkPmI9|_1WR5P>Fn2o4$)aLGK+iBAmBk@07O&`aD-w-zGa{Fe zaV#S-3p(&I=Rij97l&tuIe}Mr4)Dd>3u1_zVt_<XK8iyvB)JeaohXUIK#>-q_(C#x z`G-vtIFoq~ahE}L6ET2^h{7Qbdk^&yg`4M-WZ3vkQMx5X6h({`2Smk8To&In;`GG3 z7f+Na`(d#cp&B7`jKeZ1*wvK0l$Pe&PAG~LnMo+(E7vv@7sEje%}WxW9OC3TenG@4 z_Q!%@u)GBLR(Z%tv<*i>5pqhoc$f|(nY@kcH##QQKaZ_J-Y&#t&^3b96(X{U0$L52 zNbw;ha#O4rSWuF5;Ml@2*<P>5gwUEJ`z98T?OGHiY_1B_hPY|6VYoQidAB06Xb$<l z7{)TkLa(L+&I0!yuSABpKN}vxDO%(s5%6)`;_)3RBG1M61&Nn=VTgNgnCl-ocyQ0a zaOLqTaTROl7P-qfCy5~(Q_PnOCt{d5XvHrqfU8B&hdj}fimGTNWL98@-r{eH(TZ~* zh@tpAXc{3shPn5oct{iltT$bX(fv5<6LKUPpXViRG9D|=l}N0Mky)HkdB{TSViGGe zFLQiMK-2jJ><vjC;`Z*|wRi6@ZFOlnR3R%E!o;W~I!c+C%BoDT#NZg!fhSAis7^eU zm>#3L@MK9Efk+GX+<?odwXqbVIu@7a!RZ%8!($#lqpEl+AXQwl7!6A;7*J{@MH?yF zQOE>Ga?Uv^fIGt*1e*e{3NH4R*<Ok36`9^}sSV-q@>Ud|GB36aX|BAtv#_OKbKR{g zY}t;Vn!=Vo{P;C|qz1GLS@XaHQ9dX|RFn@GmAQrr^O9Os_SMo^V4pbb5;VnbAd?*` zd(D!^Pn^F7MZdPFngYeIS?eSHUmJ{)S_EA{a6NIa>*>VWITt~}6xQ%sm4$Q41_RoF zc>#;+(!Jp6DBS|~Yp`?KU{M8*bhOn%b1*MpSw*yumvL3f!@Z=}2%bg2CHluYdb(A7 z1lM)CR%HO#hgK~S#Gry}5nCw5#`<h{{V8W&Yt3=}s(Wx|=nPVhSjIL!Q9kJP-=e(J z2J3$~7u9i%oGN+=p6hh?Nt-HHK1<Z4moCAzZcRMvXk4D7<G-=HJXkvixQs`2h27vM zUjF}p`AkwFPC1$kMMI=Q-{fV4KbWs&QxyPnoda{_sGy?KgOA1`H~HI85_VGs#KxYE z6vc^TG0=!9`z{l$g6HG~UV^v*FP9>>shVP{6hs!Ife?>D0e}F8v@*FI<?$A<5X7ad z6txB_1Vmw&y96D{k`|H(NgR`@z?BtrNBfY>#Y6}*nU|8#Xe@9LHc){SDG^d=`$!D@ zolblRYC<G52T?C_mxJ+e7;4rKm$dFK2Px?wdJ~~J3!XB^n}Fg81(2+ILe|SfQ@G6S zvcL^+Z{ePTu^JYi2`Px;_wFdA1JMvFdzRPAVBdjF<c>>%D3Keg8AxRNeZ?9svPi!t z(ncc8YoLKj1ERezBqhRXj4H@zqRU9#q!E!CsDd!zXGJPL3>VfzHr!Oxkq94>{G^dH zD#i>K*%OAFYzo<M#e~Sb;UbF3K$S$8iNRi$$nG_~CHfgv#p%J$Q3S(VqNYr+BP7CQ z3a9$uf+RxdlO+ohm2`3NH9~4#+i^gX{}R*wlv!(K{PlMatubtMZ=t^7f#-8i=3?5T z*Z1V>d$fsf{dITGq;F)|<*HSGzwYnP`};NaMNJ@I)3wGlRv&xb)^UF^+mq{AZ5z_t zhVpGg+NpxSHr;;btTs^yG~NBl8sn)w^1O5N(vED;@{U~3^5DwE)03;6hxN|G`Od@X zs^_ik_h%o?EQPZda_r+vE9`3bsNOxA?;id8$!F|urk_qf8~M#Cz59sXdNkj9H0>;G z+mUnTZu~Fr^4WA%#+kYCg%|h&`}9Zm{Ao7Le*3!7fbgx%jeCpt7lA4IoVw@NCNNXf z-zM|SvCF=do~Juj+s5^_@qF93c8X${;g@E!{L-}*_G#5>>jAy>K)&^WcCrwtzk4&& z@Y#>G9~U-lUfTc5!(SZEu@8?e9ZP%D-fuT`Egi^CET7CxET387pU$psI;w9vn%{IZ z?R^obPxquRXKv@(Rs*|Ny}Mu53kc7pdVvPHxz1(>-%>0Y&M?=kd#V>e+J9|H{Hu7E zVj<_*vYk%roGEBjueQ_)U$jg6tI!b$l$1N=NmW5IGC@mg0RLoyWnG~PPnI@d!_tx> zSxXbZ9IXrT+xf(0A2;O%E?y#?Q`M>?<x{9MHoIIa>jRawWqrW0eirMbNe#Gv4TbHu z!6k>7Ubfn@41NWkSxXX?`jTHd9~`x>374T)V4apBILn$vs#dM_GpRbknF<JOsvh5l zStiwpZ<7rZOO~qZ<zutbQyK}Hi4*U!`W4z<i)}rKDoQUK^u|)H+G3~IBH072uZECn zv%zSxV7Szl@Oqu49W(3@+^J3*tT*irpB)=DaGmb)v_pELcBn0;9(SEm8g;)?8x~l# zUTp|4i&#(8JXAXbr>V_JEjDbMEo__Brgao+R(6)&LhpR_KJ%;9_Fi^OQ=4r4h~Ysm zb(7j$Uj21_npEIYew*4%v8U%;YE<i_dbQTJcV5?im*BBsP(C5hn1!mJIn>QzM|muw zN55QapCLUpT`}bia2qS(UL)3)IrIO*2&wKj!2ZEFr~Ke|#Mpc3QoGb{wYvg8zukSC z>QWoCWdc?7S2x?&jU~2{Nj=-#Q(HEejYHjHr)-Mbpk<fJt!vq%_NeV@quLR6P)mf# zc2=Nf-KtwKKZn|5pOf0EcF<mq4aVDo9yabl?4%#afqkma4#Q5ZRIln&dy5=+zlAXP zrgE_Sgwx%rwh-<^Ft9_gLr-nB@xL}Q$MUkRYui?FqH5LF%G0E_nS3PG5bL%<Y*n|S zmuC^k{jB1|*l{ZNhF#oMnuoMSIa0cZWbl^Y{1qcq+wl~9f8~0#j<aK5k#Qk|QXPK^ zt_dEpj%P~M>pAAiL)*^SQo<gzsuF58o_}ha+Fm>Z+bYjL^a9R;@yZs0-{j9|X~{9r zu(#Ap+K;C)j4HBoY*07ibI@1H{mSRuz9Y!)0<^8A(PC8sI7azdB|fKG{sBacWsyur z;J^GKj`E4<EMg4G+<ehvOSJlRE^|_4dChn2vc|eR&i$C$BfFxJ>#zfD#$t+CK{DK4 z#NR5L0S*|DuW-Er`Xz~ncMCQpF&>7B<|Y9Ezjl<5@d$$?xtj<*@iT~%m_AQ}RkG;Z zr3hF9e*DS-Ke6y81M<?Wr~qU%Q3>yT(-^f{7H4fe6K@?H%JG?N@U~mE1e0P<xc8&s zvb}d{z(H*_qdFOkAp|5vLe$!m$ljg(;vu>I;h04B*15%+)9_VN`+1yOYylPGu$A9E ze}3{qPDH>*!oZ8p;ZgDT{~y<EX;TbrlZfJ5G!VnlIIoQDmHJ542nsk3ZwHCx7c{DZ zNqT2^P(>^{Pc#DO=`4&v81JUJNc3RC4VSwl8ZIFc4kPXrOBx=;P-3&9;hc}akbLj- zxoK%T8DW4l_aFvE;wwa7A}wd<c?85R84WYhc<4HDQp0r#D^-RE6g~hkCK%Pxcsxia z1(0a%M974?Jq`DQgnJVV#&T01J|3x0-86Z9R(vHmu$|hj(hxz0TCdgC+8e&|W-~mO zi&HO>zzx%uP=L%lc$vH=cLw`@u_|e>l2J>&4M1Lqz_K-b#Cad2bw)Le*ib}<yV~#} z+8Ip(TztXs;jIv)6=Y6=;f|oZZFo>B2pzhv)7fHC4G#)JO*+Fc`AJ~j>~({kGhDP2 zdsZSUzTvtI)7o%cx@5R!M1?P6_`cz#T_Uk?@ea^rvMOXdzVR{*cPE@di(MPr>UjMl zK$QO-n(e2|_q|MgN2Vb&@#Xu=SDx)%4ZN)f-p&W!zT?tZZKS~UELZ8?F0DE}{-SU2 zcYTMx={xjn;@J(oZzA6}p?kNIR$4e6&WMHfZup;T3vFG*4P9v6M4Zy!dzi-N`yCIu zKkv@6IX2y`Hw@+*1~pHip)oynuU+%3d6?QdjeXwGbiWP3%GNBK9eKEUX|vwYmv87p zLw~InzH>@r0jguulK0DAV&kv$toH8Jd-vvh_x`T;z&E`Ip7E=_2lU>z^Sy7c_PnjP zPvqMte%q68pVDdz9et}UeVPv=wX|y0g_aJ@XBKt!nzK;fsJY4L9hvdcn9l=^>4TYT zdSD<Q7|>kL>+0{$K5{HoWnB+zmumI8?V6L~t9hQ+H{SPV2D8Fy$4<R|C|^IMxnc98 z@CPW$^^JFvKmW;RKgsZVfXfHC?7?pWLwaCnW#6-@-!}Zi^xqx(&9Op#=W2a_=34Gb z?j1d_{|`=P?<BkCW$Ifp>}QMG;&aTqBRiJcr+19xJ4VtTkfNda7su~UXGSt%y?J}S zdAnZUm#^>BCZ0F9-ann;v!11h-rS#W?$=HfnmRJu?;p{oK!AqUOvC5Cv@eVAi}vkV zKHuJ-c4N&l;{8<GRWWFxxdl`9WNu^|=w~Y1wzQZV$z33y6<6+~C*ykiSiXHsZyuvA z5e!W5xj;TyXXeADgG+~UY!03qd@kj7Jn`wxd-BbD(k#KT+|-r%XlXoqBiBGbQ@OU~ zMZI}6-#nUT3(f7nYaaZjc@X3BD-BPZR(QSnK)(4vnkCz&{^w^tJCjy)|K_}Z^QwO{ z>Y7{97sw~$On-R)pf+Xhzt#+!*?Vux{Vm$@=S?m5$1**c_wOAcBq?y)v=iyA=|p-^ z_jdt6XZJ6=zv#}n$apJLddI<h$3bl}?Y?t{P_K~^eQ&l|Z|=)C_krlz1crcr>7z&Q zFMXJu$liE(b?K_!GMH}})TW8|XZoIxwrSs#8F>`SZU;%WedT#Pq<6oS?|w^f+nsOQ z4F^z5d!{wpl>K12Q*Rl{w+w01F9OZx@)x>$vOP=ToadYF;WXCmTRd;g&gBv-7rwf+ z+BcT(-LH2a$af!jHvLWaajYwxV(J>>sNMOzz6E}_w!!R)T+ic^^p+Ndj?I}5mO58k z2iBZ;P3!)^unjx^ND4fn@G`ZHNFz9-o%lY*GOygmtCib$<<;Bx`{ND<%Y86&5wq*f zHZ5J&oBHxieVVt>(uwUtK69Bv`Ia4E7d~)}%mn@1&b*Uv?axhq)A|<SBOt!Np1K5G z)jfrduBFbbsCVqtrtY38bZ`4oTE3YJuLw`CJ&o!+Ci6Qc_3lZ$JFlI8(an(?&_t^- z-Cxwa1p_1(G46@E{oNT9cK6pcYUHDu1YatgUv_m4Z!B}2DC}^7ksKVB|LaNxt{AkG zIY=1D9TG~m1(|7V7y)mEWD@+TbhcE5k`^SuH`dh1$Ujg^dy`g`48jjT&Ot$1NSeWV zOO-3@jwV{=fPGQIoj|w%(FtTen7SP4sZiw(vEvw5A{5sj85W1lut+>?)7$`P15%d< z8*owmN+Rl!^bRS`q8M<NwGYEhXCadn21HZ5Ruus+_G~O-i%tFo{fZ&m?>Pn{#*@C0 z*|s#O*Kg0)Z_l}&1oZm-ni~hb6tX2+U+J=3v!^gVLbmL+(i?`lR^cSInNHTee%Y~_ zs<O4TcC4+II=aXZY8BG5Y(}}j+RQ-<ON563>uU>M%4>sIiP1VIA%eOvgi_VE_GS03 z({AjhVB*8AM&U_rIQDAr^&@m{jSTm+<qlS>1s4g?+F__Z>H?^Fbst-;<s<|o;ur>| zq^}*G{iz7u?&7r^(5m0wTJqcI3HaufviHZB=4Hdqava0)3?}on#i#5~#L)|yQ2=t2 zvZ(|M>sxDYDY#81r*zsjPI+`|9YJNw1)a4V#AV3qoR?NV>|HDLx_)ojaj`#P4sO*` z#4bQW<z^U~tOi!5mT+9^Fs_SjMA16cuhuQX-3-T^ADr34{~I=q#VjUENnU2Kk0jNZ zIako+ixwKm+o{MJ0s|^O#mfO!GnUHzXhDwr2vI{sAZNuGG5kpO)|_Zd_u*!Ek^=@f zB!`FOw0t~T%4;JGkklSW-q}3KSUZVqp3&XA4-Rt^0*~x92#%sfz7UTlWAS-p5^|wA zK2Foc_!zNXWFk(i84{4l;t?eU=D3msUyLvCNHipQJY;ZLL?-}_;2o^;Xi`Stvme=w zu+RCZ4Gi+4kOWEMxpAO285O1Zcud(f4Wo}h8ZBj{(OHbzW<iI#m=F*d9^#JENsWxW zc~Z9F;WscRSf(J-`XIVs#v+1VUZY{|OdRoNPzHj7WFaL?oYzg~y*bP^ghZmzJ-hqI z28OtWh2haXd-v@c-7~iTzbb_-46*d3v@|N|XkuDf)Kv)IvIruCDoYVMEvzFEdUWR$ z1KCAKOW6Yf%Nqu4nB;{bf?pcd!h}FQZ5roPa$^6XHHqcZMK^nup(RTIUX8XLThqrP zmwVGhHn{}ChC@;75lSnAgkr3Qm62CL;WsH0mS+LuP;ZEBoU?H_HITbl=~t-$PCYU3 z*>GSMW{{omB^r*W4wp}VIy`~6JoT;+PHZX!gv%P<`9xHSEJTxrk7Qg3@dR8|h7(RJ zsh_;}$Tt$mPJl;1jv)>Y?*NQ`MdCxE;o}v$IfJ7Db)rbb*KD{Juy)cUZU+Kpgx-mL zW7OGK)bx5Fvkd8rvcaA+*!SR|kt1iNFvSW<ju9cjM-3M+`7@)AIy}Vr1=IT?P1BJS zDR|cKUJ8ccW{FEO;nrkhR9sY_p{*CUmUrP<d#3KNMf?8;2=Yxx8^rYAhDFeHH)%Qv zzK5mSc=u*HlsT#g2J?YI%|)X6)4v$Ke<-75FX~ML`KEyt_MaO6v1`?TQum+C`%l6+ z_7cNjEVDIp(=-Wk4SLg{=7l{)!SQ#Jcaxe6sQ~Gb&kkw_3tipXxk7t~c3M0AZP%8i zkFu9@Hy(eica7w`Mpm}zU1Qq0Z`(VUs=jnASLgayc!c&t`rx?E9m;cu^!CH~_QTH< zy?s(UZDM>oQ>_Pj^MPI%JhfY&Z|+{2PFI_w--hX1n~mx1`||Dk^uSm?Fs8W*z@+E1 z1KNRK$gn1p_mkN@pZ`VrFNj5X;L-7=)4x3T#kv1I`ebZn>(lMen)IDV@;i^{n~&x< zAJv<V<(rOC103Fr8=vjd_7&RNVTDdS+<Na;wkIn*?$_IPYNxbQK&`#={!Q)F3vWaE zGIhPY2(+(y+fC!eQoXPkL_iY-=(~T$hThP4S?A-IrXV<7R26cQyUHy6a)e)XZcvYy zy@1cp@U8T^+to$;6H%Wk;~sQuPwbWg)Js>{h{{@OXz3mKU5BSd1=V%UQX1{5gB^#I z`-hE&s5VO!3)NAI2-)cI!^ij7`d27M8`Qs&%BsgcEBh0ad`lIq%+?@tS=Z8QYiTLY zw%W21%)%h>QaX^8sH$Ps$J#gO=c!@LeyV4EkM+;UyQqe8=HlZZjm6wawzP~00<!QW z&SbTvFv3|*5X1PV6oKPq?kv)}KK^)uJO0Tb?&C>r>XT2nvVb}cO@(S7Q^>iGnVEEO zf5ZO9e{T?V336YG-;4;Rsum$KYJLVzbSf;(QOX(m{CYep1kGzBEY_qZ!0St5jDtj^ z!4~T+Vb5ql9P1_7ZBBfboR}%f`-zIly&lr(m&ATCbvqhGGTyC{V2(>=h?B2}h@ehP zMpie)?s&P|)a$#w4iQ9GOqJVGtD#<41bLHca25l<Ov2N46240Pu|_Z>H8g}XP;G`> zyijzJl?k}iIY33XTaHI>LimeGk?IPD=O$7cL)Q(@9Q_^enF8HK7T92q8|<XPP8qH# z^60)eNq!ucM(`b#=5UZ?qHC0;u_=tFP`9{qV`2PK^koW1UVe)T<?n|XNZmu}8+VT0 zJ-WtJSD#>CG&QF$+}oo~y?|fz#-q`tv1||g{2%6~R(e(@=to&O`E*d<ek8yBh?zE~ zw;la0n{Pd?Hy_td!1)KCD%^Juj(vVCJM!hsayWP4$w!al%W=JFEZ;PyO?`{kryrdE z{5+ED8ghHTYF%N!YJYt7?~jwLx_{jNoAXc4>&;X7<|*yOx3z)0AEu`s^)B_nr947E zLU#XhXYK>Nb5Fi=k6ybsU%OXxJf{sO(#oCS-Js?G4yZW&9Me0URx-yk(!&$?7PH5* zdsbU_m??wwU8W^{JL|aj<LrsmR=9I_=KVX@+|IVTKQPYPz#mDWQMY=7=B3gUnf;fh zFHH~lNG3l1H%kl#4PTJ_16CqR?)||a^t)*BO;s=`#6!WLMDibK98QXpJBbuT=aR_k zeZ^4F=5mq@C5aRy-ATTO;#2Fh=IC~N*BDYjo0?)zv4xKAHK*IXV~w#Fb=%w{Ym8OA z%T74l&1+0WIqhn6!_#XO{qL~ujy0yDyy6&iH>@!)7bdm@$AKE@A$|-u_1T#R!7pEj z7AwVuiOnhzWy9z!RUy!bSLVN~4F_oh7imyiYLGyZuxti0iS<tjA$>vaNKP1~(0_Oj zo76rk{StLVe#yT=0k<>@7r%>jtudtVF>KQ+(`fz`m>sM3zXCJ5YX2)RTUYIWYaW(; e3z}Z3@LqMZpvbGsY)$UZ|3KgUaf23g4*v-j$G-Cb diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/orthogonal_matching_pursuit.cpython-39.pyc deleted file mode 100644 index 9f1ec9479869fec42f363e7f46e07dba2f1c6be5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8930 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 H7PS8b3n7jV diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-310.pyc deleted file mode 100644 index 97ed55acc1e800a138ddf489ccea709a8b28f634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11629 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 avA&6Yk^<6Wno`U`AM%$xPx3uy*Z&u-bVhUl diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-311.pyc deleted file mode 100644 index 0784caa91ce5a8acf65a6e83b8f58a47f8e12bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19787 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 M>^HBe!Eo^Z0iAV!9smFU diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_ard.cpython-39.pyc deleted file mode 100644 index 0843cdf8bd820d9cccfdcde3a1193f3f416ccc10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11717 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 Zi*F}O^<C;cm`0%G$mvY}IHnd?{}%}UP3r&v diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-310.pyc deleted file mode 100644 index 30079dce4bc04802324f720381b872c1a2f64018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9509 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 X4&uxQi9kPt=A@8#$;cEg3d(;2)UokG diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-311.pyc deleted file mode 100644 index 489534282f927e599530fd2c176b5240e2214e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19040 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 RV>v$k20#DP38fgR{|_UFGxGod diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/reg_fast_laplace.cpython-39.pyc deleted file mode 100644 index 7a3bbc05003eab405d52a934e83053ae50080d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9581 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/sequential_design.cpython-311.pyc deleted file mode 100644 index af35ff42f1ea1e8ee19d476f7b51c19199513cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87535 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 E|3L9E)c^nh diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-310.pyc deleted file mode 100644 index b856dfef2c2658af8ecc6b1ab85b99c499a39705..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35103 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 RfEonip2Lr$Q;xp){{<f=hrs{< diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-311.pyc deleted file mode 100644 index 8d6f35b0e889d838247709ac2440fed2799abfce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61708 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 diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/__pycache__/surrogate_models.cpython-39.pyc deleted file mode 100644 index f44a774b4165e6ff769d8db2f2c13c4dd0cbe8b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35188 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 X?l%ZtK(YD%eZCe!@XRZi#_|6P0+p{e diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/adaptPlot.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/adaptPlot.py deleted file mode 100644 index 102f0373c..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/adaptPlot.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Aug 13 13:46:24 2020 - -@author: farid -""" -import os -from sklearn.metrics import mean_squared_error, r2_score -from itertools import cycle -from matplotlib.backends.backend_pdf import PdfPages -import matplotlib.pyplot as plt - - -def adaptPlot(PCEModel, Y_Val, Y_PC_Val, Y_PC_Val_std, x_values=[], - plotED=False, SaveFig=True): - - NrofSamples = PCEModel.ExpDesign.n_new_samples - initNSamples = PCEModel.ExpDesign.n_init_samples - itrNr = 1 + (PCEModel.ExpDesign.X.shape[0] - initNSamples)//NrofSamples - - oldEDY = PCEModel.ExpDesign.Y - - if SaveFig: - newpath = 'adaptivePlots' - os.makedirs(newpath, exist_ok=True) - - # create a PdfPages object - pdf = PdfPages(f'./{newpath}/Model_vs_PCEModel_itr_{itrNr}.pdf') - - # List of markers and colors - color = cycle((['b', 'g', 'r', 'y', 'k'])) - marker = cycle(('x', 'd', '+', 'o', '*')) - - OutNames = list(Y_Val.keys()) - x_axis = 'Time [s]' - - if len(OutNames) == 1: - OutNames.insert(0, x_axis) - try: - x_values = Y_Val['x_values'] - except KeyError: - x_values = x_values - - fig = plt.figure(figsize=(24, 16)) - - # Plot the model vs PCE model - for keyIdx, key in enumerate(PCEModel.ModelObj.Output.names): - Y_PC_Val_ = Y_PC_Val[key] - Y_PC_Val_std_ = Y_PC_Val_std[key] - Y_Val_ = Y_Val[key] - if Y_Val_.ndim == 1: - Y_Val_ = Y_Val_.reshape(1, -1) - old_EDY = oldEDY[key] - if isinstance(x_values, dict): - x = x_values[key] - else: - x = x_values - - for idx, y in enumerate(Y_Val_): - Color = next(color) - Marker = next(marker) - - plt.plot( - x, y, color=Color, marker=Marker, - lw=2.0, label='$Y_{%s}^{M}$'%(idx+itrNr) - ) - - plt.plot( - x, Y_PC_Val_[idx], color=Color, marker=Marker, - lw=2.0, linestyle='--', label='$Y_{%s}^{PCE}$'%(idx+itrNr) - ) - plt.fill_between( - x, Y_PC_Val_[idx]-1.96*Y_PC_Val_std_[idx], - Y_PC_Val_[idx]+1.96*Y_PC_Val_std_[idx], color=Color, - alpha=0.15 - ) - - if plotED: - for output in old_EDY: - plt.plot(x, output, color='grey', alpha=0.1) - - # Calculate the RMSE - RMSE = mean_squared_error(Y_PC_Val_, Y_Val_, squared=False) - R2 = r2_score(Y_PC_Val_.reshape(-1, 1), Y_Val_.reshape(-1, 1)) - - plt.ylabel(key) - plt.xlabel(x_axis) - plt.title(key) - - ax = fig.axes[0] - ax.legend(loc='best', frameon=True) - fig.canvas.draw() - ax.text(0.65, 0.85, - f'RMSE = {round(RMSE, 3)}\n$R^2$ = {round(R2, 3)}', - transform=ax.transAxes, color='black', - bbox=dict(facecolor='none', - edgecolor='black', - boxstyle='round,pad=1') - ) - plt.grid() - - if SaveFig: - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - pdf.close() diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/apoly_construction.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/apoly_construction.py deleted file mode 100644 index 40830fe8a..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/apoly_construction.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import numpy as np - - -def apoly_construction(Data, degree): - """ - Construction of Data-driven Orthonormal Polynomial Basis - Author: Dr.-Ing. habil. Sergey Oladyshkin - Department of Stochastic Simulation and Safety Research for Hydrosystems - Institute for Modelling Hydraulic and Environmental Systems - Universitaet Stuttgart, Pfaffenwaldring 5a, 70569 Stuttgart - E-mail: Sergey.Oladyshkin@iws.uni-stuttgart.de - http://www.iws-ls3.uni-stuttgart.de - The current script is based on definition of arbitrary polynomial chaos - expansion (aPC), which is presented in the following manuscript: - Oladyshkin, S. and W. Nowak. Data-driven uncertainty quantification using - the arbitrary polynomial chaos expansion. Reliability Engineering & System - Safety, Elsevier, V. 106, P. 179-190, 2012. - DOI: 10.1016/j.ress.2012.05.002. - - Parameters - ---------- - Data : array - Raw data. - degree : int - Maximum polynomial degree. - - Returns - ------- - Polynomial : array - The coefficients of the univariate orthonormal polynomials. - - """ - if Data.ndim !=1: - raise AttributeError('Data should be a 1D array') - - # Initialization - dd = degree + 1 - nsamples = len(Data) - - # Forward linear transformation (Avoiding numerical issues) - MeanOfData = np.mean(Data) - Data = Data/MeanOfData - - # Compute raw moments of input data - raw_moments = [np.sum(np.power(Data, p))/nsamples for p in range(2*dd+2)] - - # Main Loop for Polynomial with degree up to dd - PolyCoeff_NonNorm = np.empty((0, 1)) - Polynomial = np.zeros((dd+1, dd+1)) - - for degree in range(dd+1): - Mm = np.zeros((degree+1, degree+1)) - Vc = np.zeros((degree+1)) - - # Define Moments Matrix Mm - for i in range(degree+1): - for j in range(degree+1): - if (i < degree): - Mm[i, j] = raw_moments[i+j] - - elif (i == degree) and (j == degree): - Mm[i, j] = 1 - - # Numerical Optimization for Matrix Solver - Mm[i] = Mm[i] / max(abs(Mm[i])) - - # Defenition of Right Hand side ortogonality conditions: Vc - for i in range(degree+1): - Vc[i] = 1 if i == degree else 0 - - # Solution: Coefficients of Non-Normal Orthogonal Polynomial: Vp Eq.(4) - try: - Vp = np.linalg.solve(Mm, Vc) - except: - inv_Mm = np.linalg.pinv(Mm) - Vp = np.dot(inv_Mm, Vc.T) - - if degree == 0: - PolyCoeff_NonNorm = np.append(PolyCoeff_NonNorm, Vp) - - if degree != 0: - if degree == 1: - zero = [0] - else: - zero = np.zeros((degree, 1)) - PolyCoeff_NonNorm = np.hstack((PolyCoeff_NonNorm, zero)) - - PolyCoeff_NonNorm = np.vstack((PolyCoeff_NonNorm, Vp)) - - if 100*abs(sum(abs(np.dot(Mm, Vp)) - abs(Vc))) > 0.5: - print('\n---> Attention: Computational Error too high !') - print('\n---> Problem: Convergence of Linear Solver') - - # Original Numerical Normalization of Coefficients with Norm and - # orthonormal Basis computation Matrix Storrage - # Note: Polynomial(i,j) correspont to coefficient number "j-1" - # of polynomial degree "i-1" - P_norm = 0 - for i in range(nsamples): - Poly = 0 - for k in range(degree+1): - if degree == 0: - Poly += PolyCoeff_NonNorm[k] * (Data[i]**k) - else: - Poly += PolyCoeff_NonNorm[degree, k] * (Data[i]**k) - - P_norm += Poly**2 / nsamples - - P_norm = np.sqrt(P_norm) - - for k in range(degree+1): - if degree == 0: - Polynomial[degree, k] = PolyCoeff_NonNorm[k]/P_norm - else: - Polynomial[degree, k] = PolyCoeff_NonNorm[degree, k]/P_norm - - # Backward linear transformation to the real data space - Data *= MeanOfData - for k in range(len(Polynomial)): - Polynomial[:, k] = Polynomial[:, k] / (MeanOfData**(k)) - - return Polynomial diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/bayes_linear.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/bayes_linear.py deleted file mode 100644 index 3bd827ac0..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/bayes_linear.py +++ /dev/null @@ -1,523 +0,0 @@ -import numpy as np -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -from sklearn.utils import check_X_y, check_array, as_float_array -from sklearn.utils.validation import check_is_fitted -from scipy.linalg import svd -import warnings -from sklearn.preprocessing import normalize as f_normalize - - - -class BayesianLinearRegression(RegressorMixin,LinearModel): - ''' - Superclass for Empirical Bayes and Variational Bayes implementations of - Bayesian Linear Regression Model - ''' - def __init__(self, n_iter, tol, fit_intercept,copy_X, verbose): - self.n_iter = n_iter - self.fit_intercept = fit_intercept - self.copy_X = copy_X - self.verbose = verbose - self.tol = tol - - - def _check_convergence(self, mu, mu_old): - ''' - Checks convergence of algorithm using changes in mean of posterior - distribution of weights - ''' - return np.sum(abs(mu-mu_old)>self.tol) == 0 - - - def _center_data(self,X,y): - ''' Centers data''' - X = as_float_array(X,copy = self.copy_X) - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype = X.dtype) - if self.fit_intercept: - X_mean = np.average(X,axis = 0) - y_mean = np.average(y,axis = 0) - X -= X_mean - y = y - y_mean - else: - X_mean = np.zeros(X.shape[1],dtype = X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X,y, X_mean, y_mean, X_std - - - def predict_dist(self,X): - ''' - Calculates mean and variance of predictive distribution for each data - point of test set.(Note predictive distribution for each data point is - Gaussian, therefore it is uniquely determined by mean and variance) - - Parameters - ---------- - x: array-like of size (n_test_samples, n_features) - Set of features for which corresponding responses should be predicted - - Returns - ------- - :list of two numpy arrays [mu_pred, var_pred] - - mu_pred : numpy array of size (n_test_samples,) - Mean of predictive distribution - - var_pred: numpy array of size (n_test_samples,) - Variance of predictive distribution - ''' - # Note check_array and check_is_fitted are done within self._decision_function(X) - mu_pred = self._decision_function(X) - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - return [mu_pred,var_pred] - - - - -class EBLinearRegression(BayesianLinearRegression): - ''' - Bayesian Regression with type II maximum likelihood (Empirical Bayes) - - Parameters: - ----------- - n_iter: int, optional (DEFAULT = 300) - Maximum number of iterations - - tol: float, optional (DEFAULT = 1e-3) - Threshold for convergence - - optimizer: str, optional (DEFAULT = 'fp') - Method for optimization , either Expectation Maximization or - Fixed Point Gull-MacKay {'em','fp'}. Fixed point iterations are - faster, but can be numerically unstable (especially in case of near perfect fit). - - fit_intercept: bool, optional (DEFAULT = True) - If True includes bias term in model - - perfect_fit_tol: float (DEAFAULT = 1e-5) - Prevents overflow of precision parameters (this is smallest value RSS can have). - ( !!! Note if using EM instead of fixed-point, try smaller values - of perfect_fit_tol, for better estimates of variance of predictive distribution ) - - alpha: float (DEFAULT = 1) - Initial value of precision paramter for coefficients ( by default we define - very broad distribution ) - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied, otherwise will be - - verbose: bool, optional (Default = False) - If True at each iteration progress report is printed out - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - intercept_: float - Value of bias term (if fit_intercept is False, then intercept_ = 0) - - alpha_ : float - Estimated precision of coefficients - - beta_ : float - Estimated precision of noise - - eigvals_ : array, shape = (n_features, ) - Eigenvalues of covariance matrix (from posterior distribution of weights) - - eigvecs_ : array, shape = (n_features, n_featues) - Eigenvectors of covariance matrix (from posterior distribution of weights) - - ''' - - def __init__(self,n_iter = 300, tol = 1e-3, optimizer = 'fp', fit_intercept = True, - normalize=True, perfect_fit_tol = 1e-6, alpha = 1, copy_X = True, verbose = False): - super(EBLinearRegression,self).__init__(n_iter, tol, fit_intercept, copy_X, verbose) - if optimizer not in ['em','fp']: - raise ValueError('Optimizer can be either "em" or "fp" ') - self.optimizer = optimizer - self.alpha = alpha - self.perfect_fit = False - self.normalize = True - self.scores_ = [np.NINF] - self.perfect_fit_tol = perfect_fit_tol - - def _check_convergence(self, mu, mu_old): - ''' - Checks convergence of algorithm using changes in mean of posterior - distribution of weights - ''' - return np.sum(abs(mu-mu_old)>self.tol) == 0 - - - def _center_data(self,X,y): - ''' Centers data''' - X = as_float_array(X,copy = self.copy_X) - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype = X.dtype) - if self.fit_intercept: - X_mean = np.average(X, axis=0) - X -= X_mean - if self.normalize: - X, X_std = f_normalize(X, axis=0, copy=False, - return_norm=True) - else: - X_std = np.ones(X.shape[1], dtype=X.dtype) - y_mean = np.average(y, axis=0) - y = y - y_mean - else: - X_mean = np.zeros(X.shape[1],dtype = X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X,y, X_mean, y_mean, X_std - - def fit(self, X, y): - ''' - Fits Bayesian Linear Regression using Empirical Bayes - - Parameters - ---------- - X: array-like of size [n_samples,n_features] - Matrix of explanatory variables (should not include bias term) - - y: array-like of size [n_features] - Vector of dependent variables. - - Returns - ------- - object: self - self - - ''' - # preprocess data - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # precision of noise & and coefficients - alpha = self.alpha - var_y = np.var(y) - # check that variance is non zero !!! - if var_y == 0 : - beta = 1e-2 - else: - beta = 1. / np.var(y) - - # to speed all further computations save svd decomposition and reuse it later - u,d,vt = svd(X, full_matrices = False) - Uy = np.dot(u.T,y) - dsq = d**2 - mu = 0 - - for i in range(self.n_iter): - - # find mean for posterior of w ( for EM this is E-step) - mu_old = mu - if n_samples > n_features: - mu = vt.T * d/(dsq+alpha/beta) - else: - # clever use of SVD here , faster for large n_features - mu = u * 1./(dsq + alpha/beta) - mu = np.dot(X.T,mu) - mu = np.dot(mu,Uy) - - # precompute errors, since both methods use it in estimation - error = y - np.dot(X,mu) - sqdErr = np.sum(error**2) - - if sqdErr / n_samples < self.perfect_fit_tol: - self.perfect_fit = True - warnings.warn( ('Almost perfect fit!!! Estimated values of variance ' - 'for predictive distribution are computed using only RSS')) - break - - if self.optimizer == "fp": - gamma = np.sum(beta*dsq/(beta*dsq + alpha)) - # use updated mu and gamma parameters to update alpha and beta - # !!! made computation numerically stable for perfect fit case - alpha = gamma / (np.sum(mu**2) + np.finfo(np.float32).eps ) - beta = ( n_samples - gamma ) / (sqdErr + np.finfo(np.float32).eps ) - else: - # M-step, update parameters alpha and beta to maximize ML TYPE II - eigvals = 1. / (beta * dsq + alpha) - alpha = n_features / ( np.sum(mu**2) + np.sum(1/eigvals) ) - beta = n_samples / ( sqdErr + np.sum(dsq/eigvals) ) - - # if converged or exceeded maximum number of iterations => terminate - converged = self._check_convergence(mu_old,mu) - if self.verbose: - print( "Iteration {0} completed".format(i) ) - if converged is True: - print("Algorithm converged after {0} iterations".format(i)) - if converged or i==self.n_iter -1: - break - eigvals = 1./(beta * dsq + alpha) - self.coef_ = beta*np.dot(vt.T*d*eigvals ,Uy) - self._set_intercept(X_mean,y_mean,X_std) - self.beta_ = beta - self.alpha_ = alpha - self.eigvals_ = eigvals - self.eigvecs_ = vt.T - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self,X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of predictive - distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - ''' - y_hat = np.dot(X,self.coef_) + self.intercept_ - - if return_std: - if self.normalize: - X = (X - self._x_mean_) / self._x_std - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - std_hat = np.sqrt(var_pred) - return y_hat, std_hat - else: - return y_hat - - -# ============================== VBLR ========================================= - -def gamma_mean(a,b): - ''' - Computes mean of gamma distribution - - Parameters - ---------- - a: float - Shape parameter of Gamma distribution - - b: float - Rate parameter of Gamma distribution - - Returns - ------- - : float - Mean of Gamma distribution - ''' - return float(a) / b - - - -class VBLinearRegression(BayesianLinearRegression): - ''' - Implements Bayesian Linear Regression using mean-field approximation. - Assumes gamma prior on precision parameters of coefficients and noise. - - Parameters: - ----------- - n_iter: int, optional (DEFAULT = 100) - Maximum number of iterations for KL minimization - - tol: float, optional (DEFAULT = 1e-3) - Convergence threshold - - fit_intercept: bool, optional (DEFAULT = True) - If True will use bias term in model fitting - - a: float, optional (Default = 1e-4) - Shape parameter of Gamma prior for precision of coefficients - - b: float, optional (Default = 1e-4) - Rate parameter of Gamma prior for precision coefficients - - c: float, optional (Default = 1e-4) - Shape parameter of Gamma prior for precision of noise - - d: float, optional (Default = 1e-4) - Rate parameter of Gamma prior for precision of noise - - verbose: bool, optional (Default = False) - If True at each iteration progress report is printed out - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - intercept_: float - Value of bias term (if fit_intercept is False, then intercept_ = 0) - - alpha_ : float - Mean of precision of coefficients - - beta_ : float - Mean of precision of noise - - eigvals_ : array, shape = (n_features, ) - Eigenvalues of covariance matrix (from posterior distribution of weights) - - eigvecs_ : array, shape = (n_features, n_featues) - Eigenvectors of covariance matrix (from posterior distribution of weights) - - ''' - - def __init__(self, n_iter = 100, tol =1e-4, fit_intercept = True, - a = 1e-4, b = 1e-4, c = 1e-4, d = 1e-4, copy_X = True, - verbose = False): - super(VBLinearRegression,self).__init__(n_iter, tol, fit_intercept, copy_X, - verbose) - self.a,self.b = a, b - self.c,self.d = c, d - - - def fit(self,X,y): - ''' - Fits Variational Bayesian Linear Regression Model - - Parameters - ---------- - X: array-like of size [n_samples,n_features] - Matrix of explanatory variables (should not include bias term) - - Y: array-like of size [n_features] - Vector of dependent variables. - - Returns - ------- - object: self - self - ''' - # preprocess data - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # SVD decomposition, done once , reused at each iteration - u,D,vt = svd(X, full_matrices = False) - dsq = D**2 - UY = np.dot(u.T,y) - - # some parameters of Gamma distribution have closed form solution - a = self.a + 0.5 * n_features - c = self.c + 0.5 * n_samples - b,d = self.b, self.d - - # initial mean of posterior for coefficients - mu = 0 - - for i in range(self.n_iter): - - # update parameters of distribution Q(weights) - e_beta = gamma_mean(c,d) - e_alpha = gamma_mean(a,b) - mu_old = np.copy(mu) - mu,eigvals = self._posterior_weights(e_beta,e_alpha,UY,dsq,u,vt,D,X) - - # update parameters of distribution Q(precision of weights) - b = self.b + 0.5*( np.sum(mu**2) + np.sum(eigvals)) - - # update parameters of distribution Q(precision of likelihood) - sqderr = np.sum((y - np.dot(X,mu))**2) - xsx = np.sum(dsq*eigvals) - d = self.d + 0.5*(sqderr + xsx) - - # check convergence - converged = self._check_convergence(mu,mu_old) - if self.verbose is True: - print("Iteration {0} is completed".format(i)) - if converged is True: - print("Algorithm converged after {0} iterations".format(i)) - - # terminate if convergence or maximum number of iterations are achieved - if converged or i==(self.n_iter-1): - break - - # save necessary parameters - self.beta_ = gamma_mean(c,d) - self.alpha_ = gamma_mean(a,b) - self.coef_, self.eigvals_ = self._posterior_weights(self.beta_, self.alpha_, UY, - dsq, u, vt, D, X) - self._set_intercept(X_mean,y_mean,X_std) - self.eigvecs_ = vt.T - return self - - - def _posterior_weights(self, e_beta, e_alpha, UY, dsq, u, vt, d, X): - ''' - Calculates parameters of approximate posterior distribution - of weights - ''' - # eigenvalues of covariance matrix - sigma = 1./ (e_beta*dsq + e_alpha) - - # mean of approximate posterior distribution - n_samples, n_features = X.shape - if n_samples > n_features: - mu = vt.T * d/(dsq + e_alpha/e_beta)# + np.finfo(np.float64).eps) - else: - mu = u * 1./(dsq + e_alpha/e_beta)# + np.finfo(np.float64).eps) - mu = np.dot(X.T,mu) - mu = np.dot(mu,UY) - return mu,sigma - - def predict(self,X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of predictive - distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - ''' - x = (X - self._x_mean_) / self._x_std - y_hat = np.dot(x,self.coef_) + self._y_mean - - if return_std: - data_noise = 1./self.beta_ - model_noise = np.sum(np.dot(X,self.eigvecs_)**2 * self.eigvals_,1) - var_pred = data_noise + model_noise - std_hat = np.sqrt(var_pred) - return y_hat, std_hat - else: - return y_hat \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/engine.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/engine.py deleted file mode 100644 index 7f5c1bf77..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/engine.py +++ /dev/null @@ -1,2195 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Sat Dec 16 10:16:50 2023 -Engine to train the surrogate with - -@author: Rebecca Kohlhaas -""" -import copy -from copy import deepcopy, copy -import h5py -import joblib -import numpy as np -import os - -from scipy import stats, signal, linalg, sparse -from scipy.spatial import distance -from tqdm import tqdm -import scipy.optimize as opt -from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import seaborn as sns -from joblib import Parallel, delayed -from .exploration import Exploration -import pathlib - -#from .inputs import Input -#from .exp_designs import ExpDesigns -#from .surrogate_models import MetaModel -#from bayesvalidrox.post_processing.post_processing import PostProcessing - -def hellinger_distance(P, Q): - """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) - - Parameters - ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. - - Returns - ------- - float - Hellinger distance of two distributions. - - """ - P = np.array(P) - Q= np.array(Q) - - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - -def logpdf(x, mean, cov): - """ - Computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - -def subdomain(Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : int - Number of samples to divide the domain for. - n_params : int - The number of params to build the subdomains for - - Returns - ------- - Subdomains : List of tuples of tuples - Each tuple of tuples divides one set of bounds into n_new_samples parts. - - """ - n_params = len(Bounds) - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains - -class Engine(): - - - def __init__(self, MetaMod, Model, ExpDes): - self.MetaModel = MetaMod - self.Model = Model - self.ExpDesign = ExpDes - self.parallel = False - - def start_engine(self) -> None: - """ - Do all the preparations that need to be run before the actual training - - Returns - ------- - None - - """ - self.out_names = self.Model.Output.names - self.MetaModel.out_names = self.out_names - - - def train_normal(self, parallel = False, verbose = False, save = False) -> None: - """ - Trains surrogate on static samples only. - Samples are taken from the experimental design and the specified - model is run on them. - Alternatively the samples can be read in from a provided hdf5 file. - - - Returns - ------- - None - - """ - - ExpDesign = self.ExpDesign - MetaModel = self.MetaModel - - # Read ExpDesign (training and targets) from the provided hdf5 - if ExpDesign.hdf5_file is not None: - # TODO: need to run 'generate_ED' as well after this or not? - ExpDesign.read_from_file(self.out_names) - else: - # Check if an old hdf5 file exists: if yes, rename it - hdf5file = f'ExpDesign_{self.Model.name}.hdf5' - if os.path.exists(hdf5file): - # os.rename(hdf5file, 'old_'+hdf5file) - file = pathlib.Path(hdf5file) - file.unlink() - - # Prepare X samples - # For training the surrogate use ExpDesign.X_tr, ExpDesign.X is for the model to run on - ExpDesign.generate_ED(ExpDesign.n_init_samples, - transform=True, - max_pce_deg=np.max(MetaModel.pce_deg)) - - # Run simulations at X - if not hasattr(ExpDesign, 'Y') or ExpDesign.Y is None: - print('\n Now the forward model needs to be run!\n') - ED_Y, up_ED_X = self.Model.run_model_parallel(ExpDesign.X, mp = parallel) - ExpDesign.Y = ED_Y - else: - # Check if a dict has been passed. - if not type(ExpDesign.Y) is dict: - raise Exception('Please provide either a dictionary or a hdf5' - 'file to ExpDesign.hdf5_file argument.') - - # Separate output dict and x-values - if 'x_values' in ExpDesign.Y: - ExpDesign.x_values = ExpDesign.Y['x_values'] - del ExpDesign.Y['x_values'] - else: - print('No x_values are given, this might lead to issues during PostProcessing') - - - # Fit the surrogate - MetaModel.fit(ExpDesign.X_tr, ExpDesign.Y, parallel, verbose) - - # Save what there is to save - if save: - # Save surrogate - with open(f'surrogates/surrogate_{self.Model.name}.pk1', 'wb') as output: - joblib.dump(MetaModel, output, 2) - - # Zip the model run directories - if self.Model.link_type.lower() == 'pylink' and\ - self.ExpDesign.sampling_method.lower() != 'user': - self.Model.zip_subdirs(self.Model.name, f'{self.Model.name}_') - - - def train_sequential(self, parallel = False, verbose = False) -> None: - """ - Train the surrogate in a sequential manner. - First build and train evereything on the static samples, then iterate - choosing more samples and refitting the surrogate on them. - - Returns - ------- - None - - """ - #self.train_normal(parallel, verbose) - self.parallel = parallel - self.train_seq_design(parallel, verbose) - - - # ------------------------------------------------------------------------- - def eval_metamodel(self, samples=None, nsamples=None, - sampling_method='random', return_samples=False): - """ - Evaluates meta-model at the requested samples. One can also generate - nsamples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate meta-model at. The default is None. - nsamples : int, optional - Number of samples to generate, if no `samples` is provided. The - default is None. - sampling_method : str, optional - Type of sampling, if no `samples` is provided. The default is - 'random'. - return_samples : bool, optional - Retun samples, if no `samples` is provided. The default is False. - - Returns - ------- - mean_pred : dict - Mean of the predictions. - std_pred : dict - Standard deviatioon of the predictions. - """ - # Generate or transform (if need be) samples - if samples is None: - # Generate - samples = self.ExpDesign.generate_samples( - nsamples, - sampling_method - ) - - # Transformation to other space is to be done in the MetaModel - # TODO: sort the transformations better - mean_pred, std_pred = self.MetaModel.eval_metamodel(samples) - - if return_samples: - return mean_pred, std_pred, samples - else: - return mean_pred, std_pred - - - # ------------------------------------------------------------------------- - def train_seq_design(self, parallel = False, verbose = False): - """ - Starts the adaptive sequential design for refining the surrogate model - by selecting training points in a sequential manner. - - Returns - ------- - MetaModel : object - Meta model object. - - """ - self.parallel = parallel - - # Initialization - self.SeqModifiedLOO = {} - self.seqValidError = {} - self.SeqBME = {} - self.SeqKLD = {} - self.SeqDistHellinger = {} - self.seqRMSEMean = {} - self.seqRMSEStd = {} - self.seqMinDist = [] - - if not hasattr(self.MetaModel, 'valid_samples'): - self.ExpDesign.valid_samples = [] - self.ExpDesign.valid_model_runs = [] - self.valid_likelihoods = [] - - validError = None - - - # Determine the metamodel type - if self.MetaModel.meta_model_type.lower() != 'gpe': - pce = True - else: - pce = False - mc_ref = True if bool(self.Model.mc_reference) else False - if mc_ref: - self.Model.read_observation('mc_ref') - - # Get the parameters - max_n_samples = self.ExpDesign.n_max_samples - mod_LOO_threshold = self.ExpDesign.mod_LOO_threshold - n_canddidate = self.ExpDesign.n_canddidate - post_snapshot = self.ExpDesign.post_snapshot - n_replication = self.ExpDesign.n_replication - util_func = self.ExpDesign.util_func - output_name = self.out_names - - # Handle if only one UtilityFunctions is provided - if not isinstance(util_func, list): - util_func = [self.ExpDesign.util_func] - - # Read observations or MCReference - # TODO: recheck the logic in this if statement - if (len(self.Model.observations) != 0 or self.Model.meas_file is not None) and hasattr(self.MetaModel, 'Discrepancy'): - self.observations = self.Model.read_observation() - obs_data = self.observations - else: - obs_data = [] - # TODO: TotalSigma2 not defined if not in this else??? - # TODO: no self.observations if in here - TotalSigma2 = {} - - # ---------- Initial self.MetaModel ---------- - self.train_normal(parallel = parallel, verbose=verbose) - - initMetaModel = deepcopy(self.MetaModel) - - # Validation error if validation set is provided. - if self.ExpDesign.valid_model_runs: - init_rmse, init_valid_error = self._validError(initMetaModel) - init_valid_error = list(init_valid_error.values()) - else: - init_rmse = None - - # Check if discrepancy is provided - if len(obs_data) != 0 and hasattr(self.MetaModel, 'Discrepancy'): - TotalSigma2 = self.MetaModel.Discrepancy.parameters - - # Calculate the initial BME - out = self._BME_Calculator( - obs_data, TotalSigma2, init_rmse) - init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out - print(f"\nInitial BME: {init_BME:.2f}") - print(f"Initial KLD: {init_KLD:.2f}") - - # Posterior snapshot (initial) - if post_snapshot: - parNames = self.ExpDesign.par_names - print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') - - # Check the convergence of the Mean & Std - if mc_ref and pce: - init_rmse_mean, init_rmse_std = self._error_Mean_Std() - print(f"Initial Mean and Std error: {init_rmse_mean:.2f}," - f" {init_rmse_std:.2f}") - - # Read the initial experimental design - Xinit = self.ExpDesign.X - init_n_samples = len(self.ExpDesign.X) - initYprev = self.ExpDesign.Y#initMetaModel.ModelOutputDict - #self.MetaModel.ModelOutputDict = self.ExpDesign.Y - initLCerror = initMetaModel.LCerror - n_itrs = max_n_samples - init_n_samples - - ## Get some initial statistics - # Read the initial ModifiedLOO - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = self.ExpDesign.Y[out_name] - Scores_all.append(list( - self.MetaModel.score_dict['b_1'][out_name].values())) - if self.MetaModel.dim_red_method.lower() == 'pca': - pca = self.MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - - Scores = [item for sublist in Scores_all for item in sublist] - weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], - weights=weights)] - - prevMetaModel_dict = {} - #prevExpDesign_dict = {} - # Can run sequential design multiple times for comparison - for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # util_func: the function to use inside the type of exploitation - for util_f in util_func: - print(f'\n>>>> Utility Function: {util_f} <<<<') - # To avoid changes ub original aPCE object - self.ExpDesign.X = Xinit - self.ExpDesign.Y = initYprev - self.ExpDesign.LCerror = initLCerror - - # Set the experimental design - Xprev = Xinit - total_n_samples = init_n_samples - Yprev = initYprev - - Xfull = [] - Yfull = [] - - # Store the initial ModifiedLOO - if pce: - print("\nInitial ModifiedLOO:", init_mod_LOO) - SeqModifiedLOO = np.array(init_mod_LOO) - - if len(self.ExpDesign.valid_model_runs) != 0: - SeqValidError = np.array(init_valid_error) - - # Check if data is provided - if len(obs_data) != 0 and hasattr(self.MetaModel, 'Discrepancy'): - SeqBME = np.array([init_BME]) - SeqKLD = np.array([init_KLD]) - SeqDistHellinger = np.array([init_dist_hellinger]) - - if mc_ref and pce: - seqRMSEMean = np.array([init_rmse_mean]) - seqRMSEStd = np.array([init_rmse_std]) - - # ------- Start Sequential Experimental Design ------- - postcnt = 1 - for itr_no in range(1, n_itrs+1): - print(f'\n>>>> Iteration number {itr_no} <<<<') - - # Save the metamodel prediction before updating - prevMetaModel_dict[itr_no] = deepcopy(self.MetaModel) - #prevExpDesign_dict[itr_no] = deepcopy(self.ExpDesign) - if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] - self._y_hat_prev, _ = pc_model.eval_metamodel( - samples=Xfull[-1].reshape(1, -1)) - del prevMetaModel_dict[itr_no-1] - - # Optimal Bayesian Design - #self.MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.choose_next_sample(TotalSigma2, - n_canddidate, - util_f) - S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - self.seqMinDist.append(S) - print(f"\nmin Dist from OldExpDesign: {S:2f}") - print("\n") - - # Evaluate the full model response at the new sample - Ynew, _ = self.Model.run_model_parallel( - Xnew, prevRun_No=total_n_samples - ) - total_n_samples += Xnew.shape[0] - - # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(self.ExpDesign, 'adapt_verbose') and \ - self.ExpDesign.adapt_verbose: - from .adaptPlot import adaptPlot - y_hat, std_hat = self.MetaModel.eval_metamodel( - samples=Xnew - ) - adaptPlot( - self.MetaModel, Ynew, y_hat, std_hat, - plotED=False - ) - - # -------- Retrain the surrogate model ------- - # Extend new experimental design - Xfull = np.vstack((Xprev, Xnew)) - - # Updating experimental design Y - for out_name in output_name: - Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - self.ExpDesign.Y[out_name] = Yfull - - # Pass new design to the metamodel object - self.ExpDesign.sampling_method = 'user' - self.ExpDesign.X = Xfull - #self.ExpDesign.Y = self.MetaModel.ModelOutputDict - - # Save the Experimental Design for next iteration - Xprev = Xfull - Yprev = self.ExpDesign.Y - - # Pass the new prior as the input - # TODO: another look at this - no difference apc to pce to gpe? - self.MetaModel.input_obj.poly_coeffs_flag = False - if updatedPrior is not None: - self.MetaModel.input_obj.poly_coeffs_flag = True - print("updatedPrior:", updatedPrior.shape) - # Arbitrary polynomial chaos - for i in range(updatedPrior.shape[1]): - self.MetaModel.input_obj.Marginals[i].dist_type = None - x = updatedPrior[:, i] - self.MetaModel.input_obj.Marginals[i].raw_data = x - - # Train the surrogate model for new ExpDesign - self.train_normal(parallel=False) - - # -------- Evaluate the retrained surrogate model ------- - # Extract Modified LOO from Output - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = self.ExpDesign.Y[out_name] - Scores_all.append(list( - self.MetaModel.score_dict['b_1'][out_name].values())) - if self.MetaModel.dim_red_method.lower() == 'pca': - pca = self.MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, - axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - Scores = [item for sublist in Scores_all for item - in sublist] - weights = [item for sublist in varExpDesignY for item - in sublist] - ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] - - print('\n') - print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) - print('\n') - - # Compute the validation error - if self.ExpDesign.valid_model_runs: - rmse, validError = self._validError(self.MetaModel) - ValidError = list(validError.values()) - else: - rmse = None - - # Store updated ModifiedLOO - if pce: - SeqModifiedLOO = np.vstack( - (SeqModifiedLOO, ModifiedLOO)) - if len(self.ExpDesign.valid_model_runs) != 0: - SeqValidError = np.vstack( - (SeqValidError, ValidError)) - # -------- Caclulation of BME as accuracy metric ------- - # Check if data is provided - if len(obs_data) != 0: - # Calculate the initial BME - out = self._BME_Calculator(obs_data, TotalSigma2, rmse) - BME, KLD, Posterior, likes, DistHellinger = out - print('\n') - print(f"Updated BME: {BME:.2f}") - print(f"Updated KLD: {KLD:.2f}") - print('\n') - - # Plot some snapshots of the posterior - step_snapshot = self.ExpDesign.step_snapshot - if post_snapshot and postcnt % step_snapshot == 0: - parNames = self.ExpDesign.par_names - print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') - postcnt += 1 - - # Check the convergence of the Mean&Std - if mc_ref and pce: - print('\n') - RMSE_Mean, RMSE_std = self._error_Mean_Std() - print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " - f"{RMSE_std:.2f}") - print('\n') - - # Store the updated BME & KLD - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.vstack((SeqBME, BME)) - SeqKLD = np.vstack((SeqKLD, KLD)) - SeqDistHellinger = np.vstack((SeqDistHellinger, - DistHellinger)) - if mc_ref and pce: - seqRMSEMean = np.vstack((seqRMSEMean, RMSE_Mean)) - seqRMSEStd = np.vstack((seqRMSEStd, RMSE_std)) - - if pce and any(LOO < mod_LOO_threshold - for LOO in ModifiedLOO): - break - - # Clean up - if len(obs_data) != 0: - del out - print() - print('-'*50) - print() - - # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' - if pce: - self.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(self.ExpDesign.valid_model_runs) != 0: - self.seqValidError[strKey] = SeqValidError - - # Check if data is provided - if len(obs_data) != 0: - self.SeqBME[strKey] = SeqBME - self.SeqKLD[strKey] = SeqKLD - if hasattr(self.MetaModel, 'valid_likelihoods') and \ - self.valid_likelihoods: - self.SeqDistHellinger[strKey] = SeqDistHellinger - if mc_ref and pce: - self.seqRMSEMean[strKey] = seqRMSEMean - self.seqRMSEStd[strKey] = seqRMSEStd - - # return self.MetaModel - - # ------------------------------------------------------------------------- - def util_VarBasedDesign(self, X_can, index, util_func='Entropy'): - """ - Computes the exploitation scores based on: - active learning MacKay(ALM) and active learning Cohn (ALC) - Paper: Sequential Design with Mutual Information for Computer - Experiments (MICE): Emulation of a Tsunami Model by Beck and Guillas - (2016) - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - index : int - Model output index. - UtilMethod : string, optional - Exploitation utility function. The default is 'Entropy'. - - Returns - ------- - float - Score. - - """ - MetaModel = self.MetaModel - ED_X = self.ExpDesign.X - out_dict_y = self.ExpDesign.Y - out_names = self.out_names - - # Run the Metamodel for the candidate - X_can = X_can.reshape(1, -1) - Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) - - if util_func.lower() == 'alm': - # ----- Entropy/MMSE/active learning MacKay(ALM) ----- - # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - varPCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - varPCE[KeyIdx] = np.max(canPredVar[key], axis=1) - score = np.max(varPCE, axis=0) - - elif util_func.lower() == 'eigf': - # ----- Expected Improvement for Global fit ----- - # Find closest EDX to the candidate - distances = distance.cdist(ED_X, X_can, 'euclidean') - index = np.argmin(distances) - - # Compute perdiction error and variance of the old model - predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - # Compute perdiction error and variance of the old model - # Eq (5) from Liu et al.(2018) - EIGF_PCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - residual = predError[key] - out_dict_y[key][int(index)] - var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) - score = np.max(EIGF_PCE, axis=0) - - return -1 * score # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianActiveDesign(self, y_hat, std, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian active design criterion (var). - - It is based on the following paper: - Oladyshkin, Sergey, Farid Mohammadi, Ilja Kroeker, and Wolfgang Nowak. - "Bayesian3 active learning for the gaussian process emulator using - information theory." Entropy 22, no. 8 (2020): 890. - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - BAL design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # Get the data - obs_data = self.observations - # TODO: this should be optimizable to be calculated explicitly - if hasattr(self.Model, 'n_obs'): - n_obs = self.Model.n_obs - else: - n_obs = self.n_obs - mc_size = 10000 - - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((mc_size)) - # print(y_hat) - # print(list[y_hat]) - for key in list(y_hat): - cov = np.diag(std[key]**2) - # print(y_hat[key], cov) - # TODO: added the allow_singular = True here - rv = stats.multivariate_normal(mean=y_hat[key], cov=cov,) - Y_MC[key] = rv.rvs(size=mc_size) - logPriorLikelihoods += rv.logpdf(Y_MC[key]) - std_MC[key] = np.zeros((mc_size, y_hat[key].shape[0])) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self._normpdf(Y_MC, std_MC, obs_data, sigma2Dict) - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, mc_size)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods), dtype=np.longdouble)#float128) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - # Utility function Eq.2 in Ref. (2) - # Posterior covariance matrix after observing data y - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # TODO: Calculate the correction factor for BME - # BMECorrFactor = self.BME_Corr_Weight(PCE_SparseBayes_can, - # ObservationData, sigma2Dict) - # BME += BMECorrFactor - # Haun et al implementation - # U_J_d = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - U_J_d = postExpLikelihoods - logBME - - # Marginal log likelihood - elif var == 'BME': - U_J_d = np.nanmean(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - logBME = np.log(np.nanmean(likelihoods)) - infEntropy = logBME - postExpPrior - postExpLikelihoods - U_J_d = infEntropy * -1 # -1 for minimization - - # Bayesian information criterion - elif var == 'BIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxL = np.nanmax(likelihoods) - U_J_d = -2 * np.log(maxL) + np.log(n_obs) * nModelParams - - # Akaike information criterion - elif var == 'AIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxlogL = np.log(np.nanmax(likelihoods)) - AIC = -2 * maxlogL + 2 * nModelParams - # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) - penTerm = 0 - U_J_d = 1*(AIC + penTerm) - - # Deviance information criterion - elif var == 'DIC': - # D_theta_bar = np.mean(-2 * Likelihoods) - N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self._normpdf( - y_hat, std, obs_data, sigma2Dict - ) - DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p - - U_J_d = DIC - - else: - print('The algorithm you requested has not been implemented yet!') - - # Handle inf and NaN (replace by zero) - if np.isnan(U_J_d) or U_J_d == -np.inf or U_J_d == np.inf: - U_J_d = 0.0 - - # Clear memory - del likelihoods - del Y_MC - del std_MC - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - MetaModel = self.MetaModel - out_names = self.out_names - if X_can.ndim == 1: - X_can = X_can.reshape(1, -1) - - # Compute the mean and std based on the MetaModel - # pce_means, pce_stds = self._compute_pce_moments(MetaModel) - if var == 'ALC': - Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) - - # Old Experimental design - oldExpDesignX = self.ExpDesign.X - oldExpDesignY = self.ExpDesign.Y - - # Evaluate the PCE metamodels at that location ??? - Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) - PCE_Model_can = deepcopy(MetaModel) - engine_can = deepcopy(self) - # Add the candidate to the ExpDesign - NewExpDesignX = np.vstack((oldExpDesignX, X_can)) - - NewExpDesignY = {} - for key in oldExpDesignY.keys(): - NewExpDesignY[key] = np.vstack( - (oldExpDesignY[key], Y_PC_can[key]) - ) - - engine_can.ExpDesign.sampling_method = 'user' - engine_can.ExpDesign.X = NewExpDesignX - #engine_can.ModelOutputDict = NewExpDesignY - engine_can.ExpDesign.Y = NewExpDesignY - - # Train the model for the observed data using x_can - engine_can.MetaModel.input_obj.poly_coeffs_flag = False - engine_can.start_engine() - engine_can.train_normal(parallel=False) - engine_can.MetaModel.fit(NewExpDesignX, NewExpDesignY) -# engine_can.train_norm_design(parallel=False) - - # Set the ExpDesign to its original values - engine_can.ExpDesign.X = oldExpDesignX - engine_can.ModelOutputDict = oldExpDesignY - engine_can.ExpDesign.Y = oldExpDesignY - - if var.lower() == 'mi': - # Mutual information based on Krause et al - # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = engine_can.MetaModel.eval_metamodel(samples=X_can) - std_can = {key: std_PC_can[key] for key in out_names} - - std_old = {key: Y_std_can[key] for key in out_names} - - varPCE = np.zeros((len(out_names))) - for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) - score = np.mean(varPCE) - - return -1 * score - - elif var.lower() == 'alc': - # Active learning based on Gramyc and Lee - # Adaptive design and analysis of supercomputer experiments Techno- - # metrics, 51 (2009), pp. 130–145. - - # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = engine_can.MetaModel.eval_metamodel(samples=X_MC) - - # Compute the score - score = [] - for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) - score = np.mean(score) - - return -1 * score - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = X_MC.shape[0] - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Enriching Monte Carlo samples if need be - if ESS != 0: - X_MC = self.ExpDesign.generate_samples( - MCsize, 'random' - ) - - # Evaluate the MetaModel at the given samples - Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self._normpdf( - Y_MC, std_MC, self.observations, sigma2Dict - ) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - print("--- increasing MC size---") - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # -------------------- Utility functions -------------------- - # Utility function Eq.2 in Ref. (2) - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.longdouble))#float128)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Haun et al implementation - U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) - - # U_J_d = np.sum(G_n_m_all) - # Ryan et al (2014) implementation - # importanceWeights = Likelihoods[Likelihoods!=0]/np.sum(Likelihoods[Likelihoods!=0]) - # U_J_d = np.mean(importanceWeights*np.log(Likelihoods[Likelihoods!=0])) - logBME - - # U_J_d = postExpLikelihoods - logBME - - # Marginal likelihood - elif var == 'BME': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - U_J_d = logBME - - # Bayes risk likelihood - elif var == 'BayesRisk': - - U_J_d = -1 * np.var(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postLikelihoods /= np.nansum(likelihoods[accepted]) - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - infEntropy = logBME - postExpPrior - postExpLikelihoods - - U_J_d = infEntropy * -1 # -1 for minimization - - # D-Posterior-precision - elif var == 'DPP': - X_Posterior = X_MC[accepted] - # covariance of the posterior parameters - U_J_d = -np.log(np.linalg.det(np.cov(X_Posterior))) - - # A-Posterior-precision - elif var == 'APP': - X_Posterior = X_MC[accepted] - # trace of the posterior parameters - U_J_d = -np.log(np.trace(np.cov(X_Posterior))) - - else: - print('The algorithm you requested has not been implemented yet!') - - # Clear memory - del likelihoods - del Y_MC - del std_MC - - return -1 * U_J_d # -1 is for minimization instead of maximization - - - # ------------------------------------------------------------------------- - def run_util_func(self, method, candidates, index, sigma2Dict=None, - var=None, X_MC=None): - """ - Runs the utility function based on the given method. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - candidates : array of shape (n_samples, n_params) - All candidate parameter sets. - index : int - ExpDesign index. - sigma2Dict : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - var : string, optional - Utility function. The default is None. - X_MC : TYPE, optional - DESCRIPTION. The default is None. - - Returns - ------- - index : TYPE - DESCRIPTION. - List - Scores. - - """ - - if method.lower() == 'varoptdesign': - # U_J_d = self.util_VarBasedDesign(candidates, index, var) - U_J_d = np.zeros((candidates.shape[0])) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="varoptdesign"): - U_J_d[idx] = self.util_VarBasedDesign(X_can, index, var) - - elif method.lower() == 'bayesactdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - # Evaluate all candidates - y_can, std_can = self.MetaModel.eval_metamodel(samples=candidates) - # loop through candidates - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="BAL Design"): - y_hat = {key: items[idx] for key, items in y_can.items()} - std = {key: items[idx] for key, items in std_can.items()} - - # print(y_hat) - # print(std) - U_J_d[idx] = self.util_BayesianActiveDesign( - y_hat, std, sigma2Dict, var) - - elif method.lower() == 'bayesoptdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, - var) - return (index, -1 * U_J_d) - - # ------------------------------------------------------------------------- - def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, - verbose=False): - """ - Exploration algorithm to find the optimum parameter space. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - Bounds : list of tuples - List of lower and upper boundaries of parameters. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - Run_No : int - Run number. - verbose : bool, optional - Print out a summary. The default is False. - - Returns - ------- - Run_No : int - Run number. - array - Optimial candidate. - - """ - - Model = self.Model - max_func_itr = self.ExpDesign.max_func_itr - - if method == 'VarOptDesign': - Res_Global = opt.dual_annealing(self.util_VarBasedDesign, - bounds=Bounds, - args=(Model, var), - maxfun=max_func_itr) - - elif method == 'BayesOptDesign': - Res_Global = opt.dual_annealing(self.util_BayesianDesign, - bounds=Bounds, - args=(Model, sigma2Dict, var), - maxfun=max_func_itr) - - if verbose: - print(f"Global minimum: xmin = {Res_Global.x}, " - f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - - return (Run_No, Res_Global.x) - - # ------------------------------------------------------------------------- - def tradeoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): - """ - Calculates weights for exploration scores based on the requested - scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. - - `None`: No exploration. - `equal`: Same weights for exploration and exploitation scores. - `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay - function - `adaptive`: An adaptive method based on: - Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling - approach for Kriging metamodeling by maximizing expected prediction - error." Computers & Chemical Engineering 106 (2017): 171-182. - - Parameters - ---------- - tradeoff_scheme : string - Trade-off scheme for exloration and exploitation scores. - old_EDX : array (n_samples, n_params) - Old experimental design (training points). - old_EDY : dict - Old model responses (targets). - - Returns - ------- - exploration_weight : float - Exploration weight. - exploitation_weight: float - Exploitation weight. - - """ - if tradeoff_scheme is None: - exploration_weight = 0 - - elif tradeoff_scheme == 'equal': - exploration_weight = 0.5 - - elif tradeoff_scheme == 'epsilon-decreasing': - # epsilon-decreasing scheme - # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.ExpDesign.n_init_samples - n_max_samples = self.ExpDesign.n_max_samples - - itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.ExpDesign.n_new_samples - - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, - 0, tau2, False)[itrNumber] - - elif tradeoff_scheme == 'adaptive': - - # Extract itrNumber - initNSamples = self.ExpDesign.n_init_samples - n_max_samples = self.ExpDesign.n_max_samples - itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.ExpDesign.n_new_samples - - if itrNumber == 0: - exploration_weight = 0.5 - else: - # New adaptive trade-off according to Liu et al. (2017) - # Mean squared error for last design point - last_EDX = old_EDX[-1].reshape(1, -1) - lastPCEY, _ = self.MetaModel.eval_metamodel(samples=last_EDX) - pce_y = np.array(list(lastPCEY.values()))[:, 0] - y = np.array(list(old_EDY.values()))[:, -1, :] - mseError = mean_squared_error(pce_y, y) - - # Mean squared CV - error for last design point - pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] - mseCVError = mean_squared_error(pce_y_prev, y) - - exploration_weight = min([0.5*mseError/mseCVError, 1]) - - # Exploitation weight - exploitation_weight = 1 - exploration_weight - - return exploration_weight, exploitation_weight - - # ------------------------------------------------------------------------- - def choose_next_sample(self, sigma2=None, n_candidates=5, var='DKL'): - """ - Runs optimal sequential design. - - Parameters - ---------- - sigma2 : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - n_candidates : int, optional - Number of candidate samples. The default is 5. - var : string, optional - Utility function. The default is None. # TODO: default is set to DKL, not none - - Raises - ------ - NameError - Wrong utility function. - - Returns - ------- - Xnew : array (n_samples, n_params) - Selected new training point(s). - """ - - # Initialization - Bounds = self.ExpDesign.bound_tuples - n_new_samples = self.ExpDesign.n_new_samples - explore_method = self.ExpDesign.explore_method - exploit_method = self.ExpDesign.exploit_method - n_cand_groups = self.ExpDesign.n_cand_groups - tradeoff_scheme = self.ExpDesign.tradeoff_scheme - - old_EDX = self.ExpDesign.X - old_EDY = self.ExpDesign.Y.copy() - ndim = self.ExpDesign.X.shape[1] - OutputNames = self.out_names - - # ----------------------------------------- - # ----------- CUSTOMIZED METHODS ---------- - # ----------------------------------------- - # Utility function exploit_method provided by user - if exploit_method.lower() == 'user': - if not hasattr(self.ExpDesign, 'ExploitFunction'): - raise AttributeError('Function `ExploitFunction` not given to the ExpDesign, thus cannor run user-defined sequential scheme') - # TODO: syntax does not fully match the rest - can test this?? - Xnew, filteredSamples = self.ExpDesign.ExploitFunction(self) - - print("\n") - print("\nXnew:\n", Xnew) - - return Xnew, filteredSamples - - - # Dual-Annealing works differently from the rest, so deal with this first - # Here exploration and exploitation are performed simulataneously - if explore_method == 'dual annealing': - # ------- EXPLORATION: OPTIMIZATION ------- - import time - start_time = time.time() - - # Divide the domain to subdomains - subdomains = subdomain(Bounds, n_new_samples) - - # Multiprocessing - if self.parallel: - args = [] - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() - - # Close the pool - pool.close() - # Without multiprocessing - else: - results = [] - for i in range(n_new_samples): - results.append(self.dual_annealing(exploit_method, subdomains[i], sigma2, var, i)) - - # New sample - Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - print("\nXnew:\n", Xnew) - - # Computational cost - elapsed_time = time.time() - start_time - print("\n") - print(f"Elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) - - return Xnew, None - - # Generate needed Exploration class - explore = Exploration(self.ExpDesign, n_candidates) - explore.w = 100 # * ndim #500 # TODO: where does this value come from? - - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - - # Generate the candidate samples - # TODO: here use the sampling method provided by the expdesign? - sampling_method = self.ExpDesign.sampling_method - - # TODO: changed this from 'random' for LOOCV - if explore_method == 'LOOCV': - allCandidates = self.ExpDesign.generate_samples(n_candidates, - sampling_method) - else: - allCandidates, scoreExploration = explore.get_exploration_samples() - - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- - if explore_method == 'LOOCV': - # ----------------------------------------------------------------- - # TODO: LOOCV model construnction based on Feng et al. (2020) - # 'LOOCV': - # Initilize the ExploitScore array - - # Generate random samples - allCandidates = self.ExpDesign.generate_samples(n_candidates, - 'random') - - # Construct error model based on LCerror - errorModel = self.MetaModel.create_ModelError(old_EDX, self.LCerror) - self.errorModel.append(copy(errorModel)) - - # Evaluate the error models for allCandidates - eLCAllCands, _ = errorModel.eval_errormodel(allCandidates) - # Select the maximum as the representative error - eLCAllCands = np.dstack(eLCAllCands.values()) - eLCAllCandidates = np.max(eLCAllCands, axis=1)[:, 0] - - # Normalize the error w.r.t the maximum error - scoreExploration = eLCAllCandidates / np.sum(eLCAllCandidates) - - else: - # ------- EXPLORATION: SPACE-FILLING DESIGN ------- - # Generate candidate samples from Exploration class - explore = Exploration(self.ExpDesign, n_candidates) - explore.w = 100 # * ndim #500 - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - allCandidates, scoreExploration = explore.get_exploration_samples() - - # Temp: ---- Plot all candidates ----- - if ndim == 2: - def plotter(points, allCandidates, Method, - scoreExploration=None): - if Method == 'Voronoi': - from scipy.spatial import Voronoi, voronoi_plot_2d - vor = Voronoi(points) - fig = voronoi_plot_2d(vor) - ax1 = fig.axes[0] - else: - fig = plt.figure() - ax1 = fig.add_subplot(111) - ax1.scatter(points[:, 0], points[:, 1], s=10, c='r', - marker="s", label='Old Design Points') - ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, - c='b', marker="o", label='Design candidates') - for i in range(points.shape[0]): - txt = 'p'+str(i+1) - ax1.annotate(txt, (points[i, 0], points[i, 1])) - if scoreExploration is not None: - for i in range(allCandidates.shape[0]): - txt = str(round(scoreExploration[i], 5)) - ax1.annotate(txt, (allCandidates[i, 0], - allCandidates[i, 1])) - - plt.xlim(self.bound_tuples[0]) - plt.ylim(self.bound_tuples[1]) - # plt.show() - plt.legend(loc='upper left') - - # ----------------------------------------- - # --------- EXPLOITATION METHODS ---------- - # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\n Exploration weight={explore_w:0.3f} " - f"Exploitation weight={exploit_w:0.3f}\n") - - # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- - if explore_w != 1.0: - # Check if all needed properties are set - if not hasattr(self.ExpDesign, 'max_func_itr'): - raise AttributeError('max_func_itr not given to the experimental design') - - # Create a sample pool for rejection sampling - MCsize = 15000 - X_MC = self.ExpDesign.generate_samples(MCsize, 'random') - candidates = self.ExpDesign.generate_samples( - n_candidates, 'latin_hypercube') - - # Split the candidates in groups for multiprocessing - split_cand = np.array_split( - candidates, n_cand_groups, axis=0 - ) - # print(candidates) - # print(split_cand) - if self.parallel: - results = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.run_util_func)( - exploit_method, split_cand[i], i, sigma2, var, X_MC) - for i in range(n_cand_groups)) - else: - results = [] - for i in range(n_cand_groups): - results.append(self.run_util_func(exploit_method, split_cand[i], i, sigma2, var, X_MC)) - - # Retrieve the results and append them - U_J_d = np.concatenate([results[NofE][1] for NofE in - range(n_cand_groups)]) - - # Check if all scores are inf - if np.isinf(U_J_d).all() or np.isnan(U_J_d).all(): - U_J_d = np.ones(len(U_J_d)) - - # Get the expected value (mean) of the Utility score - # for each cell - if explore_method == 'Voronoi': - U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - - # Normalize U_J_d - norm_U_J_d = U_J_d / np.sum(U_J_d) - else: - norm_U_J_d = np.zeros((len(scoreExploration))) - - # ------- Calculate Total score ------- - # ------- Trade off between EXPLORATION & EXPLOITATION ------- - # Total score - totalScore = exploit_w * norm_U_J_d - totalScore += explore_w * scoreExploration - - # temp: Plot - # dim = self.ExpDesign.X.shape[1] - # if dim == 2: - # plotter(self.ExpDesign.X, allCandidates, explore_method) - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - # select the requested number of samples - if explore_method == 'Voronoi': - Xnew = np.zeros((n_new_samples, ndim)) - for i, idx in enumerate(bestIdx): - X_can = explore.closestPoints[idx] - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - elif exploit_method == 'VarOptDesign': - # ------- EXPLOITATION: VarOptDesign ------- - UtilMethod = var - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\nweightExploration={explore_w:0.3f} " - f"weightExploitation={exploit_w:0.3f}") - - # Generate candidate samples from Exploration class - nMeasurement = old_EDY[OutputNames[0]].shape[1] - - # print(UtilMethod) - - # Find sensitive region - if UtilMethod == 'LOOCV': - LCerror = self.MetaModel.LCerror - allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), - nMeasurement)) - for y_idx, y_key in enumerate(OutputNames): - for idx, key in enumerate(LCerror[y_key].keys()): - allModifiedLOO[:, y_idx, idx] = abs( - LCerror[y_key][key]) - - ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) - # print(allModifiedLOO.shape) - - elif UtilMethod in ['EIGF', 'ALM']: - # ----- All other in ['EIGF', 'ALM'] ----- - # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) - - # Split the candidates in groups for multiprocessing - if explore_method != 'Voronoi': - split_cand = np.array_split(allCandidates, - n_cand_groups, - axis=0) - goodSampleIdx = range(n_cand_groups) - else: - # Find indices of the Vornoi cells with samples - goodSampleIdx = [] - for idx in range(len(explore.closest_points)): - if len(explore.closest_points[idx]) != 0: - goodSampleIdx.append(idx) - split_cand = explore.closest_points - - # Split the candidates in groups for multiprocessing - args = [] - for index in goodSampleIdx: - args.append((exploit_method, split_cand[index], index, - sigma2, var)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.run_util_func, args).get() - - # Close the pool - pool.close() - - # Retrieve the results and append them - if explore_method == 'Voronoi': - ExploitScore = [np.mean(results[k][1]) for k in - range(len(goodSampleIdx))] - else: - ExploitScore = np.concatenate( - [results[k][1] for k in range(len(goodSampleIdx))]) - - else: - raise NameError('The requested utility function is not ' - 'available.') - - # print("ExploitScore:\n", ExploitScore) - - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - # Total score - # Normalize U_J_d - ExploitScore = ExploitScore / np.sum(ExploitScore) - totalScore = exploit_w * ExploitScore - # print(totalScore.shape) - # print(explore_w) - # print(scoreExploration.shape) - totalScore += explore_w * scoreExploration - - temp = totalScore.copy() - sorted_idxtotalScore = np.argsort(temp, axis=0)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - Xnew = np.zeros((n_new_samples, ndim)) - if explore_method != 'Voronoi': - Xnew = allCandidates[bestIdx] - else: - for i, idx in enumerate(bestIdx.flatten()): - X_can = explore.closest_points[idx] - # plotter(self.ExpDesign.X, X_can, explore_method, - # scoreExploration=None) - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - - elif exploit_method == 'alphabetic': - # ------- EXPLOITATION: ALPHABETIC ------- - Xnew = self.util_AlphOptDesign(allCandidates, var) - - elif exploit_method == 'Space-filling': - # ------- EXPLOITATION: SPACE-FILLING ------- - totalScore = scoreExploration - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - - # select the requested number of samples - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - else: - raise NameError('The requested design method is not available.') - - print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) - print("Xnew:\n", Xnew) - - # TODO: why does it also return None? - return Xnew, None - - # ------------------------------------------------------------------------- - def util_AlphOptDesign(self, candidates, var='D-Opt'): - """ - Enriches the Experimental design with the requested alphabetic - criterion based on exploring the space with number of sampling points. - - Ref: Hadigol, M., & Doostan, A. (2018). Least squares polynomial chaos - expansion: A review of sampling strategies., Computer Methods in - Applied Mechanics and Engineering, 332, 382-407. - - Arguments - --------- - NCandidate : int - Number of candidate points to be searched - - var : string - Alphabetic optimality criterion - - Returns - ------- - X_new : array of shape (1, n_params) - The new sampling location in the input space. - """ - MetaModelOrig = self # TODO: this doesn't fully seem correct? - n_new_samples = MetaModelOrig.ExpDesign.n_new_samples - NCandidate = candidates.shape[0] - - # TODO: Loop over outputs - OutputName = self.out_names[0] - - # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) - - # Old Experimental design - oldExpDesignX = self.ExpDesign.X - - # TODO: Only one psi can be selected. - # Suggestion: Go for the one with the highest LOO error - # TODO: this is just a patch, need to look at again! - Scores = list(self.MetaModel.score_dict['b_1'][OutputName].values()) - #print(Scores) - #print(self.MetaModel.score_dict) - #print(self.MetaModel.score_dict.values()) - #print(self.MetaModel.score_dict['b_1'].values()) - #print(self.MetaModel.score_dict['b_1'][OutputName].values()) - ModifiedLOO = [1-score for score in Scores] - outIdx = np.argmax(ModifiedLOO) - - # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) - - # TODO: also patched here - BasisIndices = self.MetaModel.basis_dict['b_1'][OutputName]["y_"+str(outIdx+1)] - P = len(BasisIndices) - - # ------ Old Psi ------------ - univ_p_val = self.MetaModel.univ_basis_vals(oldExpDesignX) - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - # ------ New candidates (Psi_c) ------------ - # Assemble Psi_c - univ_p_val_c = self.MetaModel.univ_basis_vals(candidates) - Psi_c = self.MetaModel.create_psi(BasisIndices, univ_p_val_c) - - for idx in range(NCandidate): - - # Include the new row to the original Psi - Psi_cand = np.vstack((Psi, Psi_c[idx])) - - # Information matrix - PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) - - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: - # faster - invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - invM = np.linalg.pinv(M) - - # ---------- Calculate optimality criterion ---------- - # Optimality criteria according to Section 4.5.1 in Ref. - - # D-Opt - if var.lower() == 'd-opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) - - # A-Opt - elif var.lower() == 'a-opt': - Phi[idx] = np.trace(invM) - - # K-Opt - elif var.lower() == 'k-opt': - Phi[idx] = np.linalg.cond(M) - - else: - # print(var.lower()) - raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') - - # find an optimal point subset to add to the initial design - # by minimization of the Phi - sorted_idxtotalScore = np.argsort(Phi) - - # select the requested number of samples - Xnew = candidates[sorted_idxtotalScore[:n_new_samples]] - - return Xnew - - # ------------------------------------------------------------------------- - def _normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): - """ - Calculated gaussian likelihood for given y+std based on given obs+sigma - # TODO: is this understanding correct? - - Parameters - ---------- - y_hat_pce : dict of 2d np arrays - Mean output of the surrogate. - std_pce : dict of 2d np arrays - Standard deviation output of the surrogate. - obs_data : dict of 1d np arrays - Observed data. - total_sigma2s : pandas dataframe, matches obs_data - Estimated uncertainty for the observed data. - rmse : dict, optional - RMSE values from validation of the surrogate. The default is None. - - Returns - ------- - likelihoods : dict of float - The likelihood for each surrogate eval in y_hat_pce compared to the - observations (?). - - """ - - likelihoods = 1.0 - - # Loop over the outputs - for idx, out in enumerate(self.out_names): - - # (Meta)Model Output - # print(y_hat_pce[out]) - nsamples, nout = y_hat_pce[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout].values - - # Surrogate error if valid dataset is given. - if rmse is not None: - tot_sigma2s += rmse[out]**2 - else: - tot_sigma2s += np.mean(std_pce[out])**2 - - likelihoods *= stats.multivariate_normal.pdf( - y_hat_pce[out], data, np.diag(tot_sigma2s), - allow_singular=True) - - # TODO: remove this here - self.Likelihoods = likelihoods - - return likelihoods - - # ------------------------------------------------------------------------- - def _corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = self.ExpDesign.X # valid_samples - model_outputs = self.ExpDesign.Y # valid_model_runs - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = self.out_names - - # TODO: Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) - covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) - - # Compute likelilhood output vs data - logLik_data[i] += logpdf( - y_m_hat, data, covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += logpdf(y_m_hat, y_m, covMatrix) - - # Weight - logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) - - return np.log(np.mean(weights)) - - # ------------------------------------------------------------------------- - def _posteriorPlot(self, posterior, par_names, key): - """ - Plot the posterior of a specific key as a corner plot - - Parameters - ---------- - posterior : 2d np.array - Samples of the posterior. - par_names : list of strings - List of the parameter names. - key : string - Output key that this posterior belongs to. - - Returns - ------- - figPosterior : corner.corner - Plot of the posterior. - - """ - - # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') - os.makedirs(newpath, exist_ok=True) - - bound_tuples = self.ExpDesign.bound_tuples - n_params = len(par_names) - font_size = 40 - if n_params == 2: - - figPosterior, ax = plt.subplots(figsize=(15, 15)) - - sns.kdeplot(x=posterior[:, 0], y=posterior[:, 1], - fill=True, ax=ax, cmap=plt.cm.jet, - clip=bound_tuples) - # Axis labels - plt.xlabel(par_names[0], fontsize=font_size) - plt.ylabel(par_names[1], fontsize=font_size) - - # Set axis limit - plt.xlim(bound_tuples[0]) - plt.ylim(bound_tuples[1]) - - # Increase font size - plt.xticks(fontsize=font_size) - plt.yticks(fontsize=font_size) - - # Switch off the grids - plt.grid(False) - - else: - import corner - figPosterior = corner.corner(posterior, labels=par_names, - title_fmt='.2e', show_titles=True, - title_kwargs={"fontsize": 12}) - - figPosterior.savefig(f'./{newpath}/{key}.pdf', bbox_inches='tight') - plt.close() - - # Save the posterior as .npy - np.save(f'./{newpath}/{key}.npy', posterior) - - return figPosterior - - - # ------------------------------------------------------------------------- - def _BME_Calculator(self, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - - Parameters - ---------- - obs_data : dict of 1d np arrays - Observed data. - sigma2Dict : pandas dataframe, matches obs_data - Estimated uncertainty for the observed data. - rmse : dict of floats, optional - RMSE values for each output-key. The dafault is None. - - Returns - ------- - (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - """ - # Initializations - if hasattr(self, 'valid_likelihoods'): - valid_likelihoods = self.valid_likelihoods - else: - valid_likelihoods = [] - valid_likelihoods = np.array(valid_likelihoods) - - post_snapshot = self.ExpDesign.post_snapshot - if post_snapshot or valid_likelihoods.shape[0] != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') - os.makedirs(newpath, exist_ok=True) - - SamplingMethod = 'random' - MCsize = 10000 - ESS = 0 - - # Estimation of the integral via Monte Varlo integration - while (ESS > MCsize) or (ESS < 1): - - # Generate samples for Monte Carlo simulation - X_MC = self.ExpDesign.generate_samples( - MCsize, SamplingMethod - ) - - # Monte Carlo simulation for the candidate design - Y_MC, std_MC = self.MetaModel.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and - # simulation results via PCE with candidate design) - Likelihoods = self._normpdf( - Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) - - # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if (ESS > MCsize) or (ESS < 1): - print(f'ESS={ESS} MC size should be larger.') - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - X_Posterior = X_MC[accepted] - - # ------------------------------------------------------------ - # --- Kullback-Leibler Divergence & Information Entropy ------ - # ------------------------------------------------------------ - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - - # TODO: Correction factor - # log_weight = self.__corr_factor_BME(obs_data, sigma2Dict, logBME) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(self.ExpDesign.JDist.pdf(X_Posterior.T)) - ) - - # Calculate Kullback-Leibler Divergence - # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - KLD = postExpLikelihoods - logBME - - # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods - - # If post_snapshot is True, plot likelihood vs refrence - if post_snapshot or valid_likelihoods: - # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) - est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = hellinger_distance(ref_like, est_like) - - idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' - in name and os.path.isfile(os.path.join(newpath, name))]) - - fig, ax = plt.subplots() - try: - sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), - shade=True, color="g", label='Ref. Likelihood') - sns.kdeplot(np.log(Likelihoods[Likelihoods > 0]), shade=True, - color="b", label='Likelihood with PCE') - except: - pass - - text = f"Hellinger Dist.={distHellinger:.3f}\n logBME={logBME:.3f}" - "\n DKL={KLD:.3f}" - - plt.text(0.05, 0.75, text, bbox=dict(facecolor='wheat', - edgecolor='black', - boxstyle='round,pad=1'), - transform=ax.transAxes) - - fig.savefig(f'./{newpath}/Likelihoods_{idx}.pdf', - bbox_inches='tight') - plt.close() - - else: - distHellinger = 0.0 - - # Bayesian inference with Emulator only for 2D problem - if post_snapshot and self.MetaModel.n_params == 2 and not idx % 5: - from bayesvalidrox.bayes_inference.bayes_inference import BayesInference - from bayesvalidrox.bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(self) - BayesOpts.emulator = True - BayesOpts.plot_post_pred = False - - # Select the inference method - import emcee - BayesOpts.inference_method = "MCMC" - # Set the MCMC parameters passed to self.mcmc_params - BayesOpts.mcmc_params = { - 'n_steps': 1e5, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'verbose': False - } - - # ----- Define the discrepancy model ------- - # TODO: check with Farid if this first line is how it should be - BayesOpts.measured_data = obs_data - obs_data = pd.DataFrame(obs_data, columns=self.out_names) - BayesOpts.measurement_error = obs_data - # TODO: shouldn't the uncertainty be sigma2Dict instead of obs_data? - - # # -- (Option B) -- - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 - BayesOpts.Discrepancy = DiscrepancyOpts - # Start the calibration/inference - Bayes_PCE = BayesOpts.create_inference() - X_Posterior = Bayes_PCE.posterior_df.values - - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - # ------------------------------------------------------------------------- - def _validError(self): - """ - Evaluate the metamodel on the validation samples and calculate the - error against the corresponding model runs - - Returns - ------- - rms_error : dict - RMSE for each validation run. - valid_error : dict - Normed (?)RMSE for each validation run. - - """ - # Extract the original model with the generated samples - valid_model_runs = self.ExpDesign.valid_model_runs - - # Run the PCE model with the generated samples - valid_PCE_runs, _ = self.MetaModel.eval_metamodel(samples=self.ExpDesign.valid_samples) - - rms_error = {} - valid_error = {} - # Loop over the keys and compute RMSE error. - for key in self.out_names: - rms_error[key] = mean_squared_error( - valid_model_runs[key], valid_PCE_runs[key], - multioutput='raw_values', - sample_weight=None, - squared=False) - # Validation error - valid_error[key] = (rms_error[key]**2) - valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Updated Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(rms_error[key], - valid_error[key])))) - - return rms_error, valid_error - - # ------------------------------------------------------------------------- - def _error_Mean_Std(self): - """ - Calculates the error in the overall mean and std approximation of the - surrogate against the mc-reference provided to the model. - This can only be applied to metamodels of polynomial type - - Returns - ------- - RMSE_Mean : float - RMSE of the means - RMSE_std : float - RMSE of the standard deviations - - """ - # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self.MetaModel._compute_pce_moments() - - # Compute the root mean squared error - for output in self.out_names: - - # Compute the error between mean and std of MetaModel and OrigModel - RMSE_Mean = mean_squared_error( - self.Model.mc_reference['mean'], pce_means[output], squared=False - ) - RMSE_std = mean_squared_error( - self.Model.mc_reference['std'], pce_stds[output], squared=False - ) - - return RMSE_Mean, RMSE_std diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/eval_rec_rule.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/eval_rec_rule.py deleted file mode 100644 index b583c7eb2..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/eval_rec_rule.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" - - -Based on the implementation in UQLab [1]. - -References: -1. S. Marelli, and B. Sudret, UQLab: A framework for uncertainty quantification -in Matlab, Proc. 2nd Int. Conf. on Vulnerability, Risk Analysis and Management -(ICVRAM2014), Liverpool, United Kingdom, 2014, 2554-2563. - -2. S. Marelli, N. Lüthen, B. Sudret, UQLab user manual – Polynomial chaos -expansions, Report # UQLab-V1.4-104, Chair of Risk, Safety and Uncertainty -Quantification, ETH Zurich, Switzerland, 2021. - -Author: Farid Mohammadi, M.Sc. -E-Mail: farid.mohammadi@iws.uni-stuttgart.de -Department of Hydromechanics and Modelling of Hydrosystems (LH2) -Institute for Modelling Hydraulic and Environmental Systems (IWS), University -of Stuttgart, www.iws.uni-stuttgart.de/lh2/ -Pfaffenwaldring 61 -70569 Stuttgart - -Created on Fri Jan 14 2022 -""" -import numpy as np -from numpy.polynomial.polynomial import polyval - - -def poly_rec_coeffs(n_max, poly_type, params=None): - """ - Computes the recurrence coefficients for classical Wiener-Askey orthogonal - polynomials. - - Parameters - ---------- - n_max : int - Maximum polynomial degree. - poly_type : string - Polynomial type. - params : list, optional - Parameters required for `laguerre` poly type. The default is None. - - Returns - ------- - AB : dict - The 3 term recursive coefficients and the applicable ranges. - - """ - - if poly_type == 'legendre': - - def an(n): - return np.zeros((n+1, 1)) - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = np.sqrt(1./(4-i**-2)) - return sq_bn - - bounds = [-1, 1] - - elif poly_type == 'hermite': - - def an(n): - return np.zeros((n+1, 1)) - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = np.sqrt(i) - return sq_bn - - bounds = [-np.inf, np.inf] - - elif poly_type == 'laguerre': - - def an(n): - a = np.zeros((n+1, 1)) - for i in range(1, n+1): - a[i] = 2*n + params[1] - return a - - def sqrt_bn(n): - sq_bn = np.zeros((n+1, 1)) - sq_bn[0, 0] = 1 - for i in range(1, n+1): - sq_bn[i, 0] = -np.sqrt(i * (i+params[1]-1)) - return sq_bn - - bounds = [0, np.inf] - - AB = {'alpha_beta': np.concatenate((an(n_max), sqrt_bn(n_max)), axis=1), - 'bounds': bounds} - - return AB - - -def eval_rec_rule(x, max_deg, poly_type): - """ - Evaluates the polynomial that corresponds to the Jacobi matrix defined - from the AB. - - Parameters - ---------- - x : array (n_samples) - Points where the polynomials are evaluated. - max_deg : int - Maximum degree. - poly_type : string - Polynomial type. - - Returns - ------- - values : array of shape (n_samples, max_deg+1) - Polynomials corresponding to the Jacobi matrix. - - """ - AB = poly_rec_coeffs(max_deg, poly_type) - AB = AB['alpha_beta'] - - values = np.zeros((len(x), AB.shape[0]+1)) - values[:, 1] = 1 / AB[0, 1] - - for k in range(AB.shape[0]-1): - values[:, k+2] = np.multiply((x - AB[k, 0]), values[:, k+1]) - \ - np.multiply(values[:, k], AB[k, 1]) - values[:, k+2] = np.divide(values[:, k+2], AB[k+1, 1]) - return values[:, 1:] - - -def eval_rec_rule_arbitrary(x, max_deg, poly_coeffs): - """ - Evaluates the polynomial at sample array x. - - Parameters - ---------- - x : array (n_samples) - Points where the polynomials are evaluated. - max_deg : int - Maximum degree. - poly_coeffs : dict - Polynomial coefficients computed based on moments. - - Returns - ------- - values : array of shape (n_samples, max_deg+1) - Univariate Polynomials evaluated at samples. - - """ - values = np.zeros((len(x), max_deg+1)) - - for deg in range(max_deg+1): - values[:, deg] = polyval(x, poly_coeffs[deg]).T - - return values - - -def eval_univ_basis(x, max_deg, poly_types, apoly_coeffs=None): - """ - Evaluates univariate regressors along input directions. - - Parameters - ---------- - x : array of shape (n_samples, n_params) - Training samples. - max_deg : int - Maximum polynomial degree. - poly_types : list of strings - List of polynomial types for all parameters. - apoly_coeffs : dict , optional - Polynomial coefficients computed based on moments. The default is None. - - Returns - ------- - univ_vals : array of shape (n_samples, n_params, max_deg+1) - Univariate polynomials for all degrees and parameters evaluated at x. - - """ - # Initilize the output array - n_samples, n_params = x.shape - univ_vals = np.zeros((n_samples, n_params, max_deg+1)) - - for i in range(n_params): - - if poly_types[i] == 'arbitrary': - polycoeffs = apoly_coeffs[f'p_{i+1}'] - univ_vals[:, i] = eval_rec_rule_arbitrary(x[:, i], max_deg, - polycoeffs) - else: - univ_vals[:, i] = eval_rec_rule(x[:, i], max_deg, poly_types[i]) - - return univ_vals diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exp_designs.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exp_designs.py deleted file mode 100644 index 665ee4fc3..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exp_designs.py +++ /dev/null @@ -1,493 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import math -import itertools -import chaospy -import scipy.stats as st -from tqdm import tqdm -import h5py -import os - -from .apoly_construction import apoly_construction -from .input_space import InputSpace - -# ------------------------------------------------------------------------- -def check_ranges(theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c - - -class ExpDesigns(InputSpace): - """ - This class generates samples from the prescribed marginals for the model - parameters using the `Input` object. - - Attributes - ---------- - Input : obj - Input object containing the parameter marginals, i.e. name, - distribution type and distribution parameters or available raw data. - meta_Model_type : str - Type of the meta_Model_type. - sampling_method : str - Name of the sampling method for the experimental design. The following - sampling method are supported: - - * random - * latin_hypercube - * sobol - * halton - * hammersley - * chebyshev(FT) - * grid(FT) - * user - hdf5_file : str - Name of the hdf5 file that contains the experimental design. - n_new_samples : int - Number of (initial) training points. - n_max_samples : int - Number of maximum training points. - mod_LOO_threshold : float - The modified leave-one-out cross validation threshold where the - sequential design stops. - tradeoff_scheme : str - Trade-off scheme to assign weights to the exploration and exploitation - scores in the sequential design. - n_canddidate : int - Number of candidate training sets to calculate the scores for. - explore_method : str - Type of the exploration method for the sequential design. The following - methods are supported: - - * Voronoi - * random - * latin_hypercube - * LOOCV - * dual annealing - exploit_method : str - Type of the exploitation method for the sequential design. The - following methods are supported: - - * BayesOptDesign - * BayesActDesign - * VarOptDesign - * alphabetic - * Space-filling - util_func : str or list - The utility function to be specified for the `exploit_method`. For the - available utility functions see Note section. - n_cand_groups : int - Number of candidate groups. Each group of candidate training sets will - be evaulated separately in parallel. - n_replication : int - Number of replications. Only for comparison. The default is 1. - post_snapshot : int - Whether to plot the posterior in the sequential design. The default is - `True`. - step_snapshot : int - The number of steps to plot the posterior in the sequential design. The - default is 1. - max_a_post : list or array - Maximum a posteriori of the posterior distribution, if known. The - default is `[]`. - adapt_verbose : bool - Whether to plot the model response vs that of metamodel for the new - trining point in the sequential design. - - Note - ---------- - The following utiliy functions for the **exploitation** methods are - supported: - - #### BayesOptDesign (when data is available) - - DKL (Kullback-Leibler Divergence) - - DPP (D-Posterior-percision) - - APP (A-Posterior-percision) - - #### VarBasedOptDesign -> when data is not available - - Entropy (Entropy/MMSE/active learning) - - EIGF (Expected Improvement for Global fit) - - LOOCV (Leave-one-out Cross Validation) - - #### alphabetic - - D-Opt (D-Optimality) - - A-Opt (A-Optimality) - - K-Opt (K-Optimality) - """ - - def __init__(self, Input, meta_Model_type='pce', - sampling_method='random', hdf5_file=None, - n_new_samples=1, n_max_samples=None, mod_LOO_threshold=1e-16, - tradeoff_scheme=None, n_canddidate=1, explore_method='random', - exploit_method='Space-filling', util_func='Space-filling', - n_cand_groups=4, n_replication=1, post_snapshot=False, - step_snapshot=1, max_a_post=[], adapt_verbose=False, max_func_itr=1): - - self.InputObj = Input - self.meta_Model_type = meta_Model_type - self.sampling_method = sampling_method - self.hdf5_file = hdf5_file - self.n_new_samples = n_new_samples - self.n_max_samples = n_max_samples - self.mod_LOO_threshold = mod_LOO_threshold - self.explore_method = explore_method - self.exploit_method = exploit_method - self.util_func = util_func - self.tradeoff_scheme = tradeoff_scheme - self.n_canddidate = n_canddidate - self.n_cand_groups = n_cand_groups - self.n_replication = n_replication - self.post_snapshot = post_snapshot - self.step_snapshot = step_snapshot - self.max_a_post = max_a_post - self.adapt_verbose = adapt_verbose - self.max_func_itr = max_func_itr - - # Other - self.apce = None - self.ndim = None - - # Init - self.check_valid_inputs() - - # ------------------------------------------------------------------------- - def generate_samples(self, n_samples, sampling_method='random', - transform=False): - """ - Generates samples with given sampling method - - Parameters - ---------- - n_samples : int - Number of requested samples. - sampling_method : str, optional - Sampling method. The default is `'random'`. - transform : bool, optional - Transformation via an isoprobabilistic transformation method. The - default is `False`. - - Returns - ------- - samples: array of shape (n_samples, n_params) - Generated samples from defined model input object. - - """ - try: - samples = chaospy.generate_samples( - int(n_samples), domain=self.origJDist, rule=sampling_method - ) - except: - samples = self.random_sampler(int(n_samples)).T - - return samples.T - - - - # ------------------------------------------------------------------------- - def generate_ED(self, n_samples, transform=False, - max_pce_deg=None): - """ - Generates experimental designs (training set) with the given method. - - Parameters - ---------- - n_samples : int - Number of requested training points. - sampling_method : str, optional - Sampling method. The default is `'random'`. - transform : bool, optional - Isoprobabilistic transformation. The default is `False`. - max_pce_deg : int, optional - Maximum PCE polynomial degree. The default is `None`. - - Returns - ------- - None - - """ - if n_samples <0: - raise ValueError('A negative number of samples cannot be created. Please provide positive n_samples') - n_samples = int(n_samples) - - if not hasattr(self, 'n_init_samples'): - self.n_init_samples = n_samples - - # Generate the samples based on requested method - self.init_param_space(max_pce_deg) - - sampling_method = self.sampling_method - # Pass user-defined samples as ED - if sampling_method == 'user': - if not hasattr(self, 'X'): - raise AttributeError('User-defined sampling cannot proceed as no samples provided. Please add them to this class as attribute X') - if not self.X.ndim == 2: - raise AttributeError('The provided samples shuld have 2 dimensions') - samples = self.X - self.n_samples = len(samples) - - # Sample the distribution of parameters - elif self.input_data_given: - # Case II: Input values are directly given by the user. - - if sampling_method == 'random': - samples = self.random_sampler(n_samples) - - elif sampling_method == 'PCM' or \ - sampling_method == 'LSCM': - samples = self.pcm_sampler(n_samples, max_pce_deg) - - else: - # Create ExpDesign in the actual space using chaospy - try: - samples = chaospy.generate_samples(n_samples, - domain=self.JDist, - rule=sampling_method).T - except: - samples = self.JDist.resample(n_samples).T - - elif not self.input_data_given: - # Case I = User passed known distributions - samples = chaospy.generate_samples(n_samples, domain=self.JDist, - rule=sampling_method).T - - # Transform samples to the original space - if transform: - self.init_param_space(max_pce_deg) - tr_samples = self.transform( - samples, - method=sampling_method - ) - if sampling_method == 'user' or not self.apce: - self.X = samples - self.X_tr = tr_samples - #return samples, tr_samples - else: - self.X = tr_samples - self.X_tr = samples - #return tr_samples, samples # TODO: why is this swapped here? - else: - self.X = samples - self.X_tr = None - - def read_from_file(self, out_names): - """ - Reads in the ExpDesign from a provided h5py file and saves the results. - - Parameters - ---------- - out_names : list of strings - The keys that are in the outputs (y) saved in the provided file. - - Returns - ------- - None. - - """ - if self.hdf5_file == None: - raise AttributeError('ExpDesign cannot be read in, please provide hdf5 file first') - - # Read hdf5 file - f = h5py.File(self.hdf5_file, 'r+') - - # Read EDX and pass it to ExpDesign object - try: - self.X = np.array(f["EDX/New_init_"]) - except KeyError: - self.X = np.array(f["EDX/init_"]) - - # Update number of initial samples - self.n_init_samples = self.X.shape[0] - - # Read EDX and pass it to ExpDesign object - self.Y = {} - - # Extract x values - try: - self.Y["x_values"] = dict() - for varIdx, var in enumerate(out_names): - x = np.array(f[f"x_values/{var}"]) - self.Y["x_values"][var] = x - except KeyError: - self.Y["x_values"] = np.array(f["x_values"]) - - # Store the output - for varIdx, var in enumerate(out_names): - try: - y = np.array(f[f"EDY/{var}/New_init_"]) - except KeyError: - y = np.array(f[f"EDY/{var}/init_"]) - self.Y[var] = y - f.close() - print(f'Experimental Design is read in from file {self.hdf5_file}') - print('') - - - - # ------------------------------------------------------------------------- - def random_sampler(self, n_samples, max_deg = None): - """ - Samples the given raw data randomly. - - Parameters - ---------- - n_samples : int - Number of requested samples. - - max_deg : int, optional - Maximum degree. The default is `None`. - This will be used to run init_param_space, if it has not been done - until now. - - Returns - ------- - samples: array of shape (n_samples, n_params) - The sampling locations in the input space. - - """ - if not hasattr(self, 'raw_data'): - self.init_param_space(max_deg) - else: - if np.array(self.raw_data).ndim !=2: - raise AttributeError('The given raw data for sampling should have two dimensions') - samples = np.zeros((n_samples, self.ndim)) - sample_size = self.raw_data.shape[1] - - # Use a combination of raw data - if n_samples < sample_size: - for pa_idx in range(self.ndim): - # draw random indices - rand_idx = np.random.randint(0, sample_size, n_samples) - # store the raw data with given random indices - samples[:, pa_idx] = self.raw_data[pa_idx, rand_idx] - else: - try: - samples = self.JDist.resample(int(n_samples)).T - except AttributeError: - samples = self.JDist.sample(int(n_samples)).T - # Check if all samples are in the bound_tuples - for idx, param_set in enumerate(samples): - if not check_ranges(param_set, self.bound_tuples): - try: - proposed_sample = chaospy.generate_samples( - 1, domain=self.JDist, rule='random').T[0] - except: - proposed_sample = self.JDist.resample(1).T[0] - while not check_ranges(proposed_sample, - self.bound_tuples): - try: - proposed_sample = chaospy.generate_samples( - 1, domain=self.JDist, rule='random').T[0] - except: - proposed_sample = self.JDist.resample(1).T[0] - samples[idx] = proposed_sample - - return samples - - # ------------------------------------------------------------------------- - def pcm_sampler(self, n_samples, max_deg): - """ - Generates collocation points based on the root of the polynomial - degrees. - - Parameters - ---------- - n_samples : int - Number of requested samples. - max_deg : int - Maximum degree defined by user. Will also be used to run - init_param_space if that has not been done beforehand. - - Returns - ------- - opt_col_points: array of shape (n_samples, n_params) - Collocation points. - - """ - - if not hasattr(self, 'raw_data'): - self.init_param_space(max_deg) - - raw_data = self.raw_data - - # Guess the closest degree to self.n_samples - def M_uptoMax(deg): - result = [] - for d in range(1, deg+1): - result.append(math.factorial(self.ndim+d) // - (math.factorial(self.ndim) * math.factorial(d))) - return np.array(result) - #print(M_uptoMax(max_deg)) - #print(np.where(M_uptoMax(max_deg) > n_samples)[0]) - - guess_Deg = np.where(M_uptoMax(max_deg) > n_samples)[0][0] - - c_points = np.zeros((guess_Deg+1, self.ndim)) - - def PolynomialPa(parIdx): - return apoly_construction(self.raw_data[parIdx], max_deg) - - for i in range(self.ndim): - poly_coeffs = PolynomialPa(i)[guess_Deg+1][::-1] - c_points[:, i] = np.trim_zeros(np.roots(poly_coeffs)) - - # Construction of optimal integration points - Prod = itertools.product(np.arange(1, guess_Deg+2), repeat=self.ndim) - sort_dig_unique_combos = np.array(list(filter(lambda x: x, Prod))) - - # Ranking relatively mean - Temp = np.empty(shape=[0, guess_Deg+1]) - for j in range(self.ndim): - s = abs(c_points[:, j]-np.mean(raw_data[j])) - Temp = np.append(Temp, [s], axis=0) - temp = Temp.T - - index_CP = np.sort(temp, axis=0) - sort_cpoints = np.empty((0, guess_Deg+1)) - - for j in range(self.ndim): - #print(index_CP[:, j]) - sort_cp = c_points[index_CP[:, j], j] - sort_cpoints = np.vstack((sort_cpoints, sort_cp)) - - # Mapping of Combination to Cpoint Combination - sort_unique_combos = np.empty(shape=[0, self.ndim]) - for i in range(len(sort_dig_unique_combos)): - sort_un_comb = [] - for j in range(self.ndim): - SortUC = sort_cpoints[j, sort_dig_unique_combos[i, j]-1] - sort_un_comb.append(SortUC) - sort_uni_comb = np.asarray(sort_un_comb) - sort_unique_combos = np.vstack((sort_unique_combos, sort_uni_comb)) - - # Output the collocation points - if self.sampling_method.lower() == 'lscm': - opt_col_points = sort_unique_combos - else: - opt_col_points = sort_unique_combos[0:self.n_samples] - - return opt_col_points diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exploration.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exploration.py deleted file mode 100644 index e18537207..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/exploration.py +++ /dev/null @@ -1,364 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -from scipy.spatial import distance - - -class Exploration: - """ - Created based on the Surrogate Modeling Toolbox (SUMO) [1]. - - [1] Gorissen, D., Couckuyt, I., Demeester, P., Dhaene, T. and Crombecq, K., - 2010. A surrogate modeling and adaptive sampling toolbox for computer - based design. Journal of machine learning research.-Cambridge, Mass., - 11, pp.2051-2055. sumo@sumo.intec.ugent.be - http://sumo.intec.ugent.be - - Attributes - ---------- - ExpDesign : obj - ExpDesign object. - n_candidate : int - Number of candidate samples. - mc_criterion : str - Selection crieterion. The default is `'mc-intersite-proj-th'`. Another - option is `'mc-intersite-proj'`. - w : int - Number of random points in the domain for each sample of the - training set. - """ - - def __init__(self, ExpDesign, n_candidate, - mc_criterion='mc-intersite-proj-th'): - self.ExpDesign = ExpDesign - self.n_candidate = n_candidate - self.mc_criterion = mc_criterion - self.w = 100 - - def get_exploration_samples(self): - """ - This function generates candidates to be selected as new design and - their associated exploration scores. - - Returns - ------- - all_candidates : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - explore_method = self.ExpDesign.explore_method - - print("\n") - print(f' The {explore_method}-Method is selected as the exploration ' - 'method.') - print("\n") - - if explore_method == 'Voronoi': - # Generate samples using the Voronoi method - all_candidates, exploration_scores = self.get_vornoi_samples() - else: - # Generate samples using the MC method - all_candidates, exploration_scores = self.get_mc_samples() - - return all_candidates, exploration_scores - - # ------------------------------------------------------------------------- - def get_vornoi_samples(self): - """ - This function generates samples based on voronoi cells and their - corresponding scores - - Returns - ------- - new_samples : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - - mc_criterion = self.mc_criterion - n_candidate = self.n_candidate - # Get the Old ExpDesign #samples - old_ED_X = self.ExpDesign.X - ndim = old_ED_X.shape[1] - - # calculate error #averageErrors - error_voronoi, all_candidates = self.approximate_voronoi( - self.w, old_ED_X - ) - - # Pick the best candidate point in the voronoi cell - # for each best sample - selected_samples = np.empty((0, ndim)) - bad_samples = [] - - for index in range(len(error_voronoi)): - - # get candidate new samples from voronoi tesselation - candidates = self.closest_points[index] - - # get total number of candidates - n_new_samples = candidates.shape[0] - - # still no candidate samples around this one, skip it! - if n_new_samples == 0: - print('The following sample has been skipped because there ' - 'were no candidate samples around it...') - print(old_ED_X[index]) - bad_samples.append(index) - continue - - # find candidate that is farthest away from any existing sample - max_min_distance = 0 - best_candidate = 0 - min_intersite_dist = np.zeros((n_new_samples)) - min_projected_dist = np.zeros((n_new_samples)) - - for j in range(n_new_samples): - - new_samples = np.vstack((old_ED_X, selected_samples)) - - # find min distorted distance from all other samples - euclidean_dist = self._build_dist_matrix_point( - new_samples, candidates[j], do_sqrt=True) - min_euclidean_dist = np.min(euclidean_dist) - min_intersite_dist[j] = min_euclidean_dist - - # Check if this is the maximum minimum distance from all other - # samples - if min_euclidean_dist >= max_min_distance: - max_min_distance = min_euclidean_dist - best_candidate = j - - # Projected distance - projected_dist = distance.cdist( - new_samples, [candidates[j]], 'chebyshev') - min_projected_dist[j] = np.min(projected_dist) - - if mc_criterion == 'mc-intersite-proj': - weight_euclidean_dist = 0.5 * ((n_new_samples+1)**(1/ndim) - 1) - weight_projected_dist = 0.5 * (n_new_samples+1) - total_dist_scores = weight_euclidean_dist * min_intersite_dist - total_dist_scores += weight_projected_dist * min_projected_dist - - elif mc_criterion == 'mc-intersite-proj-th': - alpha = 0.5 # chosen (tradeoff) - d_min = 2 * alpha / n_new_samples - if any(min_projected_dist < d_min): - candidates = np.delete( - candidates, [min_projected_dist < d_min], axis=0 - ) - total_dist_scores = np.delete( - min_intersite_dist, [min_projected_dist < d_min], - axis=0 - ) - else: - total_dist_scores = min_intersite_dist - else: - raise NameError( - 'The MC-Criterion you requested is not available.' - ) - - # Add the best candidate to the list of new samples - best_candidate = np.argsort(total_dist_scores)[::-1][:n_candidate] - selected_samples = np.vstack( - (selected_samples, candidates[best_candidate]) - ) - - self.new_samples = selected_samples - self.exploration_scores = np.delete(error_voronoi, bad_samples, axis=0) - - return self.new_samples, self.exploration_scores - - # ------------------------------------------------------------------------- - def get_mc_samples(self, all_candidates=None): - """ - This function generates random samples based on Global Monte Carlo - methods and their corresponding scores, based on [1]. - - [1] Crombecq, K., Laermans, E. and Dhaene, T., 2011. Efficient - space-filling and non-collapsing sequential design strategies for - simulation-based modeling. European Journal of Operational Research - , 214(3), pp.683-696. - DOI: https://doi.org/10.1016/j.ejor.2011.05.032 - - Implemented methods to compute scores: - 1) mc-intersite-proj - 2) mc-intersite-proj-th - - Arguments - --------- - all_candidates : array, optional - Samples to compute the scores for. The default is `None`. In this - case, samples will be generated by defined model input marginals. - - Returns - ------- - new_samples : array of shape (n_candidate, n_params) - A list of samples. - exploration_scores: arrays of shape (n_candidate) - Exploration scores. - """ - explore_method = self.ExpDesign.explore_method - mc_criterion = self.mc_criterion - if all_candidates is None: - n_candidate = self.n_candidate - else: - n_candidate = all_candidates.shape[0] - - # Get the Old ExpDesign #samples - old_ED_X = self.ExpDesign.X - ndim = old_ED_X.shape[1] - - # ----- Compute the number of random points ----- - if all_candidates is None: - # Generate MC Samples - all_candidates = self.ExpDesign.generate_samples( - self.n_candidate, explore_method - ) - self.all_candidates = all_candidates - - # initialization - min_intersite_dist = np.zeros((n_candidate)) - min_projected_dist = np.zeros((n_candidate)) - - for i, candidate in enumerate(all_candidates): - - # find candidate that is farthest away from any existing sample - maxMinDistance = 0 - - # find min distorted distance from all other samples - euclidean_dist = self._build_dist_matrix_point( - old_ED_X, candidate, do_sqrt=True - ) - min_euclidean_dist = np.min(euclidean_dist) - min_intersite_dist[i] = min_euclidean_dist - - # Check if this is the maximum minimum distance from all other - # samples - if min_euclidean_dist >= maxMinDistance: - maxMinDistance = min_euclidean_dist - - # Projected distance - projected_dist = self._build_dist_matrix_point( - old_ED_X, candidate, 'chebyshev' - ) - min_projected_dist[i] = np.min(projected_dist) - - if mc_criterion == 'mc-intersite-proj': - weight_euclidean_dist = ((n_candidate+1)**(1/ndim) - 1) * 0.5 - weight_projected_dist = (n_candidate+1) * 0.5 - total_dist_scores = weight_euclidean_dist * min_intersite_dist - total_dist_scores += weight_projected_dist * min_projected_dist - - elif mc_criterion == 'mc-intersite-proj-th': - alpha = 0.5 # chosen (tradeoff) - d_min = 2 * alpha / n_candidate - if any(min_projected_dist < d_min): - all_candidates = np.delete( - all_candidates, [min_projected_dist < d_min], axis=0 - ) - total_dist_scores = np.delete( - min_intersite_dist, [min_projected_dist < d_min], axis=0 - ) - else: - total_dist_scores = min_intersite_dist - else: - raise NameError('The MC-Criterion you requested is not available.') - - self.new_samples = all_candidates - self.exploration_scores = total_dist_scores - self.exploration_scores /= np.nansum(total_dist_scores) - - return self.new_samples, self.exploration_scores - - # ------------------------------------------------------------------------- - def approximate_voronoi(self, w, samples): - """ - An approximate (monte carlo) version of Matlab's voronoi command. - - Arguments - --------- - samples : array - Old experimental design to be used as center points for voronoi - cells. - - Returns - ------- - areas : array - An approximation of the voronoi cells' areas. - all_candidates: list of arrays - A list of samples in each voronoi cell. - """ - n_samples = samples.shape[0] - ndim = samples.shape[1] - - # Compute the number of random points - n_points = w * samples.shape[0] - # Generate w random points in the domain for each sample - points = self.ExpDesign.generate_samples(n_points, 'random') - self.all_candidates = points - - # Calculate the nearest sample to each point - self.areas = np.zeros((n_samples)) - self.closest_points = [np.empty((0, ndim)) for i in range(n_samples)] - - # Compute the minimum distance from all the samples of old_ED_X for - # each test point - for idx in range(n_points): - # calculate the minimum distance - distances = self._build_dist_matrix_point( - samples, points[idx], do_sqrt=True - ) - closest_sample = np.argmin(distances) - - # Add to the voronoi list of the closest sample - self.areas[closest_sample] = self.areas[closest_sample] + 1 - prev_closest_points = self.closest_points[closest_sample] - self.closest_points[closest_sample] = np.vstack( - (prev_closest_points, points[idx]) - ) - - # Divide by the amount of points to get the estimated volume of each - # voronoi cell - self.areas /= n_points - - self.perc = np.max(self.areas * 100) - - self.errors = self.areas - - return self.areas, self.all_candidates - - # ------------------------------------------------------------------------- - def _build_dist_matrix_point(self, samples, point, method='euclidean', - do_sqrt=False): - """ - Calculates the intersite distance of all points in samples from point. - - Parameters - ---------- - samples : array of shape (n_samples, n_params) - The old experimental design. - point : array - A candidate point. - method : str - Distance method. - do_sqrt : bool, optional - Whether to return distances or squared distances. The default is - `False`. - - Returns - ------- - distances : array - Distances. - - """ - distances = distance.cdist(samples, np.array([point]), method) - - # do square root? - if do_sqrt: - return distances - else: - return distances**2 - diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/glexindex.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/glexindex.py deleted file mode 100644 index 90877331e..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/glexindex.py +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Multi indices for monomial exponents. -Credit: Jonathan Feinberg -https://github.com/jonathf/numpoly/blob/master/numpoly/utils/glexindex.py -""" - -import numpy -import numpy.typing - - -def glexindex(start, stop=None, dimensions=1, cross_truncation=1., - graded=False, reverse=False): - """ - Generate graded lexicographical multi-indices for the monomial exponents. - Args: - start (Union[int, numpy.ndarray]): - The lower order of the indices. If array of int, counts as lower - bound for each axis. - stop (Union[int, numpy.ndarray, None]): - The maximum shape included. If omitted: stop <- start; start <- 0 - If int is provided, set as largest total order. If array of int, - set as upper bound for each axis. - dimensions (int): - The number of dimensions in the expansion. - cross_truncation (float, Tuple[float, float]): - Use hyperbolic cross truncation scheme to reduce the number of - terms in expansion. If two values are provided, first is low bound - truncation, while the latter upper bound. If only one value, upper - bound is assumed. - graded (bool): - Graded sorting, meaning the indices are always sorted by the index - sum. E.g. ``(2, 2, 2)`` has a sum of 6, and will therefore be - consider larger than both ``(3, 1, 1)`` and ``(1, 1, 3)``. - reverse (bool): - Reversed lexicographical sorting meaning that ``(1, 3)`` is - considered smaller than ``(3, 1)``, instead of the opposite. - Returns: - list: - Order list of indices. - Examples: - >>> numpoly.glexindex(4).tolist() - [[0], [1], [2], [3]] - >>> numpoly.glexindex(2, dimensions=2).tolist() - [[0, 0], [1, 0], [0, 1]] - >>> numpoly.glexindex(start=2, stop=3, dimensions=2).tolist() - [[2, 0], [1, 1], [0, 2]] - >>> numpoly.glexindex([1, 2, 3]).tolist() - [[0, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 2]] - >>> numpoly.glexindex([1, 2, 3], cross_truncation=numpy.inf).tolist() - [[0, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 1], [0, 0, 2], [0, 1, 2]] - """ - if stop is None: - start, stop = 0, start - start = numpy.array(start, dtype=int).flatten() - stop = numpy.array(stop, dtype=int).flatten() - start, stop, _ = numpy.broadcast_arrays(start, stop, numpy.empty(dimensions)) - - cross_truncation = cross_truncation*numpy.ones(2) - - # Moved here from _glexindex - bound = stop.max() - dimensions = len(start) - start = numpy.clip(start, a_min=0, a_max=None) - dtype = numpy.uint8 if bound < 256 else numpy.uint16 - range_ = numpy.arange(bound, dtype=dtype) - indices = range_[:, numpy.newaxis] - - for idx in range(dimensions-1): - - # Truncate at each step to keep memory usage low - if idx: - indices = indices[cross_truncate(indices, bound-1, cross_truncation[1])] - - # Repeats the current set of indices. - # e.g. [0,1,2] -> [0,1,2,0,1,2,...,0,1,2] - indices = numpy.tile(indices, (bound, 1)) - - # Stretches ranges over the new dimension. - # e.g. [0,1,2] -> [0,0,...,0,1,1,...,1,2,2,...,2] - front = range_.repeat(len(indices)//bound)[:, numpy.newaxis] - - # Puts them two together. - indices = numpy.column_stack((front, indices)) - - # Complete the truncation scheme - if dimensions == 1: - indices = indices[(indices >= start) & (indices < bound)] - else: - lower = cross_truncate(indices, start-1, cross_truncation[0]) - upper = cross_truncate(indices, stop-1, cross_truncation[1]) - indices = indices[lower ^ upper] - - indices = numpy.array(indices, dtype=int).reshape(-1, dimensions) - if indices.size: - # moved here from glexsort - keys = indices.T - keys_ = numpy.atleast_2d(keys) - if reverse: - keys_ = keys_[::-1] - - indices_sort = numpy.array(numpy.lexsort(keys_)) - if graded: - indices_sort = indices_sort[numpy.argsort( - numpy.sum(keys_[:, indices_sort], axis=0))].T - - indices = indices[indices_sort] - return indices - -def cross_truncate(indices, bound, norm): - r""" - Truncate of indices using L_p norm. - .. math: - L_p(x) = \sum_i |x_i/b_i|^p ^{1/p} \leq 1 - where :math:`b_i` are bounds that each :math:`x_i` should follow. - Args: - indices (Sequence[int]): - Indices to be truncated. - bound (int, Sequence[int]): - The bound function for witch the indices can not be larger than. - norm (float, Sequence[float]): - The `p` in the `L_p`-norm. Support includes both `L_0` and `L_inf`. - Returns: - Boolean indices to ``indices`` with True for each index where the - truncation criteria holds. - Examples: - >>> indices = numpy.array(numpy.mgrid[:10, :10]).reshape(2, -1).T - >>> indices[cross_truncate(indices, 2, norm=0)].T - array([[0, 0, 0, 1, 2], - [0, 1, 2, 0, 0]]) - >>> indices[cross_truncate(indices, 2, norm=1)].T - array([[0, 0, 0, 1, 1, 2], - [0, 1, 2, 0, 1, 0]]) - >>> indices[cross_truncate(indices, [0, 1], norm=1)].T - array([[0, 0], - [0, 1]]) - """ - assert norm >= 0, "negative L_p norm not allowed" - bound = numpy.asfarray(bound).flatten()*numpy.ones(indices.shape[1]) - - if numpy.any(bound < 0): - return numpy.zeros((len(indices),), dtype=bool) - - if numpy.any(bound == 0): - out = numpy.all(indices[:, bound == 0] == 0, axis=-1) - if numpy.any(bound): - out &= cross_truncate(indices[:, bound != 0], bound[bound != 0], norm=norm) - return out - - if norm == 0: - out = numpy.sum(indices > 0, axis=-1) <= 1 - out[numpy.any(indices > bound, axis=-1)] = False - elif norm == numpy.inf: - out = numpy.max(indices/bound, axis=-1) <= 1 - else: - out = numpy.sum((indices/bound)**norm, axis=-1)**(1./norm) <= 1 - - assert numpy.all(out[numpy.all(indices == 0, axis=-1)]) - - return out diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/input_space.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/input_space.py deleted file mode 100644 index 3160ba2d0..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/input_space.py +++ /dev/null @@ -1,395 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import numpy as np -import chaospy -import scipy.stats as st - - -class InputSpace: - """ - This class generates the input space for the metamodel from the - distributions provided using the `Input` object. - - Attributes - ---------- - Input : obj - Input object containing the parameter marginals, i.e. name, - distribution type and distribution parameters or available raw data. - meta_Model_type : str - Type of the meta_Model_type. - - """ - - def __init__(self, Input, meta_Model_type='pce'): - self.InputObj = Input - self.meta_Model_type = meta_Model_type - - # Other - self.apce = None - self.ndim = None - - # Init - self.check_valid_inputs() - - - def check_valid_inputs(self)-> None: - """ - Check if the given InputObj is valid to use for further calculations: - Has some Marginals - Marginals have valid priors - All Marginals given as the same type (samples vs dist) - - Returns - ------- - None - - """ - Inputs = self.InputObj - self.ndim = len(Inputs.Marginals) - - # Check if PCE or aPCE metamodel is selected. - # TODO: test also for 'pce'?? - if self.meta_Model_type.lower() == 'apce': - self.apce = True - else: - self.apce = False - - # check if marginals given - if not self.ndim >=1: - raise AssertionError('Cannot build distributions if no marginals are given') - - # check that each marginal is valid - for marginals in Inputs.Marginals: - if len(marginals.input_data) == 0: - if marginals.dist_type == None: - raise AssertionError('Not all marginals were provided priors') - break - if np.array(marginals.input_data).shape[0] and (marginals.dist_type != None): - raise AssertionError('Both samples and distribution type are given. Please choose only one.') - break - - # Check if input is given as dist or input_data. - self.input_data_given = -1 - for marg in Inputs.Marginals: - #print(self.input_data_given) - size = np.array(marg.input_data).shape[0] - #print(f'Size: {size}') - if size and abs(self.input_data_given) !=1: - self.input_data_given = 2 - break - if (not size) and self.input_data_given > 0: - self.input_data_given = 2 - break - if not size: - self.input_data_given = 0 - if size: - self.input_data_given = 1 - - if self.input_data_given == 2: - raise AssertionError('Distributions cannot be built as the priors have different types') - - - # Get the bounds if input_data are directly defined by user: - if self.input_data_given: - for i in range(self.ndim): - low_bound = np.min(Inputs.Marginals[i].input_data) - up_bound = np.max(Inputs.Marginals[i].input_data) - Inputs.Marginals[i].parameters = [low_bound, up_bound] - - - - # ------------------------------------------------------------------------- - def init_param_space(self, max_deg=None): - """ - Initializes parameter space. - - Parameters - ---------- - max_deg : int, optional - Maximum degree. The default is `None`. - - Creates - ------- - raw_data : array of shape (n_params, n_samples) - Raw data. - bound_tuples : list of tuples - A list containing lower and upper bounds of parameters. - - """ - # Recheck all before running! - self.check_valid_inputs() - - Inputs = self.InputObj - ndim = self.ndim - rosenblatt_flag = Inputs.Rosenblatt - mc_size = 50000 - - # Save parameter names - self.par_names = [] - for parIdx in range(ndim): - self.par_names.append(Inputs.Marginals[parIdx].name) - - # Create a multivariate probability distribution - # TODO: change this to make max_deg obligatory? at least in some specific cases? - if max_deg is not None: - JDist, poly_types = self.build_polytypes(rosenblatt=rosenblatt_flag) - self.JDist, self.poly_types = JDist, poly_types - - if self.input_data_given: - self.MCSize = len(Inputs.Marginals[0].input_data) - self.raw_data = np.zeros((ndim, self.MCSize)) - - for parIdx in range(ndim): - # Save parameter names - try: - self.raw_data[parIdx] = np.array( - Inputs.Marginals[parIdx].input_data) - except: - self.raw_data[parIdx] = self.JDist[parIdx].sample(mc_size) - - else: - # Generate random samples based on parameter distributions - self.raw_data = chaospy.generate_samples(mc_size, - domain=self.JDist) - - # Extract moments - for parIdx in range(ndim): - mu = np.mean(self.raw_data[parIdx]) - std = np.std(self.raw_data[parIdx]) - self.InputObj.Marginals[parIdx].moments = [mu, std] - - # Generate the bounds based on given inputs for marginals - bound_tuples = [] - for i in range(ndim): - if Inputs.Marginals[i].dist_type == 'unif': - low_bound = Inputs.Marginals[i].parameters[0] - up_bound = Inputs.Marginals[i].parameters[1] - else: - low_bound = np.min(self.raw_data[i]) - up_bound = np.max(self.raw_data[i]) - - bound_tuples.append((low_bound, up_bound)) - - self.bound_tuples = tuple(bound_tuples) - - # ------------------------------------------------------------------------- - def build_polytypes(self, rosenblatt): - """ - Creates the polynomial types to be passed to univ_basis_vals method of - the MetaModel object. - - Parameters - ---------- - rosenblatt : bool - Rosenblatt transformation flag. - - Returns - ------- - orig_space_dist : object - A chaospy JDist object or a gaussian_kde object. - poly_types : list - List of polynomial types for the parameters. - - """ - Inputs = self.InputObj - - all_data = [] - all_dist_types = [] - orig_joints = [] - poly_types = [] - - for parIdx in range(self.ndim): - - if Inputs.Marginals[parIdx].dist_type is None: - data = Inputs.Marginals[parIdx].input_data - all_data.append(data) - dist_type = None - else: - dist_type = Inputs.Marginals[parIdx].dist_type - params = Inputs.Marginals[parIdx].parameters - - if rosenblatt: - polytype = 'hermite' - dist = chaospy.Normal() - - elif dist_type is None: - polytype = 'arbitrary' - dist = None - - elif 'unif' in dist_type.lower(): - polytype = 'legendre' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Uniform(lower=params[0], upper=params[1]) - - elif 'norm' in dist_type.lower() and \ - 'log' not in dist_type.lower(): - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - polytype = 'hermite' - dist = chaospy.Normal(mu=params[0], sigma=params[1]) - - elif 'gamma' in dist_type.lower(): - polytype = 'laguerre' - if not np.array(params).shape[0]>=3: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Gamma(shape=params[0], - scale=params[1], - shift=params[2]) - - elif 'beta' in dist_type.lower(): - if not np.array(params).shape[0]>=4: - raise AssertionError('Distribution has too few parameters!') - polytype = 'jacobi' - dist = chaospy.Beta(alpha=params[0], beta=params[1], - lower=params[2], upper=params[3]) - - elif 'lognorm' in dist_type.lower(): - polytype = 'hermite' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - mu = np.log(params[0]**2/np.sqrt(params[0]**2 + params[1]**2)) - sigma = np.sqrt(np.log(1 + params[1]**2 / params[0]**2)) - dist = chaospy.LogNormal(mu, sigma) - # dist = chaospy.LogNormal(mu=params[0], sigma=params[1]) - - elif 'expon' in dist_type.lower(): - polytype = 'exponential' - if not np.array(params).shape[0]>=2: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Exponential(scale=params[0], shift=params[1]) - - elif 'weibull' in dist_type.lower(): - polytype = 'weibull' - if not np.array(params).shape[0]>=3: - raise AssertionError('Distribution has too few parameters!') - dist = chaospy.Weibull(shape=params[0], scale=params[1], - shift=params[2]) - - else: - message = (f"DistType {dist_type} for parameter" - f"{parIdx+1} is not available.") - raise ValueError(message) - - if self.input_data_given or self.apce: - polytype = 'arbitrary' - - # Store dists and poly_types - orig_joints.append(dist) - poly_types.append(polytype) - all_dist_types.append(dist_type) - - # Prepare final output to return - if None in all_dist_types: - # Naive approach: Fit a gaussian kernel to the provided data - Data = np.asarray(all_data) - try: - orig_space_dist = st.gaussian_kde(Data) - except: - raise ValueError('The samples provided to the Marginals should be 1D only') - self.prior_space = orig_space_dist - else: - orig_space_dist = chaospy.J(*orig_joints) - try: - self.prior_space = st.gaussian_kde(orig_space_dist.sample(10000)) - except: - raise ValueError('Parameter values are not valid, please set differently') - - return orig_space_dist, poly_types - - # ------------------------------------------------------------------------- - def transform(self, X, params=None, method=None): - """ - Transforms the samples via either a Rosenblatt or an isoprobabilistic - transformation. - - Parameters - ---------- - X : array of shape (n_samples,n_params) - Samples to be transformed. - method : string - If transformation method is 'user' transform X, else just pass X. - - Returns - ------- - tr_X: array of shape (n_samples,n_params) - Transformed samples. - - """ - # Check for built JDist - if not hasattr(self, 'JDist'): - raise AttributeError('Call function init_param_space first to create JDist') - - # Check if X is 2d - if X.ndim != 2: - raise AttributeError('X should have two dimensions') - - # Check if size of X matches Marginals - if X.shape[1]!= self.ndim: - raise AttributeError('The second dimension of X should be the same size as the number of marginals in the InputObj') - - if self.InputObj.Rosenblatt: - self.origJDist, _ = self.build_polytypes(False) - if method == 'user': - tr_X = self.JDist.inv(self.origJDist.fwd(X.T)).T - else: - # Inverse to original spcace -- generate sample ED - tr_X = self.origJDist.inv(self.JDist.fwd(X.T)).T - else: - # Transform samples via an isoprobabilistic transformation - n_samples, n_params = X.shape - Inputs = self.InputObj - origJDist = self.JDist - poly_types = self.poly_types - - disttypes = [] - for par_i in range(n_params): - disttypes.append(Inputs.Marginals[par_i].dist_type) - - # Pass non-transformed X, if arbitrary PCE is selected. - if None in disttypes or self.input_data_given or self.apce: - return X - - cdfx = np.zeros((X.shape)) - tr_X = np.zeros((X.shape)) - - for par_i in range(n_params): - - # Extract the parameters of the original space - disttype = disttypes[par_i] - if disttype is not None: - dist = origJDist[par_i] - else: - dist = None - polytype = poly_types[par_i] - cdf = np.vectorize(lambda x: dist.cdf(x)) - - # Extract the parameters of the transformation space based on - # polyType - if polytype == 'legendre' or disttype == 'uniform': - # Generate Y_Dists based - params_Y = [-1, 1] - dist_Y = st.uniform(loc=params_Y[0], - scale=params_Y[1]-params_Y[0]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'hermite' or disttype == 'norm': - params_Y = [0, 1] - dist_Y = st.norm(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'laguerre' or disttype == 'gamma': - if params == None: - raise AttributeError('Additional parameters have to be set for the gamma distribution!') - params_Y = [1, params[1]] - dist_Y = st.gamma(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - # Compute CDF_x(X) - cdfx[:, par_i] = cdf(X[:, par_i]) - - # Compute invCDF_y(cdfx) - tr_X[:, par_i] = inv_cdf(cdfx[:, par_i]) - - return tr_X diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/inputs.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/inputs.py deleted file mode 100644 index 783e82b05..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/inputs.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -class Input: - """ - A class to define the uncertain input parameters. - - Attributes - ---------- - Marginals : obj - Marginal objects. See `inputs.Marginal`. - Rosenblatt : bool - If Rossenblatt transformation is required for the dependent input - parameters. - - Examples - ------- - Marginals can be defined as following: - - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].dist_type = 'uniform' - >>> Inputs.Marginals[0].parameters = [-5, 5] - - If there is no common data is avaliable, the input data can be given - as following: - - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].input_data = input_data - """ - poly_coeffs_flag = True - - def __init__(self): - self.Marginals = [] - self.Rosenblatt = False - - def add_marginals(self): - """ - Adds a new Marginal object to the input object. - - Returns - ------- - None. - - """ - self.Marginals.append(Marginal()) - - -# Nested class -class Marginal: - """ - An object containing the specifications of the marginals for each uncertain - parameter. - - Attributes - ---------- - name : string - Name of the parameter. The default is `'$x_1$'`. - dist_type : string - Name of the distribution. The default is `None`. - parameters : list - List of the parameters corresponding to the distribution type. The - default is `None`. - input_data : array - Available input data. The default is `[]`. - moments : list - List of the moments. - """ - - def __init__(self): - self.name = '$x_1$' - self.dist_type = None - self.parameters = None - self.input_data = [] - self.moments = None diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py deleted file mode 100644 index 96ef9c1d5..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jul 15 14:08:59 2022 - -@author: farid -""" -import numpy as np -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -from sklearn.utils import check_X_y - - -def corr(x, y): - return abs(x.dot(y))/np.sqrt((x**2).sum()) - - -class OrthogonalMatchingPursuit(LinearModel, RegressorMixin): - ''' - Regression with Orthogonal Matching Pursuit [1]. - - Parameters - ---------- - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - References - ---------- - [1] Pati, Y., Rezaiifar, R., Krishnaprasad, P. (1993). Orthogonal matching - pursuit: recursive function approximation with application to wavelet - decomposition. Proceedings of 27th Asilomar Conference on Signals, - Systems and Computers, 40-44. - ''' - - def __init__(self, fit_intercept=True, normalize=False, copy_X=True, - verbose=False): - self.fit_intercept = fit_intercept - self.normalize = normalize - self.copy_X = copy_X - self.verbose = verbose - - def _preprocess_data(self, X, y): - """Center and scale data. - Centers data to have mean zero along axis 0. If fit_intercept=False or - if the X is a sparse matrix, no centering is done, but normalization - can still be applied. The function returns the statistics necessary to - reconstruct the input data, which are X_offset, y_offset, X_scale, such - that the output - X = (X - X_offset) / X_scale - X_scale is the L2 norm of X - X_offset. - """ - - if self.copy_X: - X = X.copy(order='K') - - y = np.asarray(y, dtype=X.dtype) - - if self.fit_intercept: - X_offset = np.average(X, axis=0) - X -= X_offset - if self.normalize: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - std = np.sqrt(np.sum(X**2, axis=0)/(len(X)-1)) - X_scale[std != 0] = std[std != 0] - X /= X_scale - else: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - y_offset = np.mean(y) - y = y - y_offset - else: - X_offset = np.zeros(X.shape[1], dtype=X.dtype) - X_scale = np.ones(X.shape[1], dtype=X.dtype) - if y.ndim == 1: - y_offset = X.dtype.type(0) - else: - y_offset = np.zeros(y.shape[1], dtype=X.dtype) - - return X, y, X_offset, y_offset, X_scale - - def fit(self, X, y): - ''' - Fits Regression with Orthogonal Matching Pursuit Algorithm. - - Parameters - ----------- - X: {array-like, sparse matrix} of size (n_samples, n_features) - Training data, matrix of explanatory variables - - y: array-like of size [n_samples, n_features] - Target values - - Returns - ------- - self : object - Returns self. - ''' - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._preprocess_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # Normalize columns of Psi, so that each column has norm = 1 - norm_X = np.linalg.norm(X, axis=0) - X_norm = X/norm_X - - # Initialize residual vector to full model response and normalize - R = y - norm_y = np.sqrt(np.dot(y, y)) - r = y/norm_y - - # Check for constant regressors - const_indices = np.where(~np.diff(X, axis=0).any(axis=0))[0] - bool_const = not const_indices - - # Start regression using OPM algorithm - precision = 0 # Set precision criterion to precision of program - early_stop = True - cond_early = True # Initialize condition for early stop - ind = [] - iindx = [] # index of selected columns - indtot = np.arange(n_features) # Full index set for remaining columns - kmax = min(n_samples, n_features) # Maximum number of iterations - LOO = np.PINF * np.ones(kmax) # Store LOO error at each iteration - LOOmin = np.PINF # Initialize minimum value of LOO - coeff = np.zeros((n_features, kmax)) - count = 0 - k = 0.1 # Percentage of iteration history for early stop - - # Begin iteration over regressors set (Matrix X) - while (np.linalg.norm(R) > precision) and (count <= kmax-1) and \ - ((cond_early or early_stop) ^ ~cond_early): - - # Update index set of columns yet to select - if count != 0: - indtot = np.delete(indtot, iindx) - - # Find column of X that is most correlated with residual - h = abs(np.dot(r, X_norm)) - iindx = np.argmax(h[indtot]) - indx = indtot[iindx] - - # initialize with the constant regressor, if it exists in the basis - if (count == 0) and bool_const: - # overwrite values for iindx and indx - iindx = const_indices[0] - indx = indtot[iindx] - - # Invert the information matrix at the first iteration, later only - # update its value on the basis of the previously inverted one, - if count == 0: - M = 1 / np.dot(X[:, indx], X[:, indx]) - else: - x = np.dot(X[:, ind].T, X[:, indx]) - r = np.dot(X[:, indx], X[:, indx]) - M = self.blockwise_inverse(M, x, x.T, r) - - # Add newly found index to the selected indexes set - ind.append(indx) - - # Select regressors subset (Projection subspace) - Xpro = X[:, ind] - - # Obtain coefficient by performing OLS - TT = np.dot(y, Xpro) - beta = np.dot(M, TT) - coeff[ind, count] = beta - - # Compute LOO error - LOO[count] = self.loo_error(Xpro, M, y, beta) - - # Compute new residual due to new projection - R = y - np.dot(Xpro, beta) - - # Normalize residual - norm_R = np.sqrt(np.dot(R, R)) - r = R / norm_R - - # Update counters and early-stop criterions - countinf = max(0, int(count-k*kmax)) - LOOmin = min(LOOmin, LOO[count]) - - if count == 0: - cond_early = (LOO[0] <= LOOmin) - else: - cond_early = (min(LOO[countinf:count+1]) <= LOOmin) - - if self.verbose: - print(f'Iteration: {count+1}, mod. LOOCV error : ' - f'{LOO[count]:.2e}') - - # Update counter - count += 1 - - # Select projection with smallest cross-validation error - countmin = np.argmin(LOO[:-1]) - self.coef_ = coeff[:, countmin] - self.active = coeff[:, countmin] != 0.0 - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self, X): - ''' - Computes predictive distribution for test set. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - ''' - - y_hat = np.dot(X, self.coef_) + self.intercept_ - - return y_hat - - def loo_error(self, psi, inv_inf_matrix, y, coeffs): - """ - Calculates the corrected LOO error for regression on regressor - matrix `psi` that generated the coefficients based on [1] and [2]. - - [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for - uncertainty propagation and sensitivity analysis (Doctoral - dissertation, Clermont-Ferrand 2). - - [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos - expansion based on least angle regression. Journal of computational - Physics, 230(6), pp.2345-2367. - - Parameters - ---------- - psi : array of shape (n_samples, n_feature) - Orthogonal bases evaluated at the samples. - inv_inf_matrix : array - Inverse of the information matrix. - y : array of shape (n_samples, ) - Targets. - coeffs : array - Computed regresssor cofficients. - - Returns - ------- - loo_error : float - Modified LOOCV error. - - """ - - # NrEvaluation (Size of experimental design) - N, P = psi.shape - - # h factor (the full matrix is not calculated explicitly, - # only the trace is, to save memory) - PsiM = np.dot(psi, inv_inf_matrix) - - h = np.sum(np.multiply(PsiM, psi), axis=1, dtype=np.longdouble) - - # ------ Calculate Error Loocv for each measurement point ---- - # Residuals - residual = np.dot(psi, coeffs) - y - - # Variance - varY = np.var(y) - - if varY == 0: - norm_emp_error = 0 - loo_error = 0 - else: - norm_emp_error = np.mean(residual**2)/varY - - loo_error = np.mean(np.square(residual / (1-h))) / varY - - # if there are NaNs, just return an infinite LOO error (this - # happens, e.g., when a strongly underdetermined problem is solved) - if np.isnan(loo_error): - loo_error = np.inf - - # Corrected Error for over-determined system - tr_M = np.trace(np.atleast_2d(inv_inf_matrix)) - if tr_M < 0 or abs(tr_M) > 1e6: - tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) - - # Over-determined system of Equation - if N > P: - T_factor = N/(N-P) * (1 + tr_M) - - # Under-determined system of Equation - else: - T_factor = np.inf - - loo_error *= T_factor - - return loo_error - - def blockwise_inverse(self, Ainv, B, C, D): - """ - non-singular square matrix M defined as M = [[A B]; [C D]] . - B, C and D can have any dimension, provided their combination defines - a square matrix M. - - Parameters - ---------- - Ainv : float or array - inverse of the square-submatrix A. - B : float or array - Information matrix with all new regressor. - C : float or array - Transpose of B. - D : float or array - Information matrix with all selected regressors. - - Returns - ------- - M : array - Inverse of the information matrix. - - """ - if np.isscalar(D): - # Inverse of D - Dinv = 1/D - # Schur complement - SCinv = 1/(D - np.dot(C, np.dot(Ainv, B[:, None])))[0] - else: - # Inverse of D - Dinv = np.linalg.solve(D, np.eye(D.shape)) - # Schur complement - SCinv = np.linalg.solve((D - C*Ainv*B), np.eye(D.shape)) - - T1 = np.dot(Ainv, np.dot(B[:, None], SCinv)) - T2 = np.dot(C, Ainv) - - # Assemble the inverse matrix - M = np.vstack(( - np.hstack((Ainv+T1*T2, -T1)), - np.hstack((-(SCinv)*T2, SCinv)) - )) - return M diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_ard.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_ard.py deleted file mode 100644 index e6883a3ed..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_ard.py +++ /dev/null @@ -1,475 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Tue Mar 24 19:41:45 2020 - -@author: farid -""" -import numpy as np -from scipy.linalg import solve_triangular -from numpy.linalg import LinAlgError -from sklearn.base import RegressorMixin -from sklearn.linear_model._base import LinearModel -import warnings -from sklearn.utils import check_X_y -from scipy.linalg import pinvh - - -def update_precisions(Q,S,q,s,A,active,tol,n_samples,clf_bias): - ''' - Selects one feature to be added/recomputed/deleted to model based on - effect it will have on value of log marginal likelihood. - ''' - # initialise vector holding changes in log marginal likelihood - deltaL = np.zeros(Q.shape[0]) - - # identify features that can be added , recomputed and deleted in model - theta = q**2 - s - add = (theta > 0) * (active == False) - recompute = (theta > 0) * (active == True) - delete = ~(add + recompute) - - # compute sparsity & quality parameters corresponding to features in - # three groups identified above - Qadd,Sadd = Q[add], S[add] - Qrec,Srec,Arec = Q[recompute], S[recompute], A[recompute] - Qdel,Sdel,Adel = Q[delete], S[delete], A[delete] - - # compute new alpha's (precision parameters) for features that are - # currently in model and will be recomputed - Anew = s[recompute]**2/ ( theta[recompute] + np.finfo(np.float32).eps) - delta_alpha = (1./Anew - 1./Arec) - - # compute change in log marginal likelihood - deltaL[add] = ( Qadd**2 - Sadd ) / Sadd + np.log(Sadd/Qadd**2 ) - deltaL[recompute] = Qrec**2 / (Srec + 1. / delta_alpha) - np.log(1 + Srec*delta_alpha) - deltaL[delete] = Qdel**2 / (Sdel - Adel) - np.log(1 - Sdel / Adel) - deltaL = deltaL / n_samples - - # find feature which caused largest change in likelihood - feature_index = np.argmax(deltaL) - - # no deletions or additions - same_features = np.sum( theta[~recompute] > 0) == 0 - - # changes in precision for features already in model is below threshold - no_delta = np.sum( abs( Anew - Arec ) > tol ) == 0 - # if same_features: print(abs( Anew - Arec )) - # print("same_features = {} no_delta = {}".format(same_features,no_delta)) - # check convergence: if no features to add or delete and small change in - # precision for current features then terminate - converged = False - if same_features and no_delta: - converged = True - return [A,converged] - - # if not converged update precision parameter of weights and return - if theta[feature_index] > 0: - A[feature_index] = s[feature_index]**2 / theta[feature_index] - if active[feature_index] == False: - active[feature_index] = True - else: - # at least two active features - if active[feature_index] == True and np.sum(active) >= 2: - # do not remove bias term in classification - # (in regression it is factored in through centering) - if not (feature_index == 0 and clf_bias): - active[feature_index] = False - A[feature_index] = np.PINF - - return [A,converged] - - -class RegressionFastARD(LinearModel, RegressorMixin): - ''' - Regression with Automatic Relevance Determination (Fast Version uses - Sparse Bayesian Learning) - https://github.com/AmazaspShumik/sklearn-bayes/blob/master/skbayes/rvm_ard_models/fast_rvm.py - - Parameters - ---------- - n_iter: int, optional (DEFAULT = 100) - Maximum number of iterations - - start: list, optional (DEFAULT = None) - Initial selected features. - - tol: float, optional (DEFAULT = 1e-3) - If absolute change in precision parameter for weights is below threshold - algorithm terminates. - - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - compute_score : bool, default=False - If True, compute the log marginal likelihood at each iteration of the - optimization. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - alpha_ : float - estimated precision of the noise - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - lambda_ : array, shape = (n_features) - estimated precisions of the coefficients - - sigma_ : array, shape = (n_features, n_features) - estimated covariance matrix of the weights, computed only - for non-zero coefficients - - scores_ : array-like of shape (n_iter_+1,) - If computed_score is True, value of the log marginal likelihood (to be - maximized) at each iteration of the optimization. - - References - ---------- - [1] Fast marginal likelihood maximisation for sparse Bayesian models - (Tipping & Faul 2003) (http://www.miketipping.com/papers/met-fastsbl.pdf) - [2] Analysis of sparse Bayesian learning (Tipping & Faul 2001) - (http://www.miketipping.com/abstracts.htm#Faul:NIPS01) - ''' - - def __init__(self, n_iter=300, start=None, tol=1e-3, fit_intercept=True, - normalize=False, copy_X=True, compute_score=False, verbose=False): - self.n_iter = n_iter - self.start = start - self.tol = tol - self.scores_ = list() - self.fit_intercept = fit_intercept - self.normalize = normalize - self.copy_X = copy_X - self.compute_score = compute_score - self.verbose = verbose - - def _preprocess_data(self, X, y): - """Center and scale data. - Centers data to have mean zero along axis 0. If fit_intercept=False or - if the X is a sparse matrix, no centering is done, but normalization - can still be applied. The function returns the statistics necessary to - reconstruct the input data, which are X_offset, y_offset, X_scale, such - that the output - X = (X - X_offset) / X_scale - X_scale is the L2 norm of X - X_offset. - """ - - if self.copy_X: - X = X.copy(order='K') - - y = np.asarray(y, dtype=X.dtype) - - if self.fit_intercept: - X_offset = np.average(X, axis=0) - X -= X_offset - if self.normalize: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - std = np.sqrt(np.sum(X**2, axis=0)/(len(X)-1)) - X_scale[std != 0] = std[std != 0] - X /= X_scale - else: - X_scale = np.ones(X.shape[1], dtype=X.dtype) - y_offset = np.mean(y) - y = y - y_offset - else: - X_offset = np.zeros(X.shape[1], dtype=X.dtype) - X_scale = np.ones(X.shape[1], dtype=X.dtype) - if y.ndim == 1: - y_offset = X.dtype.type(0) - else: - y_offset = np.zeros(y.shape[1], dtype=X.dtype) - - return X, y, X_offset, y_offset, X_scale - - def fit(self, X, y): - ''' - Fits ARD Regression with Sequential Sparse Bayes Algorithm. - - Parameters - ----------- - X: {array-like, sparse matrix} of size (n_samples, n_features) - Training data, matrix of explanatory variables - - y: array-like of size [n_samples, n_features] - Target values - - Returns - ------- - self : object - Returns self. - ''' - X, y = check_X_y(X, y, dtype=np.float64, y_numeric=True) - n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._preprocess_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # precompute X'*Y , X'*X for faster iterations & allocate memory for - # sparsity & quality vectors - XY = np.dot(X.T, y) - XX = np.dot(X.T, X) - XXd = np.diag(XX) - - # initialise precision of noise & and coefficients - var_y = np.var(y) - - # check that variance is non zero !!! - if var_y == 0: - beta = 1e-2 - self.var_y = True - else: - beta = 1. / np.var(y) - self.var_y = False - - A = np.PINF * np.ones(n_features) - active = np.zeros(n_features, dtype=np.bool) - - if self.start is not None and not hasattr(self, 'active_'): - start = self.start - # start from a given start basis vector - proj = XY**2 / XXd - active[start] = True - A[start] = XXd[start]/(proj[start] - var_y) - - else: - # in case of almost perfect multicollinearity between some features - # start from feature 0 - if np.sum(XXd - X_mean**2 < np.finfo(np.float32).eps) > 0: - A[0] = np.finfo(np.float16).eps - active[0] = True - - else: - # start from a single basis vector with largest projection on - # targets - proj = XY**2 / XXd - start = np.argmax(proj) - active[start] = True - A[start] = XXd[start]/(proj[start] - var_y + - np.finfo(np.float32).eps) - - warning_flag = 0 - scores_ = [] - for i in range(self.n_iter): - # Handle variance zero - if self.var_y: - A[0] = y_mean - active[0] = True - converged = True - break - - XXa = XX[active, :][:, active] - XYa = XY[active] - Aa = A[active] - - # mean & covariance of posterior distribution - Mn, Ri, cholesky = self._posterior_dist(Aa, beta, XXa, XYa) - if cholesky: - Sdiag = np.sum(Ri**2, 0) - else: - Sdiag = np.copy(np.diag(Ri)) - warning_flag += 1 - - # raise warning in case cholesky fails - if warning_flag == 1: - warnings.warn(("Cholesky decomposition failed! Algorithm uses " - "pinvh, which is significantly slower. If you " - "use RVR it is advised to change parameters of " - "the kernel!")) - - # compute quality & sparsity parameters - s, q, S, Q = self._sparsity_quality(XX, XXd, XY, XYa, Aa, Ri, - active, beta, cholesky) - - # update precision parameter for noise distribution - rss = np.sum((y - np.dot(X[:, active], Mn))**2) - - # if near perfect fit , then terminate - if (rss / n_samples/var_y) < self.tol: - warnings.warn('Early termination due to near perfect fit') - converged = True - break - beta = n_samples - np.sum(active) + np.sum(Aa * Sdiag) - beta /= rss - # beta /= (rss + np.finfo(np.float32).eps) - - # update precision parameters of coefficients - A, converged = update_precisions(Q, S, q, s, A, active, self.tol, - n_samples, False) - - if self.compute_score: - scores_.append(self.log_marginal_like(XXa, XYa, Aa, beta)) - - if self.verbose: - print(('Iteration: {0}, number of features ' - 'in the model: {1}').format(i, np.sum(active))) - - if converged or i == self.n_iter - 1: - if converged and self.verbose: - print('Algorithm converged!') - break - - # after last update of alpha & beta update parameters - # of posterior distribution - XXa, XYa, Aa = XX[active, :][:, active], XY[active], A[active] - Mn, Sn, cholesky = self._posterior_dist(Aa, beta, XXa, XYa, True) - self.coef_ = np.zeros(n_features) - self.coef_[active] = Mn - self.sigma_ = Sn - self.active_ = active - self.lambda_ = A - self.alpha_ = beta - self.converged = converged - if self.compute_score: - self.scores_ = np.array(scores_) - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - return self - - def log_marginal_like(self, XXa, XYa, Aa, beta): - """Computes the log of the marginal likelihood.""" - N, M = XXa.shape - A = np.diag(Aa) - - Mn, sigma_, cholesky = self._posterior_dist(Aa, beta, XXa, XYa, - full_covar=True) - - C = sigma_ + np.dot(np.dot(XXa.T, np.linalg.pinv(A)), XXa) - - score = np.dot(np.dot(XYa.T, np.linalg.pinv(C)), XYa) +\ - np.log(np.linalg.det(C)) + N * np.log(2 * np.pi) - - return -0.5 * score - - def predict(self, X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance based on - Ref.[1] Section 3.3.2. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - References - ---------- - [1] Bishop, C. M. (2006). Pattern recognition and machine learning. - springer. - ''' - - y_hat = np.dot(X, self.coef_) + self.intercept_ - - if return_std: - # Handle the zero variance case - if self.var_y: - return y_hat, np.zeros_like(y_hat) - - if self.normalize: - X -= self._x_mean_[self.active_] - X /= self._x_std[self.active_] - var_hat = 1./self.alpha_ - var_hat += np.sum(X.dot(self.sigma_) * X, axis=1) - std_hat = np.sqrt(var_hat) - return y_hat, std_hat - else: - return y_hat - - def _posterior_dist(self, A, beta, XX, XY, full_covar=False): - ''' - Calculates mean and covariance matrix of posterior distribution - of coefficients. - ''' - # compute precision matrix for active features - Sinv = beta * XX - np.fill_diagonal(Sinv, np.diag(Sinv) + A) - cholesky = True - - # try cholesky, if it fails go back to pinvh - try: - # find posterior mean : R*R.T*mean = beta*X.T*Y - # solve(R*z = beta*X.T*Y) =>find z=> solve(R.T*mean = z)=>find mean - R = np.linalg.cholesky(Sinv) - Z = solve_triangular(R, beta*XY, check_finite=True, lower=True) - Mn = solve_triangular(R.T, Z, check_finite=True, lower=False) - - # invert lower triangular matrix from cholesky decomposition - Ri = solve_triangular(R, np.eye(A.shape[0]), check_finite=False, - lower=True) - if full_covar: - Sn = np.dot(Ri.T, Ri) - return Mn, Sn, cholesky - else: - return Mn, Ri, cholesky - except LinAlgError: - cholesky = False - Sn = pinvh(Sinv) - Mn = beta*np.dot(Sinv, XY) - return Mn, Sn, cholesky - - def _sparsity_quality(self, XX, XXd, XY, XYa, Aa, Ri, active, beta, cholesky): - ''' - Calculates sparsity and quality parameters for each feature - - Theoretical Note: - ----------------- - Here we used Woodbury Identity for inverting covariance matrix - of target distribution - C = 1/beta + 1/alpha * X' * X - C^-1 = beta - beta^2 * X * Sn * X' - ''' - bxy = beta*XY - bxx = beta*XXd - if cholesky: - # here Ri is inverse of lower triangular matrix obtained from - # cholesky decomp - xxr = np.dot(XX[:, active], Ri.T) - rxy = np.dot(Ri, XYa) - S = bxx - beta**2 * np.sum(xxr**2, axis=1) - Q = bxy - beta**2 * np.dot(xxr, rxy) - else: - # here Ri is covariance matrix - XXa = XX[:, active] - XS = np.dot(XXa, Ri) - S = bxx - beta**2 * np.sum(XS*XXa, 1) - Q = bxy - beta**2 * np.dot(XS, XYa) - # Use following: - # (EQ 1) q = A*Q/(A - S) ; s = A*S/(A-S) - # so if A = np.PINF q = Q, s = S - qi = np.copy(Q) - si = np.copy(S) - # If A is not np.PINF, then it should be 'active' feature => use (EQ 1) - Qa, Sa = Q[active], S[active] - qi[active] = Aa * Qa / (Aa - Sa) - si[active] = Aa * Sa / (Aa - Sa) - - return [si, qi, S, Q] diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_laplace.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_laplace.py deleted file mode 100644 index 7fdcb5cf6..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/reg_fast_laplace.py +++ /dev/null @@ -1,452 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import numpy as np -from sklearn.utils import as_float_array -from sklearn.model_selection import KFold - - -class RegressionFastLaplace(): - ''' - Sparse regression with Bayesian Compressive Sensing as described in Alg. 1 - (Fast Laplace) of Ref.[1], which updated formulas from [2]. - - sigma2: noise precision (sigma^2) - nu fixed to 0 - - uqlab/lib/uq_regression/BCS/uq_bsc.m - - Parameters - ---------- - n_iter: int, optional (DEFAULT = 1000) - Maximum number of iterations - - tol: float, optional (DEFAULT = 1e-7) - If absolute change in precision parameter for weights is below - threshold algorithm terminates. - - fit_intercept : boolean, optional (DEFAULT = True) - whether to calculate the intercept for this model. If set - to false, no intercept will be used in calculations - (e.g. data is expected to be already centered). - - copy_X : boolean, optional (DEFAULT = True) - If True, X will be copied; else, it may be overwritten. - - verbose : boolean, optional (DEFAULT = FALSE) - Verbose mode when fitting the model - - Attributes - ---------- - coef_ : array, shape = (n_features) - Coefficients of the regression model (mean of posterior distribution) - - alpha_ : float - estimated precision of the noise - - active_ : array, dtype = np.bool, shape = (n_features) - True for non-zero coefficients, False otherwise - - lambda_ : array, shape = (n_features) - estimated precisions of the coefficients - - sigma_ : array, shape = (n_features, n_features) - estimated covariance matrix of the weights, computed only - for non-zero coefficients - - References - ---------- - [1] Babacan, S. D., Molina, R., & Katsaggelos, A. K. (2009). Bayesian - compressive sensing using Laplace priors. IEEE Transactions on image - processing, 19(1), 53-63. - [2] Fast marginal likelihood maximisation for sparse Bayesian models - (Tipping & Faul 2003). - (http://www.miketipping.com/papers/met-fastsbl.pdf) - ''' - - def __init__(self, n_iter=1000, n_Kfold=10, tol=1e-7, fit_intercept=False, - bias_term=True, copy_X=True, verbose=False): - self.n_iter = n_iter - self.n_Kfold = n_Kfold - self.tol = tol - self.fit_intercept = fit_intercept - self.bias_term = bias_term - self.copy_X = copy_X - self.verbose = verbose - - def _center_data(self, X, y): - ''' Centers data''' - X = as_float_array(X, copy = self.copy_X) - - # normalisation should be done in preprocessing! - X_std = np.ones(X.shape[1], dtype=X.dtype) - if self.fit_intercept: - X_mean = np.average(X, axis=0) - y_mean = np.average(y, axis=0) - X -= X_mean - y -= y_mean - else: - X_mean = np.zeros(X.shape[1], dtype=X.dtype) - y_mean = 0. if y.ndim == 1 else np.zeros(y.shape[1], dtype=X.dtype) - return X, y, X_mean, y_mean, X_std - - def fit(self, X, y): - - k_fold = KFold(n_splits=self.n_Kfold) - - varY = np.var(y, ddof=1) if np.var(y, ddof=1) != 0 else 1.0 - sigma2s = len(y)*varY*(10**np.linspace(-16, -1, self.n_Kfold)) - - errors = np.zeros((len(sigma2s), self.n_Kfold)) - for s, sigma2 in enumerate(sigma2s): - for k, (train, test) in enumerate(k_fold.split(X, y)): - self.fit_(X[train], y[train], sigma2) - errors[s, k] = np.linalg.norm( - y[test] - self.predict(X[test]) - )**2/len(test) - - KfCVerror = np.sum(errors, axis=1)/self.n_Kfold/varY - i_minCV = np.argmin(KfCVerror) - - self.kfoldCVerror = np.min(KfCVerror) - - return self.fit_(X, y, sigma2s[i_minCV]) - - def fit_(self, X, y, sigma2): - - N, P = X.shape - # n_samples, n_features = X.shape - - X, y, X_mean, y_mean, X_std = self._center_data(X, y) - self._x_mean_ = X_mean - self._y_mean = y_mean - self._x_std = X_std - - # check that variance is non zero !!! - if np.var(y) == 0: - self.var_y = True - else: - self.var_y = False - beta = 1./sigma2 - - # precompute X'*Y , X'*X for faster iterations & allocate memory for - # sparsity & quality vectors X=Psi - PsiTY = np.dot(X.T, y) - PsiTPsi = np.dot(X.T, X) - XXd = np.diag(PsiTPsi) - - # initialize with constant regressor, or if that one does not exist, - # with the one that has the largest correlation with Y - ind_global_to_local = np.zeros(P, dtype=np.int32) - - # identify constant regressors - constidx = np.where(~np.diff(X, axis=0).all(axis=0))[0] - - if self.bias_term and constidx.size != 0: - ind_start = constidx[0] - ind_global_to_local[ind_start] = True - else: - # start from a single basis vector with largest projection on - # targets - proj = np.divide(np.square(PsiTY), XXd) - ind_start = np.argmax(proj) - ind_global_to_local[ind_start] = True - - num_active = 1 - active_indices = [ind_start] - deleted_indices = [] - bcs_path = [ind_start] - gamma = np.zeros(P) - # for the initial value of gamma(ind_start), use the RVM formula - # gamma = (q^2 - s) / (s^2) - # and the fact that initially s = S = beta*Psi_i'*Psi_i and q = Q = - # beta*Psi_i'*Y - gamma[ind_start] = np.square(PsiTY[ind_start]) - gamma[ind_start] -= sigma2 * PsiTPsi[ind_start, ind_start] - gamma[ind_start] /= np.square(PsiTPsi[ind_start, ind_start]) - - Sigma = 1. / (beta * PsiTPsi[ind_start, ind_start] - + 1./gamma[ind_start]) - - mu = Sigma * PsiTY[ind_start] * beta - tmp1 = beta * PsiTPsi[ind_start] - S = beta * np.diag(PsiTPsi).T - Sigma * np.square(tmp1) - Q = beta * PsiTY.T - mu*(tmp1) - - tmp2 = np.ones(P) # alternative computation for the initial s,q - q0tilde = PsiTY[ind_start] - s0tilde = PsiTPsi[ind_start, ind_start] - tmp2[ind_start] = s0tilde / (q0tilde**2) / beta - s = np.divide(S, tmp2) - q = np.divide(Q, tmp2) - Lambda = 2*(num_active - 1) / np.sum(gamma) - - Delta_L_max = [] - for i in range(self.n_iter): - # Handle variance zero - if self.var_y: - mu = np.mean(y) - break - - if self.verbose: - print(' lambda = {0:.6e}\n'.format(Lambda)) - - # Calculate the potential updated value of each gamma[i] - if Lambda == 0.0: # RVM - gamma_potential = np.multiply(( - (q**2 - s) > Lambda), - np.divide(q**2 - s, s**2) - ) - else: - a = Lambda * s**2 - b = s**2 + 2*Lambda*s - c = Lambda + s - q**2 - gamma_potential = np.multiply( - (c < 0), np.divide( - -b + np.sqrt(b**2 - 4*np.multiply(a, c)), 2*a) - ) - - l_gamma = - np.log(np.absolute(1 + np.multiply(gamma, s))) - l_gamma += np.divide(np.multiply(q**2, gamma), - (1 + np.multiply(gamma, s))) - l_gamma -= Lambda*gamma # omitted the factor 1/2 - - # Contribution of each updated gamma(i) to L(gamma) - l_gamma_potential = - np.log( - np.absolute(1 + np.multiply(gamma_potential, s)) - ) - l_gamma_potential += np.divide( - np.multiply(q**2, gamma_potential), - (1 + np.multiply(gamma_potential, s)) - ) - # omitted the factor 1/2 - l_gamma_potential -= Lambda*gamma_potential - - # Check how L(gamma) would change if we replaced gamma(i) by the - # updated gamma_potential(i), for each i separately - Delta_L_potential = l_gamma_potential - l_gamma - - # deleted indices should not be chosen again - if len(deleted_indices) != 0: - values = -np.inf * np.ones(len(deleted_indices)) - Delta_L_potential[deleted_indices] = values - - Delta_L_max.append(np.nanmax(Delta_L_potential)) - ind_L_max = np.nanargmax(Delta_L_potential) - - # in case there is only 1 regressor in the model and it would now - # be deleted - if len(active_indices) == 1 and ind_L_max == active_indices[0] \ - and gamma_potential[ind_L_max] == 0.0: - Delta_L_potential[ind_L_max] = -np.inf - Delta_L_max[i] = np.max(Delta_L_potential) - ind_L_max = np.argmax(Delta_L_potential) - - # If L did not change significantly anymore, break - if Delta_L_max[i] <= 0.0 or\ - (i > 0 and all(np.absolute(Delta_L_max[i-1:]) - < sum(Delta_L_max)*self.tol)) or \ - (i > 0 and all(np.diff(bcs_path)[i-1:] == 0.0)): - if self.verbose: - print('Increase in L: {0:.6e} (eta = {1:.3e})\ - -- break\n'.format(Delta_L_max[i], self.tol)) - break - - # Print information - if self.verbose: - print(' Delta L = {0:.6e} \n'.format(Delta_L_max[i])) - - what_changed = int(gamma[ind_L_max] == 0.0) - what_changed -= int(gamma_potential[ind_L_max] == 0.0) - - # Print information - if self.verbose: - if what_changed < 0: - print(f'{i+1} - Remove regressor #{ind_L_max+1}..\n') - elif what_changed == 0: - print(f'{i+1} - Recompute regressor #{ind_L_max+1}..\n') - else: - print(f'{i+1} - Add regressor #{ind_L_max+1}..\n') - - # --- Update all quantities ---- - if what_changed == 1: - # adding a regressor - - # update gamma - gamma[ind_L_max] = gamma_potential[ind_L_max] - - Sigma_ii = 1.0 / (1.0/gamma[ind_L_max] + S[ind_L_max]) - try: - x_i = np.matmul( - Sigma, PsiTPsi[active_indices, ind_L_max].reshape(-1, 1) - ) - except ValueError: - x_i = Sigma * PsiTPsi[active_indices, ind_L_max] - tmp_1 = - (beta * Sigma_ii) * x_i - Sigma = np.vstack( - (np.hstack(((beta**2 * Sigma_ii) * np.dot(x_i, x_i.T) - + Sigma, tmp_1)), np.append(tmp_1.T, Sigma_ii)) - ) - mu_i = Sigma_ii * Q[ind_L_max] - mu = np.vstack((mu - (beta * mu_i) * x_i, mu_i)) - - tmp2_1 = PsiTPsi[:, ind_L_max] - beta * np.squeeze( - np.matmul(PsiTPsi[:, active_indices], x_i) - ) - if i == 0: - tmp2_1[0] /= 2 - tmp2 = beta * tmp2_1.T - S = S - Sigma_ii * np.square(tmp2) - Q = Q - mu_i * tmp2 - - num_active += 1 - ind_global_to_local[ind_L_max] = num_active - active_indices.append(ind_L_max) - bcs_path.append(ind_L_max) - - elif what_changed == 0: - # recomputation - # zero if regressor has not been chosen yet - if not ind_global_to_local[ind_L_max]: - raise Exception('Cannot recompute index{0} -- not yet\ - part of the model!'.format(ind_L_max)) - Sigma = np.atleast_2d(Sigma) - mu = np.atleast_2d(mu) - gamma_i_new = gamma_potential[ind_L_max] - gamma_i_old = gamma[ind_L_max] - # update gamma - gamma[ind_L_max] = gamma_potential[ind_L_max] - - # index of regressor in Sigma - local_ind = ind_global_to_local[ind_L_max]-1 - - kappa_i = (1.0/gamma_i_new - 1.0/gamma_i_old) - kappa_i = 1.0 / kappa_i - kappa_i += Sigma[local_ind, local_ind] - kappa_i = 1 / kappa_i - Sigma_i_col = Sigma[:, local_ind] - - Sigma = Sigma - kappa_i * (Sigma_i_col * Sigma_i_col.T) - mu_i = mu[local_ind] - mu = mu - (kappa_i * mu_i) * Sigma_i_col[:, None] - - tmp1 = beta * np.dot( - Sigma_i_col.reshape(1, -1), PsiTPsi[active_indices])[0] - S = S + kappa_i * np.square(tmp1) - Q = Q + (kappa_i * mu_i) * tmp1 - - # no change in active_indices or ind_global_to_local - bcs_path.append(ind_L_max + 0.1) - - elif what_changed == -1: - gamma[ind_L_max] = 0 - - # index of regressor in Sigma - local_ind = ind_global_to_local[ind_L_max]-1 - - Sigma_ii_inv = 1. / Sigma[local_ind, local_ind] - Sigma_i_col = Sigma[:, local_ind] - - Sigma = Sigma - Sigma_ii_inv * (Sigma_i_col * Sigma_i_col.T) - - Sigma = np.delete( - np.delete(Sigma, local_ind, axis=0), local_ind, axis=1) - - mu = mu - (mu[local_ind] * Sigma_ii_inv) * Sigma_i_col[:, None] - mu = np.delete(mu, local_ind, axis=0) - - tmp1 = beta * np.dot(Sigma_i_col, PsiTPsi[active_indices]) - S = S + Sigma_ii_inv * np.square(tmp1) - Q = Q + (mu_i * Sigma_ii_inv) * tmp1 - - num_active -= 1 - ind_global_to_local[ind_L_max] = 0.0 - v = ind_global_to_local[ind_global_to_local > local_ind] - 1 - ind_global_to_local[ind_global_to_local > local_ind] = v - del active_indices[local_ind] - deleted_indices.append(ind_L_max) - # and therefore ineligible - bcs_path.append(-ind_L_max) - - # same for all three cases - tmp3 = 1 - np.multiply(gamma, S) - s = np.divide(S, tmp3) - q = np.divide(Q, tmp3) - - # Update lambda - Lambda = 2*(num_active - 1) / np.sum(gamma) - - # Prepare the result object - self.coef_ = np.zeros(P) - self.coef_[active_indices] = np.squeeze(mu) - self.sigma_ = Sigma - self.active_ = active_indices - self.gamma = gamma - self.Lambda = Lambda - self.beta = beta - self.bcs_path = bcs_path - - # set intercept_ - if self.fit_intercept: - self.coef_ = self.coef_ / X_std - self.intercept_ = y_mean - np.dot(X_mean, self.coef_.T) - else: - self.intercept_ = 0. - - return self - - def predict(self, X, return_std=False): - ''' - Computes predictive distribution for test set. - Predictive distribution for each data point is one dimensional - Gaussian and therefore is characterised by mean and variance based on - Ref.[1] Section 3.3.2. - - Parameters - ----------- - X: {array-like, sparse} (n_samples_test, n_features) - Test data, matrix of explanatory variables - - Returns - ------- - : list of length two [y_hat, var_hat] - - y_hat: numpy array of size (n_samples_test,) - Estimated values of targets on test set (i.e. mean of - predictive distribution) - - var_hat: numpy array of size (n_samples_test,) - Variance of predictive distribution - - References - ---------- - [1] Bishop, C. M. (2006). Pattern recognition and machine learning. - springer. - ''' - y_hat = np.dot(X, self.coef_) + self.intercept_ - - if return_std: - # Handle the zero variance case - if self.var_y: - return y_hat, np.zeros_like(y_hat) - - var_hat = 1./self.beta - var_hat += np.sum(X.dot(self.sigma_) * X, axis=1) - std_hat = np.sqrt(var_hat) - return y_hat, std_hat - else: - return y_hat - -# l2norm = 0.0 -# for idx in range(10): -# sigma2 = np.genfromtxt('./test/sigma2_{0}.csv'.format(idx+1), delimiter=',') -# Psi_train = np.genfromtxt('./test/Psi_train_{0}.csv'.format(idx+1), delimiter=',') -# Y_train = np.genfromtxt('./test/Y_train_{0}.csv'.format(idx+1)) -# Psi_test = np.genfromtxt('./test/Psi_test_{0}.csv'.format(idx+1), delimiter=',') -# Y_test = np.genfromtxt('./test/Y_test_{0}.csv'.format(idx+1)) - -# clf = RegressionFastLaplace(verbose=True) -# clf.fit_(Psi_train, Y_train, sigma2) -# coeffs_fold = np.genfromtxt('./test/coeffs_fold_{0}.csv'.format(idx+1)) -# print("coeffs error: {0:.4g}".format(np.linalg.norm(clf.coef_ - coeffs_fold))) -# l2norm += np.linalg.norm(Y_test - clf.predict(Psi_test))**2/len(Y_test) -# print("l2norm error: {0:.4g}".format(l2norm)) diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/sequential_design.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/sequential_design.py deleted file mode 100644 index e1feb7317..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/sequential_design.py +++ /dev/null @@ -1,2187 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jan 28 09:21:18 2022 - -@author: farid -""" -import numpy as np -from scipy import stats, signal, linalg, sparse -from scipy.spatial import distance -from copy import deepcopy, copy -from tqdm import tqdm -import scipy.optimize as opt -from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import os -import gc -import seaborn as sns -from joblib import Parallel, delayed -#import resource -from .exploration import Exploration - - -class SeqDesign(): - """ Sequential experimental design - This class provieds method for trainig the meta-model in an iterative - manners. - The main method to execute the task is `train_seq_design`, which - recieves a model object and returns the trained metamodel. - """ - - # ------------------------------------------------------------------------- - def train_seq_design(self, MetaModel): - """ - Starts the adaptive sequential design for refining the surrogate model - by selecting training points in a sequential manner. - - Parameters - ---------- - Model : object - An object containing all model specifications. - - Returns - ------- - MetaModel : object - Meta model object. - - """ - # MetaModel = self - Model = MetaModel.ModelObj - self.MetaModel = MetaModel - self.Model = Model - - # Initialization - MetaModel.SeqModifiedLOO = {} - MetaModel.seqValidError = {} - MetaModel.SeqBME = {} - MetaModel.SeqKLD = {} - MetaModel.SeqDistHellinger = {} - MetaModel.seqRMSEMean = {} - MetaModel.seqRMSEStd = {} - MetaModel.seqMinDist = [] - pce = True if MetaModel.meta_model_type.lower() != 'gpe' else False - mc_ref = True if bool(Model.mc_reference) else False - if mc_ref: - Model.read_mc_reference() - - if not hasattr(MetaModel, 'valid_likelihoods'): - MetaModel.valid_samples = [] - MetaModel.valid_model_runs = [] - MetaModel.valid_likelihoods = [] - - # Get the parameters - max_n_samples = MetaModel.ExpDesign.n_max_samples - mod_LOO_threshold = MetaModel.ExpDesign.mod_LOO_threshold - n_canddidate = MetaModel.ExpDesign.n_canddidate - post_snapshot = MetaModel.ExpDesign.post_snapshot - n_replication = MetaModel.ExpDesign.n_replication - util_func = MetaModel.ExpDesign.util_func - output_name = Model.Output.names - validError = None - # Handle if only one UtilityFunctions is provided - if not isinstance(util_func, list): - util_func = [MetaModel.ExpDesign.util_func] - - # Read observations or MCReference - if len(Model.observations) != 0 or Model.meas_file is not None: - self.observations = Model.read_observation() - obs_data = self.observations - else: - obs_data = [] - TotalSigma2 = {} - # ---------- Initial MetaModel ---------- - initMetaModel = deepcopy(MetaModel) - - # Validation error if validation set is provided. - if len(MetaModel.valid_model_runs) != 0: - init_rmse, init_valid_error = self.__validError(initMetaModel) - init_valid_error = list(init_valid_error.values()) - else: - init_rmse = None - - # Check if discrepancy is provided - if len(obs_data) != 0 and hasattr(MetaModel, 'Discrepancy'): - TotalSigma2 = MetaModel.Discrepancy.parameters - - # Calculate the initial BME - out = self.__BME_Calculator( - initMetaModel, obs_data, TotalSigma2, init_rmse) - init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out - print(f"\nInitial BME: {init_BME:.2f}") - print(f"Initial KLD: {init_KLD:.2f}") - - # Posterior snapshot (initial) - if post_snapshot: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') - - # Check the convergence of the Mean & Std - if mc_ref and pce: - init_rmse_mean, init_rmse_std = self.__error_Mean_Std() - print(f"Initial Mean and Std error: {init_rmse_mean}," - f" {init_rmse_std}") - - # Read the initial experimental design - Xinit = initMetaModel.ExpDesign.X - init_n_samples = len(MetaModel.ExpDesign.X) - initYprev = initMetaModel.ModelOutputDict - initLCerror = initMetaModel.LCerror - n_itrs = max_n_samples - init_n_samples - - # Read the initial ModifiedLOO - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = initMetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - initMetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - - Scores = [item for sublist in Scores_all for item in sublist] - weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], - weights=weights)] - - prevMetaModel_dict = {} - # Replicate the sequential design - for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - for util_f in util_func: - print(f'\n>>>> Utility Function: {util_f} <<<<') - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - # Set the experimental design - Xprev = Xinit - total_n_samples = init_n_samples - Yprev = initYprev - - Xfull = [] - Yfull = [] - - # Store the initial ModifiedLOO - if pce: - print("\nInitial ModifiedLOO:", init_mod_LOO) - SeqModifiedLOO = np.array(init_mod_LOO) - - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.array(init_valid_error) - - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.array([init_BME]) - SeqKLD = np.array([init_KLD]) - SeqDistHellinger = np.array([init_dist_hellinger]) - - if mc_ref and pce: - seqRMSEMean = np.array([init_rmse_mean]) - seqRMSEStd = np.array([init_rmse_std]) - - # ------- Start Sequential Experimental Design ------- - postcnt = 1 - for itr_no in range(1, n_itrs+1): - print(f'\n>>>> Iteration number {itr_no} <<<<') - - # Save the metamodel prediction before updating - prevMetaModel_dict[itr_no] = deepcopy(MetaModel) - if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] - self._y_hat_prev, _ = pc_model.eval_metamodel( - samples=Xfull[-1].reshape(1, -1)) - - # Optimal Bayesian Design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.opt_SeqDesign(TotalSigma2, - n_canddidate, - util_f) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - MetaModel.seqMinDist.append(S) - print(f"\nmin Dist from OldExpDesign: {S:2f}") - print("\n") - - # Evaluate the full model response at the new sample - Ynew, _ = Model.run_model_parallel( - Xnew, prevRun_No=total_n_samples - ) - total_n_samples += Xnew.shape[0] - # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(MetaModel, 'adapt_verbose') and \ - MetaModel.adapt_verbose: - from .adaptPlot import adaptPlot - y_hat, std_hat = MetaModel.eval_metamodel(samples=Xnew) - adaptPlot(MetaModel, Ynew, y_hat, std_hat, plotED=False) - - # -------- Retrain the surrogate model ------- - # Extend new experimental design - Xfull = np.vstack((Xprev, Xnew)) - - # Updating experimental design Y - for out_name in output_name: - Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - MetaModel.ModelOutputDict[out_name] = Yfull - - # Pass new design to the metamodel object - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = Xfull - MetaModel.ExpDesign.Y = MetaModel.ModelOutputDict - - # Save the Experimental Design for next iteration - Xprev = Xfull - Yprev = MetaModel.ModelOutputDict - - # Pass the new prior as the input - MetaModel.input_obj.poly_coeffs_flag = False - if updatedPrior is not None: - MetaModel.input_obj.poly_coeffs_flag = True - print("updatedPrior:", updatedPrior.shape) - # Arbitrary polynomial chaos - for i in range(updatedPrior.shape[1]): - MetaModel.input_obj.Marginals[i].dist_type = None - x = updatedPrior[:, i] - MetaModel.input_obj.Marginals[i].raw_data = x - - # Train the surrogate model for new ExpDesign - MetaModel.train_norm_design(parallel=False) - m_3 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # -------- Evaluate the retrained surrogate model ------- - # Extract Modified LOO from Output - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = MetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - MetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, - axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - Scores = [item for sublist in Scores_all for item - in sublist] - weights = [item for sublist in varExpDesignY for item - in sublist] - ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] - - print('\n') - print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) - print('\n') - - # Compute the validation error - if len(MetaModel.valid_model_runs) != 0: - rmse, validError = self.__validError(MetaModel) - ValidError = list(validError.values()) - else: - rmse = None - - # Store updated ModifiedLOO - if pce: - SeqModifiedLOO = np.vstack( - (SeqModifiedLOO, ModifiedLOO)) - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.vstack( - (SeqValidError, ValidError)) - m_4 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - # -------- Caclulation of BME as accuracy metric ------- - # Check if data is provided - if len(obs_data) != 0: - # Calculate the initial BME - out = self.__BME_Calculator(MetaModel, obs_data, - TotalSigma2, rmse) - BME, KLD, Posterior, likes, DistHellinger = out - print('\n') - print(f"Updated BME: {BME:.2f}") - print(f"Updated KLD: {KLD:.2f}") - print('\n') - - # Plot some snapshots of the posterior - step_snapshot = MetaModel.ExpDesign.step_snapshot - if post_snapshot and postcnt % step_snapshot == 0: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') - postcnt += 1 - m_5 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # Check the convergence of the Mean&Std - if mc_ref and pce: - print('\n') - RMSE_Mean, RMSE_std = self.__error_Mean_Std() - print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " - f"{RMSE_std:.2f}") - print('\n') - - # Store the updated BME & KLD - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.vstack((SeqBME, BME)) - SeqKLD = np.vstack((SeqKLD, KLD)) - SeqDistHellinger = np.vstack((SeqDistHellinger, - DistHellinger)) - if mc_ref and pce: - seqRMSEMean = np.vstack((seqRMSEMean, RMSE_Mean)) - seqRMSEStd = np.vstack((seqRMSEStd, RMSE_std)) - - if pce and any(LOO < mod_LOO_threshold - for LOO in ModifiedLOO): - break - - print(f"Memory itr {itr_no}: I: {m_2-m_1:.2f} MB") - print(f"Memory itr {itr_no}: II: {m_3-m_2:.2f} MB") - print(f"Memory itr {itr_no}: III: {m_4-m_3:.2f} MB") - print(f"Memory itr {itr_no}: IV: {m_5-m_4:.2f} MB") - m_6 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"Memory itr {itr_no}: total: {m_6:.2f} MB") - - # Clean up - if len(obs_data) != 0: - del out - gc.collect() - print() - print('-'*50) - print() - - # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' - if pce: - MetaModel.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(MetaModel.valid_model_runs) != 0: - MetaModel.seqValidError[strKey] = SeqValidError - - # Check if data is provided - if len(obs_data) != 0: - MetaModel.SeqBME[strKey] = SeqBME - MetaModel.SeqKLD[strKey] = SeqKLD - if len(MetaModel.valid_likelihoods) != 0: - MetaModel.SeqDistHellinger[strKey] = SeqDistHellinger - if mc_ref and pce: - MetaModel.seqRMSEMean[strKey] = seqRMSEMean - MetaModel.seqRMSEStd[strKey] = seqRMSEStd - - return MetaModel - - # ------------------------------------------------------------------------- - def util_VarBasedDesign(self, X_can, index, util_func='Entropy'): - """ - Computes the exploitation scores based on: - active learning MacKay(ALM) and active learning Cohn (ALC) - Paper: Sequential Design with Mutual Information for Computer - Experiments (MICE): Emulation of a Tsunami Model by Beck and Guillas - (2016) - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - index : int - Model output index. - UtilMethod : string, optional - Exploitation utility function. The default is 'Entropy'. - - Returns - ------- - float - Score. - - """ - MetaModel = self.MetaModel - ED_X = MetaModel.ExpDesign.X - out_dict_y = MetaModel.ExpDesign.Y - out_names = MetaModel.ModelObj.Output.names - - # Run the Metamodel for the candidate - X_can = X_can.reshape(1, -1) - Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) - - if util_func.lower() == 'alm': - # ----- Entropy/MMSE/active learning MacKay(ALM) ----- - # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - varPCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - varPCE[KeyIdx] = np.max(canPredVar[key], axis=1) - score = np.max(varPCE, axis=0) - - elif util_func.lower() == 'eigf': - # ----- Expected Improvement for Global fit ----- - # Find closest EDX to the candidate - distances = distance.cdist(ED_X, X_can, 'euclidean') - index = np.argmin(distances) - - # Compute perdiction error and variance of the old model - predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - # Compute perdiction error and variance of the old model - # Eq (5) from Liu et al.(2018) - EIGF_PCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - residual = predError[key] - out_dict_y[key][int(index)] - var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) - score = np.max(EIGF_PCE, axis=0) - - return -1 * score # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianActiveDesign(self, X_can, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian active design criterion (var). - - It is based on the following paper: - Oladyshkin, Sergey, Farid Mohammadi, Ilja Kroeker, and Wolfgang Nowak. - "Bayesian3 active learning for the gaussian process emulator using - information theory." Entropy 22, no. 8 (2020): 890. - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - BAL design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # Evaluate the PCE metamodels at that location ??? - Y_mean_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Get the data - obs_data = self.observations - n_obs = self.Model.n_obs - # TODO: Analytical DKL - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - - # priorMean, priorSigma2, Obs = np.empty((0)),np.empty((0)),np.empty((0)) - - # for key in list(Y_mean_can): - # # concatenate the measurement error - # Obs = np.hstack((Obs,ObservationData[key])) - - # # concatenate the mean and variance of prior predictive - # means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # priorMean = np.hstack((priorSigma2,means)) - # priorSigma2 = np.hstack((priorSigma2,stds**2)) - - # # Covariance Matrix of prior - # covPrior = np.zeros((priorSigma2.shape[0], priorSigma2.shape[0]), float) - # np.fill_diagonal(covPrior, priorSigma2) - - # # Covariance Matrix of Likelihood - # covLikelihood = np.zeros((sigma2Dict.shape[0], sigma2Dict.shape[0]), float) - # np.fill_diagonal(covLikelihood, sigma2Dict) - - # # Calculate moments of the posterior (Analytical derivation) - # n = priorSigma2.shape[0] - # covPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))),covLikelihood/n) - - # meanPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))) , Obs) + \ - # np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))), - # priorMean/n) - # # Compute DKL from prior to posterior - # term1 = np.trace(np.dot(np.linalg.inv(covPrior),covPost)) - # deltaMean = priorMean-meanPost - # term2 = np.dot(np.dot(deltaMean,np.linalg.inv(covPrior)),deltaMean[:,None]) - # term3 = np.log(np.linalg.det(covPrior)/np.linalg.det(covPost)) - # DKL = 0.5 * (term1 + term2 - n + term3)[0] - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = 20000 - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((MCsize)) - for key in list(Y_mean_can): - means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # cov = np.zeros((means.shape[0], means.shape[0]), float) - # np.fill_diagonal(cov, stds**2) - - Y_MC[key] = np.zeros((MCsize, n_obs)) - logsamples = np.zeros((MCsize, n_obs)) - for i in range(n_obs): - NormalDensity = stats.norm(means[i], stds[i]) - Y_MC[key][:, i] = NormalDensity.rvs(MCsize) - logsamples[:, i] = NormalDensity.logpdf(Y_MC[key][:, i]) - - logPriorLikelihoods = np.sum(logsamples, axis=1) - std_MC[key] = np.zeros((MCsize, means.shape[0])) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf(Y_MC, std_MC, obs_data, sigma2Dict) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.nansum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - # Utility function Eq.2 in Ref. (2) - # Posterior covariance matrix after observing data y - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # TODO: Calculate the correction factor for BME - # BMECorrFactor = self.BME_Corr_Weight(PCE_SparseBayes_can, - # ObservationData, sigma2Dict) - # BME += BMECorrFactor - # Haun et al implementation - # U_J_d = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - U_J_d = postExpLikelihoods - logBME - - # Marginal log likelihood - elif var == 'BME': - U_J_d = logBME - - # Entropy-based information gain - elif var == 'infEntropy': - logBME = np.log(np.nanmean(likelihoods)) - infEntropy = logBME - postExpPrior - postExpLikelihoods - U_J_d = infEntropy * -1 # -1 for minimization - - # Bayesian information criterion - elif var == 'BIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxL = np.nanmax(likelihoods) - U_J_d = -2 * np.log(maxL) + np.log(n_obs) * nModelParams - - # Akaike information criterion - elif var == 'AIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxlogL = np.log(np.nanmax(likelihoods)) - AIC = -2 * maxlogL + 2 * nModelParams - # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) - penTerm = 0 - U_J_d = 1*(AIC + penTerm) - - # Deviance information criterion - elif var == 'DIC': - # D_theta_bar = np.mean(-2 * Likelihoods) - N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self.__normpdf( - Y_mean_can, Y_std_can, obs_data, sigma2Dict - ) - DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p - - U_J_d = DIC - - else: - print('The algorithm you requested has not been implemented yet!') - - # Handle inf and NaN (replace by zero) - if np.isnan(U_J_d) or U_J_d == -np.inf or U_J_d == np.inf: - U_J_d = 0.0 - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def update_metamodel(self, MetaModel, output, y_hat_can, univ_p_val, index, - new_pca=False): - BasisIndices = MetaModel.basis_dict[output]["y_"+str(index+1)] - clf_poly = MetaModel.clf_poly[output]["y_"+str(index+1)] - Mn = clf_poly.coef_ - Sn = clf_poly.sigma_ - beta = clf_poly.alpha_ - active = clf_poly.active_ - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - Sn_new_inv = np.linalg.inv(Sn) - Sn_new_inv += beta * np.dot(Psi[:, active].T, Psi[:, active]) - Sn_new = np.linalg.inv(Sn_new_inv) - - Mn_new = np.dot(Sn_new_inv, Mn[active]).reshape(-1, 1) - Mn_new += beta * np.dot(Psi[:, active].T, y_hat_can) - Mn_new = np.dot(Sn_new, Mn_new).flatten() - - # Compute the old and new moments of PCEs - mean_old = Mn[0] - mean_new = Mn_new[0] - std_old = np.sqrt(np.sum(np.square(Mn[1:]))) - std_new = np.sqrt(np.sum(np.square(Mn_new[1:]))) - - # Back transformation if PCA is selected. - if MetaModel.dim_red_method.lower() == 'pca': - old_pca = MetaModel.pca[output] - mean_old = old_pca.mean_[index] - mean_old += np.sum(mean_old * old_pca.components_[:, index]) - std_old = np.sqrt(np.sum(std_old**2 * - old_pca.components_[:, index]**2)) - mean_new = new_pca.mean_[index] - mean_new += np.sum(mean_new * new_pca.components_[:, index]) - std_new = np.sqrt(np.sum(std_new**2 * - new_pca.components_[:, index]**2)) - # print(f"mean_old: {mean_old:.2f} mean_new: {mean_new:.2f}") - # print(f"std_old: {std_old:.2f} std_new: {std_new:.2f}") - # Store the old and new moments of PCEs - results = { - 'mean_old': mean_old, - 'mean_new': mean_new, - 'std_old': std_old, - 'std_new': std_new - } - return results - - # ------------------------------------------------------------------------- - def util_BayesianDesign_old(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - old_EDY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels using the candidate design - Y_PC_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Generate y from posterior predictive - m_size = 100 - y_hat_samples = {} - for idx, key in enumerate(Model.Output.names): - means, stds = Y_PC_can[key][0], Y_std_can[key][0] - y_hat_samples[key] = np.random.multivariate_normal( - means, np.diag(stds), m_size) - - # Create the SparseBayes-based PCE metamodel: - MetaModel.input_obj.poly_coeffs_flag = False - univ_p_val = self.MetaModel.univ_basis_vals(X_can) - G_n_m_all = np.zeros((m_size, len(Model.Output.names), Model.n_obs)) - - for i in range(m_size): - for idx, key in enumerate(Model.Output.names): - if MetaModel.dim_red_method.lower() == 'pca': - # Equal number of components - new_outputs = np.vstack( - (old_EDY[key], y_hat_samples[key][i]) - ) - new_pca, _ = MetaModel.pca_transformation(new_outputs) - target = new_pca.transform( - y_hat_samples[key][i].reshape(1, -1) - )[0] - else: - new_pca, target = False, y_hat_samples[key][i] - - for j in range(len(target)): - - # Update surrogate - result = self.update_metamodel( - MetaModel, key, target[j], univ_p_val, j, new_pca) - - # Compute Expected Information Gain (Eq. 39) - G_n_m = np.log(result['std_old']/result['std_new']) - 1./2 - G_n_m += result['std_new']**2 / (2*result['std_old']**2) - G_n_m += (result['mean_new'] - result['mean_old'])**2 /\ - (2*result['std_old']**2) - - G_n_m_all[i, idx, j] = G_n_m - - U_J_d = G_n_m_all.mean(axis=(1, 2)).mean() - return -1 * U_J_d - - # ------------------------------------------------------------------------- - def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - out_names = MetaModel.ModelObj.Output.names - if X_can.ndim == 1: - X_can = X_can.reshape(1, -1) - - # Compute the mean and std based on the MetaModel - # pce_means, pce_stds = self._compute_pce_moments(MetaModel) - if var == 'ALC': - Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - oldExpDesignY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels at that location ??? - Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) - - # Add all suggestion as new ExpDesign - NewExpDesignX = np.vstack((oldExpDesignX, X_can)) - - NewExpDesignY = {} - for key in oldExpDesignY.keys(): - try: - NewExpDesignY[key] = np.vstack((oldExpDesignY[key], - Y_PC_can[key])) - except: - NewExpDesignY[key] = oldExpDesignY[key] - - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = NewExpDesignX - MetaModel.ExpDesign.Y = NewExpDesignY - - # Train the model for the observed data using x_can - MetaModel.input_obj.poly_coeffs_flag = False - MetaModel.train_norm_design(parallel=False) - PCE_Model_can = MetaModel - - if var.lower() == 'mi': - # Mutual information based on Krause et al - # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = PCE_Model_can.eval_metamodel(samples=X_can) - std_can = {key: std_PC_can[key] for key in out_names} - - std_old = {key: Y_std_can[key] for key in out_names} - - varPCE = np.zeros((len(out_names))) - for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) - score = np.mean(varPCE) - - return -1 * score - - elif var.lower() == 'alc': - # Active learning based on Gramyc and Lee - # Adaptive design and analysis of supercomputer experiments Techno- - # metrics, 51 (2009), pp. 130–145. - - # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Compute the score - score = [] - for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) - score = np.mean(score) - - return -1 * score - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = X_MC.shape[0] - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Enriching Monte Carlo samples if need be - if ESS != 0: - X_MC = self.MetaModel.ExpDesign.generate_samples( - MCsize, 'random' - ) - - # Evaluate the MetaModel at the given samples - Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf( - Y_MC, std_MC, self.observations, sigma2Dict - ) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - print("--- increasing MC size---") - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # -------------------- Utility functions -------------------- - # Utility function Eq.2 in Ref. (2) - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.float128)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Haun et al implementation - U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) - - # U_J_d = np.sum(G_n_m_all) - # Ryan et al (2014) implementation - # importanceWeights = Likelihoods[Likelihoods!=0]/np.sum(Likelihoods[Likelihoods!=0]) - # U_J_d = np.mean(importanceWeights*np.log(Likelihoods[Likelihoods!=0])) - logBME - - # U_J_d = postExpLikelihoods - logBME - - # Marginal likelihood - elif var == 'BME': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - U_J_d = logBME - - # Bayes risk likelihood - elif var == 'BayesRisk': - - U_J_d = -1 * np.var(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] / np.nansum(likelihoods[accepted]) - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - infEntropy = logBME - postExpPrior - postExpLikelihoods - - U_J_d = infEntropy * -1 # -1 for minimization - - # D-Posterior-precision - elif var == 'DPP': - X_Posterior = X_MC[accepted] - # covariance of the posterior parameters - U_J_d = -np.log(np.linalg.det(np.cov(X_Posterior))) - - # A-Posterior-precision - elif var == 'APP': - X_Posterior = X_MC[accepted] - # trace of the posterior parameters - U_J_d = -np.log(np.trace(np.cov(X_Posterior))) - - else: - print('The algorithm you requested has not been implemented yet!') - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def subdomain(self, Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : TYPE - DESCRIPTION. - - Returns - ------- - Subdomains : TYPE - DESCRIPTION. - - """ - n_params = self.MetaModel.n_params - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains - - # ------------------------------------------------------------------------- - def run_util_func(self, method, candidates, index, sigma2Dict=None, - var=None, X_MC=None): - """ - Runs the utility function based on the given method. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - candidates : array of shape (n_samples, n_params) - All candidate parameter sets. - index : int - ExpDesign index. - sigma2Dict : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - var : string, optional - Utility function. The default is None. - X_MC : TYPE, optional - DESCRIPTION. The default is None. - - Returns - ------- - index : TYPE - DESCRIPTION. - List - Scores. - - """ - - if method.lower() == 'varoptdesign': - # U_J_d = self.util_VarBasedDesign(candidates, index, var) - U_J_d = np.zeros((candidates.shape[0])) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="varoptdesign"): - U_J_d[idx] = self.util_VarBasedDesign(X_can, index, var) - - elif method.lower() == 'bayesactdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianActiveDesign(X_can, sigma2Dict, - var) - elif method.lower() == 'bayesoptdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, - var) - return (index, -1 * U_J_d) - - # ------------------------------------------------------------------------- - def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, - verbose=False): - """ - Exploration algorithim to find the optimum parameter space. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - Bounds : list of tuples - List of lower and upper boundaries of parameters. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - Run_No : int - Run number. - verbose : bool, optional - Print out a summary. The default is False. - - Returns - ------- - Run_No : int - Run number. - array - Optimial candidate. - - """ - - Model = self.Model - max_func_itr = self.MetaModel.ExpDesign.max_func_itr - - if method == 'VarOptDesign': - Res_Global = opt.dual_annealing(self.util_VarBasedDesign, - bounds=Bounds, - args=(Model, var), - maxfun=max_func_itr) - - elif method == 'BayesOptDesign': - Res_Global = opt.dual_annealing(self.util_BayesianDesign, - bounds=Bounds, - args=(Model, sigma2Dict, var), - maxfun=max_func_itr) - - if verbose: - print(f"Global minimum: xmin = {Res_Global.x}, " - f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - - return (Run_No, Res_Global.x) - - # ------------------------------------------------------------------------- - def tradoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): - """ - Calculates weights for exploration scores based on the requested - scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. - - `None`: No exploration. - `equal`: Same weights for exploration and exploitation scores. - `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay - function - `adaptive`: An adaptive method based on: - Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling - approach for Kriging metamodeling by maximizing expected prediction - error." Computers & Chemical Engineering 106 (2017): 171-182. - - Parameters - ---------- - tradeoff_scheme : string - Trade-off scheme for exloration and exploitation scores. - old_EDX : array (n_samples, n_params) - Old experimental design (training points). - old_EDY : dict - Old model responses (targets). - - Returns - ------- - exploration_weight : float - Exploration weight. - exploitation_weight: float - Exploitation weight. - - """ - if tradeoff_scheme is None: - exploration_weight = 0 - - elif tradeoff_scheme == 'equal': - exploration_weight = 0.5 - - elif tradeoff_scheme == 'epsilon-decreasing': - # epsilon-decreasing scheme - # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, - 0, tau2, False)[itrNumber] - - elif tradeoff_scheme == 'adaptive': - - # Extract itrNumber - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - if itrNumber == 0: - exploration_weight = 0.5 - else: - # New adaptive trade-off according to Liu et al. (2017) - # Mean squared error for last design point - last_EDX = old_EDX[-1].reshape(1, -1) - lastPCEY, _ = self.MetaModel.eval_metamodel(samples=last_EDX) - pce_y = np.array(list(lastPCEY.values()))[:, 0] - y = np.array(list(old_EDY.values()))[:, -1, :] - mseError = mean_squared_error(pce_y, y) - - # Mean squared CV - error for last design point - pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] - mseCVError = mean_squared_error(pce_y_prev, y) - - exploration_weight = min([0.5*mseError/mseCVError, 1]) - - # Exploitation weight - exploitation_weight = 1 - exploration_weight - - return exploration_weight, exploitation_weight - - # ------------------------------------------------------------------------- - def opt_SeqDesign(self, sigma2, n_candidates=5, var='DKL'): - """ - Runs optimal sequential design. - - Parameters - ---------- - sigma2 : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - n_candidates : int, optional - Number of candidate samples. The default is 5. - var : string, optional - Utility function. The default is None. - - Raises - ------ - NameError - Wrong utility function. - - Returns - ------- - Xnew : array (n_samples, n_params) - Selected new training point(s). - """ - - # Initialization - MetaModel = self.MetaModel - Bounds = MetaModel.bound_tuples - n_new_samples = MetaModel.ExpDesign.n_new_samples - explore_method = MetaModel.ExpDesign.explore_method - exploit_method = MetaModel.ExpDesign.exploit_method - n_cand_groups = MetaModel.ExpDesign.n_cand_groups - tradeoff_scheme = MetaModel.ExpDesign.tradeoff_scheme - - old_EDX = MetaModel.ExpDesign.X - old_EDY = MetaModel.ExpDesign.Y.copy() - ndim = MetaModel.ExpDesign.X.shape[1] - OutputNames = MetaModel.ModelObj.Output.names - - # ----------------------------------------- - # ----------- CUSTOMIZED METHODS ---------- - # ----------------------------------------- - # Utility function exploit_method provided by user - if exploit_method.lower() == 'user': - - Xnew, filteredSamples = MetaModel.ExpDesign.ExploitFunction(self) - - print("\n") - print("\nXnew:\n", Xnew) - - return Xnew, filteredSamples - - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- - if explore_method == 'dual annealing': - # ------- EXPLORATION: OPTIMIZATION ------- - import time - start_time = time.time() - - # Divide the domain to subdomains - args = [] - subdomains = self.subdomain(Bounds, n_new_samples) - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() - - # Close the pool - pool.close() - - Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - - print("\nXnew:\n", Xnew) - - elapsed_time = time.time() - start_time - print("\n") - print(f"Elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) - - elif explore_method == 'LOOCV': - # ----------------------------------------------------------------- - # TODO: LOOCV model construnction based on Feng et al. (2020) - # 'LOOCV': - # Initilize the ExploitScore array - - # Generate random samples - allCandidates = MetaModel.ExpDesign.generate_samples(n_candidates, - 'random') - - # Construct error model based on LCerror - errorModel = MetaModel.create_ModelError(old_EDX, self.LCerror) - self.errorModel.append(copy(errorModel)) - - # Evaluate the error models for allCandidates - eLCAllCands, _ = errorModel.eval_errormodel(allCandidates) - # Select the maximum as the representative error - eLCAllCands = np.dstack(eLCAllCands.values()) - eLCAllCandidates = np.max(eLCAllCands, axis=1)[:, 0] - - # Normalize the error w.r.t the maximum error - scoreExploration = eLCAllCandidates / np.sum(eLCAllCandidates) - - else: - # ------- EXPLORATION: SPACE-FILLING DESIGN ------- - # Generate candidate samples from Exploration class - explore = Exploration(MetaModel, n_candidates) - explore.w = 100 # * ndim #500 - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - allCandidates, scoreExploration = explore.get_exploration_samples() - - # Temp: ---- Plot all candidates ----- - if ndim == 2: - def plotter(points, allCandidates, Method, - scoreExploration=None): - if Method == 'Voronoi': - from scipy.spatial import Voronoi, voronoi_plot_2d - vor = Voronoi(points) - fig = voronoi_plot_2d(vor) - ax1 = fig.axes[0] - else: - fig = plt.figure() - ax1 = fig.add_subplot(111) - ax1.scatter(points[:, 0], points[:, 1], s=10, c='r', - marker="s", label='Old Design Points') - ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, - c='b', marker="o", label='Design candidates') - for i in range(points.shape[0]): - txt = 'p'+str(i+1) - ax1.annotate(txt, (points[i, 0], points[i, 1])) - if scoreExploration is not None: - for i in range(allCandidates.shape[0]): - txt = str(round(scoreExploration[i], 5)) - ax1.annotate(txt, (allCandidates[i, 0], - allCandidates[i, 1])) - - plt.xlim(self.bound_tuples[0]) - plt.ylim(self.bound_tuples[1]) - # plt.show() - plt.legend(loc='upper left') - - # ----------------------------------------- - # --------- EXPLOITATION METHODS ---------- - # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\n Exploration weight={explore_w:0.3f} " - f"Exploitation weight={exploit_w:0.3f}\n") - - # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- - if explore_w != 1.0: - - # Create a sample pool for rejection sampling - MCsize = 15000 - X_MC = MetaModel.ExpDesign.generate_samples(MCsize, 'random') - candidates = MetaModel.ExpDesign.generate_samples( - MetaModel.ExpDesign.max_func_itr, 'latin_hypercube') - - # Split the candidates in groups for multiprocessing - split_cand = np.array_split( - candidates, n_cand_groups, axis=0 - ) - - results = Parallel(n_jobs=-1, backend='threading')( - delayed(self.run_util_func)( - exploit_method, split_cand[i], i, sigma2, var, X_MC) - for i in range(n_cand_groups)) - # out = map(self.run_util_func, - # [exploit_method]*n_cand_groups, - # split_cand, - # range(n_cand_groups), - # [sigma2] * n_cand_groups, - # [var] * n_cand_groups, - # [X_MC] * n_cand_groups - # ) - # results = list(out) - - # Retrieve the results and append them - U_J_d = np.concatenate([results[NofE][1] for NofE in - range(n_cand_groups)]) - - # Check if all scores are inf - if np.isinf(U_J_d).all() or np.isnan(U_J_d).all(): - U_J_d = np.ones(len(U_J_d)) - - # Get the expected value (mean) of the Utility score - # for each cell - if explore_method == 'Voronoi': - U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - - # create surrogate model for U_J_d - from sklearn.preprocessing import MinMaxScaler - # Take care of inf entries - good_indices = [i for i, arr in enumerate(U_J_d) - if np.isfinite(arr).all()] - scaler = MinMaxScaler() - X_S = scaler.fit_transform(candidates[good_indices]) - gp = MetaModel.gaussian_process_emulator( - X_S, U_J_d[good_indices], autoSelect=True - ) - U_J_d = gp.predict(scaler.transform(allCandidates)) - - # Normalize U_J_d - norm_U_J_d = U_J_d / np.sum(U_J_d) - print("norm_U_J_d:\n", norm_U_J_d) - else: - norm_U_J_d = np.zeros((len(scoreExploration))) - - # ------- Calculate Total score ------- - # ------- Trade off between EXPLORATION & EXPLOITATION ------- - # Total score - totalScore = exploit_w * norm_U_J_d - totalScore += explore_w * scoreExploration - - # temp: Plot - # dim = self.ExpDesign.X.shape[1] - # if dim == 2: - # plotter(self.ExpDesign.X, allCandidates, explore_method) - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - # select the requested number of samples - if explore_method == 'Voronoi': - Xnew = np.zeros((n_new_samples, ndim)) - for i, idx in enumerate(bestIdx): - X_can = explore.closestPoints[idx] - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - elif exploit_method == 'VarOptDesign': - # ------- EXPLOITATION: VarOptDesign ------- - UtilMethod = var - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\nweightExploration={explore_w:0.3f} " - f"weightExploitation={exploit_w:0.3f}") - - # Generate candidate samples from Exploration class - nMeasurement = old_EDY[OutputNames[0]].shape[1] - - # Find sensitive region - if UtilMethod == 'LOOCV': - LCerror = MetaModel.LCerror - allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), - nMeasurement)) - for y_idx, y_key in enumerate(OutputNames): - for idx, key in enumerate(LCerror[y_key].keys()): - allModifiedLOO[:, y_idx, idx] = abs( - LCerror[y_key][key]) - - ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) - - elif UtilMethod in ['EIGF', 'ALM']: - # ----- All other in ['EIGF', 'ALM'] ----- - # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) - - # Split the candidates in groups for multiprocessing - if explore_method != 'Voronoi': - split_cand = np.array_split(allCandidates, - n_cand_groups, - axis=0) - goodSampleIdx = range(n_cand_groups) - else: - # Find indices of the Vornoi cells with samples - goodSampleIdx = [] - for idx in range(len(explore.closest_points)): - if len(explore.closest_points[idx]) != 0: - goodSampleIdx.append(idx) - split_cand = explore.closest_points - - # Split the candidates in groups for multiprocessing - args = [] - for index in goodSampleIdx: - args.append((exploit_method, split_cand[index], index, - sigma2, var)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.run_util_func, args).get() - - # Close the pool - pool.close() - # out = map(self.run_util_func, - # [exploit_method]*len(goodSampleIdx), - # split_cand, - # range(len(goodSampleIdx)), - # [sigma2] * len(goodSampleIdx), - # [var] * len(goodSampleIdx) - # ) - # results = list(out) - - # Retrieve the results and append them - if explore_method == 'Voronoi': - ExploitScore = [np.mean(results[k][1]) for k in - range(len(goodSampleIdx))] - else: - ExploitScore = np.concatenate( - [results[k][1] for k in range(len(goodSampleIdx))]) - - else: - raise NameError('The requested utility function is not ' - 'available.') - - # print("ExploitScore:\n", ExploitScore) - - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - # Total score - # Normalize U_J_d - ExploitScore = ExploitScore / np.sum(ExploitScore) - totalScore = exploit_w * ExploitScore - totalScore += explore_w * scoreExploration - - temp = totalScore.copy() - sorted_idxtotalScore = np.argsort(temp, axis=0)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - Xnew = np.zeros((n_new_samples, ndim)) - if explore_method != 'Voronoi': - Xnew = allCandidates[bestIdx] - else: - for i, idx in enumerate(bestIdx.flatten()): - X_can = explore.closest_points[idx] - # plotter(self.ExpDesign.X, X_can, explore_method, - # scoreExploration=None) - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - - elif exploit_method == 'alphabetic': - # ------- EXPLOITATION: ALPHABETIC ------- - Xnew = self.util_AlphOptDesign(allCandidates, var) - - elif exploit_method == 'Space-filling': - # ------- EXPLOITATION: SPACE-FILLING ------- - totalScore = scoreExploration - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - - # select the requested number of samples - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - else: - raise NameError('The requested design method is not available.') - - print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) - print("Xnew:\n", Xnew) - gc.collect() - - return Xnew, None - - # ------------------------------------------------------------------------- - def util_AlphOptDesign(self, candidates, var='D-Opt'): - """ - Enriches the Experimental design with the requested alphabetic - criterion based on exploring the space with number of sampling points. - - Ref: Hadigol, M., & Doostan, A. (2018). Least squares polynomial chaos - expansion: A review of sampling strategies., Computer Methods in - Applied Mechanics and Engineering, 332, 382-407. - - Arguments - --------- - NCandidate : int - Number of candidate points to be searched - - var : string - Alphabetic optimality criterion - - Returns - ------- - X_new : array of shape (1, n_params) - The new sampling location in the input space. - """ - MetaModelOrig = self - Model = self.Model - n_new_samples = MetaModelOrig.ExpDesign.n_new_samples - NCandidate = candidates.shape[0] - - # TODO: Loop over outputs - OutputName = Model.Output.names[0] - - # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - - # TODO: Only one psi can be selected. - # Suggestion: Go for the one with the highest LOO error - Scores = list(MetaModel.score_dict[OutputName].values()) - ModifiedLOO = [1-score for score in Scores] - outIdx = np.argmax(ModifiedLOO) - - # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) - - BasisIndices = MetaModelOrig.basis_dict[OutputName]["y_"+str(outIdx+1)] - P = len(BasisIndices) - - # ------ Old Psi ------------ - univ_p_val = MetaModelOrig.univ_basis_vals(oldExpDesignX) - Psi = MetaModelOrig.create_psi(BasisIndices, univ_p_val) - - # ------ New candidates (Psi_c) ------------ - # Assemble Psi_c - univ_p_val_c = self.univ_basis_vals(candidates) - Psi_c = self.create_psi(BasisIndices, univ_p_val_c) - - for idx in range(NCandidate): - - # Include the new row to the original Psi - Psi_cand = np.vstack((Psi, Psi_c[idx])) - - # Information matrix - PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) - - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: - # faster - invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - invM = np.linalg.pinv(M) - - # ---------- Calculate optimality criterion ---------- - # Optimality criteria according to Section 4.5.1 in Ref. - - # D-Opt - if var == 'D-Opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) - - # A-Opt - elif var == 'A-Opt': - Phi[idx] = np.trace(invM) - - # K-Opt - elif var == 'K-Opt': - Phi[idx] = np.linalg.cond(M) - - else: - raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') - - # find an optimal point subset to add to the initial design - # by minimization of the Phi - sorted_idxtotalScore = np.argsort(Phi) - - # select the requested number of samples - Xnew = candidates[sorted_idxtotalScore[:n_new_samples]] - - return Xnew - - # ------------------------------------------------------------------------- - def __normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): - - Model = self.Model - likelihoods = 1.0 - - # Loop over the outputs - for idx, out in enumerate(Model.Output.names): - - # (Meta)Model Output - nsamples, nout = y_hat_pce[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout].values - - # Surrogate error if valid dataset is given. - if rmse is not None: - tot_sigma2s += rmse[out]**2 - - likelihoods *= stats.multivariate_normal.pdf( - y_hat_pce[out], data, np.diag(tot_sigma2s), - allow_singular=True) - self.Likelihoods = likelihoods - - return likelihoods - - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = MetaModel.ExpDesign.X # valid_samples - model_outputs = MetaModel.ExpDesign.Y # valid_model_runs - Model = MetaModel.ModelObj - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names - - # TODO: Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) - covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) - - # Compute likelilhood output vs data - logLik_data[i] += self.__logpdf( - y_m_hat, data, covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += self.__logpdf(y_m_hat, y_m, covMatrix) - - # Weight - logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) - - return np.log(np.mean(weights)) - - # ------------------------------------------------------------------------- - def __logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - - # ------------------------------------------------------------------------- - def __posteriorPlot(self, posterior, par_names, key): - - # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') - os.makedirs(newpath, exist_ok=True) - - bound_tuples = self.MetaModel.bound_tuples - n_params = len(par_names) - font_size = 40 - if n_params == 2: - - figPosterior, ax = plt.subplots(figsize=(15, 15)) - - sns.kdeplot(x=posterior[:, 0], y=posterior[:, 1], - fill=True, ax=ax, cmap=plt.cm.jet, - clip=bound_tuples) - # Axis labels - plt.xlabel(par_names[0], fontsize=font_size) - plt.ylabel(par_names[1], fontsize=font_size) - - # Set axis limit - plt.xlim(bound_tuples[0]) - plt.ylim(bound_tuples[1]) - - # Increase font size - plt.xticks(fontsize=font_size) - plt.yticks(fontsize=font_size) - - # Switch off the grids - plt.grid(False) - - else: - import corner - figPosterior = corner.corner(posterior, labels=par_names, - title_fmt='.2e', show_titles=True, - title_kwargs={"fontsize": 12}) - - figPosterior.savefig(f'./{newpath}/{key}.pdf', bbox_inches='tight') - plt.close() - - # Save the posterior as .npy - np.save(f'./{newpath}/{key}.npy', posterior) - - return figPosterior - - # ------------------------------------------------------------------------- - def __hellinger_distance(self, P, Q): - """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) - - Parameters - ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. - - Returns - ------- - float - Hellinger distance of two distributions. - - """ - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - # ------------------------------------------------------------------------- - def __BME_Calculator(self, MetaModel, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - - """ - # Initializations - valid_likelihoods = MetaModel.valid_likelihoods - - post_snapshot = MetaModel.ExpDesign.post_snapshot - if post_snapshot or len(valid_likelihoods) != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') - os.makedirs(newpath, exist_ok=True) - - SamplingMethod = 'random' - MCsize = 10000 - ESS = 0 - - # Estimation of the integral via Monte Varlo integration - while (ESS > MCsize) or (ESS < 1): - - # Generate samples for Monte Carlo simulation - X_MC = MetaModel.ExpDesign.generate_samples( - MCsize, SamplingMethod - ) - - # Monte Carlo simulation for the candidate design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - Y_MC, std_MC = MetaModel.eval_metamodel(samples=X_MC) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel in BME: {m_2-m_1:.2f} MB") - - # Likelihood computation (Comparison of data and - # simulation results via PCE with candidate design) - Likelihoods = self.__normpdf( - Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) - - # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if (ESS > MCsize) or (ESS < 1): - print(f'ESS={ESS} MC size should be larger.') - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - X_Posterior = X_MC[accepted] - - # ------------------------------------------------------------ - # --- Kullback-Leibler Divergence & Information Entropy ------ - # ------------------------------------------------------------ - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - - # TODO: Correction factor - # log_weight = self.__corr_factor_BME(obs_data, sigma2Dict, logBME) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(MetaModel.ExpDesign.JDist.pdf(X_Posterior.T)) - ) - - # Calculate Kullback-Leibler Divergence - # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - KLD = postExpLikelihoods - logBME - - # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods - - # If post_snapshot is True, plot likelihood vs refrence - if post_snapshot or len(valid_likelihoods) != 0: - # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) - est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = self.__hellinger_distance(ref_like, est_like) - - idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' - in name and os.path.isfile(os.path.join(newpath, name))]) - fig, ax = plt.subplots() - try: - sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), - shade=True, color="g", label='Ref. Likelihood') - sns.kdeplot(np.log(Likelihoods[Likelihoods > 0]), shade=True, - color="b", label='Likelihood with PCE') - except: - pass - - text = f"Hellinger Dist.={distHellinger:.3f}\n logBME={logBME:.3f}" - "\n DKL={KLD:.3f}" - - plt.text(0.05, 0.75, text, bbox=dict(facecolor='wheat', - edgecolor='black', - boxstyle='round,pad=1'), - transform=ax.transAxes) - - fig.savefig(f'./{newpath}/Likelihoods_{idx}.pdf', - bbox_inches='tight') - plt.close() - - else: - distHellinger = 0.0 - - # Bayesian inference with Emulator only for 2D problem - if post_snapshot and MetaModel.n_params == 2 and not idx % 5: - from bayes_inference.bayes_inference import BayesInference - from bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(MetaModel) - BayesOpts.emulator = True - BayesOpts.plot_post_pred = False - - # Select the inference method - import emcee - BayesOpts.inference_method = "MCMC" - # Set the MCMC parameters passed to self.mcmc_params - BayesOpts.mcmc_params = { - 'n_steps': 1e5, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'verbose': False - } - - # ----- Define the discrepancy model ------- - obs_data = pd.DataFrame(obs_data, columns=self.Model.Output.names) - BayesOpts.measurement_error = obs_data - - # # -- (Option B) -- - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 - BayesOpts.Discrepancy = DiscrepancyOpts - # Start the calibration/inference - Bayes_PCE = BayesOpts.create_inference() - X_Posterior = Bayes_PCE.posterior_df.values - - # Clean up - del Y_MC, std_MC - gc.collect() - - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - # ------------------------------------------------------------------------- - def __validError(self, MetaModel): - - # MetaModel = self.MetaModel - Model = MetaModel.ModelObj - OutputName = Model.Output.names - - # Extract the original model with the generated samples - valid_samples = MetaModel.valid_samples - valid_model_runs = MetaModel.valid_model_runs - - # Run the PCE model with the generated samples - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - valid_PCE_runs, valid_PCE_std = MetaModel.eval_metamodel(samples=valid_samples) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel: {m_2-m_1:.2f} MB") - - rms_error = {} - valid_error = {} - # Loop over the keys and compute RMSE error. - for key in OutputName: - rms_error[key] = mean_squared_error( - valid_model_runs[key], valid_PCE_runs[key], - multioutput='raw_values', - sample_weight=None, - squared=False) - - # Validation error - valid_error[key] = (rms_error[key]**2) - valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Updated Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(rms_error[key], - valid_error[key])))) - - return rms_error, valid_error - - # ------------------------------------------------------------------------- - def __error_Mean_Std(self): - - MetaModel = self.MetaModel - # Extract the mean and std provided by user - df_MCReference = MetaModel.ModelObj.mc_reference - - # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self._compute_pce_moments(MetaModel) - - # Compute the root mean squared error - for output in MetaModel.ModelObj.Output.names: - - # Compute the error between mean and std of MetaModel and OrigModel - RMSE_Mean = mean_squared_error( - df_MCReference['mean'], pce_means[output], squared=False - ) - RMSE_std = mean_squared_error( - df_MCReference['std'], pce_means[output], squared=False - ) - - return RMSE_Mean, RMSE_std - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self, MetaModel): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - outputs = MetaModel.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.mean_ + np.dot( - pce_mean, PCA.components_) - stds[output] = np.sqrt(np.dot(pce_var, - PCA.components_**2)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/surrogate_models.py b/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/surrogate_models.py deleted file mode 100644 index a6d31ccd1..000000000 --- a/examples/umbridge_tsunamitutorial/bayesvalidrox/surrogate_models/surrogate_models.py +++ /dev/null @@ -1,1473 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import warnings -import numpy as np -import math -import h5py -import matplotlib.pyplot as plt -from sklearn.preprocessing import MinMaxScaler -import scipy as sp -from tqdm import tqdm -from sklearn.decomposition import PCA as sklearnPCA -import sklearn.linear_model as lm -from sklearn.gaussian_process import GaussianProcessRegressor -import sklearn.gaussian_process.kernels as kernels -import os -from joblib import Parallel, delayed -import copy - -from .input_space import InputSpace -from .glexindex import glexindex -from .eval_rec_rule import eval_univ_basis -from .reg_fast_ard import RegressionFastARD -from .reg_fast_laplace import RegressionFastLaplace -from .orthogonal_matching_pursuit import OrthogonalMatchingPursuit -from .bayes_linear import VBLinearRegression, EBLinearRegression -from .apoly_construction import apoly_construction -warnings.filterwarnings("ignore") -# Load the mplstyle -plt.style.use(os.path.join(os.path.split(__file__)[0], - '../', 'bayesvalidrox.mplstyle')) - - -class MetaModel(): - """ - Meta (surrogate) model - - This class trains a surrogate model. It accepts an input object (input_obj) - containing the specification of the distributions for uncertain parameters - and a model object with instructions on how to run the computational model. - - Attributes - ---------- - input_obj : obj - Input object with the information on the model input parameters. - meta_model_type : str - Surrogate model types. Three surrogate model types are supported: - polynomial chaos expansion (`PCE`), arbitrary PCE (`aPCE`) and - Gaussian process regression (`GPE`). Default is PCE. - pce_reg_method : str - PCE regression method to compute the coefficients. The following - regression methods are available: - - 1. OLS: Ordinary Least Square method - 2. BRR: Bayesian Ridge Regression - 3. LARS: Least angle regression - 4. ARD: Bayesian ARD Regression - 5. FastARD: Fast Bayesian ARD Regression - 6. VBL: Variational Bayesian Learning - 7. EBL: Emperical Bayesian Learning - Default is `OLS`. - bootstrap_method : str - Bootstraping method. Options are `'normal'` and `'fast'`. The default - is `'fast'`. It means that in each iteration except the first one, only - the coefficent are recalculated with the ordinary least square method. - n_bootstrap_itrs : int - Number of iterations for the bootstrap sampling. The default is `1`. - pce_deg : int or list of int - Polynomial degree(s). If a list is given, an adaptive algorithm is used - to find the best degree with the lowest Leave-One-Out cross-validation - (LOO) error (or the highest score=1-LOO). Default is `1`. - pce_q_norm : float - Hyperbolic (or q-norm) truncation for multi-indices of multivariate - polynomials. Default is `1.0`. - dim_red_method : str - Dimensionality reduction method for the output space. The available - method is based on principal component analysis (PCA). The Default is - `'no'`. There are two ways to select number of components: use - percentage of the explainable variance threshold (between 0 and 100) - (Option A) or direct prescription of components' number (Option B): - - >>> MetaModelOpts.dim_red_method = 'PCA' - >>> MetaModelOpts.var_pca_threshold = 99.999 # Option A - >>> MetaModelOpts.n_pca_components = 12 # Option B - - verbose : bool - Prints summary of the regression results. Default is `False`. - - Note - ------- - To define the sampling methods and the training set, an experimental design - instance shall be defined. This can be done by: - - >>> MetaModelOpts.add_InputSpace() - - Two experimental design schemes are supported: one-shot (`normal`) and - adaptive sequential (`sequential`) designs. - For experimental design refer to `InputSpace`. - - """ - - def __init__(self, input_obj, meta_model_type='PCE', - pce_reg_method='OLS', bootstrap_method='fast', - n_bootstrap_itrs=1, pce_deg=1, pce_q_norm=1.0, - dim_red_method='no', verbose=False): - - self.input_obj = input_obj - self.meta_model_type = meta_model_type - self.pce_reg_method = pce_reg_method - self.bootstrap_method = bootstrap_method - self.n_bootstrap_itrs = n_bootstrap_itrs - self.pce_deg = pce_deg - self.pce_q_norm = pce_q_norm - self.dim_red_method = dim_red_method - self.verbose = verbose - - def build_metamodel(self, n_init_samples = None) -> None: - """ - Builds the parts for the metamodel (polynomes,...) that are neede before fitting. - - Returns - ------- - None - DESCRIPTION. - - """ - - # Add InputSpace to MetaModel if it does not have any - if not hasattr(self, 'InputSpace'): - self.InputSpace = InputSpace(self.input_obj) - self.InputSpace.n_init_samples = n_init_samples - self.InputSpace.init_param_space(np.max(self.pce_deg)) - - self.ndim = self.InputSpace.ndim - - if not hasattr(self, 'CollocationPoints'): - raise AttributeError('Please provide samples to the metamodel before building it.') - - self.n_params = len(self.input_obj.Marginals) - - # Generate polynomials - if self.meta_model_type.lower() != 'gpe': - self.generate_polynomials(np.max(self.pce_deg)) - - # Initialize the nested dictionaries - if self.meta_model_type.lower() == 'gpe': - self.gp_poly = self.auto_vivification() - self.x_scaler = self.auto_vivification() - self.LCerror = self.auto_vivification() - else: - self.deg_dict = self.auto_vivification() - self.q_norm_dict = self.auto_vivification() - self.coeffs_dict = self.auto_vivification() - self.basis_dict = self.auto_vivification() - self.score_dict = self.auto_vivification() - self.clf_poly = self.auto_vivification() - self.LCerror = self.auto_vivification() - if self.dim_red_method.lower() == 'pca': - self.pca = self.auto_vivification() - - # Define an array containing the degrees - self.CollocationPoints = np.array(self.CollocationPoints) - self.n_samples, ndim = self.CollocationPoints.shape - if self.ndim != ndim: - raise AttributeError('The given samples do not match the given number of priors. The samples should be a 2D array of size (#samples, #priors)') - - self.deg_array = self.__select_degree(ndim, self.n_samples) - - # Generate all basis indices - self.allBasisIndices = self.auto_vivification() - for deg in self.deg_array: - keys = self.allBasisIndices.keys() - if deg not in np.fromiter(keys, dtype=float): - # Generate the polynomial basis indices - for qidx, q in enumerate(self.pce_q_norm): - basis_indices = glexindex(start=0, stop=deg+1, - dimensions=self.n_params, - cross_truncation=q, - reverse=False, graded=True) - self.allBasisIndices[str(deg)][str(q)] = basis_indices - - - - def fit(self, X, y, parallel = True, verbose = False): - """ - Fits the surrogate to the given data (samples X, outputs y). - Note here that the samples X should be the transformed samples provided - by the experimental design if the transformation is used there. - - Parameters - ---------- - X : 2D list or np.array of shape (#samples, #dim) - The parameter value combinations that the model was evaluated at. - y : dict of 2D lists or arrays of shape (#samples, #timesteps) - The respective model evaluations. - - Returns - ------- - None. - - """ - X = np.array(X) - for key in y.keys(): - y_val = np.array(y[key]) - if y_val.ndim !=2: - raise ValueError('The given outputs y should be 2D') - y[key] = np.array(y[key]) - - # Output names are the same as the keys in y - self.out_names = list(y.keys()) - - # Build the MetaModel on the static samples - self.CollocationPoints = X - - # TODO: other option: rebuild every time - if not hasattr(self, 'deg_array'): - self.build_metamodel(n_init_samples = X.shape[1]) - - # Evaluate the univariate polynomials on InputSpace - if self.meta_model_type.lower() != 'gpe': - self.univ_p_val = self.univ_basis_vals(self.CollocationPoints) - - # --- Loop through data points and fit the surrogate --- - if verbose: - print(f"\n>>>> Training the {self.meta_model_type} metamodel " - "started. <<<<<<\n") - - # --- Bootstrap sampling --- - # Correct number of bootstrap if PCA transformation is required. - if self.dim_red_method.lower() == 'pca' and self.n_bootstrap_itrs == 1: - self.n_bootstrap_itrs = 100 - - # Check if fast version (update coeffs with OLS) is selected. - if self.bootstrap_method.lower() == 'fast': - fast_bootstrap = True - first_out = {} - n_comp_dict = {} - else: - fast_bootstrap = False - - # Prepare tqdm iteration maessage - if verbose and self.n_bootstrap_itrs > 1: - enum_obj = tqdm(range(self.n_bootstrap_itrs), - total=self.n_bootstrap_itrs, - desc="Bootstrapping the metamodel", - ascii=True) - else: - enum_obj = range(self.n_bootstrap_itrs) - - # Loop over the bootstrap iterations - for b_i in enum_obj: - if b_i > 0: - b_indices = np.random.randint(self.n_samples, size=self.n_samples) - else: - b_indices = np.arange(len(X)) - - X_train_b = X[b_indices] - - if verbose and self.n_bootstrap_itrs == 1: - items = tqdm(y.items(), desc="Fitting regression") - else: - items = y.items() - - # For loop over the components/outputs - for key, Output in items: - - # Dimensionality reduction with PCA, if specified - if self.dim_red_method.lower() == 'pca': - - # Use the stored n_comp for fast bootsrtrapping - if fast_bootstrap and b_i > 0: - self.n_pca_components = n_comp_dict[key] - - # Start transformation - pca, target, n_comp = self.pca_transformation( - Output[b_indices], verbose=False - ) - self.pca[f'b_{b_i+1}'][key] = pca - # Store the number of components for fast bootsrtrapping - if fast_bootstrap and b_i == 0: - n_comp_dict[key] = n_comp - else: - target = Output[b_indices] - - # Parallel fit regression - if self.meta_model_type.lower() == 'gpe': - # Prepare the input matrix - scaler = MinMaxScaler() - X_S = scaler.fit_transform(X_train_b) - - self.x_scaler[f'b_{b_i+1}'][key] = scaler - if parallel: - out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.gaussian_process_emulator)( - X_S, target[:, idx]) for idx in - range(target.shape[1])) - else: - results = map(self.gaussian_process_emulator, - [X_train_b]*target.shape[1], - [target[:, idx] for idx in - range(target.shape[1])] - ) - out = list(results) - - for idx in range(target.shape[1]): - self.gp_poly[f'b_{b_i+1}'][key][f"y_{idx+1}"] = out[idx] - - else: - self.univ_p_val = self.univ_p_val[b_indices] - if parallel and (not fast_bootstrap or b_i == 0): - out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.adaptive_regression)(X_train_b, - target[:, idx], - idx) - for idx in range(target.shape[1])) - elif not parallel and (not fast_bootstrap or b_i == 0): - results = map(self.adaptive_regression, - [X_train_b]*target.shape[1], - [target[:, idx] for idx in - range(target.shape[1])], - range(target.shape[1])) - out = list(results) - - # Store the first out dictionary - if fast_bootstrap and b_i == 0: - first_out[key] = copy.deepcopy(out) - - if b_i > 0 and fast_bootstrap: - - # fast bootstrap - out = self.update_pce_coeffs( - X_train_b, target, first_out[key]) - - for i in range(target.shape[1]): - # Create a dict to pass the variables - self.deg_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['degree'] - self.q_norm_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['qnorm'] - self.coeffs_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['coeffs'] - self.basis_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['multi_indices'] - self.score_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LOOCVScore'] - self.clf_poly[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['clf_poly'] - #self.LCerror[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LCerror'] - - if verbose: - print(f"\n>>>> Training the {self.meta_model_type} metamodel" - " sucessfully completed. <<<<<<\n") - - # ------------------------------------------------------------------------- - def update_pce_coeffs(self, X, y, out_dict = None): - """ - Updates the PCE coefficents using only the ordinary least square method - for the fast version of the bootstrapping. - - Parameters - ---------- - X : array of shape (n_samples, n_params) - Training set. - y : array of shape (n_samples, n_outs) - The (transformed) model responses. - out_dict : dict - The training output dictionary of the first iteration, i.e. - the surrogate model for the original experimental design. - - Returns - ------- - final_out_dict : dict - The updated training output dictionary. - - """ - # Make a copy - final_out_dict = copy.deepcopy(out_dict) - - # Loop over the points - for i in range(y.shape[1]): - - - # Extract nonzero basis indices - nnz_idx = np.nonzero(out_dict[i]['coeffs'])[0] - if len(nnz_idx) != 0: - basis_indices = out_dict[i]['multi_indices'] - - # Evaluate the multivariate polynomials on CollocationPoints - psi = self.create_psi(basis_indices, self.univ_p_val) - - # Calulate the cofficients of surrogate model - updated_out = self.regression( - psi, y[:, i], basis_indices, reg_method='OLS', - sparsity=False - ) - - # Update coeffs in out_dict - final_out_dict[i]['coeffs'][nnz_idx] = updated_out['coeffs'] - - return final_out_dict - - # ------------------------------------------------------------------------- - def add_InputSpace(self): - """ - Instanciates experimental design object. - - Returns - ------- - None. - - """ - self.InputSpace = InputSpace(self.input_obj, - meta_Model_type=self.meta_model_type) - - # ------------------------------------------------------------------------- - def univ_basis_vals(self, samples, n_max=None): - """ - Evaluates univariate regressors along input directions. - - Parameters - ---------- - samples : array of shape (n_samples, n_params) - Samples. - n_max : int, optional - Maximum polynomial degree. The default is `None`. - - Returns - ------- - univ_basis: array of shape (n_samples, n_params, n_max+1) - All univariate regressors up to n_max. - """ - # Extract information - poly_types = self.InputSpace.poly_types - if samples.ndim != 2: - samples = samples.reshape(1, len(samples)) - n_max = np.max(self.pce_deg) if n_max is None else n_max - - # Extract poly coeffs - if self.InputSpace.input_data_given or self.InputSpace.apce: - apolycoeffs = self.polycoeffs - else: - apolycoeffs = None - - # Evaluate univariate basis - univ_basis = eval_univ_basis(samples, n_max, poly_types, apolycoeffs) - - return univ_basis - - # ------------------------------------------------------------------------- - def create_psi(self, basis_indices, univ_p_val): - """ - This function assemble the design matrix Psi from the given basis index - set INDICES and the univariate polynomial evaluations univ_p_val. - - Parameters - ---------- - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - univ_p_val : array of (n_samples, n_params, n_max+1) - All univariate regressors up to `n_max`. - - Raises - ------ - ValueError - n_terms in arguments do not match. - - Returns - ------- - psi : array of shape (n_samples, n_terms) - Multivariate regressors. - - """ - # Check if BasisIndices is a sparse matrix - sparsity = sp.sparse.issparse(basis_indices) - if sparsity: - basis_indices = basis_indices.toarray() - - # Initialization and consistency checks - # number of input variables - n_params = univ_p_val.shape[1] - - # Size of the experimental design - n_samples = univ_p_val.shape[0] - - # number of basis terms - n_terms = basis_indices.shape[0] - - # check that the variables have consistent sizes - if n_params != basis_indices.shape[1]: - raise ValueError( - f"The shapes of basis_indices ({basis_indices.shape[1]}) and " - f"univ_p_val ({n_params}) don't match!!" - ) - - # Preallocate the Psi matrix for performance - psi = np.ones((n_samples, n_terms)) - # Assemble the Psi matrix - for m in range(basis_indices.shape[1]): - aa = np.where(basis_indices[:, m] > 0)[0] - try: - basisIdx = basis_indices[aa, m] - bb = univ_p_val[:, m, basisIdx].reshape(psi[:, aa].shape) - psi[:, aa] = np.multiply(psi[:, aa], bb) - except ValueError as err: - raise err - return psi - - # ------------------------------------------------------------------------- - def regression(self, X, y, basis_indices, reg_method=None, sparsity=True): - """ - Fit regression using the regression method provided. - - Parameters - ---------- - X : array of shape (n_samples, n_features) - Training vector, where n_samples is the number of samples and - n_features is the number of features. - y : array of shape (n_samples,) - Target values. - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - reg_method : str, optional - DESCRIPTION. The default is None. - - Returns - ------- - return_out_dict : Dict - Fitted estimator, spareMulti-Index, sparseX and coefficients. - - """ - if reg_method is None: - reg_method = self.pce_reg_method - - bias_term = self.dim_red_method.lower() != 'pca' - - compute_score = True if self.verbose else False - - # inverse of the observed variance of the data - if np.var(y) != 0: - Lambda = 1 / np.var(y) - else: - Lambda = 1e-6 - - # Bayes sparse adaptive aPCE - if reg_method.lower() == 'ols': - clf_poly = lm.LinearRegression(fit_intercept=False) - elif reg_method.lower() == 'brr': - clf_poly = lm.BayesianRidge(n_iter=1000, tol=1e-7, - fit_intercept=False, - #normalize=True, - compute_score=compute_score, - alpha_1=1e-04, alpha_2=1e-04, - lambda_1=Lambda, lambda_2=Lambda) - clf_poly.converged = True - - elif reg_method.lower() == 'ard': - if X.shape[0]<2: - raise ValueError('Regression with ARD can only be performed for more than 2 samples') - clf_poly = lm.ARDRegression(fit_intercept=False, - #normalize=True, - compute_score=compute_score, - n_iter=1000, tol=0.0001, - alpha_1=1e-3, alpha_2=1e-3, - lambda_1=Lambda, lambda_2=Lambda) - - elif reg_method.lower() == 'fastard': - clf_poly = RegressionFastARD(fit_intercept=False, - normalize=True, - compute_score=compute_score, - n_iter=300, tol=1e-10) - - elif reg_method.lower() == 'bcs': - if X.shape[0]<10: - raise ValueError('Regression with BCS can only be performed for more than 10 samples') - clf_poly = RegressionFastLaplace(fit_intercept=False, - bias_term=bias_term, - n_iter=1000, tol=1e-7) - - elif reg_method.lower() == 'lars': - if X.shape[0]<10: - raise ValueError('Regression with LARS can only be performed for more than 5 samples') - clf_poly = lm.LassoLarsCV(fit_intercept=False) - - elif reg_method.lower() == 'sgdr': - clf_poly = lm.SGDRegressor(fit_intercept=False, - max_iter=5000, tol=1e-7) - - elif reg_method.lower() == 'omp': - clf_poly = OrthogonalMatchingPursuit(fit_intercept=False) - - elif reg_method.lower() == 'vbl': - clf_poly = VBLinearRegression(fit_intercept=False) - - elif reg_method.lower() == 'ebl': - clf_poly = EBLinearRegression(optimizer='em') - - # Fit - clf_poly.fit(X, y) - - # Select the nonzero entries of coefficients - if sparsity: - nnz_idx = np.nonzero(clf_poly.coef_)[0] - else: - nnz_idx = np.arange(clf_poly.coef_.shape[0]) - - # This is for the case where all outputs are zero, thereby - # all coefficients are zero - if (y == 0).all(): - nnz_idx = np.insert(np.nonzero(clf_poly.coef_)[0], 0, 0) - - sparse_basis_indices = basis_indices[nnz_idx] - sparse_X = X[:, nnz_idx] - coeffs = clf_poly.coef_[nnz_idx] - clf_poly.coef_ = coeffs - - # Create a dict to pass the outputs - return_out_dict = dict() - return_out_dict['clf_poly'] = clf_poly - return_out_dict['spareMulti-Index'] = sparse_basis_indices - return_out_dict['sparePsi'] = sparse_X - return_out_dict['coeffs'] = coeffs - return return_out_dict - - # -------------------------------------------------------------------------------------------------------- - def adaptive_regression(self, ED_X, ED_Y, varIdx, verbose=False): - """ - Adaptively fits the PCE model by comparing the scores of different - degrees and q-norm. - - Parameters - ---------- - ED_X : array of shape (n_samples, n_params) - Experimental design. - ED_Y : array of shape (n_samples,) - Target values, i.e. simulation results for the Experimental design. - varIdx : int - Index of the output. - verbose : bool, optional - Print out summary. The default is False. - - Returns - ------- - returnVars : Dict - Fitted estimator, best degree, best q-norm, LOOCVScore and - coefficients. - - """ - - n_samples, n_params = ED_X.shape - # Initialization - qAllCoeffs, AllCoeffs = {}, {} - qAllIndices_Sparse, AllIndices_Sparse = {}, {} - qAllclf_poly, Allclf_poly = {}, {} - qAllnTerms, AllnTerms = {}, {} - qAllLCerror, AllLCerror = {}, {} - - # Extract degree array and qnorm array - deg_array = np.array([*self.allBasisIndices], dtype=int) - qnorm = [*self.allBasisIndices[str(int(deg_array[0]))]] - - # Some options for EarlyStop - errorIncreases = False - # Stop degree, if LOO error does not decrease n_checks_degree times - n_checks_degree = 3 - # Stop qNorm, if criterion isn't fulfilled n_checks_qNorm times - n_checks_qNorm = 2 - nqnorms = len(qnorm) - qNormEarlyStop = True - if nqnorms < n_checks_qNorm+1: - qNormEarlyStop = False - - # ===================================================================== - # basis adaptive polynomial chaos: repeat the calculation by increasing - # polynomial degree until the highest accuracy is reached - # ===================================================================== - # For each degree check all q-norms and choose the best one - scores = -np.inf * np.ones(deg_array.shape[0]) - qNormScores = -np.inf * np.ones(nqnorms) - - for degIdx, deg in enumerate(deg_array): - - for qidx, q in enumerate(qnorm): - - # Extract the polynomial basis indices from the pool of - # allBasisIndices - BasisIndices = self.allBasisIndices[str(deg)][str(q)] - - # Assemble the Psi matrix - Psi = self.create_psi(BasisIndices, self.univ_p_val) - - # Calulate the cofficients of the meta model - outs = self.regression(Psi, ED_Y, BasisIndices) - - # Calculate and save the score of LOOCV - score, LCerror = self.corr_loocv_error(outs['clf_poly'], - outs['sparePsi'], - outs['coeffs'], - ED_Y) - - # Check the convergence of noise for FastARD - if self.pce_reg_method == 'FastARD' and \ - outs['clf_poly'].alpha_ < np.finfo(np.float32).eps: - score = -np.inf - - qNormScores[qidx] = score - qAllCoeffs[str(qidx+1)] = outs['coeffs'] - qAllIndices_Sparse[str(qidx+1)] = outs['spareMulti-Index'] - qAllclf_poly[str(qidx+1)] = outs['clf_poly'] - qAllnTerms[str(qidx+1)] = BasisIndices.shape[0] - qAllLCerror[str(qidx+1)] = LCerror - - # EarlyStop check - # if there are at least n_checks_qNorm entries after the - # best one, we stop - if qNormEarlyStop and \ - sum(np.isfinite(qNormScores)) > n_checks_qNorm: - # If the error has increased the last two iterations, stop! - qNormScores_nonInf = qNormScores[np.isfinite(qNormScores)] - deltas = np.sign(np.diff(qNormScores_nonInf)) - if sum(deltas[-n_checks_qNorm+1:]) == 2: - # stop the q-norm loop here - break - if np.var(ED_Y) == 0: - break - - # Store the score in the scores list - best_q = np.nanargmax(qNormScores) - scores[degIdx] = qNormScores[best_q] - - AllCoeffs[str(degIdx+1)] = qAllCoeffs[str(best_q+1)] - AllIndices_Sparse[str(degIdx+1)] = qAllIndices_Sparse[str(best_q+1)] - Allclf_poly[str(degIdx+1)] = qAllclf_poly[str(best_q+1)] - AllnTerms[str(degIdx+1)] = qAllnTerms[str(best_q+1)] - AllLCerror[str(degIdx+1)] = qAllLCerror[str(best_q+1)] - - # Check the direction of the error (on average): - # if it increases consistently stop the iterations - if len(scores[scores != -np.inf]) > n_checks_degree: - scores_nonInf = scores[scores != -np.inf] - ss = np.sign(scores_nonInf - np.max(scores_nonInf)) - # ss<0 error decreasing - errorIncreases = np.sum(np.sum(ss[-2:])) <= -1*n_checks_degree - - if errorIncreases: - break - - # Check only one degree, if target matrix has zero variance - if np.var(ED_Y) == 0: - break - - # ------------------ Summary of results ------------------ - # Select the one with the best score and save the necessary outputs - best_deg = np.nanargmax(scores)+1 - coeffs = AllCoeffs[str(best_deg)] - basis_indices = AllIndices_Sparse[str(best_deg)] - clf_poly = Allclf_poly[str(best_deg)] - LOOCVScore = np.nanmax(scores) - P = AllnTerms[str(best_deg)] - LCerror = AllLCerror[str(best_deg)] - degree = deg_array[np.nanargmax(scores)] - qnorm = float(qnorm[best_q]) - - # ------------------ Print out Summary of results ------------------ - if self.verbose: - # Create PSI_Sparse by removing redundent terms - nnz_idx = np.nonzero(coeffs)[0] - BasisIndices_Sparse = basis_indices[nnz_idx] - - print(f'Output variable {varIdx+1}:') - print('The estimation of PCE coefficients converged at polynomial ' - f'degree {deg_array[best_deg-1]} with ' - f'{len(BasisIndices_Sparse)} terms (Sparsity index = ' - f'{round(len(BasisIndices_Sparse)/P, 3)}).') - - print(f'Final ModLOO error estimate: {1-max(scores):.3e}') - print('\n'+'-'*50) - - if verbose: - print('='*50) - print(' '*10 + ' Summary of results ') - print('='*50) - - print("Scores:\n", scores) - print("Degree of best score:", self.deg_array[best_deg-1]) - print("No. of terms:", len(basis_indices)) - print("Sparsity index:", round(len(basis_indices)/P, 3)) - print("Best Indices:\n", basis_indices) - - if self.pce_reg_method in ['BRR', 'ARD']: - fig, ax = plt.subplots(figsize=(12, 10)) - plt.title("Marginal log-likelihood") - plt.plot(clf_poly.scores_, color='navy', linewidth=2) - plt.ylabel("Score") - plt.xlabel("Iterations") - if self.pce_reg_method.lower() == 'bbr': - text = f"$\\alpha={clf_poly.alpha_:.1f}$\n" - f"$\\lambda={clf_poly.lambda_:.3f}$\n" - f"$L={clf_poly.scores_[-1]:.1f}$" - else: - text = f"$\\alpha={clf_poly.alpha_:.1f}$\n$" - f"\\L={clf_poly.scores_[-1]:.1f}$" - - plt.text(0.75, 0.5, text, fontsize=18, transform=ax.transAxes) - plt.show() - print('='*80) - - # Create a dict to pass the outputs - returnVars = dict() - returnVars['clf_poly'] = clf_poly - returnVars['degree'] = degree - returnVars['qnorm'] = qnorm - returnVars['coeffs'] = coeffs - returnVars['multi_indices'] = basis_indices - returnVars['LOOCVScore'] = LOOCVScore - returnVars['LCerror'] = LCerror - - return returnVars - - # ------------------------------------------------------------------------- - def corr_loocv_error(self, clf, psi, coeffs, y): - """ - Calculates the corrected LOO error for regression on regressor - matrix `psi` that generated the coefficients based on [1] and [2]. - - [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for - uncertainty propagation and sensitivity analysis (Doctoral - dissertation, Clermont-Ferrand 2). - - [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos - expansion based on least angle regression. Journal of computational - Physics, 230(6), pp.2345-2367. - - Parameters - ---------- - clf : object - Fitted estimator. - psi : array of shape (n_samples, n_features) - The multivariate orthogonal polynomials (regressor). - coeffs : array-like of shape (n_features,) - Estimated cofficients. - y : array of shape (n_samples,) - Target values. - - Returns - ------- - R_2 : float - LOOCV Validation score (1-LOOCV erro). - residual : array of shape (n_samples,) - Residual values (y - predicted targets). - - """ - psi = np.array(psi, dtype=float) - - # Create PSI_Sparse by removing redundent terms - nnz_idx = np.nonzero(coeffs)[0] - if len(nnz_idx) == 0: - nnz_idx = [0] - psi_sparse = psi[:, nnz_idx] - - # NrCoeffs of aPCEs - P = len(nnz_idx) - # NrEvaluation (Size of experimental design) - N = psi.shape[0] - - # Build the projection matrix - PsiTPsi = np.dot(psi_sparse.T, psi_sparse) - - if np.linalg.cond(PsiTPsi) > 1e-12: #and \ - # np.linalg.cond(PsiTPsi) < 1/sys.float_info.epsilon: - # faster - try: - M = sp.linalg.solve(PsiTPsi, - sp.sparse.eye(PsiTPsi.shape[0]).toarray()) - except: - raise AttributeError('There are too few samples for the corrected loo-cv error. Fit surrogate on at least as many samples as parameters to use this') - else: - # stabler - M = np.linalg.pinv(PsiTPsi) - - # h factor (the full matrix is not calculated explicitly, - # only the trace is, to save memory) - PsiM = np.dot(psi_sparse, M) - - h = np.sum(np.multiply(PsiM, psi_sparse), axis=1, dtype=np.longdouble)#float128) - - # ------ Calculate Error Loocv for each measurement point ---- - # Residuals - try: - residual = clf.predict(psi) - y - except: - residual = np.dot(psi, coeffs) - y - - # Variance - var_y = np.var(y) - - if var_y == 0: - norm_emp_error = 0 - loo_error = 0 - LCerror = np.zeros((y.shape)) - return 1-loo_error, LCerror - else: - norm_emp_error = np.mean(residual**2)/var_y - - # LCerror = np.divide(residual, (1-h)) - LCerror = residual / (1-h) - loo_error = np.mean(np.square(LCerror)) / var_y - # if there are NaNs, just return an infinite LOO error (this - # happens, e.g., when a strongly underdetermined problem is solved) - if np.isnan(loo_error): - loo_error = np.inf - - # Corrected Error for over-determined system - tr_M = np.trace(M) - if tr_M < 0 or abs(tr_M) > 1e6: - tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) - - # Over-determined system of Equation - if N > P: - T_factor = N/(N-P) * (1 + tr_M) - - # Under-determined system of Equation - else: - T_factor = np.inf - - corrected_loo_error = loo_error * T_factor - - R_2 = 1 - corrected_loo_error - - return R_2, LCerror - - # ------------------------------------------------------------------------- - def pca_transformation(self, target, verbose=False): - """ - Transforms the targets (outputs) via Principal Component Analysis - - Parameters - ---------- - target : array of shape (n_samples,) - Target values. - - Returns - ------- - pca : obj - Fitted sklearnPCA object. - OutputMatrix : array of shape (n_samples,) - Transformed target values. - n_pca_components : int - Number of selected principal components. - - """ - # Transform via Principal Component Analysis - if hasattr(self, 'var_pca_threshold'): - var_pca_threshold = self.var_pca_threshold - else: - var_pca_threshold = 100.0 - n_samples, n_features = target.shape - - if hasattr(self, 'n_pca_components'): - n_pca_components = self.n_pca_components - else: - # Instantiate and fit sklearnPCA object - covar_matrix = sklearnPCA(n_components=None) - covar_matrix.fit(target) - var = np.cumsum(np.round(covar_matrix.explained_variance_ratio_, - decimals=5)*100) - # Find the number of components to explain self.varPCAThreshold of - # variance - try: - n_components = np.where(var >= var_pca_threshold)[0][0] + 1 - except IndexError: - n_components = min(n_samples, n_features) - - n_pca_components = min(n_samples, n_features, n_components) - - # Print out a report - if verbose: - print() - print('-' * 50) - print(f"PCA transformation is performed with {n_pca_components}" - " components.") - print('-' * 50) - print() - - # Fit and transform with the selected number of components - pca = sklearnPCA(n_components=n_pca_components, svd_solver='arpack') - scaled_target = pca.fit_transform(target) - - return pca, scaled_target, n_pca_components - - # ------------------------------------------------------------------------- - def gaussian_process_emulator(self, X, y, nug_term=None, autoSelect=False, - varIdx=None): - """ - Fits a Gaussian Process Emulator to the target given the training - points. - - Parameters - ---------- - X : array of shape (n_samples, n_params) - Training points. - y : array of shape (n_samples,) - Target values. - nug_term : float, optional - Nugget term. The default is None, i.e. variance of y. - autoSelect : bool, optional - Loop over some kernels and select the best. The default is False. - varIdx : int, optional - The index number. The default is None. - - Returns - ------- - gp : object - Fitted estimator. - - """ - - nug_term = nug_term if nug_term else np.var(y) - - Kernels = [nug_term * kernels.RBF(length_scale=1.0, - length_scale_bounds=(1e-25, 1e15)), - nug_term * kernels.RationalQuadratic(length_scale=0.2, - alpha=1.0), - nug_term * kernels.Matern(length_scale=1.0, - length_scale_bounds=(1e-15, 1e5), - nu=1.5)] - - # Automatic selection of the kernel - if autoSelect: - gp = {} - BME = [] - for i, kernel in enumerate(Kernels): - gp[i] = GaussianProcessRegressor(kernel=kernel, - n_restarts_optimizer=3, - normalize_y=False) - - # Fit to data using Maximum Likelihood Estimation - gp[i].fit(X, y) - - # Store the MLE as BME score - BME.append(gp[i].log_marginal_likelihood()) - - gp = gp[np.argmax(BME)] - - else: - gp = GaussianProcessRegressor(kernel=Kernels[0], - n_restarts_optimizer=3, - normalize_y=False) - gp.fit(X, y) - - # Compute score - if varIdx is not None: - Score = gp.score(X, y) - print('-'*50) - print(f'Output variable {varIdx}:') - print('The estimation of GPE coefficients converged,') - print(f'with the R^2 score: {Score:.3f}') - print('-'*50) - - return gp - - # ------------------------------------------------------------------------- - def eval_metamodel(self, samples): - """ - Evaluates meta-model at the requested samples. One can also generate - nsamples. - - Parameters - ---------- - samples : array of shape (n_samples, n_params), optional - Samples to evaluate meta-model at. The default is None. - nsamples : int, optional - Number of samples to generate, if no `samples` is provided. The - default is None. - sampling_method : str, optional - Type of sampling, if no `samples` is provided. The default is - 'random'. - return_samples : bool, optional - Retun samples, if no `samples` is provided. The default is False. - - Returns - ------- - mean_pred : dict - Mean of the predictions. - std_pred : dict - Standard deviatioon of the predictions. - """ - # Transform into np array - can also be given as list - samples = np.array(samples) - - # Transform samples to the independent space - samples = self.InputSpace.transform( - samples, - method='user' - ) - # Compute univariate bases for the given samples - if self.meta_model_type.lower() != 'gpe': - univ_p_val = self.univ_basis_vals( - samples, - n_max=np.max(self.pce_deg) - ) - - mean_pred_b = {} - std_pred_b = {} - # Loop over bootstrap iterations - for b_i in range(self.n_bootstrap_itrs): - - # Extract model dictionary - if self.meta_model_type.lower() == 'gpe': - model_dict = self.gp_poly[f'b_{b_i+1}'] - else: - model_dict = self.coeffs_dict[f'b_{b_i+1}'] - - # Loop over outputs - mean_pred = {} - std_pred = {} - for output, values in model_dict.items(): - - mean = np.empty((len(samples), len(values))) - std = np.empty((len(samples), len(values))) - idx = 0 - for in_key, InIdxValues in values.items(): - - # Prediction with GPE - if self.meta_model_type.lower() == 'gpe': - X_T = self.x_scaler[f'b_{b_i+1}'][output].transform(samples) - gp = self.gp_poly[f'b_{b_i+1}'][output][in_key] - y_mean, y_std = gp.predict(X_T, return_std=True) - - else: - # Prediction with PCE - # Assemble Psi matrix - basis = self.basis_dict[f'b_{b_i+1}'][output][in_key] - psi = self.create_psi(basis, univ_p_val) - - # Prediction - if self.bootstrap_method != 'fast' or b_i == 0: - # with error bar, i.e. use clf_poly - clf_poly = self.clf_poly[f'b_{b_i+1}'][output][in_key] - try: - y_mean, y_std = clf_poly.predict( - psi, return_std=True - ) - except TypeError: - y_mean = clf_poly.predict(psi) - y_std = np.zeros_like(y_mean) - else: - # without error bar - coeffs = self.coeffs_dict[f'b_{b_i+1}'][output][in_key] - y_mean = np.dot(psi, coeffs) - y_std = np.zeros_like(y_mean) - - mean[:, idx] = y_mean - std[:, idx] = y_std - idx += 1 - - # Save predictions for each output - if self.dim_red_method.lower() == 'pca': - PCA = self.pca[f'b_{b_i+1}'][output] - mean_pred[output] = PCA.inverse_transform(mean) - std_pred[output] = np.zeros(mean.shape) - else: - mean_pred[output] = mean - std_pred[output] = std - - # Save predictions for each bootstrap iteration - mean_pred_b[b_i] = mean_pred - std_pred_b[b_i] = std_pred - - # Change the order of nesting - mean_pred_all = {} - for i in sorted(mean_pred_b): - for k, v in mean_pred_b[i].items(): - if k not in mean_pred_all: - mean_pred_all[k] = [None] * len(mean_pred_b) - mean_pred_all[k][i] = v - - # Compute the moments of predictions over the predictions - for output in self.out_names: - # Only use bootstraps with finite values - finite_rows = np.isfinite( - mean_pred_all[output]).all(axis=2).all(axis=1) - outs = np.asarray(mean_pred_all[output])[finite_rows] - # Compute mean - mean_pred[output] = np.mean(outs, axis=0) - # Compute standard deviation - if self.n_bootstrap_itrs > 1: - std_pred[output] = np.std(outs, axis=0) - else: - std_pred[output] = std_pred_b[b_i][output] - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - def create_model_error(self, X, y, Model, name='Calib'): - """ - Fits a GPE-based model error. - - Parameters - ---------- - X : array of shape (n_outputs, n_inputs) - Input array. It can contain any forcing inputs or coordinates of - extracted data. - y : array of shape (n_outputs,) - The model response for the MAP parameter set. - name : str, optional - Calibration or validation. The default is `'Calib'`. - - Returns - ------- - self: object - Self object. - - """ - outputNames = self.out_names - self.errorRegMethod = 'GPE' - self.errorclf_poly = self.auto_vivification() - self.errorScale = self.auto_vivification() - - # Read data - # TODO: do this call outside the metamodel - MeasuredData = Model.read_observation(case=name) - - # Fitting GPR based bias model - for out in outputNames: - nan_idx = ~np.isnan(MeasuredData[out]) - # Select data - try: - data = MeasuredData[out].values[nan_idx] - except AttributeError: - data = MeasuredData[out][nan_idx] - - # Prepare the input matrix - scaler = MinMaxScaler() - delta = data # - y[out][0] - BiasInputs = np.hstack((X[out], y[out].reshape(-1, 1))) - X_S = scaler.fit_transform(BiasInputs) - gp = self.gaussian_process_emulator(X_S, delta) - - self.errorScale[out]["y_1"] = scaler - self.errorclf_poly[out]["y_1"] = gp - - return self - - # ------------------------------------------------------------------------- - def eval_model_error(self, X, y_pred): - """ - Evaluates the error model. - - Parameters - ---------- - X : array - Inputs. - y_pred : dict - Predictions. - - Returns - ------- - mean_pred : dict - Mean predition of the GPE-based error model. - std_pred : dict - standard deviation of the GPE-based error model. - - """ - mean_pred = {} - std_pred = {} - - for Outkey, ValuesDict in self.errorclf_poly.items(): - - pred_mean = np.zeros_like(y_pred[Outkey]) - pred_std = np.zeros_like(y_pred[Outkey]) - - for Inkey, InIdxValues in ValuesDict.items(): - - gp = self.errorclf_poly[Outkey][Inkey] - scaler = self.errorScale[Outkey][Inkey] - - # Transform Samples using scaler - for j, pred in enumerate(y_pred[Outkey]): - BiasInputs = np.hstack((X[Outkey], pred.reshape(-1, 1))) - Samples_S = scaler.transform(BiasInputs) - y_hat, y_std = gp.predict(Samples_S, return_std=True) - pred_mean[j] = y_hat - pred_std[j] = y_std - # pred_mean[j] += pred - - mean_pred[Outkey] = pred_mean - std_pred[Outkey] = pred_std - - return mean_pred, std_pred - - # ------------------------------------------------------------------------- - class auto_vivification(dict): - """ - Implementation of perl's AutoVivification feature. - - Source: https://stackoverflow.com/a/651879/18082457 - """ - - def __getitem__(self, item): - try: - return dict.__getitem__(self, item) - except KeyError: - value = self[item] = type(self)() - return value - - # ------------------------------------------------------------------------- - def copy_meta_model_opts(self): - """ - This method is a convinient function to copy the metamodel options. - - Returns - ------- - new_MetaModelOpts : object - The copied object. - - """ - # TODO: what properties should be moved to the new object? - new_MetaModelOpts = copy.deepcopy(self) - new_MetaModelOpts.input_obj = self.input_obj#InputObj - new_MetaModelOpts.InputSpace = self.InputSpace - #new_MetaModelOpts.InputSpace.meta_Model = 'aPCE' - #new_MetaModelOpts.InputSpace.InputObj = self.input_obj - #new_MetaModelOpts.InputSpace.ndim = len(self.input_obj.Marginals) - new_MetaModelOpts.n_params = len(self.input_obj.Marginals) - #new_MetaModelOpts.InputSpace.hdf5_file = None - - return new_MetaModelOpts - - # ------------------------------------------------------------------------- - def __select_degree(self, ndim, n_samples): - """ - Selects degree based on the number of samples and parameters in the - sequential design. - - Parameters - ---------- - ndim : int - Dimension of the parameter space. - n_samples : int - Number of samples. - - Returns - ------- - deg_array: array - Array containing the arrays. - - """ - # Define the deg_array - max_deg = np.max(self.pce_deg) - min_Deg = np.min(self.pce_deg) - - # TODO: remove the options for sequential? - #nitr = n_samples - self.InputSpace.n_init_samples - - # Check q-norm - if not np.isscalar(self.pce_q_norm): - self.pce_q_norm = np.array(self.pce_q_norm) - else: - self.pce_q_norm = np.array([self.pce_q_norm]) - - def M_uptoMax(maxDeg): - n_combo = np.zeros(maxDeg) - for i, d in enumerate(range(1, maxDeg+1)): - n_combo[i] = math.factorial(ndim+d) - n_combo[i] /= math.factorial(ndim) * math.factorial(d) - return n_combo - - deg_new = max_deg - #d = nitr if nitr != 0 and self.n_params > 5 else 1 - # d = 1 - # min_index = np.argmin(abs(M_uptoMax(max_deg)-ndim*n_samples*d)) - # deg_new = range(1, max_deg+1)[min_index] - - if deg_new > min_Deg and self.pce_reg_method.lower() != 'fastard': - deg_array = np.arange(min_Deg, deg_new+1) - else: - deg_array = np.array([deg_new]) - - return deg_array - - def generate_polynomials(self, max_deg=None): - # Check for InputSpace - if not hasattr(self, 'InputSpace'): - raise AttributeError('Generate or add InputSpace before generating polynomials') - - ndim = self.InputSpace.ndim - # Create orthogonal polynomial coefficients if necessary - if (self.meta_model_type.lower()!='gpe') and max_deg is not None:# and self.input_obj.poly_coeffs_flag: - self.polycoeffs = {} - for parIdx in tqdm(range(ndim), ascii=True, - desc="Computing orth. polynomial coeffs"): - poly_coeffs = apoly_construction( - self.InputSpace.raw_data[parIdx], - max_deg - ) - self.polycoeffs[f'p_{parIdx+1}'] = poly_coeffs - else: - raise AttributeError('MetaModel cannot generate polynomials in the given scenario!') - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - - # Check if its truly a pce-surrogate - if self.meta_model_type.lower() == 'gpe': - raise AttributeError('Moments can only be computed for pce-type surrogates') - - outputs = self.out_names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(self.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = self.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = self.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = self.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if self.dim_red_method.lower() == 'pca': - PCA = self.pca[f'b_{b_i+1}'][output] - means[output] = PCA.inverse_transform(pce_mean) - stds[output] = PCA.inverse_transform(np.sqrt(pce_var)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/src/bayesvalidrox/pylink/pylink.py b/src/bayesvalidrox/pylink/pylink.py index 3fd1db366..8b826c5ce 100644 --- a/src/bayesvalidrox/pylink/pylink.py +++ b/src/bayesvalidrox/pylink/pylink.py @@ -473,8 +473,6 @@ class PyLinkForwardModel(object): #model = umbridge.HTTPModel('http://localhost:4242', 'forward') self.model = umbridge.HTTPModel(self.host, 'forward') # TODO: is this always forward? Function = self.uMBridge_model - # For now just do same as usual - self.link_type = 'function' # Extract the function if self.link_type.lower() == 'function': @@ -492,7 +490,7 @@ class PyLinkForwardModel(object): # Run forward model if n_c_points == 1 or not mp: if n_c_points== 1: - if self.link_type.lower() == 'function': + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': group_results = Function(c_points, **self.func_args) else: group_results = self.run_forwardmodel( @@ -501,7 +499,7 @@ class PyLinkForwardModel(object): else: for i in range(c_points.shape[0]): if i == 0: - if self.link_type.lower() == 'function': + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': group_results = Function(np.array([c_points[0]]), **self.func_args) else: group_results = self.run_forwardmodel( @@ -511,7 +509,7 @@ class PyLinkForwardModel(object): if key != 'x_values': group_results[key] = [group_results[key]] else: - if self.link_type.lower() == 'function': + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': res = Function(np.array([c_points[i]]), **self.func_args) else: res = self.run_forwardmodel( @@ -529,7 +527,7 @@ class PyLinkForwardModel(object): with get_context('spawn').Pool(n_cpus) as p: #with multiprocessing.Pool(n_cpus) as p: - if self.link_type.lower() == 'function': + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': imap_var = p.imap(partial(Function, **self.func_args), c_points[:, np.newaxis]) else: @@ -608,8 +606,8 @@ class PyLinkForwardModel(object): for key in self.Output.names: # If needed resort into single-value outputs if self.output_type == 'single-valued': - if out[:,cnt].shape[1] >1: # TODO: this doesn't fully seem correct?? - for i in range(out[:,key]): + if out.shape[1]>1: # TODO: this doesn't fully seem correct?? + for i in range(out[:,key]): # TODO: this doesn't fully seem correct?? new_key = key+str(i) if new_key not in self.Output.names: self.Output.names.append(new_key) diff --git a/src/bayesvalidrox/surrogate_models/surrogate_models.py b/src/bayesvalidrox/surrogate_models/surrogate_models.py index a6d31ccd1..af20e9814 100644 --- a/src/bayesvalidrox/surrogate_models/surrogate_models.py +++ b/src/bayesvalidrox/surrogate_models/surrogate_models.py @@ -8,6 +8,7 @@ import h5py import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler import scipy as sp +from scipy.optimize import minimize, NonlinearConstraint, LinearConstraint from tqdm import tqdm from sklearn.decomposition import PCA as sklearnPCA import sklearn.linear_model as lm @@ -82,6 +83,10 @@ class MetaModel(): >>> MetaModelOpts.dim_red_method = 'PCA' >>> MetaModelOpts.var_pca_threshold = 99.999 # Option A >>> MetaModelOpts.n_pca_components = 12 # Option B + apply_constraints : bool + If set to true constraints will be applied during training. + In this case the training uses OLS. In this version the constraints + need to be set explicitly in this class. verbose : bool Prints summary of the regression results. Default is `False`. @@ -102,7 +107,8 @@ class MetaModel(): def __init__(self, input_obj, meta_model_type='PCE', pce_reg_method='OLS', bootstrap_method='fast', n_bootstrap_itrs=1, pce_deg=1, pce_q_norm=1.0, - dim_red_method='no', verbose=False): + dim_red_method='no', apply_constraints = False, + verbose=False): self.input_obj = input_obj self.meta_model_type = meta_model_type @@ -112,6 +118,7 @@ class MetaModel(): self.pce_deg = pce_deg self.pce_q_norm = pce_q_norm self.dim_red_method = dim_red_method + self.apply_constraints = apply_constraints self.verbose = verbose def build_metamodel(self, n_init_samples = None) -> None: @@ -587,9 +594,32 @@ class MetaModel(): elif reg_method.lower() == 'ebl': clf_poly = EBLinearRegression(optimizer='em') - - # Fit - clf_poly.fit(X, y) + + + # Training with constraints automatically uses L2 + if self.apply_constraints: + # TODO: set the constraints here + # Define the nonlin. constraint + nlc = NonlinearConstraint(lambda x: np.matmul(X,x),-1,1.1) + self.nlc = nlc + + fun = lambda x: (np.linalg.norm(np.matmul(X, x)-y, ord = 2))**2 + if self.init_type =='zeros': + res = minimize(fun, np.zeros(X.shape[1]), method = 'trust-constr', constraints = self.nlc) + if self.init_type == 'nonpi': + clf_poly.fit(X, y) + coeff = clf_poly.coef_ + res = minimize(fun, coeff, method = 'trust-constr', constraints = self.nlc) + + coeff = np.array(res.x) + clf_poly.coef_ = coeff + clf_poly.X = X + clf_poly.y = y + clf_poly.intercept_ = 0 + + # Training without constraints uses chosen regression method + else: + clf_poly.fit(X, y) # Select the nonzero entries of coefficients if sparsity: @@ -614,6 +644,65 @@ class MetaModel(): return_out_dict['sparePsi'] = sparse_X return_out_dict['coeffs'] = coeffs return return_out_dict + + # ------------------------------------------------------------------------- + def create_psi(self, basis_indices, univ_p_val): + """ + This function assemble the design matrix Psi from the given basis index + set INDICES and the univariate polynomial evaluations univ_p_val. + + Parameters + ---------- + basis_indices : array of shape (n_terms, n_params) + Multi-indices of multivariate polynomials. + univ_p_val : array of (n_samples, n_params, n_max+1) + All univariate regressors up to `n_max`. + + Raises + ------ + ValueError + n_terms in arguments do not match. + + Returns + ------- + psi : array of shape (n_samples, n_terms) + Multivariate regressors. + + """ + # Check if BasisIndices is a sparse matrix + sparsity = sp.sparse.issparse(basis_indices) + if sparsity: + basis_indices = basis_indices.toarray() + + # Initialization and consistency checks + # number of input variables + n_params = univ_p_val.shape[1] + + # Size of the experimental design + n_samples = univ_p_val.shape[0] + + # number of basis terms + n_terms = basis_indices.shape[0] + + # check that the variables have consistent sizes + if n_params != basis_indices.shape[1]: + raise ValueError( + f"The shapes of basis_indices ({basis_indices.shape[1]}) and " + f"univ_p_val ({n_params}) don't match!!" + ) + + # Preallocate the Psi matrix for performance + psi = np.ones((n_samples, n_terms)) + # Assemble the Psi matrix + for m in range(basis_indices.shape[1]): + aa = np.where(basis_indices[:, m] > 0)[0] + try: + basisIdx = basis_indices[aa, m] + bb = univ_p_val[:, m, basisIdx].reshape(psi[:, aa].shape) + psi[:, aa] = np.multiply(psi[:, aa], bb) + except ValueError as err: + raise err + return psi # -------------------------------------------------------------------------------------------------------- def adaptive_regression(self, ED_X, ED_Y, varIdx, verbose=False): diff --git a/tests/test_MetaModel.py b/tests/test_MetaModel.py index 949ea6435..a2fb876e2 100644 --- a/tests/test_MetaModel.py +++ b/tests/test_MetaModel.py @@ -1122,3 +1122,21 @@ def test__compute_pce_moments_gpe() -> None: #%% Test MetaModel.update_metamodel #TODO: taken from engine + +if __name__ == '__main__': + + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0,1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples = 2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = mm.create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi) -- GitLab