diff --git a/doc/_src_docs/applications/Mixed_Hier_surr.rst b/doc/_src_docs/applications/Mixed_Hier_surr.rst index 4cfa27f62..3f056daa6 100644 --- a/doc/_src_docs/applications/Mixed_Hier_surr.rst +++ b/doc/_src_docs/applications/Mixed_Hier_surr.rst @@ -224,9 +224,9 @@ Example of mixed integer Gower Distance model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0101140 + Predicting - done. Time (sec): 0.0156229 - Prediction time/pt. (sec) : 0.0001011 + Prediction time/pt. (sec) : 0.0001562 ___________________________________________________________________________ @@ -235,9 +235,9 @@ Example of mixed integer Gower Distance model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0100331 + Predicting - done. Time (sec): 0.0156212 - Prediction time/pt. (sec) : 0.0001003 + Prediction time/pt. (sec) : 0.0001562 ___________________________________________________________________________ @@ -246,9 +246,9 @@ Example of mixed integer Gower Distance model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0080712 + Predicting - done. Time (sec): 0.0159624 - Prediction time/pt. (sec) : 0.0000807 + Prediction time/pt. (sec) : 0.0001596 .. figure:: Mixed_Hier_surr_TestMixedInteger_run_mixed_gower_example.png @@ -412,9 +412,9 @@ Example of mixed integer Compound Symmetry model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0108335 + Predicting - done. Time (sec): 0.0156257 - Prediction time/pt. (sec) : 0.0001083 + Prediction time/pt. (sec) : 0.0001563 ___________________________________________________________________________ @@ -423,9 +423,9 @@ Example of mixed integer Compound Symmetry model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0084054 + Predicting - done. Time (sec): 0.0098379 - Prediction time/pt. (sec) : 0.0000841 + Prediction time/pt. (sec) : 0.0000984 ___________________________________________________________________________ @@ -434,9 +434,9 @@ Example of mixed integer Compound Symmetry model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0084145 + Predicting - done. Time (sec): 0.0159245 - Prediction time/pt. (sec) : 0.0000841 + Prediction time/pt. (sec) : 0.0001592 .. figure:: Mixed_Hier_surr_TestMixedInteger_run_mixed_cs_example.png @@ -591,9 +591,9 @@ Example of mixed integer Homoscedastic Hypersphere model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0104566 + Predicting - done. Time (sec): 0.0152884 - Prediction time/pt. (sec) : 0.0001046 + Prediction time/pt. (sec) : 0.0001529 ___________________________________________________________________________ @@ -602,9 +602,9 @@ Example of mixed integer Homoscedastic Hypersphere model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0108221 + Predicting - done. Time (sec): 0.0156202 - Prediction time/pt. (sec) : 0.0001082 + Prediction time/pt. (sec) : 0.0001562 ___________________________________________________________________________ @@ -613,9 +613,9 @@ Example of mixed integer Homoscedastic Hypersphere model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0084147 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000841 + Prediction time/pt. (sec) : 0.0000000 .. figure:: Mixed_Hier_surr_TestMixedInteger_run_mixed_homo_hyp_example.png @@ -770,9 +770,9 @@ Example of mixed integer Exponential Homoscedastic Hypersphere model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0080357 + Predicting - done. Time (sec): 0.0156219 - Prediction time/pt. (sec) : 0.0000804 + Prediction time/pt. (sec) : 0.0001562 ___________________________________________________________________________ @@ -792,9 +792,9 @@ Example of mixed integer Exponential Homoscedastic Hypersphere model # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0024157 + Predicting - done. Time (sec): 0.0156231 - Prediction time/pt. (sec) : 0.0000242 + Prediction time/pt. (sec) : 0.0001562 .. figure:: Mixed_Hier_surr_TestMixedInteger_run_mixed_homo_gaussian_example.png @@ -998,9 +998,9 @@ Example of mixed integer Kriging with hierarchical variables # eval points. : 15 Predicting ... - Predicting - done. Time (sec): 0.0108297 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0007220 + Prediction time/pt. (sec) : 0.0000000 diff --git a/doc/_src_docs/applications/Mixed_Hier_usage.rst b/doc/_src_docs/applications/Mixed_Hier_usage.rst index 92277bcc9..831276765 100644 --- a/doc/_src_docs/applications/Mixed_Hier_usage.rst +++ b/doc/_src_docs/applications/Mixed_Hier_usage.rst @@ -241,9 +241,9 @@ The hierarchy relationships are specified after instantiating the design space: # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.3159189 + Predicting - done. Time (sec): 0.3548803 - Prediction time/pt. (sec) : 0.0031592 + Prediction time/pt. (sec) : 0.0035488 Pred_RMSE 4.052163509443859e-13 @@ -391,9 +391,9 @@ Example of mixed integer context usage # eval points. : 50 Predicting ... - Predicting - done. Time (sec): 0.0100770 + Predicting - done. Time (sec): 0.0182035 - Prediction time/pt. (sec) : 0.0002015 + Prediction time/pt. (sec) : 0.0003641 .. figure:: Mixed_Hier_usage_TestMixedInteger_run_mixed_integer_context_example.png diff --git a/doc/_src_docs/applications/Mixed_Hier_usage_TestMixedInteger_run_mixed_integer_context_example.png b/doc/_src_docs/applications/Mixed_Hier_usage_TestMixedInteger_run_mixed_integer_context_example.png index 7f64fb746..454b2087d 100644 Binary files a/doc/_src_docs/applications/Mixed_Hier_usage_TestMixedInteger_run_mixed_integer_context_example.png and b/doc/_src_docs/applications/Mixed_Hier_usage_TestMixedInteger_run_mixed_integer_context_example.png differ diff --git a/doc/_src_docs/applications/ego.rst b/doc/_src_docs/applications/ego.rst index cd928a4f8..65f33e33b 100644 --- a/doc/_src_docs/applications/ego.rst +++ b/doc/_src_docs/applications/ego.rst @@ -548,7 +548,7 @@ Usage with mixed variable :: - Minimum in x=[-5. 2. 0. 0.] with f(x)=-15.0 + Minimum in x=[-5. 2. 1. 0.] with f(x)=-14.2 .. figure:: ego_TestEGO_run_ego_mixed_integer_example.png :scale: 80 % @@ -604,7 +604,7 @@ Options - ['str'] - Approximated q-EI maximization strategy * - evaluator - - + - - None - ['Evaluator'] - Object used to run function fun to optimize at x points (nsamples, nxdim) @@ -634,7 +634,7 @@ Options - ['bool'] - Enable the penalization of points that have been already evaluated in EI criterion * - surrogate - - + - - None - ['KRG', 'KPLS', 'KPLSK', 'GEKPLS', 'MGP'] - SMT kriging-based surrogate model used internaly diff --git a/doc/_src_docs/applications/mfk.rst b/doc/_src_docs/applications/mfk.rst index 3fd6812a6..9d723d1fe 100644 --- a/doc/_src_docs/applications/mfk.rst +++ b/doc/_src_docs/applications/mfk.rst @@ -104,7 +104,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.7581904 + Training - done. Time (sec): 0.8266912 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/applications/mfkpls.rst b/doc/_src_docs/applications/mfkpls.rst index e23baef6b..779898a7e 100644 --- a/doc/_src_docs/applications/mfkpls.rst +++ b/doc/_src_docs/applications/mfkpls.rst @@ -109,7 +109,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.2003310 + Training - done. Time (sec): 0.1940961 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/applications/mfkplsk.rst b/doc/_src_docs/applications/mfkplsk.rst index 07c771109..2b09f57d9 100644 --- a/doc/_src_docs/applications/mfkplsk.rst +++ b/doc/_src_docs/applications/mfkplsk.rst @@ -109,7 +109,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.2006626 + Training - done. Time (sec): 0.1834221 ___________________________________________________________________________ Evaluation @@ -117,9 +117,9 @@ Usage # eval points. : 101 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0156226 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0001547 ___________________________________________________________________________ diff --git a/doc/_src_docs/applications/podi.rst b/doc/_src_docs/applications/podi.rst index 2de9951f0..39b8a55ff 100644 --- a/doc/_src_docs/applications/podi.rst +++ b/doc/_src_docs/applications/podi.rst @@ -1,15 +1,15 @@ Proper Orthogonal Decomposition + Interpolation (PODI) ====================================================== -PODI is an application used to predict vectorial measures. +PODI is an application used to predict vectorial outputs. It combines Proper Orthogonal Decomposition (POD) and kriging based surrogate models to perform the estimations. Context ------- -We consider a problem in which the estimation of a measure :math:`u` is desired along a mesh of :math:`p` points. -The data containing the values of :math:`u` in a specific configuration of the problem is called a **snapshot**. -With :math:`k \in [\![1,N]\!]`, the caracteristics of the :math:`k`-th configuration are represented by :math:`\mathbf{x}_k`. +We consider a problem in which the estimation of a vectorial output :math:`u\in\mathbb{R}^p` is desired. +This vector depends of an input variable :math:`\mathbf{x}=(\mathbf{x_1},\dots,\mathbf{x_N})\in\mathbb{R}^N` representing the caracteristics of :math:`N` configurations of the problem. +With :math:`k \in [\![1,N]\!]`, :math:`u(\mathbf{x_k})` corresponds to output values at a specific configuration. It is called a **snapshot**. The :math:`N` snapshots are gathered in a database called the **snapshot matrix**: @@ -22,12 +22,12 @@ The :math:`N` snapshots are gathered in a database called the **snapshot matrix* \end{bmatrix} \in \mathbb{R}^{p \times N} -Each column of the matrix corresponds to a snapshot, while each row corresponds to a point of the problem's mesh. +Each column of the matrix corresponds to a snapshot output :math:`u(\mathbf{x_k})`. Proper Orthogonal Decomposition (POD) ------------------------------------- -The measure :math:`u` is a vector of dimension :math:`p`. Its POD is this decomposition: +The vectorial output $u$ is a vector of dimension $p$. Its POD is this decomposition: .. math :: \begin{equation}\label{e:pod} @@ -38,7 +38,7 @@ The measure :math:`u` is a vector of dimension :math:`p`. Its POD is this decomp * each mode :math:`i` is defined by a scalar coefficient :math:`\alpha_i` and a vector :math:`\phi_{i}` of dimension :math:`p`. -* the :math:`\phi_i` vectors are orthogonal and form the **POD basis**. The POD basis is **global** here because it doesn't depend of :math:`\mathbf{x}`. +* the :math:`\phi_i` vectors are orthogonal and form the **POD basis**. We can also define the matricial POD equation: @@ -133,17 +133,16 @@ These models are able to compute an estimation denoted :math:`\hat\alpha_i(\math .. math :: \hat\alpha_i(\mathbf{x}_*) \hookrightarrow \mathcal{N}(\mu_i(\mathbf{x}_*),\sigma_i^{2}(\mathbf{x}_*)) -The mean and variance of :math:`u(\mathbf{x}_*)` can be deduced: +The mean, variance and derivative of :math:`u(\mathbf{x}_*)` can be deduced: .. math :: \begin{cases} \mathbb{E}[u(\mathbf{x}_*)]=u_0+\sum_{i=1}^{M} \mu_i(\mathbf{x}_*)\phi_i \\ - \mathbb{V}[u(\mathbf{x}_*)]=\sum_{i=1}^{M} \sigma_i^{2}(\mathbf{x}_*)\phi_i^{2} + \mathbb{V}[u(\mathbf{x}_*)]=\sum_{i=1}^{M} \sigma_i^{2}(\mathbf{x}_*)\phi_i^{2} \\ + u'(\mathbf{x}_*)=\sum_{i=1}^{M} \hat\alpha_i'(\mathbf{x}_*)\phi_i \end{cases} -NB: These equations take in consideration that: - -- the POD basis is global: the :math:`\phi_i` are independent of :math:`\mathbf{x}`. +NB: The variance equation takes in consideration that: - the models are pairwise independent, so are the coefficients :math:`\hat\alpha_i(\mathbf{x}_*)`. @@ -159,21 +158,21 @@ Usage light_pink = np.array((250, 233, 232)) / 255 - ny = 100 - mesh = np.linspace(-1, 1, ny) + p = 100 + y = np.linspace(-1, 1, p) n_modes_test = 10 - def function_test_1d(x, mesh, n_modes_test, ny): + def function_test_1d(x, y, n_modes_test, p): import numpy as np # Note: only required by SMT doc testing toolchain - def cos_coef(i: int, x: np.ndarray): + def cos_coeff(i: int, x: np.ndarray): a = 2 * i % 2 - 1 return a * x[:, 0] * np.cos(i * x[:, 0]) - def Legendre(i: int, mesh: np.ndarray): + def Legendre(i: int, y: np.ndarray): from scipy import special - return special.legendre(i)(mesh) + return special.legendre(i)(y) def gram_schmidt(input_array: np.ndarray) -> np.ndarray: """To perform the Gram-Schmidt's algorithm.""" @@ -190,58 +189,65 @@ Usage basis[i] /= np.linalg.norm(basis[i]) return basis - u0 = np.zeros((ny, 1)) + u0 = np.zeros((p, 1)) alpha = np.zeros((x.shape[0], n_modes_test)) for i in range(n_modes_test): - alpha[:, i] = cos_coef(i, x) + alpha[:, i] = cos_coeff(i, x) - V_init = np.zeros((ny, n_modes_test)) + V_init = np.zeros((p, n_modes_test)) for i in range(n_modes_test): - V_init[:, i] = Legendre(i, mesh) + V_init[:, i] = Legendre(i, y) V = gram_schmidt(V_init.T).T database = u0 + np.dot(V, alpha.T) return database - seed = 42 - nt = 40 + seed_sampling = 42 xlimits = np.array([[0, 4]]) - sampling = LHS(xlimits=xlimits, random_state=seed) + sampling = LHS(xlimits=xlimits, random_state=seed_sampling) + + nt = 40 xt = sampling(nt) nv = 400 xv = sampling(nv) x = np.concatenate((xt, xv)) - dbtrue = function_test_1d(x, mesh, n_modes_test, ny) + dbfull = function_test_1d(x, y, n_modes_test, p) # Training data - dbt = dbtrue[:, :nt] + dbt = dbfull[:, :nt] + + # Validation data + dbv = dbfull[:, nt:] podi = PODI() - podi.compute_pod(dbt, tol=0.9999, seed=seed) + seed_pod = 42 + podi.compute_pod(dbt, tol=0.9999, seed=seed_pod) podi.set_training_values(xt) podi.train() - values = podi.predict_values(x) - variances = podi.predict_variances(x) + values = podi.predict_values(xv) + variances = podi.predict_variances(xv) - i = nt + nv // 2 + # Choosing a value from the validation inputs + i = nv // 2 - diff = dbtrue[:, i] - values[:, i] + diff = dbv[:, i] - values[:, i] rms_error = np.sqrt(np.mean(diff**2)) plt.figure(figsize=(8, 5)) + light_pink = np.array((250, 233, 232)) / 255 plt.fill_between( - np.ravel(np.linspace(-1, 1, ny)), + np.ravel(y), np.ravel(values[:, i] - 3 * np.sqrt(variances[:, i])), np.ravel(values[:, i] + 3 * np.sqrt(variances[:, i])), color=light_pink, label="confiance interval (99%)", ) plt.scatter( - mesh, + y, values[:, i], color="r", marker="x", @@ -250,8 +256,8 @@ Usage label="prediction (mean)", ) plt.scatter( - mesh, - dbtrue[:, i], + y, + dbv[:, i], color="b", marker="*", s=5, @@ -263,8 +269,8 @@ Usage ax = plt.gca() ax.axes.xaxis.set_visible(False) - plt.ylabel("u(x = " + str(x[i, 0])[:4] + ")") - plt.title("Estimation of u at x = " + str(x[i, 0])[:4]) + plt.ylabel("u(x = " + str(xv[i, 0])[:4] + ")") + plt.title("Estimation of u at x = " + str(xv[i, 0])[:4]) plt.legend() plt.show() @@ -295,7 +301,7 @@ PODI class API .. automethod:: smt.applications.podi.PODI.train - .. automethod:: smt.applications.podi.PODI.get_interp_coef + .. automethod:: smt.applications.podi.PODI.get_interp_coeff .. automethod:: smt.applications.podi.PODI.predict_values diff --git a/doc/_src_docs/applications/podi.rstx b/doc/_src_docs/applications/podi.rstx index bf5105681..f70a03654 100644 --- a/doc/_src_docs/applications/podi.rstx +++ b/doc/_src_docs/applications/podi.rstx @@ -1,15 +1,15 @@ Proper Orthogonal Decomposition + Interpolation (PODI) ====================================================== -PODI is an application used to predict vectorial measures. +PODI is an application used to predict vectorial outputs. It combines Proper Orthogonal Decomposition (POD) and kriging based surrogate models to perform the estimations. Context ------- -We consider a problem in which the estimation of a measure :math:`u` is desired along a mesh of :math:`p` points. -The data containing the values of :math:`u` in a specific configuration of the problem is called a **snapshot**. -With :math:`k \in [\![1,N]\!]`, the caracteristics of the :math:`k`-th configuration are represented by :math:`\mathbf{x}_k`. +We consider a problem in which the estimation of a vectorial output :math:`u\in\mathbb{R}^p` is desired. +This vector depends of an input variable :math:`\mathbf{x}=(\mathbf{x_1},\dots,\mathbf{x_N})\in\mathbb{R}^N` representing the caracteristics of :math:`N` configurations of the problem. +With :math:`k \in [\![1,N]\!]`, :math:`u(\mathbf{x_k})` corresponds to output values at a specific configuration. It is called a **snapshot**. The :math:`N` snapshots are gathered in a database called the **snapshot matrix**: @@ -22,12 +22,12 @@ The :math:`N` snapshots are gathered in a database called the **snapshot matrix* \end{bmatrix} \in \mathbb{R}^{p \times N} -Each column of the matrix corresponds to a snapshot, while each row corresponds to a point of the problem's mesh. +Each column of the matrix corresponds to a snapshot output :math:`u(\mathbf{x_k})`. Proper Orthogonal Decomposition (POD) ------------------------------------- -The measure :math:`u` is a vector of dimension :math:`p`. Its POD is this decomposition: +The vectorial output $u$ is a vector of dimension $p$. Its POD is this decomposition: .. math :: \begin{equation}\label{e:pod} @@ -38,7 +38,7 @@ The measure :math:`u` is a vector of dimension :math:`p`. Its POD is this decomp * each mode :math:`i` is defined by a scalar coefficient :math:`\alpha_i` and a vector :math:`\phi_{i}` of dimension :math:`p`. -* the :math:`\phi_i` vectors are orthogonal and form the **POD basis**. The POD basis is **global** here because it doesn't depend of :math:`\mathbf{x}`. +* the :math:`\phi_i` vectors are orthogonal and form the **POD basis**. We can also define the matricial POD equation: @@ -133,17 +133,16 @@ These models are able to compute an estimation denoted :math:`\hat\alpha_i(\math .. math :: \hat\alpha_i(\mathbf{x}_*) \hookrightarrow \mathcal{N}(\mu_i(\mathbf{x}_*),\sigma_i^{2}(\mathbf{x}_*)) -The mean and variance of :math:`u(\mathbf{x}_*)` can be deduced: +The mean, variance and derivative of :math:`u(\mathbf{x}_*)` can be deduced: .. math :: \begin{cases} \mathbb{E}[u(\mathbf{x}_*)]=u_0+\sum_{i=1}^{M} \mu_i(\mathbf{x}_*)\phi_i \\ - \mathbb{V}[u(\mathbf{x}_*)]=\sum_{i=1}^{M} \sigma_i^{2}(\mathbf{x}_*)\phi_i^{2} + \mathbb{V}[u(\mathbf{x}_*)]=\sum_{i=1}^{M} \sigma_i^{2}(\mathbf{x}_*)\phi_i^{2} \\ + u'(\mathbf{x}_*)=\sum_{i=1}^{M} \hat\alpha_i'(\mathbf{x}_*)\phi_i \end{cases} -NB: These equations take in consideration that: - -- the POD basis is global: the :math:`\phi_i` are independent of :math:`\mathbf{x}`. +NB: The variance equation takes in consideration that: - the models are pairwise independent, so are the coefficients :math:`\hat\alpha_i(\mathbf{x}_*)`. @@ -175,7 +174,7 @@ PODI class API .. automethod:: smt.applications.podi.PODI.train - .. automethod:: smt.applications.podi.PODI.get_interp_coef + .. automethod:: smt.applications.podi.PODI.get_interp_coeff .. automethod:: smt.applications.podi.PODI.predict_values diff --git a/doc/_src_docs/applications/vfm.rst b/doc/_src_docs/applications/vfm.rst index 143355a6f..a86d96ce5 100644 --- a/doc/_src_docs/applications/vfm.rst +++ b/doc/_src_docs/applications/vfm.rst @@ -121,7 +121,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.3209596 + Training - done. Time (sec): 0.3157246 .. figure:: vfm_TestVFM_run_vfm_example.png :scale: 80 % diff --git a/doc/_src_docs/applications/vfm_TestVFM_run_vfm_example.png b/doc/_src_docs/applications/vfm_TestVFM_run_vfm_example.png index 0e832c443..5b16e9ac8 100644 Binary files a/doc/_src_docs/applications/vfm_TestVFM_run_vfm_example.png and b/doc/_src_docs/applications/vfm_TestVFM_run_vfm_example.png differ diff --git a/doc/_src_docs/examples/b777_engine/b777_engine.rst b/doc/_src_docs/examples/b777_engine/b777_engine.rst index ed2b16880..4b92656cf 100644 --- a/doc/_src_docs/examples/b777_engine/b777_engine.rst +++ b/doc/_src_docs/examples/b777_engine/b777_engine.rst @@ -311,21 +311,21 @@ RMTB Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.2163289 + Computing energy terms - done. Time (sec): 0.2145510 Computing approximation terms ... Computing approximation terms - done. Time (sec): 0.0000000 - Pre-computing matrices - done. Time (sec): 0.2163289 + Pre-computing matrices - done. Time (sec): 0.2145510 Solving for degrees of freedom ... Solving initial startup problem (n=3375) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 4.857178281e+07 2.642628384e+13 Iteration (num., iy, grad. norm, func.) : 0 0 1.373632370e+05 6.994943224e+09 - Solving for output 0 - done. Time (sec): 0.0844762 + Solving for output 0 - done. Time (sec): 0.0749166 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 3.711896708e-01 7.697335516e-04 Iteration (num., iy, grad. norm, func.) : 0 1 1.379731698e-03 3.522836449e-07 - Solving for output 1 - done. Time (sec): 0.1004388 - Solving initial startup problem (n=3375) - done. Time (sec): 0.1849151 + Solving for output 1 - done. Time (sec): 0.0908349 + Solving initial startup problem (n=3375) - done. Time (sec): 0.1657515 Solving nonlinear problem (n=3375) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 1.373632370e+05 6.994943224e+09 @@ -349,7 +349,7 @@ RMTB Iteration (num., iy, grad. norm, func.) : 17 0 1.450796571e+03 1.500561151e+08 Iteration (num., iy, grad. norm, func.) : 18 0 2.465781060e+03 1.490289858e+08 Iteration (num., iy, grad. norm, func.) : 19 0 1.706970844e+03 1.487533340e+08 - Solving for output 0 - done. Time (sec): 1.6332912 + Solving for output 0 - done. Time (sec): 1.5216210 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 1.379731698e-03 3.522836449e-07 Iteration (num., iy, grad. norm, func.) : 0 1 3.549321664e-04 6.189348135e-08 @@ -372,10 +372,10 @@ RMTB Iteration (num., iy, grad. norm, func.) : 17 1 7.918364377e-06 1.155510003e-09 Iteration (num., iy, grad. norm, func.) : 18 1 5.134927534e-06 1.140449521e-09 Iteration (num., iy, grad. norm, func.) : 19 1 6.357993355e-06 1.139634498e-09 - Solving for output 1 - done. Time (sec): 1.4209077 - Solving nonlinear problem (n=3375) - done. Time (sec): 3.0541990 - Solving for degrees of freedom - done. Time (sec): 3.2391140 - Training - done. Time (sec): 3.4554429 + Solving for output 1 - done. Time (sec): 1.5441484 + Solving nonlinear problem (n=3375) - done. Time (sec): 3.0657694 + Solving for degrees of freedom - done. Time (sec): 3.2315209 + Training - done. Time (sec): 3.4460719 ___________________________________________________________________________ Evaluation @@ -405,9 +405,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0080266 + Predicting - done. Time (sec): 0.0080709 - Prediction time/pt. (sec) : 0.0000803 + Prediction time/pt. (sec) : 0.0000807 ___________________________________________________________________________ @@ -449,9 +449,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0083914 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000839 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -482,9 +482,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0051041 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000510 ___________________________________________________________________________ @@ -493,9 +493,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0080214 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000802 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -537,9 +537,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0080581 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000806 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -548,9 +548,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0080400 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000804 ___________________________________________________________________________ @@ -559,9 +559,9 @@ RMTB # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0010188 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000102 ___________________________________________________________________________ @@ -624,25 +624,25 @@ RMTC Training ... Pre-computing matrices ... Computing dof2coeff ... - Computing dof2coeff - done. Time (sec): 0.0308995 + Computing dof2coeff - done. Time (sec): 0.0221343 Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.1848645 + Computing energy terms - done. Time (sec): 0.1877089 Computing approximation terms ... - Computing approximation terms - done. Time (sec): 0.0624893 - Pre-computing matrices - done. Time (sec): 0.2782533 + Computing approximation terms - done. Time (sec): 0.0567157 + Pre-computing matrices - done. Time (sec): 0.2665589 Solving for degrees of freedom ... Solving initial startup problem (n=2744) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 7.864862172e+07 2.642628384e+13 Iteration (num., iy, grad. norm, func.) : 0 0 2.029343879e+05 2.066646848e+09 - Solving for output 0 - done. Time (sec): 0.1452096 + Solving for output 0 - done. Time (sec): 0.1489806 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 8.095040141e-01 7.697335516e-04 Iteration (num., iy, grad. norm, func.) : 0 1 1.333265997e-03 1.320416078e-07 - Solving for output 1 - done. Time (sec): 0.1679800 - Solving initial startup problem (n=2744) - done. Time (sec): 0.3131895 + Solving for output 1 - done. Time (sec): 0.2037950 + Solving initial startup problem (n=2744) - done. Time (sec): 0.3527756 Solving nonlinear problem (n=2744) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 2.029343879e+05 2.066646848e+09 @@ -666,7 +666,7 @@ RMTC Iteration (num., iy, grad. norm, func.) : 17 0 5.175024952e+02 3.298089323e+08 Iteration (num., iy, grad. norm, func.) : 18 0 5.659469259e+02 3.298071432e+08 Iteration (num., iy, grad. norm, func.) : 19 0 3.408424643e+02 3.298015516e+08 - Solving for output 0 - done. Time (sec): 3.3268821 + Solving for output 0 - done. Time (sec): 3.2044845 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 1.333265997e-03 1.320416078e-07 Iteration (num., iy, grad. norm, func.) : 0 1 3.969689807e-04 9.494233834e-09 @@ -689,10 +689,10 @@ RMTC Iteration (num., iy, grad. norm, func.) : 17 1 1.487456551e-05 2.926019676e-09 Iteration (num., iy, grad. norm, func.) : 18 1 5.180815992e-06 2.920834147e-09 Iteration (num., iy, grad. norm, func.) : 19 1 3.876107086e-06 2.920143941e-09 - Solving for output 1 - done. Time (sec): 3.4642906 - Solving nonlinear problem (n=2744) - done. Time (sec): 6.7911727 - Solving for degrees of freedom - done. Time (sec): 7.1043622 - Training - done. Time (sec): 7.3826156 + Solving for output 1 - done. Time (sec): 3.2836044 + Solving nonlinear problem (n=2744) - done. Time (sec): 6.4880888 + Solving for degrees of freedom - done. Time (sec): 6.8408644 + Training - done. Time (sec): 7.1084726 ___________________________________________________________________________ Evaluation @@ -711,9 +711,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0020499 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000205 ___________________________________________________________________________ @@ -733,9 +733,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0060575 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000606 ___________________________________________________________________________ @@ -766,9 +766,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0156205 + Predicting - done. Time (sec): 0.0085499 - Prediction time/pt. (sec) : 0.0001562 + Prediction time/pt. (sec) : 0.0000855 ___________________________________________________________________________ @@ -777,9 +777,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0010045 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000100 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -799,9 +799,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0020571 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000206 ___________________________________________________________________________ @@ -810,9 +810,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0050187 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000502 ___________________________________________________________________________ @@ -821,9 +821,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0156255 + Predicting - done. Time (sec): 0.0030560 - Prediction time/pt. (sec) : 0.0001563 + Prediction time/pt. (sec) : 0.0000306 ___________________________________________________________________________ @@ -854,9 +854,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0024855 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000249 ___________________________________________________________________________ @@ -865,9 +865,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0025101 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000251 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -876,9 +876,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0065539 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000655 ___________________________________________________________________________ @@ -887,9 +887,9 @@ RMTC # eval points. : 100 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0020568 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000206 .. figure:: b777_engine.png diff --git a/doc/_src_docs/examples/one_D_step/ex_1d_step.rst b/doc/_src_docs/examples/one_D_step/ex_1d_step.rst index ed4e7697a..81f8fd0f0 100644 --- a/doc/_src_docs/examples/one_D_step/ex_1d_step.rst +++ b/doc/_src_docs/examples/one_D_step/ex_1d_step.rst @@ -166,10 +166,10 @@ RMTB Iteration (num., iy, grad. norm, func.) : 17 0 6.756594233e-16 8.453271528e-15 Iteration (num., iy, grad. norm, func.) : 18 0 2.143825648e-16 8.453270718e-15 Iteration (num., iy, grad. norm, func.) : 19 0 7.115441072e-17 8.453270419e-15 - Solving for output 0 - done. Time (sec): 0.1098616 - Solving nonlinear problem (n=100) - done. Time (sec): 0.1098616 - Solving for degrees of freedom - done. Time (sec): 0.1098616 - Training - done. Time (sec): 0.1098616 + Solving for output 0 - done. Time (sec): 0.1149590 + Solving nonlinear problem (n=100) - done. Time (sec): 0.1149590 + Solving for degrees of freedom - done. Time (sec): 0.1149590 + Training - done. Time (sec): 0.1149590 ___________________________________________________________________________ Evaluation @@ -240,8 +240,8 @@ RMTC Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 1.470849329e-01 8.436300000e-03 Iteration (num., iy, grad. norm, func.) : 0 0 1.672771647e-10 2.493685484e-14 - Solving for output 0 - done. Time (sec): 0.0156205 - Solving initial startup problem (n=82) - done. Time (sec): 0.0156205 + Solving for output 0 - done. Time (sec): 0.0166364 + Solving initial startup problem (n=82) - done. Time (sec): 0.0166364 Solving nonlinear problem (n=82) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 7.484144240e-12 2.493684372e-14 @@ -258,10 +258,10 @@ RMTC Iteration (num., iy, grad. norm, func.) : 10 0 3.525949088e-15 1.108940914e-14 Iteration (num., iy, grad. norm, func.) : 11 0 4.977597964e-16 1.108940364e-14 Iteration (num., iy, grad. norm, func.) : 12 0 4.328767946e-17 1.108940341e-14 - Solving for output 0 - done. Time (sec): 0.0688419 - Solving nonlinear problem (n=82) - done. Time (sec): 0.0688419 - Solving for degrees of freedom - done. Time (sec): 0.0844624 - Training - done. Time (sec): 0.0844624 + Solving for output 0 - done. Time (sec): 0.0814357 + Solving nonlinear problem (n=82) - done. Time (sec): 0.0814357 + Solving for degrees of freedom - done. Time (sec): 0.0980721 + Training - done. Time (sec): 0.0980721 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/examples/rans_crm_wing/rans_crm_wing.rst b/doc/_src_docs/examples/rans_crm_wing/rans_crm_wing.rst index 6c788dfab..f55d3a6c8 100644 --- a/doc/_src_docs/examples/rans_crm_wing/rans_crm_wing.rst +++ b/doc/_src_docs/examples/rans_crm_wing/rans_crm_wing.rst @@ -501,21 +501,21 @@ RMTB Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.0107510 + Computing energy terms - done. Time (sec): 0.0156271 Computing approximation terms ... Computing approximation terms - done. Time (sec): 0.0000000 - Pre-computing matrices - done. Time (sec): 0.0107510 + Pre-computing matrices - done. Time (sec): 0.0156271 Solving for degrees of freedom ... Solving initial startup problem (n=400) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 9.429150220e-02 1.114942861e-02 Iteration (num., iy, grad. norm, func.) : 0 0 2.984735241e-08 1.793055991e-10 - Solving for output 0 - done. Time (sec): 0.0104730 + Solving for output 0 - done. Time (sec): 0.0156212 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 1.955493282e+00 4.799845498e+00 Iteration (num., iy, grad. norm, func.) : 0 1 8.972452140e-07 4.567718425e-08 - Solving for output 1 - done. Time (sec): 0.0107534 - Solving initial startup problem (n=400) - done. Time (sec): 0.0212264 + Solving for output 1 - done. Time (sec): 0.0178726 + Solving initial startup problem (n=400) - done. Time (sec): 0.0334938 Solving nonlinear problem (n=400) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 6.652507490e-09 1.793038784e-10 @@ -535,7 +535,7 @@ RMTB Iteration (num., iy, grad. norm, func.) : 13 0 1.026910429e-12 6.255701028e-12 Iteration (num., iy, grad. norm, func.) : 14 0 1.584455272e-12 6.255682352e-12 Iteration (num., iy, grad. norm, func.) : 15 0 3.772463044e-13 6.255651149e-12 - Solving for output 0 - done. Time (sec): 0.1532443 + Solving for output 0 - done. Time (sec): 0.1675348 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 9.728856644e-08 4.567640473e-08 Iteration (num., iy, grad. norm, func.) : 0 1 9.337495225e-08 4.538210157e-08 @@ -568,10 +568,10 @@ RMTB Iteration (num., iy, grad. norm, func.) : 27 1 1.615904818e-12 2.713451132e-10 Iteration (num., iy, grad. norm, func.) : 28 1 1.430058429e-12 2.713450210e-10 Iteration (num., iy, grad. norm, func.) : 29 1 8.733556585e-13 2.713449614e-10 - Solving for output 1 - done. Time (sec): 0.3371367 - Solving nonlinear problem (n=400) - done. Time (sec): 0.4903810 - Solving for degrees of freedom - done. Time (sec): 0.5116074 - Training - done. Time (sec): 0.5223584 + Solving for output 1 - done. Time (sec): 0.2545013 + Solving nonlinear problem (n=400) - done. Time (sec): 0.4220362 + Solving for degrees of freedom - done. Time (sec): 0.4555299 + Training - done. Time (sec): 0.4711571 ___________________________________________________________________________ Evaluation @@ -612,9 +612,9 @@ RMTB # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0010068 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000020 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -792,25 +792,25 @@ RMTC Training ... Pre-computing matrices ... Computing dof2coeff ... - Computing dof2coeff - done. Time (sec): 0.0055771 + Computing dof2coeff - done. Time (sec): 0.0166361 Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.0095417 + Computing energy terms - done. Time (sec): 0.0000000 Computing approximation terms ... - Computing approximation terms - done. Time (sec): 0.0103765 - Pre-computing matrices - done. Time (sec): 0.0254953 + Computing approximation terms - done. Time (sec): 0.0000000 + Pre-computing matrices - done. Time (sec): 0.0166361 Solving for degrees of freedom ... Solving initial startup problem (n=1764) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 1.279175539e-01 1.114942861e-02 Iteration (num., iy, grad. norm, func.) : 0 0 3.676209532e-06 2.207093656e-08 - Solving for output 0 - done. Time (sec): 0.0196388 + Solving for output 0 - done. Time (sec): 0.0156279 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 2.653045755e+00 4.799845498e+00 Iteration (num., iy, grad. norm, func.) : 0 1 5.931882707e-05 6.501854582e-06 - Solving for output 1 - done. Time (sec): 0.0155652 - Solving initial startup problem (n=1764) - done. Time (sec): 0.0352039 + Solving for output 1 - done. Time (sec): 0.0338449 + Solving initial startup problem (n=1764) - done. Time (sec): 0.0494728 Solving nonlinear problem (n=1764) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 8.720952301e-07 2.206099886e-08 @@ -881,7 +881,7 @@ RMTC Iteration (num., iy, grad. norm, func.) : 64 0 1.904781413e-12 2.864924172e-10 Iteration (num., iy, grad. norm, func.) : 65 0 3.311811443e-12 2.864924162e-10 Iteration (num., iy, grad. norm, func.) : 66 0 4.109786374e-13 2.864924155e-10 - Solving for output 0 - done. Time (sec): 1.3670561 + Solving for output 0 - done. Time (sec): 1.3435118 Solving for output 1 ... Iteration (num., iy, grad. norm, func.) : 0 1 1.433843609e-05 6.499190122e-06 Iteration (num., iy, grad. norm, func.) : 0 1 1.433915036e-05 6.252291412e-06 @@ -963,10 +963,10 @@ RMTC Iteration (num., iy, grad. norm, func.) : 76 1 1.039726926e-12 1.446355915e-08 Iteration (num., iy, grad. norm, func.) : 77 1 1.656395559e-12 1.446355915e-08 Iteration (num., iy, grad. norm, func.) : 78 1 9.864571633e-13 1.446355915e-08 - Solving for output 1 - done. Time (sec): 1.7164180 - Solving nonlinear problem (n=1764) - done. Time (sec): 3.0834742 - Solving for degrees of freedom - done. Time (sec): 3.1186781 - Training - done. Time (sec): 3.1441734 + Solving for output 1 - done. Time (sec): 1.5652311 + Solving nonlinear problem (n=1764) - done. Time (sec): 2.9087429 + Solving for degrees of freedom - done. Time (sec): 2.9582157 + Training - done. Time (sec): 2.9748518 ___________________________________________________________________________ Evaluation @@ -974,9 +974,9 @@ RMTC # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0010328 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000021 ___________________________________________________________________________ @@ -1007,9 +1007,9 @@ RMTC # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0020330 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000041 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -1029,9 +1029,9 @@ RMTC # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0000000 + Predicting - done. Time (sec): 0.0020578 - Prediction time/pt. (sec) : 0.0000000 + Prediction time/pt. (sec) : 0.0000041 ___________________________________________________________________________ @@ -1095,9 +1095,9 @@ RMTC # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0080130 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000160 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -1117,9 +1117,9 @@ RMTC # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0020711 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000041 + Prediction time/pt. (sec) : 0.0000000 ___________________________________________________________________________ @@ -1139,9 +1139,9 @@ RMTC # eval points. : 2500 Predicting ... - Predicting - done. Time (sec): 0.0084162 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000034 + Prediction time/pt. (sec) : 0.0000000 .. figure:: rans_crm_wing.png diff --git a/doc/_src_docs/problems/mixedcantileverbeam_Test_test_mixed_cantilever_beam.png b/doc/_src_docs/problems/mixedcantileverbeam_Test_test_mixed_cantilever_beam.png index f3bea0958..ff2c67e91 100644 Binary files a/doc/_src_docs/problems/mixedcantileverbeam_Test_test_mixed_cantilever_beam.png and b/doc/_src_docs/problems/mixedcantileverbeam_Test_test_mixed_cantilever_beam.png differ diff --git a/doc/_src_docs/sampling_methods/lhs_Test_run_lhs.png b/doc/_src_docs/sampling_methods/lhs_Test_run_lhs.png index fd07169bc..3ebf2bc92 100644 Binary files a/doc/_src_docs/sampling_methods/lhs_Test_run_lhs.png and b/doc/_src_docs/sampling_methods/lhs_Test_run_lhs.png differ diff --git a/doc/_src_docs/sampling_methods_Test_run_random.png b/doc/_src_docs/sampling_methods_Test_run_random.png index c843e9d51..9ce2be646 100644 Binary files a/doc/_src_docs/sampling_methods_Test_run_random.png and b/doc/_src_docs/sampling_methods_Test_run_random.png differ diff --git a/doc/_src_docs/surrogate_models/gekpls.rst b/doc/_src_docs/surrogate_models/gekpls.rst index 2aeaf6408..d51d82662 100644 --- a/doc/_src_docs/surrogate_models/gekpls.rst +++ b/doc/_src_docs/surrogate_models/gekpls.rst @@ -97,7 +97,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.2171850 + Training - done. Time (sec): 0.2204998 .. figure:: gekpls_Test_test_gekpls.png :scale: 80 % diff --git a/doc/_src_docs/surrogate_models/gekpls_Test_test_gekpls.png b/doc/_src_docs/surrogate_models/gekpls_Test_test_gekpls.png index 600fac087..93da20594 100644 Binary files a/doc/_src_docs/surrogate_models/gekpls_Test_test_gekpls.png and b/doc/_src_docs/surrogate_models/gekpls_Test_test_gekpls.png differ diff --git a/doc/_src_docs/surrogate_models/genn.rst b/doc/_src_docs/surrogate_models/genn.rst index 11236cbaf..184e8f8ea 100644 --- a/doc/_src_docs/surrogate_models/genn.rst +++ b/doc/_src_docs/surrogate_models/genn.rst @@ -96,7 +96,7 @@ Usage Training Training ... - Training - done. Time (sec): 1.7235396 + Training - done. Time (sec): 1.7719331 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/genn_Test_test_genn.png b/doc/_src_docs/surrogate_models/genn_Test_test_genn.png index 983cb1464..628452752 100644 Binary files a/doc/_src_docs/surrogate_models/genn_Test_test_genn.png and b/doc/_src_docs/surrogate_models/genn_Test_test_genn.png differ diff --git a/doc/_src_docs/surrogate_models/gpx.rst b/doc/_src_docs/surrogate_models/gpx.rst index 92cfd9388..69cb2deb9 100644 --- a/doc/_src_docs/surrogate_models/gpx.rst +++ b/doc/_src_docs/surrogate_models/gpx.rst @@ -90,7 +90,7 @@ Example Training Training ... - Training - done. Time (sec): 0.0020244 + Training - done. Time (sec): 0.0080330 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/kpls.rst b/doc/_src_docs/surrogate_models/kpls.rst index 132df926a..a9f44c53d 100644 --- a/doc/_src_docs/surrogate_models/kpls.rst +++ b/doc/_src_docs/surrogate_models/kpls.rst @@ -83,7 +83,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.1138916 + Training - done. Time (sec): 0.0998423 ___________________________________________________________________________ Evaluation @@ -159,7 +159,7 @@ Usage with an automatic number of components Training Training ... - Training - done. Time (sec): 13.9423621 + Training - done. Time (sec): 13.2172527 The model automatically choose 3 components. ___________________________________________________________________________ @@ -169,9 +169,9 @@ Usage with an automatic number of components # eval points. : 1 Predicting ... - Predicting - done. Time (sec): 0.0010085 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0010085 + Prediction time/pt. (sec) : 0.0000000 [[20.59910277]] [[1075.83008026]] diff --git a/doc/_src_docs/surrogate_models/kplsk.rst b/doc/_src_docs/surrogate_models/kplsk.rst index 42011ecd5..528b0111a 100644 --- a/doc/_src_docs/surrogate_models/kplsk.rst +++ b/doc/_src_docs/surrogate_models/kplsk.rst @@ -85,7 +85,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.1409676 + Training - done. Time (sec): 0.1614909 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/krg.rst b/doc/_src_docs/surrogate_models/krg.rst index a1ac9a875..e22a612b0 100644 --- a/doc/_src_docs/surrogate_models/krg.rst +++ b/doc/_src_docs/surrogate_models/krg.rst @@ -142,7 +142,7 @@ Example 1 Training Training ... - Training - done. Time (sec): 0.1158748 + Training - done. Time (sec): 0.1214223 ___________________________________________________________________________ Evaluation @@ -229,9 +229,9 @@ Example 2 with mixed variables # eval points. : 500 Predicting ... - Predicting - done. Time (sec): 0.0206537 + Predicting - done. Time (sec): 0.0101421 - Prediction time/pt. (sec) : 0.0000413 + Prediction time/pt. (sec) : 0.0000203 .. figure:: krg_Test_test_mixed_int_krg.png @@ -304,7 +304,7 @@ Example 3 with noisy data Training Training ... - Training - done. Time (sec): 0.3472505 + Training - done. Time (sec): 0.3176570 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/ls.rst b/doc/_src_docs/surrogate_models/ls.rst index fdf75440c..c11203fc7 100644 --- a/doc/_src_docs/surrogate_models/ls.rst +++ b/doc/_src_docs/surrogate_models/ls.rst @@ -57,7 +57,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.0000000 + Training - done. Time (sec): 0.0080714 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/mgp.rst b/doc/_src_docs/surrogate_models/mgp.rst index 5c7406f45..e0ded823a 100644 --- a/doc/_src_docs/surrogate_models/mgp.rst +++ b/doc/_src_docs/surrogate_models/mgp.rst @@ -129,7 +129,7 @@ Usage Training Training ... - Training - done. Time (sec): 0.5683582 + Training - done. Time (sec): 0.5436754 .. figure:: mgp_Test_test_mgp.png :scale: 80 % diff --git a/doc/_src_docs/surrogate_models/rmts.rst b/doc/_src_docs/surrogate_models/rmts.rst index 60def6aaf..3cafa2b82 100644 --- a/doc/_src_docs/surrogate_models/rmts.rst +++ b/doc/_src_docs/surrogate_models/rmts.rst @@ -147,24 +147,24 @@ Usage (RMTB) Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.0000000 + Computing energy terms - done. Time (sec): 0.0080621 Computing approximation terms ... Computing approximation terms - done. Time (sec): 0.0000000 - Pre-computing matrices - done. Time (sec): 0.0000000 + Pre-computing matrices - done. Time (sec): 0.0080621 Solving for degrees of freedom ... Solving initial startup problem (n=20) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 1.549745600e+00 2.530000000e+00 Iteration (num., iy, grad. norm, func.) : 0 0 1.246458141e-15 4.463939441e-16 - Solving for output 0 - done. Time (sec): 0.0156238 - Solving initial startup problem (n=20) - done. Time (sec): 0.0156238 + Solving for output 0 - done. Time (sec): 0.0100861 + Solving initial startup problem (n=20) - done. Time (sec): 0.0100861 Solving nonlinear problem (n=20) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 1.530702323e-15 4.463939441e-16 Solving for output 0 - done. Time (sec): 0.0000000 Solving nonlinear problem (n=20) - done. Time (sec): 0.0000000 - Solving for degrees of freedom - done. Time (sec): 0.0156238 - Training - done. Time (sec): 0.0156238 + Solving for degrees of freedom - done. Time (sec): 0.0100861 + Training - done. Time (sec): 0.0181482 ___________________________________________________________________________ Evaluation @@ -238,24 +238,24 @@ Usage (RMTC) Initializing Hessian ... Initializing Hessian - done. Time (sec): 0.0000000 Computing energy terms ... - Computing energy terms - done. Time (sec): 0.0000000 + Computing energy terms - done. Time (sec): 0.0080643 Computing approximation terms ... Computing approximation terms - done. Time (sec): 0.0000000 - Pre-computing matrices - done. Time (sec): 0.0000000 + Pre-computing matrices - done. Time (sec): 0.0080643 Solving for degrees of freedom ... Solving initial startup problem (n=42) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 2.249444376e+00 2.530000000e+00 Iteration (num., iy, grad. norm, func.) : 0 0 1.953264763e-15 4.346868680e-16 - Solving for output 0 - done. Time (sec): 0.0000000 - Solving initial startup problem (n=42) - done. Time (sec): 0.0000000 + Solving for output 0 - done. Time (sec): 0.0020618 + Solving initial startup problem (n=42) - done. Time (sec): 0.0020618 Solving nonlinear problem (n=42) ... Solving for output 0 ... Iteration (num., iy, grad. norm, func.) : 0 0 2.956393318e-15 4.346868680e-16 Solving for output 0 - done. Time (sec): 0.0000000 Solving nonlinear problem (n=42) - done. Time (sec): 0.0000000 - Solving for degrees of freedom - done. Time (sec): 0.0000000 - Training - done. Time (sec): 0.0000000 + Solving for degrees of freedom - done. Time (sec): 0.0020618 + Training - done. Time (sec): 0.0101261 ___________________________________________________________________________ Evaluation diff --git a/doc/_src_docs/surrogate_models/sgp.rst b/doc/_src_docs/surrogate_models/sgp.rst index f6997914b..4e03154a6 100644 --- a/doc/_src_docs/surrogate_models/sgp.rst +++ b/doc/_src_docs/surrogate_models/sgp.rst @@ -133,7 +133,7 @@ Using FITC method Training Training ... - Training - done. Time (sec): 0.6163564 + Training - done. Time (sec): 0.5941231 ___________________________________________________________________________ Evaluation @@ -223,7 +223,7 @@ Using VFE method Training Training ... - Training - done. Time (sec): 0.5419903 + Training - done. Time (sec): 0.5157521 ___________________________________________________________________________ Evaluation @@ -231,9 +231,9 @@ Using VFE method # eval points. : 201 Predicting ... - Predicting - done. Time (sec): 0.0156231 + Predicting - done. Time (sec): 0.0000000 - Prediction time/pt. (sec) : 0.0000777 + Prediction time/pt. (sec) : 0.0000000 .. figure:: sgp_Test_test_sgp_vfe.png diff --git a/smt/applications/podi.py b/smt/applications/podi.py index 2c1effcac..3f0926b2c 100644 --- a/smt/applications/podi.py +++ b/smt/applications/podi.py @@ -28,7 +28,7 @@ class PODI(SurrogateBasedApplication): Singular vectors of the POD. singular_values : np.ndarray Singular values of the POD. - interp_coef : list[SurrogateModel] + interp_coeff : list[SurrogateModel] List containing the surrogate models used. Examples @@ -55,7 +55,7 @@ def _initialize(self) -> None: self.training_values_set = False self.train_done = False - self.interp_coef = None + self.interp_coeff = None @staticmethod def choice_n_modes_tol(EV_list: np.ndarray, tol: float) -> int: @@ -151,7 +151,7 @@ def compute_pod( self.mean = np.atleast_2d(database.mean(axis=1)).T self.basis = self.singular_vectors[:, : self.n_modes] - self.coef = np.dot(database.T - self.mean.T, self.basis) + self.coeff = np.dot(database.T - self.mean.T, self.basis) self.pod_computed = True self.interp_options_set = False @@ -250,7 +250,7 @@ def set_interp_options( f"expected interp_options of size {self.n_modes} or 1, but got {len(interp_options)}." ) - self.interp_coef = [] + self.interp_coeff = [] for i in range(self.n_modes): if mode_options == "local": index = i @@ -262,7 +262,7 @@ def set_interp_options( for key in interp_options[index].keys(): sm_i.options[key] = interp_options[index][key] - self.interp_coef.append(sm_i) + self.interp_coeff.append(sm_i) self.interp_options_set = True self.training_values_set = False @@ -285,11 +285,11 @@ def set_training_values(self, xt: np.ndarray) -> None: "'compute_pod' method must have been succesfully executed before trying to set the training values." ) if not self.interp_options_set: - self.interp_coef = [] + self.interp_coeff = [] for i in range(self.n_modes): sm_i = PODI_available_models["KRG"](print_global=False) - self.interp_coef.append(sm_i) + self.interp_coeff.append(sm_i) self.interp_options_set = True self.nt = xt.shape[0] @@ -301,7 +301,7 @@ def set_training_values(self, xt: np.ndarray) -> None: ) for i in range(self.n_modes): - self.interp_coef[i].set_training_values(xt, self.coef[:, i]) + self.interp_coeff[i].set_training_values(xt, self.coeff[:, i]) self.training_values_set = True @@ -319,21 +319,21 @@ def train(self) -> None: "the training values should have been set before trying to train the models." ) - for interp_coef in self.interp_coef: - interp_coef.train() + for interp_coeff in self.interp_coeff: + interp_coeff.train() self.train_done = True - def get_interp_coef(self) -> np.ndarray: + def get_interp_coeff(self) -> np.ndarray: """ Getter for the list of the interpolation surrogate models used Returns ------- - interp_coef : np.ndarray[n_modes] + interp_coeff : np.ndarray[n_modes] List of the kriging models used for the POD coefficients. """ - return self.interp_coef + return self.interp_coeff def predict_values(self, xn) -> np.ndarray: """ @@ -362,13 +362,13 @@ def predict_values(self, xn) -> np.ndarray: ) self.n_new = xn.shape[0] - mean_coef_interp = np.zeros((self.n_modes, self.n_new)) + mean_coeff_interp = np.zeros((self.n_modes, self.n_new)) for i in range(self.n_modes): - mu_i = self.interp_coef[i].predict_values(xn) - mean_coef_interp[i] = mu_i[:, 0] + mu_i = self.interp_coeff[i].predict_values(xn) + mean_coeff_interp[i] = mu_i[:, 0] - y = self.mean + np.dot(self.basis, mean_coef_interp) + y = self.mean + np.dot(self.basis, mean_coeff_interp) return y @@ -400,13 +400,13 @@ def predict_variances(self, xn) -> np.ndarray: ) self.n_new = xn.shape[0] - var_coef_interp = np.zeros((self.n_modes, self.n_new)) + var_coeff_interp = np.zeros((self.n_modes, self.n_new)) for i in range(self.n_modes): - sigma_i_square = self.interp_coef[i].predict_variances(xn) - var_coef_interp[i] = sigma_i_square[:, 0] + sigma_i_square = self.interp_coeff[i].predict_variances(xn) + var_coeff_interp[i] = sigma_i_square[:, 0] - s2 = np.dot((self.basis**2), var_coef_interp) + s2 = np.dot((self.basis**2), var_coeff_interp) return s2 @@ -446,11 +446,13 @@ def predict_derivatives(self, xn, kx) -> np.ndarray: ) self.n_new = xn.shape[0] - deriv_coef_interp = np.zeros((self.n_modes, self.n_new)) + deriv_coeff_interp = np.zeros((self.n_modes, self.n_new)) for i in range(self.n_modes): - deriv_coef_interp[i] = self.interp_coef[i].predict_derivatives(xn, d)[:, 0] + deriv_coeff_interp[i] = self.interp_coeff[i].predict_derivatives(xn, d)[ + :, 0 + ] - dy_dx = np.dot(self.basis, deriv_coef_interp) + dy_dx = np.dot(self.basis, deriv_coeff_interp) return dy_dx diff --git a/smt/applications/tests/test_podi.py b/smt/applications/tests/test_podi.py index ba60e4767..a74136830 100644 --- a/smt/applications/tests/test_podi.py +++ b/smt/applications/tests/test_podi.py @@ -11,7 +11,7 @@ from smt.applications import PODI -def cos_coef(i: int, x: np.ndarray): +def cos_coeff(i: int, x: np.ndarray): """Generates the i-th coefficient for the one-dimension problem.""" a = 2 * i % 2 - 1 @@ -68,7 +68,7 @@ def pb_1d(x: np.ndarray) -> np.ndarray: alpha = np.zeros((x.shape[0], self.n_modes_test)) for i in range(self.n_modes_test): - alpha[:, i] = cos_coef(i, x) + alpha[:, i] = cos_coeff(i, x) V_init = np.zeros((self.ny, self.n_modes_test)) for i in range(self.n_modes_test): @@ -211,18 +211,18 @@ def test_set_options(self): ] sm.set_interp_options("KRG", options_global) - sm_list = sm.get_interp_coef() - for interp_coef in sm_list: + sm_list = sm.get_interp_coeff() + for interp_coeff in sm_list: for key in options_global[0].keys(): - self.assertEqual(interp_coef.options[key], options_global[0][key]) + self.assertEqual(interp_coeff.options[key], options_global[0][key]) options_local = [{"poly": "quadratic"}, {"corr": "matern52"}] sm.set_interp_options("KRG", options_local) - sm_list = sm.get_interp_coef() - for i, interp_coef in enumerate(sm_list): + sm_list = sm.get_interp_coeff() + for i, interp_coeff in enumerate(sm_list): for key in options_local[i].keys(): - self.assertEqual(interp_coef.options[key], options_local[i][key]) + self.assertEqual(interp_coeff.options[key], options_local[i][key]) def test_pod(self): """Tests the computing of the pod.""" @@ -299,21 +299,21 @@ def run_podi_example_1d(): light_pink = np.array((250, 233, 232)) / 255 - ny = 100 - mesh = np.linspace(-1, 1, ny) + p = 100 + y = np.linspace(-1, 1, p) n_modes_test = 10 - def function_test_1d(x, mesh, n_modes_test, ny): + def function_test_1d(x, y, n_modes_test, p): import numpy as np # Note: only required by SMT doc testing toolchain - def cos_coef(i: int, x: np.ndarray): + def cos_coeff(i: int, x: np.ndarray): a = 2 * i % 2 - 1 return a * x[:, 0] * np.cos(i * x[:, 0]) - def Legendre(i: int, mesh: np.ndarray): + def Legendre(i: int, y: np.ndarray): from scipy import special - return special.legendre(i)(mesh) + return special.legendre(i)(y) def gram_schmidt(input_array: np.ndarray) -> np.ndarray: """To perform the Gram-Schmidt's algorithm.""" @@ -330,58 +330,65 @@ def gram_schmidt(input_array: np.ndarray) -> np.ndarray: basis[i] /= np.linalg.norm(basis[i]) return basis - u0 = np.zeros((ny, 1)) + u0 = np.zeros((p, 1)) alpha = np.zeros((x.shape[0], n_modes_test)) for i in range(n_modes_test): - alpha[:, i] = cos_coef(i, x) + alpha[:, i] = cos_coeff(i, x) - V_init = np.zeros((ny, n_modes_test)) + V_init = np.zeros((p, n_modes_test)) for i in range(n_modes_test): - V_init[:, i] = Legendre(i, mesh) + V_init[:, i] = Legendre(i, y) V = gram_schmidt(V_init.T).T database = u0 + np.dot(V, alpha.T) return database - seed = 42 - nt = 40 + seed_sampling = 42 xlimits = np.array([[0, 4]]) - sampling = LHS(xlimits=xlimits, random_state=seed) + sampling = LHS(xlimits=xlimits, random_state=seed_sampling) + + nt = 40 xt = sampling(nt) nv = 400 xv = sampling(nv) x = np.concatenate((xt, xv)) - dbtrue = function_test_1d(x, mesh, n_modes_test, ny) + dbfull = function_test_1d(x, y, n_modes_test, p) # Training data - dbt = dbtrue[:, :nt] + dbt = dbfull[:, :nt] + + # Validation data + dbv = dbfull[:, nt:] podi = PODI() - podi.compute_pod(dbt, tol=0.9999, seed=seed) + seed_pod = 42 + podi.compute_pod(dbt, tol=0.9999, seed=seed_pod) podi.set_training_values(xt) podi.train() - values = podi.predict_values(x) - variances = podi.predict_variances(x) + values = podi.predict_values(xv) + variances = podi.predict_variances(xv) - i = nt + nv // 2 + # Choosing a value from the validation inputs + i = nv // 2 - diff = dbtrue[:, i] - values[:, i] + diff = dbv[:, i] - values[:, i] rms_error = np.sqrt(np.mean(diff**2)) plt.figure(figsize=(8, 5)) + light_pink = np.array((250, 233, 232)) / 255 plt.fill_between( - np.ravel(np.linspace(-1, 1, ny)), + np.ravel(y), np.ravel(values[:, i] - 3 * np.sqrt(variances[:, i])), np.ravel(values[:, i] + 3 * np.sqrt(variances[:, i])), color=light_pink, label="confiance interval (99%)", ) plt.scatter( - mesh, + y, values[:, i], color="r", marker="x", @@ -390,8 +397,8 @@ def gram_schmidt(input_array: np.ndarray) -> np.ndarray: label="prediction (mean)", ) plt.scatter( - mesh, - dbtrue[:, i], + y, + dbv[:, i], color="b", marker="*", s=5, @@ -403,8 +410,8 @@ def gram_schmidt(input_array: np.ndarray) -> np.ndarray: ax = plt.gca() ax.axes.xaxis.set_visible(False) - plt.ylabel("u(x = " + str(x[i, 0])[:4] + ")") - plt.title("Estimation of u at x = " + str(x[i, 0])[:4]) + plt.ylabel("u(x = " + str(xv[i, 0])[:4] + ")") + plt.title("Estimation of u at x = " + str(xv[i, 0])[:4]) plt.legend() plt.show() diff --git a/tutorial/SMT_PODI_tutorial.ipynb b/tutorial/SMT_PODI_tutorial.ipynb new file mode 100644 index 000000000..3cf453eda --- /dev/null +++ b/tutorial/SMT_PODI_tutorial.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"FqdO-rESet18"},"source":["\n","\"Open\n"]},{"cell_type":"markdown","metadata":{"id":"TEKYTASvet2B"},"source":["
\n","\n","This tutorial describes how to use PODI, an application of the SMT toolbox. It combines Proper Orthogonal Decomposition (POD) and kriging based surrogate models to perform the estimations of vectorial outputs\n","
\n","\n","Hugo Reimeringer ONERA/DTIS/M2CI\n","\n","May 2024 - `SMT version 2.5.1`\n",""]},{"cell_type":"markdown","metadata":{"id":"vKWoh8Ldet2C"},"source":["

\n","To use SMT, please follow this link : https://github.com/SMTorg/SMT/blob/master/README.md. The documentation is available here: http://smt.readthedocs.io/en/latest/\n","

\n","\n","The reference paper is available\n","here https://www.sciencedirect.com/science/article/pii/S0965997818309360?via%3Dihub\n","\n","or as a preprint: http://mdolab.engin.umich.edu/content/python-surrogate-modeling-framework-derivatives"]},{"cell_type":"code","execution_count":19,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":11977,"status":"ok","timestamp":1715761101522,"user":{"displayName":"HUGO R","userId":"03990053277838011550"},"user_tz":-120},"id":"vdWGVt-Det2D","outputId":"c23298ef-327b-4733-e15a-87fec3ab3e75"},"outputs":[{"name":"stdout","output_type":"stream","text":["Requirement already satisfied: smt in d:\\hreimeri\\anaconda3\\lib\\site-packages (2.4.0)\n","Requirement already satisfied: scikit-learn in d:\\hreimeri\\anaconda3\\lib\\site-packages (from smt) (1.3.0)\n","Requirement already satisfied: pyDOE3 in d:\\hreimeri\\anaconda3\\lib\\site-packages (from smt) (1.0.1)\n","Requirement already satisfied: scipy in d:\\hreimeri\\anaconda3\\lib\\site-packages (from smt) (1.11.1)\n","Requirement already satisfied: jenn in d:\\hreimeri\\anaconda3\\lib\\site-packages (from smt) (1.0.3)\n","Requirement already satisfied: orjson>=3.9 in d:\\hreimeri\\anaconda3\\lib\\site-packages (from jenn->smt) (3.9.15)\n","Requirement already satisfied: numpy>=1.22 in d:\\hreimeri\\anaconda3\\lib\\site-packages (from jenn->smt) (1.24.3)\n","Requirement already satisfied: joblib>=1.1.1 in d:\\hreimeri\\anaconda3\\lib\\site-packages (from scikit-learn->smt) (1.2.0)\n","Requirement already satisfied: threadpoolctl>=2.0.0 in d:\\hreimeri\\anaconda3\\lib\\site-packages (from scikit-learn->smt) (2.2.0)\n"]}],"source":["!pip install smt"]},{"cell_type":"markdown","metadata":{"id":"rNnEZOcoet2F"},"source":["# Context\n","---\n","\n","We consider a problem in which the estimation of a vectorial output $u\\in\\mathbb{R}^p$ is desired.\n","This vector depends of an input variable $\\mathbf{x}=(\\mathbf{x_1},\\dots,\\mathbf{x_N})\\in\\mathbb{R}^N$ representing the caracteristics of $N$ configurations of the problem.\n","With $k \\in [\\![1,N]\\!]$, $u(\\mathbf{x_k})$ corresponds to output values at a specific configuration. It is called a **snapshot**.\n","\n","The $N$ snapshots are gathered in a database called the **snapshot matrix**:\n","$$\n","\tS=\n","\t\\begin{bmatrix}\n","\t\tu( \\mathbf{x}_1)_1 & \\dots & u( \\mathbf{x}_N)_1 \\\\\n","\t\t\\vdots & \\ddots & \\vdots \\\\\n","\t\tu( \\mathbf{x}_1)_p & \\dots & u( \\mathbf{x}_N)_p \\\\\n","\t\\end{bmatrix}\n","\t\\in \\mathbb{R}^{p \\times N}\n","$$\n","\n","Each column of the matrix corresponds to a snapshot $u(\\mathbf{x_k})$."]},{"cell_type":"markdown","metadata":{"id":"LbKREeWkfuX6"},"source":["We import the needed packages"]},{"cell_type":"code","execution_count":20,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":376},"executionInfo":{"elapsed":2288,"status":"error","timestamp":1715761103799,"user":{"displayName":"HUGO R","userId":"03990053277838011550"},"user_tz":-120},"id":"4roq8FhRet2G","outputId":"9b7d37da-63fa-459a-c06e-80e8bcd9c1fd"},"outputs":[],"source":["from smt.applications import PODI\n","import numpy as np\n","from scipy import special\n","from matplotlib import pyplot as plt\n","from smt.sampling_methods import LHS\n","%matplotlib inline\n","#to ignore warning messages\n","import warnings\n","warnings.filterwarnings(\"ignore\")"]},{"cell_type":"markdown","metadata":{"id":"f-pA4nVfet2G"},"source":["# 1D test function"]},{"cell_type":"code","execution_count":21,"metadata":{"id":"OzuKwdsAet2H"},"outputs":[],"source":["#defining the 1D-test fuction\n","\n","p = 100\n","y = np.linspace(-1, 1, p)\n","n_modes_test = 10\n","def function_test_1d(x, y, n_modes_test, p):\n"," def cos_coeff(i: int, x: np.ndarray):\n"," a = 2 * i % 2 - 1\n"," return a * x[:, 0] * np.cos(i * x[:, 0])\n","\n"," def Legendre(i: int, y: np.ndarray):\n"," return special.legendre(i)(y)\n","\n"," def gram_schmidt(input_array: np.ndarray) -> np.ndarray:\n"," \"\"\"To perform the Gram-Schmidt's algorithm.\"\"\"\n","\n"," basis = np.zeros_like(input_array)\n"," for i in range(len(input_array)):\n"," basis[i] = input_array[i]\n"," for j in range(i):\n"," basis[i] -= (\n"," np.dot(input_array[i], basis[j])\n"," / np.dot(basis[j], basis[j])\n"," * basis[j]\n"," )\n"," basis[i] /= np.linalg.norm(basis[i])\n"," return basis\n","\n"," u0 = np.zeros((p, 1))\n","\n"," alpha = np.zeros((x.shape[0], n_modes_test))\n"," for i in range(n_modes_test):\n"," alpha[:, i] = cos_coeff(i, x)\n","\n"," V_init = np.zeros((p, n_modes_test))\n"," for i in range(n_modes_test):\n"," V_init[:, i] = Legendre(i, y)\n","\n"," V = gram_schmidt(V_init.T).T\n"," database = u0 + np.dot(V, alpha.T)\n","\n"," return database\n","\n","seed_sampling = 42\n","xlimits = np.array([[0, 4]])\n","sampling = LHS(xlimits=xlimits, random_state=seed_sampling)\n","\n","nt = 40\n","xt = sampling(nt)\n","\n","nv = 400\n","xv = sampling(nv)\n","\n","x = np.concatenate((xt, xv))\n","dbfull = function_test_1d(x, y, n_modes_test, p)\n","\n","# Training data\n","dbt = dbfull[:, :nt]\n","\n","# Validation data\n","dbv = dbfull[:, nt:]"]},{"cell_type":"markdown","metadata":{"id":"_UOJq8jsl-yy"},"source":["# Proper Orthogonal Decomposition (POD)\n","---\n","\n","The vectorial output $u$ is a vector of dimension $p$. Its POD is this decomposition:\n","\n","$$\n","\tu({\\mathbf x})=u_0 + \\sum_{i=1}^{M} \\alpha_i(\\mathbf x)\\phi_i\n","$$\n","\n","* $u$ is decomposed as a sum of $M$ modes and $u_0$ corresponds to the mean value of $u$.\n","\n","* each mode $i$ is defined by a scalar coefficient $\\alpha_i$ and a vector $\\phi_{i}$ of dimension $p$.\n","\n","* the $\\phi_i$ vectors are orthogonal and form the **POD basis**.\n","\n","We can also define the matricial POD equation:\n","\n","$$\n","\tS=U_0+\\Phi A\n","$$\n","\n","where $U_0$ is composed of the $u_0$ vector on each column,\n","\n","$$\n","\tA=\n","\t\\begin{bmatrix}\n","\t\t\\alpha_1( \\mathbf{x}_1) & \\dots & \\alpha_1( \\mathbf{x}_N) \\\\\n","\t\t\\vdots & \\ddots & \\vdots \\\\\n","\t\t\\alpha_M( \\mathbf{x}_1) & \\dots & \\alpha_M( \\mathbf{x}_N) \\\\\n","\t\\end{bmatrix}\n","\t,\\Phi=\n","\t\\begin{bmatrix}\n","\t\t(\\phi_1)_1 & \\dots & (\\phi_M)_1 \\\\\n","\t\t\\vdots & \\ddots & \\vdots \\\\\n","\t\t(\\phi_1)_p & \\dots & (\\phi_M)_p \\\\\n","\t\\end{bmatrix}\n","$$\n","\n","# Singular Values Decomposition (SVD)\n","---\n","\n","To perform the POD, the SVD of the snapshot matrix *S* is used:\n","\n","$$\n","\tS=U\\Sigma{V}^{T}\n","$$\n","\n","The $(p \\times p)$ $U$ and $(N \\times N)$ ${V}^{T}$ matrices are orthogonal and contain the **singular vectors**.\n","These vectors are the directions of maximum variance in the data and are ranked by decreasing order of importance.\n","Each vector corresponds to a mode of $u$. The total number of available modes is limited by the number of snapshots:\n","\n","$$\n","\tM \\le N\n","$$\n","\n","The importance of each mode is represented by the diagonal values of the $(p \\times N)$ $\\Sigma$ matrix. They are known as the **singular values** $\\sigma_i$ and are positive numbers ranked by decreasing value.\n","It is then needed to filter the modes to keep those that represent most of the data structure.\n","To do this, we use the **explained variance** (EV). It represents the data variance that we keep when filtering the modes.\n","\n","If $m$ modes are kept, their explained variance $EV_m$ is:\n","\n","$$\n","\tEV_m=\\frac{\\sum_{i=1}^{m} \\sigma_i}{\\sum_{i=1}^{N} \\sigma_i}\n","$$\n","\n","The number of kept modes is defined by a tolerance $\\eta \\in ]0,1]$ that represents the minimum variance we desire to explain during the SVD:\n","\n","$$\n","\tM = \\min\\{m \\in [\\![1,N]\\!]: EV_m \\ge \\eta\\}\n","$$\n","\n","Then, the first $M$ singular vectors of the $U$ matrix correspond to the $\\phi_i$ vectors in the POD.\n","The $\\alpha_i$ coefficients of the $A$ matrix can be deduced:\n","\n","$$\n","\tA={\\Phi}^{T}(S-U_0)\n","$$"]},{"cell_type":"markdown","metadata":{"id":"qQf2YersmLfj"},"source":["### Computing the POD"]},{"cell_type":"code","execution_count":22,"metadata":{"id":"B-WUsWvDet2I"},"outputs":[{"name":"stdout","output_type":"stream","text":["10 modes were kept.\n"]}],"source":["#Call PODI\n","podi = PODI()\n","seed_pod = 42\n","podi.compute_pod(dbt, tol=0.9999, seed=seed_pod)\n","\n","#Results of the POD + SVD\n","n_modes = podi.get_n_modes()\n","print(f\"{n_modes} modes were kept.\")"]},{"cell_type":"markdown","metadata":{"id":"baPXwClBet2J"},"source":["# Use of Surrogate models\n","---\n","\n","To compute $u$ at a new input $\\mathbf{x}_*$, the values of $\\alpha_i(\\mathbf{x}_*)$ at each mode $i$ are needed.\n","\n","To estimate them, **kriging based surrogate models** are used:\n","\n","$$\n","\t\\mathbf{x}=(\\mathbf{x}_1,\\dots,\\mathbf{x}_k,\\dots,\\mathbf{x}_N)\n","\t\\longrightarrow\n","\t\\begin{cases}\n","\t\t\\alpha_1(\\mathbf{x}) \\longrightarrow \\text{model 1} \\\\\n","\t\t\\vdots \\\\\n","\t\t\\alpha_i(\\mathbf{x}) \\longrightarrow \\text{model i} \\\\\n","\t\t\\vdots \\\\\n","\t\t\\alpha_M(\\mathbf{x}) \\longrightarrow \\text{model M} \\\\\n","\t\\end{cases}\n","$$\n","\n","For each kept mode $i$, we use a surrogate model that is trained with the inputs $\\mathbf{x}_k$ and outputs $\\alpha_i(\\mathbf{x}_k)$.\n","\n","These models are able to compute an estimation denoted $\\hat\\alpha_i(\\mathbf{x}_*)$. It is normally distributed:\n","\n","$$\n","\t\\hat\\alpha_i(\\mathbf{x}_*) \\hookrightarrow \\mathcal{N}(\\mu_i(\\mathbf{x}_*),\\sigma_i^{2}(\\mathbf{x}_*))\n","$$\n","\n","The mean, variance and derivative of $u(\\mathbf{x}_*)$ can be deduced:\n","\n","$$\n","\t\\begin{cases}\n","\t\t\\mathbb{E}[u(\\mathbf{x}_*)]=u_0+\\sum_{i=1}^{M} \\mu_i(\\mathbf{x}_*)\\phi_i \\\\\n","\t\t\\mathbb{V}[u(\\mathbf{x}_*)]=\\sum_{i=1}^{M} \\sigma_i^{2}(\\mathbf{x}_*)\\phi_i^{2} \\\\\n","\t\tu'(\\mathbf{x}_*)=\\sum_{i=1}^{M} \\alpha_i'(\\mathbf{x}_*)\\phi_i\n","\t\\end{cases}\n","$$\n","\n","NB: The variance equation takes in consideration that:\n","\n","- the models are pairwise independent, so are the coefficients $\\hat\\alpha_i(\\mathbf{x}_*)$."]},{"cell_type":"markdown","metadata":{"id":"th7jYf31nsXU"},"source":["### Setting the models to perform the predictions"]},{"cell_type":"code","execution_count":23,"metadata":{"id":"7v7BHkxQet2K"},"outputs":[],"source":["#Choosing the KPLSK models (default is Kriging \"KRG\")\n","podi.set_interp_options(interp_type = \"KPLSK\")\n","\n","#Setting the training inputs\n","podi.set_training_values(xt)\n","#Training the models\n","podi.train()\n","\n","#predicting the desired values with inputs\n","values = podi.predict_values(xv)\n","variances = podi.predict_variances(xv)\n","derivatives = podi.predict_derivatives(xv, kx = 0)"]},{"cell_type":"markdown","metadata":{"id":"XV0z5R4uet2L"},"source":["### Results for an input $x_k$ not used for the training"]},{"cell_type":"code","execution_count":24,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":216},"executionInfo":{"elapsed":233,"status":"error","timestamp":1715761207370,"user":{"displayName":"HUGO R","userId":"03990053277838011550"},"user_tz":-120},"id":"FisVBZ0MVDw7","outputId":"877005e0-95ca-4345-fab2-f88425a3014d"},"outputs":[{"data":{"image/png":"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/KHVfmPGjIGlpeUbbx07dixQXRYWFvD19cXff/+t1fYpKSl45513EBMTg99++w0NGjRQ2eb69eu4cOECypUrp7jljrlt3749vLy8ClQrEeVgTywRFYi1tTX8/Pzg5OSEw4cPIzIyEi1btlRc3FPYHjttSCQSCCFULijatGmT0rCC3Hq1ratjx4744osv8P3332PatGmK9tyvnwsalNSdZ8+ePdi/fz/69OmjaP/2228VjxeEt7c3rl69qtR2/PhxPH/+/I37SiQSWFhYKH3Fn5aWhu+++05lW216m1937do1TJ48GSNGjMDGjRvRqlUrDBw4EJGRkShXrly++xbFcILXpaen48KFC6hevfobt80NsP/88w9+++03jfML79q1S+lbAwD49ddfsWTJEnzzzTcqF4ERkW4YYolI4fr16yqzEwA5V/G7urpi7ty5uH//Pjp27IjKlSvj6dOn+Oqrr2BpaamYW7NatWqwtbXF9u3bUbt2bZQtWxYVK1ZExYoV9V6vg4MD2rZti6VLl8LFxQXe3t44deoUNm/eDCcnJ6Vt69WrBwDYsGGDYjqlqlWrqh0K0KlTJ3Tp0gXBwcFITU1F69atFbMTNG7cGMOHD9dL/SNGjMDatWsxcuRIxMbGon79+jhz5gwWLVqErl274p133inQcYcPH445c+Zg7ty58PPzQ3R0NNasWaPVV9fdunXD8uXLMWTIEAQFBSE5ORlffvml2pkH6tevj127dmH37t3w8fGBjY0N6tevr/a4L168wIABA1C1alV8/fXXsLKywp49e+Dr64vRo0dj//79+dbl7e2tt1XVWrVqhZ49e6J27dpwdHREbGws1q1bh7t372Lfvn1K2+aG2jt37gDICfRdunRBZGQkVq5ciezsbFy4cEGxvaurq2LWC3WLeuSuGNekSRMudkBUWIa9royIjEF+sxMAEBs3bhRCCHHw4EHx7rvvikqVKgkrKyvh5uYmunbtKk6fPq10vJ07d4patWoJS0tLpSvlNc1O0K1bN5WaAIiJEycqtcXExAgAYunSpYq2+/fvi759+4py5coJe3t74e/vL65fv672SvyVK1eKqlWrCnNzc6UZFPLOTiBEzgwDwcHBwsvLS1haWgoPDw/x3nvviZSUFK3q9/Pz0+pK+eTkZDFhwgTh4eEhLCwshJeXlwgJCRHp6ekqx9N2doKM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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["#Choosing a value from the validation inputs\n","i = nv//2\n","\n","diff = dbv[:, i] - values[:, nt + i]\n","rms_error = np.sqrt(np.mean(diff**2))\n","plt.figure(figsize=(8, 5))\n","light_pink = np.array((250, 233, 232)) / 255\n","plt.fill_between(\n"," np.ravel(y),\n"," np.ravel(values[:, i] - 3 * np.sqrt(variances[:, i])),\n"," np.ravel(values[:, i] + 3 * np.sqrt(variances[:, i])),\n"," color=light_pink,\n"," label=\"confiance interval (99%)\",\n",")\n","plt.scatter(\n"," y,\n"," values[:, i],\n"," color=\"r\",\n"," marker=\"x\",\n"," s=15,\n"," alpha=1.0,\n"," label=\"prediction (mean)\",\n",")\n","plt.scatter(\n"," y,\n"," dbv[:, i],\n"," color=\"b\",\n"," marker=\"*\",\n"," s=5,\n"," alpha=1.0,\n"," label=\"reference\",\n",")\n","plt.plot([], [], color=\"w\", label=\"error = \" + str(round(rms_error, 9)))\n","\n","ax = plt.gca()\n","ax.axes.xaxis.set_visible(False)\n","\n","plt.ylabel(\"u(x = \" + str(xv[i, 0])[:4] + \")\")\n","plt.title(\"Estimation of u at x = \" + str(xv[i, 0])[:4])\n","plt.legend()\n","plt.show()"]}],"metadata":{"celltoolbar":"Diaporama","colab":{"provenance":[]},"kernelspec":{"display_name":"base","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.5"}},"nbformat":4,"nbformat_minor":0}