From daee66fb5ce500cdf09d0f3b607add8202d29350 Mon Sep 17 00:00:00 2001 From: Farid Mohammadi <farid.mohammadi@iws.uni-stuttgart.de> Date: Mon, 12 Sep 2022 10:42:02 +0200 Subject: [PATCH] [examples] add borehole example. --- examples/borehole/borehole.py | 66 +++++++ examples/borehole/data/valid_outputs.npy | Bin 0 -> 928 bytes examples/borehole/data/valid_samples.npy | Bin 0 -> 6528 bytes examples/borehole/test_borehole.py | 240 +++++++++++++++++++++++ 4 files changed, 306 insertions(+) create mode 100644 examples/borehole/borehole.py create mode 100644 examples/borehole/data/valid_outputs.npy create mode 100644 examples/borehole/data/valid_samples.npy create mode 100644 examples/borehole/test_borehole.py diff --git a/examples/borehole/borehole.py b/examples/borehole/borehole.py new file mode 100644 index 000000000..43dd71f21 --- /dev/null +++ b/examples/borehole/borehole.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Nov 19 08:56:21 2018 + +@author: farid +""" +import numpy as np + + +def borehole(xx, *args): + """ + BOREHOLE FUNCTION + + Authors: Sonja Surjanovic, Simon Fraser University + Derek Bingham, Simon Fraser University + Questions/Comments: Please email Derek Bingham at dbingham@stat.sfu.ca. + + Copyright 2013. Derek Bingham, Simon Fraser University. + + THERE IS NO WARRANTY, EXPRESS OR IMPLIED. WE DO NOT ASSUME ANY LIABILITY + FOR THE USE OF THIS SOFTWARE. If software is modified to produce + derivative works, such modified software should be clearly marked. + Additionally, this program is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; version 2.0 of the License. + Accordingly, this program is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + For function details and reference information, see: + https://www.sfu.ca/~ssurjano/ishigami.html + + Parameters + ---------- + xx : array of shape (n_samples, n_params) + Input parameter sets. [rw, L, kw, Tu, Tl, Hu, Hl, r] + + Returns + ------- + output: dict + Water flow rate. + + """ + rw = xx[:, 0] + L = xx[:, 1] + Kw = xx[:, 2] + Tu = xx[:, 3] + Tl = xx[:, 4] + Hu = xx[:, 5] + Hl = xx[:, 6] + r = xx[:, 7] + + frac1 = 2 * np.pi * Tu * (Hu-Hl) + + frac2a = 2*L*Tu / (np.log(r/rw)*(rw**2)*Kw) + frac2b = Tu / Tl + frac2 = np.log(r/rw) * (1 + frac2a + frac2b) + + y = frac1 / frac2 + + # Prepare output dict using standard bayesvalidrox format + output = {'x_values': np.zeros(1), 'flow rate [m$^3$/yr]': y} + + return output diff --git a/examples/borehole/data/valid_outputs.npy b/examples/borehole/data/valid_outputs.npy new file mode 100644 index 0000000000000000000000000000000000000000..076320cebb087989776523cbfd6e1dd122c84b63 GIT binary patch literal 928 zcmbWr{ZrBh0LO9JYS*k>cc{Dcny6>A^bFCvoI(3!f&qf?{Q`xq^9dh1R2--q;lrhM zNDEt9O?TRpKlGsY9jBIA>M}i3ce4?hy4%)dd3kwQ=!VTEto;jn|Mq@0N)%$Lisn=9 zV`Qpx^*K6b0)xrPi)ThLn0Z=VsV=KHL#tEg{^$IxLVfOA*B4}!<i7nKF)UUTBj)2M zMkV8a=DX}TccFq!BF?`fLtl~!ZQeS|dP_3uc^X@PT^d9U+}m;Ud;~@Qrafsp2#47k z@SH~=5=Z)<CZ)h^Jntg+3b5#+sIYZHuqfT^mNWvzlLd?Bq=QI^PrSUKmci@ixL>%C zjnE?t5kmvXsGNwBo;HfX82!q5BR>^W4@~CG5(0XQO6|5Pkoqz#@FGuy{Pxr1-;B$_ z>8>g&YT1JTzndR+(ozsHoL(3r5@Y+V#u-gGAIu*1$nSq-V)PX4N&O4~I{lGps8@xF zUQ@%B+v%taZrd0BMuzO2)fcLZ^U)~sHw<*}p@R90z32ecl&yRNM+W1(#CkVIhHJGO zS5kyZ41V<2CtdAgH2ZayTfRI5X&##r9!-ELZFIBqRSvEfI}GDXa=7EvKUl7jm~3A= z@%=F+8ppmnK3OY8v}c+MyeC9KMq%iQ5dmC9J>ND2$#85j_V5dmhwDPk)Nz*rMVdYN za}QEs3z)J7JAjC_0>QLI0B7l9D%F#Tr(cZSTU<GSp+38Cx32=*+PcL8FA0zCeAB!_ z0<UvxW|LPA>X*MeT7Q+n%KfyOqKBiudG^jotPou}??hj;OR=l#=Wc6N8sal<Xr`V? z(Q<X8kv>PFfhKa_UzMW%v*ob5Wd%y7#s-7@NpP&&?T<Y&aEDHkn$`U{WMI!;3Q}N= z)_iGiuM)%2vd9Il5_dVyvCfceT>bOwE9PA))W75fzIZN&;r+|mJ~0ARrJo6F0)f^y z8=5Sm1ccjUC9Db(Avv}(?o2ZH9`<1FrWCl&dfxj-szk-oqeS~T6<n{AcGn&iqfpuE z2&|N%W5@JPmPriJ{^pvcv_w2CYhR_ul8_6vAp>^^oPDC$<m1?f(6%n7JD7lXqR*fT z<iYoF&+Er!1lHFKzxpv<g>v#Iii{xeZrd}Oy9L-X|8V8zN-Fw#vufB|MG(y1`e5#J G68{2Y9*=YY literal 0 HcmV?d00001 diff --git a/examples/borehole/data/valid_samples.npy b/examples/borehole/data/valid_samples.npy new file mode 100644 index 0000000000000000000000000000000000000000..27564f822ee863e5d75d7b8c71fcd8a763d5bc63 GIT binary patch literal 6528 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 JYPAl8;(u>pD5U@Z literal 0 HcmV?d00001 diff --git a/examples/borehole/test_borehole.py b/examples/borehole/test_borehole.py new file mode 100644 index 000000000..3097b78bc --- /dev/null +++ b/examples/borehole/test_borehole.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +This test deals with the surrogate modeling of a Ishigami function. + +You will see how to: + Check the quality of your regression model + Perform sensitivity analysis via Sobol Indices + +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 Wed Jul 10 2019 + +""" + +import numpy as np +import joblib + +# import bayesvalidrox +# Add BayesValidRox path +import sys +sys.path.append("../../src/bayesvalidrox/") + +from pylink.pylink import PyLinkForwardModel +from surrogate_models.inputs import Input +from surrogate_models.surrogate_models import MetaModel +from post_processing.post_processing import PostProcessing +from bayes_inference.bayes_inference import BayesInference +from bayes_inference.discrepancy import Discrepancy +import matplotlib +matplotlib.use('agg') + +if __name__ == "__main__": + + # ===================================================== + # ============= COMPUTATIONAL MODEL ================ + # ===================================================== + Model = PyLinkForwardModel() + + # Define model options + Model.link_type = 'Function' + Model.py_file = 'borehole' + Model.name = 'borehole' + + Model.Output.names = ['flow rate [m$^3$/yr]'] + + # ===================================================== + # ========= PROBABILISTIC INPUT MODEL ============== + # ===================================================== + Inputs = Input() + + # borehole radius + Inputs.add_marginals() + Inputs.Marginals[0].name = '$r_w$' + Inputs.Marginals[0].dist_type = 'normal' + Inputs.Marginals[0].parameters = [0.10, 0.0161812] + + # borehole length + Inputs.add_marginals() + Inputs.Marginals[1].name = '$L$' + Inputs.Marginals[1].dist_type = 'unif' + Inputs.Marginals[1].parameters = [1120, 1680] + + # borehole hydraulic conductivity + Inputs.add_marginals() + Inputs.Marginals[2].name = '$K_w$' + Inputs.Marginals[2].dist_type = 'unif' + Inputs.Marginals[2].parameters = [9855, 12045] + + # transmissivity of upper aquifer + Inputs.add_marginals() + Inputs.Marginals[3].name = '$T_u$' + Inputs.Marginals[3].dist_type = 'unif' + Inputs.Marginals[3].parameters = [63070, 115600] + + # transmissivity of lower aquifer + Inputs.add_marginals() + Inputs.Marginals[4].name = '$T_l$' + Inputs.Marginals[4].dist_type = 'unif' + Inputs.Marginals[4].parameters = [63.1, 116] + + # potentiometric head of upper aquifer + Inputs.add_marginals() + Inputs.Marginals[5].name = '$H_u$' + Inputs.Marginals[5].dist_type = 'unif' + Inputs.Marginals[5].parameters = [990, 1110] + + # potentiometric head of lower aquifer + Inputs.add_marginals() + Inputs.Marginals[6].name = '$H_l$' + Inputs.Marginals[6].dist_type = 'unif' + Inputs.Marginals[6].parameters = [700, 820] + + # radius of influence + Inputs.add_marginals() + Inputs.Marginals[7].name = '$r$' + Inputs.Marginals[7].dist_type = 'lognorm' + Inputs.Marginals[7].parameters = [7.71, 1.0056] + + # ===================================================== + # ====== POLYNOMIAL CHAOS EXPANSION METAMODELS ====== + # ===================================================== + MetaModelOpts = MetaModel(Inputs, Model) + + # Select your metamodel method + # 1) PCE (Polynomial Chaos Expansion) 2) aPCE (arbitrary PCE) + # 3) GPE (Gaussian Process Emulator) + MetaModelOpts.meta_model_type = 'aPCE' + + # ------------------------------------------------ + # ------------- PCE Specification ---------------- + # ------------------------------------------------ + # Select the sparse least-square minimization method for + # the PCE coefficients calculation: + # 1)OLS: Ordinary Least Square 2)BRR: Bayesian Ridge Regression + # 3)LARS: Least angle regression 4)ARD: Bayesian ARD Regression + # 5)FastARD: Fast Bayesian ARD Regression + # 6)BCS: Bayesian Compressive Sensing + # 7)OMP: Orthogonal Matching Pursuit + # 8)VBL: Variational Bayesian Learning + # 9)EBL: Emperical Bayesian Learning + MetaModelOpts.pce_reg_method = 'OMP' + + # Bootstraping + # 1) normal 2) fast + MetaModelOpts.bootstrap_method = 'fast' + MetaModelOpts.n_bootstrap_itrs = 1#00 + + # Specify the max degree to be compared by the adaptive algorithm: + # The degree with the lowest Leave-One-Out cross-validation (LOO) + # error (or the highest score=1-LOO)estimator is chosen as the final + # metamodel. pce_deg accepts degree as a scalar or a range. + MetaModelOpts.pce_deg = 5 + + # q-quasi-norm 0<q<1 (default=1) + MetaModelOpts.pce_q_norm = 1.0 + + # Print summary of the regression results + # MetaModelOpts.verbose = True + + # ------------------------------------------------ + # ------ Experimental Design Configuration ------- + # ------------------------------------------------ + MetaModelOpts.add_ExpDesign() + + # One-shot (normal) or Sequential Adaptive (sequential) Design + MetaModelOpts.ExpDesign.method = 'sequential' + MetaModelOpts.ExpDesign.n_init_samples = 50 + + # Sampling methods + # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) korobov + # 7) chebyshev(FT) 8) grid(FT) 9) nested_grid(FT) 10)user + MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + + # Provide the experimental design object with a hdf5 file + # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_borehole.hdf5' + + # Sequential experimental design (needed only for sequential ExpDesign) + MetaModelOpts.ExpDesign.n_new_samples = 1 + MetaModelOpts.ExpDesign.n_max_samples = 300 # 150 + MetaModelOpts.ExpDesign.mod_LOO_threshold = 1e-16 + + # ------------------------------------------------ + # ------- Sequential Design configuration -------- + # ------------------------------------------------ + # 1) None 2) 'equal' 3)'epsilon-decreasing' 4) 'adaptive' + MetaModelOpts.ExpDesign.tradeoff_scheme = None + # MetaModelOpts.ExpDesign.n_replication = 50 + # -------- Exploration ------ + # 1)'Voronoi' 2)'random' 3)'latin_hypercube' 4)'dual annealing' + MetaModelOpts.ExpDesign.explore_method = 'latin_hypercube' + + # Use when 'dual annealing' chosen + MetaModelOpts.ExpDesign.max_func_itr = 200 + + # Use when 'Voronoi' or 'random' or 'latin_hypercube' chosen + MetaModelOpts.ExpDesign.n_canddidate = 5000 + MetaModelOpts.ExpDesign.n_cand_groups = 4 + + # -------- Exploitation ------ + # 1)'BayesOptDesign' 2)'VarOptDesign' 3)'alphabetic' 4)'Space-filling' + MetaModelOpts.ExpDesign.exploit_method = 'Space-filling' + + # BayesOptDesign -> when data is available + # 1)DKL (Kullback-Leibler Divergence) 2)DPP (D-Posterior-percision) + # 3)APP (A-Posterior-percision) + # MetaModelOpts.ExpDesign.util_func = 'DKL' + + # VarBasedOptDesign -> when data is not available + # Only with Vornoi >>> 1)Entropy 2)EIGF, 3)ALM, 4)LOOCV + MetaModelOpts.ExpDesign.util_func = 'ALM' + + # alphabetic + # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) + # 3)K-Opt (K-Optimality) + # MetaModelOpts.ExpDesign.util_func = 'D-Opt' + + MetaModelOpts.valid_samples = np.load("data/valid_samples.npy") + MetaModelOpts.valid_model_runs = { + 'flow rate [m$^3$/yr]': np.load("data/valid_outputs.npy") + } + # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + # Adaptive sparse arbitrary polynomial chaos expansion + # PCEModel = MetaModelOpts.create_metamodel() + from surrogate_models.meta_model_engine import MetaModelEngine + meta_model_engine = MetaModelEngine(MetaModelOpts) + meta_model_engine.run() + PCEModel = meta_model_engine.MetaModel + + # Save PCE models + with open(f'PCEModel_{Model.name}.pkl', 'wb') as output: + joblib.dump(PCEModel, output, 2) + + # ===================================================== + # ========= POST PROCESSING OF METAMODELS =========== + # ===================================================== + PostPCE = PostProcessing(PCEModel) + + # Plot to check validation visually. + PostPCE.valid_metamodel(n_samples=200) + + # Check the quality of your regression model + PostPCE.check_reg_quality() + + # PostPCE.eval_PCEmodel_3D() + # Compute and print RMSE error + PostPCE.check_accuracy(n_samples=3000) + + # Plot the evolution of the KLD,BME, and Modified LOOCV error + if MetaModelOpts.ExpDesign.method == 'sequential': + PostPCE.plot_seq_design_diagnostics() + + # Plot the sobol indices + total_sobol = PostPCE.sobol_indices(plot_type='bar') -- GitLab