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