diff --git a/manual/v2.0.2/en/.buildinfo b/manual/v2.0.2/en/.buildinfo new file mode 100644 index 00000000..be53f85e --- /dev/null +++ b/manual/v2.0.2/en/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: cad319f0e7bfacb48db2344eb6175754 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_15_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_15_1.png new file mode 100644 index 00000000..2f357d0e Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_15_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_16_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_16_1.png new file mode 100644 index 00000000..4f591a9d Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_16_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_25_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_25_1.png new file mode 100644 index 00000000..a6a80bcb Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_25_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_27_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_27_1.png new file mode 100644 index 00000000..8487778a Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_27_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_22_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_22_1.png new file mode 100644 index 00000000..f80eca59 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_22_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_23_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_23_1.png new file mode 100644 index 00000000..745455d7 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_basic_org_23_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_12_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_12_0.png new file mode 100644 index 00000000..a13db00e Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_12_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_14_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_14_0.png new file mode 100644 index 00000000..071ddc70 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_14_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_28_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_28_0.png new file mode 100644 index 00000000..08be0187 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_28_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_35_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_35_0.png new file mode 100644 index 00000000..520a8baa Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_35_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_41_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_41_0.png new file mode 100644 index 00000000..5ac1f3b1 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_41_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_47_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_47_0.png new file mode 100644 index 00000000..a9be02f0 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_47_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_53_0.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_53_0.png new file mode 100644 index 00000000..4ce45ecd Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_objective_53_0.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_11_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_11_1.png new file mode 100644 index 00000000..0068091e Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_11_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_12_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_12_1.png new file mode 100644 index 00000000..85da5350 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_12_1.png differ diff --git a/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_14_1.png b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_14_1.png new file mode 100644 index 00000000..502aa769 Binary files /dev/null and b/manual/v2.0.2/en/_images/notebook_tutorial_multi_probe_14_1.png differ diff --git a/manual/v2.0.2/en/_modules/index.html b/manual/v2.0.2/en/_modules/index.html new file mode 100644 index 00000000..651a8513 --- /dev/null +++ b/manual/v2.0.2/en/_modules/index.html @@ -0,0 +1,197 @@ + + + + + + + + Overview: module code — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/basis/fourier.html b/manual/v2.0.2/en/_modules/physbo/blm/basis/fourier.html new file mode 100644 index 00000000..b3bad602 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/basis/fourier.html @@ -0,0 +1,328 @@ + + + + + + + + physbo.blm.basis.fourier — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.basis.fourier

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# -*- coding:utf-8 -*-
+import numpy as np
+
+
+
+[docs] +class fourier: + """ + random feature maps + ``Psi(X; W,b) = cos[X * Wt + b] * alpha`` + where + + - X: input, N-by-d matrix + - W: weight, l-by-d matrix + - Wt: transpose of W + - b: bias, 1-by-l matrix + - alpha: coefficient + + and + + - N: number of data + - d: dimension of input + - l: number of basis + + Attributes + ========== + params: Tuple + W, b, alpha + nbasis: int + number of basis + + References + ========== + A. Rahimi and B. Recht, "Random features for large-scale kernel machines," + in "Advances in neural information processing systems," 2007, pp. 1177-1184. + """ + + def __init__(self, params): + """ + Parameters + ---------- + params: Tuple + W, b, alpha + """ + self._check_params(params) + self._check_len_params(params) + self.params = params + self.nbasis = self.params[1].shape[0] + +
+[docs] + def get_basis(self, X, params=None): + """ + compute the value of basis + + Parameters + ========== + X: numpy.ndarray + input + params: Tuple + W, b, alpha + (default: self.params) + + Returns + ======= + Psi(X; W,b): numpy.ndarray + N-by-l matrix + + ``cos[X * Wt + b] * alpha`` + + where ``Wt`` is the transpose of ``W``. + """ + if params is None: + params = self.params + + self._check_params(params) + self._check_len_params(params) + + return np.cos(np.dot(X, params[0].transpose()) + params[1]) * params[2]
+ + +
+[docs] + def set_params(self, params): + """ + update basis parameters + + Parameters + ========== + params: tuple + W, b, alpha + + """ + self._check_params(params) + self._check_len_params(params) + self.params = params
+ + +
+[docs] + def show(self): + """ + print parameters + """ + print("W = ", self.params[0]) + print("b = ", self.params[1]) + print("alpha = ", self.params[2])
+ + + def _check_params(self, params): + """ + Parameters + ========== + params: tuple + W, b, alpha + + Raises + ====== + ValueError + if ``params`` is not a 3-dimensional tuple + """ + if not isinstance(params, tuple): + raise ValueError("The variable < params > must be a tuple.") + + if len(params) != 3: + raise ValueError("The variable < params > must be 3-dimensional tuple.") + + def _check_len_params(self, params): + """ + Parameters + ========== + params: tuple + W, b, alpha + + + Raises + ====== + ValueError + when dim of W and b are mismatch + or alpha is not a scalar + """ + if params[0].shape[0] != params[1].shape[0]: + raise ValueError( + "The length of 0-axis of W must be same as the length of b." + ) + + if hasattr(params[2], "__len__"): + if len(params[2]) != 1: + raise ValueError("The third entry of <params> must be a scalar.") + else: + if isinstance(params[2], str): + raise ValueError("The third entry of <params> must be a scalar.")
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/core/model.html b/manual/v2.0.2/en/_modules/physbo/blm/core/model.html new file mode 100644 index 00000000..fc7c33c9 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/core/model.html @@ -0,0 +1,452 @@ + + + + + + + + physbo.blm.core.model — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.core.model

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+from .. import inf
+
+
+
+[docs] +class model: + """ + Baysean Linear Model + + Attributes + ========== + prior: physbo.blm.prior.gauss + prior distribution of weights + lik: physbo.blm.lik.gauss + kernel + nbasis: int + number of features in random feature map + stats: Tuple + auxially parameters for sampling + method: str + sampling method + """ + + def __init__(self, lik, prior, options={}): + self.prior = prior + self.lik = lik + self.nbasis = self.lik.linear.basis.nbasis + self._init_prior(prior) + self._set_options(options) + self.stats = () + +
+[docs] + def prepare(self, X, t, Psi=None): + """ + initializes model by using the first training dataset + + Parameters + ========== + X: numpy.ndarray + inputs + t: numpy.ndarray + target (label) + Psi: numpy.ndarray + feature maps + + See also + ======== + physbo.blm.inf.exact.prepare + """ + if self.method == "exact": + inf.exact.prepare(blm=self, X=X, t=t, Psi=Psi) + else: + pass
+ + +
+[docs] + def update_stats(self, x, t, psi=None): + """ + updates model by using another training data + + Parameters + ========== + x: numpy.ndarray + input + t: float + target (label) + psi: numpy.ndarray + feature map + + See also + ======== + physbo.blm.inf.exact.update_stats + """ + if self.method == "exact": + self.stats = inf.exact.update_stats(self, x, t, psi) + else: + pass
+ + +
+[docs] + def get_post_params_mean(self): + """ + calculates posterior mean of weights + + Returns + ======= + numpy.ndarray + + See also + ======== + physbo.blm.inf.exact.get_post_params_mean + """ + if self.method == "exact": + self.lik.linear.params = inf.exact.get_post_params_mean(blm=self)
+ + +
+[docs] + def get_post_fmean(self, X, Psi=None, w=None): + """ + calculates posterior mean of model (function) + + Parameters + ========== + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + w: numpy.ndarray + weight + + See also + ======== + physbo.blm.inf.exact.get_post_fmean + """ + if self.method == "exact": + fmu = inf.exact.get_post_fmean(self, X, Psi, w) + else: + pass + return fmu
+ + +
+[docs] + def sampling(self, w_mu=None, N=1, alpha=1.0): + """ + draws samples of weights + + Parameters + ========== + blm: physbo.blm.core.model + model + w_mu: numpy.ndarray + mean of weight + N: int + the number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + samples of weights + + See also + ======== + physbo.blm.inf.exact.sampling + """ + if self.method == "exact": + w_hat = inf.exact.sampling(self, w_mu, N, alpha=alpha) + else: + pass + return w_hat
+ + +
+[docs] + def post_sampling(self, Xtest, Psi=None, N=1, alpha=1.0): + """ + draws samples of mean value of model + + Parameters + ========== + Xtest: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: ``blm.lik.get_basis(Xtest)``) + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = self.lik.get_basis(Xtest) + w_hat = self.sampling(N=N, alpha=alpha) + return Psi.dot(w_hat) + self.lik.linear.bias
+ + +
+[docs] + def predict_sampling(self, Xtest, Psi=None, N=1): + """ + draws samples from model + + Parameters + ========== + Xtest: numpy.ndarray + inputs + Psi: numpy.ndarray + feature map + (default: ``blm.lik.get_basis(Xtest)``) + N: int + number of samples + (default: 1) + + Returns + ======= + numpy.ndarray + """ + if Xtest.shape[0] == 0: + return np.zeros((0, N)) + fmean = self.post_sampling(Xtest, Psi, N=N) + A = np.random.randn(Xtest.shape[0], N) + return fmean + np.sqrt(self.lik.cov.sigma2) * A
+ + +
+[docs] + def get_post_fcov(self, X, Psi=None, diag=True): + """ + calculates posterior covariance of model + + Parameters + ========== + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + diag: bool + if True, returns only variances as a diagonal matrix + (default: True) + + Returns + ======= + numpy.ndarray + + See also + ======== + physbo.blm.inf.exact.get_post_fcov + """ + if self.method == "exact": + fcov = inf.exact.get_post_fcov(self, X, Psi, diag=True) + else: + pass + return fcov
+ + + def _set_options(self, options): + """ + read options + + Parameters + ========== + options: dict + + - 'method' : sampling method + + - 'exact' (default) + """ + self.method = options.get("method", "exact") + + def _init_prior(self, prior): + """ + sets the prior distribution + + Parameters + ========== + prior: physbo.blm.prior.gauss + if None, prior.gauss(self.nbasis) + """ + if prior is None: + prior = prior.gauss(self.nbasis) + self.prior = prior
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/inf/exact.html b/manual/v2.0.2/en/_modules/physbo/blm/inf/exact.html new file mode 100644 index 00000000..5d840395 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/inf/exact.html @@ -0,0 +1,378 @@ + + + + + + + + physbo.blm.inf.exact — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.inf.exact

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+import physbo.misc as misc
+
+
+
+[docs] +def prepare(blm, X, t, Psi=None): + """ + initializes auxiaialy parameters for quick sampling + + ``blm.stats`` will be updated. + + Parameters + ========== + blm: physbo.blm.core.model + model + X: numpy.ndarray + inputs + t: numpy.ndarray + target (label) + Psi: + feature maps (default: blm.lik.get_basis(X)) + """ + if Psi is None: + Psi = blm.lik.get_basis(X) + PsiT = Psi.transpose() + G = np.dot(PsiT, Psi) * blm.lik.cov.prec + A = G + blm.prior.get_prec() + U = scipy.linalg.cholesky(A, check_finite=False) + b = PsiT.dot(t - blm.lik.linear.bias) + alpha = misc.gauss_elim(U, b) + blm.stats = (U, b, alpha)
+ + + +
+[docs] +def update_stats(blm, x, t, psi=None): + """ + calculates new auxiaialy parameters for quick sampling by fast-update + + Parameters + ========== + blm: physbo.blm.core.model + model + x: numpy.ndarray + input + t: numpy.ndarray + target (label) + psi: + feature map (default: blm.lik.get_basis(X)) + + Returns + ======= + (U, b, alpha): Tuple + new auxially parameters + + Notes + ===== + ``blm.stats[0]`` (U) will be mutated while the others not. + """ + if psi is None: + psi = blm.lik.get_basis(x) + U = blm.stats[0] + b = blm.stats[1] + (t - blm.lik.linear.bias) * psi + misc.cholupdate(U, psi * np.sqrt(blm.lik.cov.prec)) + alpha = misc.gauss_elim(U, b) + return (U, b, alpha)
+ + + +
+[docs] +def sampling(blm, w_mu=None, N=1, alpha=1.0): + """ + draws samples of weights + + Parameters + ========== + blm: physbo.blm.core.model + model + w_mu: numpy.ndarray + mean of weight + N: int + the number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + samples of weights + """ + if w_mu is None: + w_mu = get_post_params_mean(blm) + if N == 1: + z = np.random.randn(blm.nbasis) * alpha + else: + z = np.random.randn(blm.nbasis, N) * alpha + + U = blm.stats[0] + invUz = scipy.linalg.solve_triangular( + U, z, lower=False, overwrite_b=False, check_finite=False + ) + return (invUz.transpose() + w_mu).transpose()
+ + + +
+[docs] +def get_post_params_mean(blm): + """ + calculates mean of weight + + Parameters + ========== + blm: physbo.blm.core.model + + Returns + ======= + numpy.ndarray + """ + return blm.stats[2] * blm.lik.cov.prec
+ + + +
+[docs] +def get_post_fmean(blm, X, Psi=None, w=None): + """ + calculates posterior mean of model + + Parameters + ========== + blm: physbo.blm.core.model + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + w: numpy.ndarray + weights + (default: get_post_params_mean(blm)) + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = blm.lik.linear.basis.get_basis(X) + + if w is None: + w = get_post_params_mean(blm) + return Psi.dot(w) + blm.lik.linear.bias
+ + + +
+[docs] +def get_post_fcov(blm, X, Psi=None, diag=True): + """ + calculates posterior covariance of model + + Parameters + ========== + blm: physbo.blm.core.model + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + diag: bool + if True, returns only variances as a diagonal matrix + (default: True) + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = blm.lik.linear.basis.get_basis(X) + + U = blm.stats[0] + R = scipy.linalg.solve_triangular( + U.transpose(), + Psi.transpose(), + lower=True, + overwrite_b=False, + check_finite=False, + ) + RT = R.transpose() + + if diag is True: + fcov = misc.diagAB(RT, R) + else: + fcov = np.dot(RT, R) + + return fcov
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/lik/gauss.html b/manual/v2.0.2/en/_modules/physbo/blm/lik/gauss.html new file mode 100644 index 00000000..390a56ca --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/lik/gauss.html @@ -0,0 +1,328 @@ + + + + + + + + physbo.blm.lik.gauss — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.lik.gauss

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class gauss: + """ + Gaussian + + Attributes + ========== + linear + cov: blm.lik.cov + covariance + stats + """ + + def __init__(self, linear, cov): + self.linear = linear + self.cov = cov + self.stats = () + +
+[docs] + def get_cov(self, N, params=None): + """ + Returns covariance matrix + + Parameters + ========== + N: int + dimension + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + NxN covariance matrix + """ + if params is None: + params = np.copy(self.cov.params) + + return self.cov.get_cov(N, params)
+ + +
+[docs] + def get_prec(self, N, params=None): + """ + Returns precision matrix + + Parameters + ========== + N: int + dimension + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + NxN precision matrix + """ + + if params is None: + params = np.copy(self.cov.params) + + return self.cov.get_cov(N, params)
+ + +
+[docs] + def get_basis(self, X): + """ + calculates value of basis function at input + + Parameters + ========== + X: numpy.ndarray + input + + See also + ======== + blm.basis.fourier.get_basis + """ + return self.linear.basis.get_basis(X)
+ + +
+[docs] + def get_mean(self, X, Psi=None, params=None, bias=None): + """ + calculates mean value + + Parameters + ========== + X: numpy.ndarray + raw input + Psi: numpy.ndarray + value of feature maps + params: numpy.ndarray + weight + bias: float + bias + + See also + ======== + blm.basis.fourier.get_mean + """ + return self.linear.get_mean(X, Psi, params, bias)
+ + +
+[docs] + def set_params(self, params): + """ + sets parameters + """ + self.linear.set_params(params)
+ + +
+[docs] + def set_bias(self, bias): + """ + sets bias + """ + self.linear.set_bias(bias)
+ + +
+[docs] + def sampling(self, fmean): + """ + draws samples + + Parameters + ========== + fmean: numpy.ndarray + means of samples + + Returns + ======= + samples: numpy.ndarray + """ + num_data = fmean.shape[0] + eps = np.sqrt(self.cov.sigma2) * np.random.randn(num_data) + return fmean + eps
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/lik/linear.html b/manual/v2.0.2/en/_modules/physbo/blm/lik/linear.html new file mode 100644 index 00000000..934edee5 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/lik/linear.html @@ -0,0 +1,300 @@ + + + + + + + + physbo.blm.lik.linear — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.lik.linear

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class linear: + """ + + Attributes + ========== + basis: + basis for random feature map + nbasis: int + number of basis + bias: + params: + _init_params: + initial value of the parameter + """ + + def __init__(self, basis, params=None, bias=None): + self.basis = basis + self.nbasis = basis.nbasis + self._init_params = params + self.bias = bias + self.params = params + + if params is None: + self.params = np.zeros(self.nbasis) + self.nparams = self.nbasis + +
+[docs] + def get_mean(self, X, Psi=None, params=None, bias=None): + """ + calculate mean values + + Parameters + ========== + X: numpy.ndarray + input as an N-by-d matrix + Psi: numpy.ndarray + feature maps ``Psi(X)`` as an N-by-l matrix + (default: self.get_basis(X)) + params: numpy.ndarray + weight as a vector with size l + (default: self.params) + bias: float + (default: self.bias) + + Returns + ======= + numpy.ndarray + Psi * params + bias + + """ + if params is None: + params = np.copy(self.params) + + if bias is None: + bias = np.copy(self.bias) + + if Psi is None: + Psi = self.get_basis(X) + + return Psi.dot(params) + bias
+ + +
+[docs] + def set_params(self, params): + """ + set parameters + + Parameters + ========== + params: np.ndarray + """ + self.params = params
+ + +
+[docs] + def set_bias(self, bias): + """ + set bias + + Parameters + ========== + bias: float + """ + self.bias = bias
+ + +
+[docs] + def _init_params(self, params): + """ + initialize parameters + + Parameters + ========== + params: np.ndarray + (default: numpy.zeros(self.nbasis)) + """ + if params is None: + self.params = np.zeros(self.nbasis) + + self.params = params
+ + + def _init_bias(self, bias): + """ + initialize bias + + Parameters + ========== + bias: float + (default: 0) + """ + if bias is None: + self.bias = 0 + + self.bias = bias
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/predictor.html b/manual/v2.0.2/en/_modules/physbo/blm/predictor.html new file mode 100644 index 00000000..80a9b2f5 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/predictor.html @@ -0,0 +1,439 @@ + + + + + + + + physbo.blm.predictor — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.predictor

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import physbo.predictor
+
+
+
+[docs] +class predictor(physbo.predictor.base_predictor): + """Predictor using Baysean linear model + + Attributes + ========== + blm: physbo.blm.core.model + config: physbo.misc.set_config + configuration + """ + + def __init__(self, config, model=None): + """ + + Parameters + ========== + config: physbo.misc.set_config + configuration + model: physbo.gp.core.model + + See also + ======== + physbo.base_predictor + """ + super(predictor, self).__init__(config, model) + self.blm = None + +
+[docs] + def fit(self, training, num_basis=None): + """ + fit model to training dataset + + Parameters + ========== + training: physbo.variable + dataset for training + num_basis: int + the number of basis (default: self.config.predict.num_basis) + """ + if num_basis is None: + num_basis = self.config.predict.num_basis + + if self.model.prior.cov.num_dim is None: + self.model.prior.cov.num_dim = training.X.shape[1] + self.model.fit(training.X, training.t, self.config) + self.blm = self.model.export_blm(num_basis) + self.delete_stats()
+ + +
+[docs] + def prepare(self, training): + """ + initializes model by using training data set + + Parameters + ========== + training: physbo.variable + dataset for training + """ + self.blm.prepare(training.X, training.t, training.Z)
+ + +
+[docs] + def delete_stats(self): + """ + resets model + """ + self.blm.stats = None
+ + +
+[docs] + def get_basis(self, X): + """ + calculates feature maps Psi(X) + + Parameters + ========== + X: numpy.ndarray + inputs + + Returns + ======= + Psi: numpy.ndarray + feature maps + """ + return self.blm.lik.get_basis(X)
+ + +
+[docs] + def get_post_fmean(self, training, test): + """ + calculates posterior mean value of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_fmean(test.X, test.Z)
+ + +
+[docs] + def get_post_fcov(self, training, test): + """ + calculates posterior variance-covariance matrix of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_fcov(test.X, test.Z)
+ + +
+[docs] + def get_post_params(self, training, test): + """ + calculates posterior weights + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs (not used) + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_params_mean()
+ + +
+[docs] + def get_post_samples(self, training, test, N=1, alpha=1.0): + """ + draws samples of mean values of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.post_sampling(test.X, Psi=test.Z, N=N, alpha=alpha)
+ + +
+[docs] + def get_predict_samples(self, training, test, N=1): + """ + draws samples of values of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray (N x len(test)) + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.predict_sampling(test.X, Psi=test.Z, N=N).transpose()
+ + +
+[docs] + def update(self, training, test): + """ + updates the model. + + If not yet initialized (prepared), the model will be prepared by ``training``. + Otherwise, the model will be updated by ``test``. + + Parameters + ========== + training: physbo.variable + training dataset for initialization (preparation). + If already prepared, the model ignore this. + test: physbo.variable + training data for update. + If not prepared, the model ignore this. + """ + if self.model.stats is None: + self.prepare(training) + return None + + if hasattr(test.t, "__len__"): + N = len(test.t) + else: + N = 1 + + if N == 1: + if test.Z is None: + if test.X.ndim == 1: + self.blm.update_stats(test.X, test.t) + else: + self.blm.update_stats(test.X[0, :], test.t) + else: + if test.Z.ndim == 1: + self.blm.update_stats(test.X, test.t, psi=test.Z) + else: + self.blm.update_stats(test.X[0, :], test.t, psi=test.Z[0, :]) + else: + for n in range(N): + if test.Z is None: + self.blm.update_stats(test.X[n, :], test.t[n]) + else: + self.blm.update_stats(test.X[n, :], test.t[n], psi=test.Z[n, :])
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/blm/prior/gauss.html b/manual/v2.0.2/en/_modules/physbo/blm/prior/gauss.html new file mode 100644 index 00000000..6a84d7cf --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/blm/prior/gauss.html @@ -0,0 +1,410 @@ + + + + + + + + physbo.blm.prior.gauss — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.blm.prior.gauss

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class cov_const: + """ + isotropic variance-covariance + + All elements have the same variance and are independent with each other + + Attributes + ========== + params: float + half of log of covariance + sigma2: float + covariance + prec: float + precision (= inv. of covariance) + """ + + def __init__(self, params=None): + """ + Parameters + ========== + params: float + half of log of covariance + (default: numpy.log(1)) + """ + if params is None: + self.params = np.log(1) + self.sigma2, self.prec = self._trans_params(params) + +
+[docs] + def get_cov(self, nbasis, params=None): + """ + computes the covariance + + Parameters + ========== + nbasis: int + the number of components + params: float + half of log of variance + (default: self.params) + + Returns + ======= + numpy.ndarray + nbasis-by-n-basis covariance matrix + """ + if params is None: + params = self.params + sigma2, prec = self._trans_params(params) + return np.identity(nbasis) * sigma2
+ + +
+[docs] + def get_prec(self, nbasis, params=None): + """ + computes the precision + + Parameters + ========== + nbasis: int + the number of components + params: float + half of log of variance + (default: self.params) + + Returns + ======= + numpy.ndarray + nbasis-by-n-basis precision matrix + """ + if params is None: + params = self.params + sigma2, prec = self._trans_params(params) + return np.identity(nbasis) * prec
+ + +
+[docs] + def set_params(self, params): + """ + sets params + + Parameters + ========== + params: float + half of log of variance + """ + self.params = params + self.sigma2, self.prec = self._trans_params(params)
+ + + def _trans_params(self, params=None): + """ + calculates variance and precise from params + + Parameters + ========== + params: float + half of log of variance + (default: self.params) + + Returns + ======= + sigma2: float + variance + prec: float + precise (= inv. of variance) + """ + if params is None: + params = self.params + + sigma2 = np.exp(2 * params) + prec = 1 / sigma2 + + return sigma2, prec
+ + + +
+[docs] +class gauss: + """ + Gaussian prior + + Attributes + ========== + nbasis: int + number of components + cov: cov_const + covariance + """ + + def __init__(self, nbasis, cov=None): + """ + Parameters + ========== + nbasis: int + number of components + cov: cov_const + (default: cov_const()) + """ + self._init_cov(cov) + self.nbasis = nbasis + +
+[docs] + def get_mean(self, params=None): + """ + calculates the mean value of priors + + Parameters + ========== + params: float + half of log of variance + (not used) + + Returns + ======= + numpy.ndarray + """ + return np.zeros(self.nbasis)
+ + +
+[docs] + def get_cov(self, params=None): + """ + calculates the variance-covariance matrix of priors + + Parameters + ========== + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + """ + return self.cov.get_cov(self.nbasis, params)
+ + +
+[docs] + def get_prec(self, params=None): + """ + calculates the precise matrix of priors + + Parameters + ========== + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + """ + return self.cov.get_prec(self.nbasis, params)
+ + +
+[docs] + def set_params(self, params): + """ + sets params + + Parameters + ========== + params: float + half of log of variance + """ + self.cov.set_params(params)
+ + + def _init_cov(self, cov): + """ + initialize covariance + + Parameters + ========== + cov: cov_const + default: ``cov_const()`` + """ + self.cov = cov + if cov is None: + self.cov = cov_const()
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/core/learning.html b/manual/v2.0.2/en/_modules/physbo/gp/core/learning.html new file mode 100644 index 00000000..5958a54f --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/core/learning.html @@ -0,0 +1,571 @@ + + + + + + + + physbo.gp.core.learning — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.core.learning

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# coding=utf-8
+import numpy as np
+import scipy.optimize
+
+
+
+[docs] +class batch(object): + """ + basis class for batch learning + """ + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : physbo.gp.core.model object + config: physbo.misc.set_config object + """ + + self.gp = gp + self.config = config + +
+[docs] + def run(self, X, t): + """ + Performing optimization using the L-BFGS-B algorithm + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + Returns + ------- + numpy.ndarray + The solution of the optimization. + """ + batch_size = self.config.learning.batch_size + sub_X, sub_t = self.gp.sub_sampling(X, t, batch_size) + + if self.config.learning.num_init_params_search != 0: + is_init_params_search = True + else: + is_init_params_search = False + + if is_init_params_search: + params = self.init_params_search(sub_X, sub_t) + else: + params = np.copy(self.gp.params) + + params = self.one_run(params, sub_X, sub_t) + return params
+ + +
+[docs] + def one_run(self, params, X, t, max_iter=None): + """ + + Parameters + ---------- + params: numpy.ndarray + Initial guess for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + max_iter: int + Maximum number of iterations to perform. + Returns + ------- + numpy.ndarray + The solution of the optimization. + """ + + # is_disp: Set to True to print convergence messages. + is_disp = True + + if max_iter is None: + is_disp = self.config.learning.is_disp + max_iter = int(self.config.learning.max_iter) + + args = (X, t) + bound = self.gp.get_params_bound() + res = scipy.optimize.minimize( + fun=self.gp.eval_marlik, + args=args, + x0=params, + method="L-BFGS-B", + jac=self.gp.get_grad_marlik, + bounds=bound, + options={"disp": is_disp, "maxiter": max_iter}, + ) + + return res.x
+ + + +
+ + + +
+[docs] +class online(object): + """ + base class for online learning + """ + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : model (gp.core.model) + config: set_config (misc.set_config) + """ + self.gp = gp + self.config = config + self.num_iter = 0 + +
+[docs] + def run(self, X, t): + """ + Run initial search and hyper parameter running. + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + + Returns + ------- + numpy.ndarray + The solution of the optimization. + + """ + if self.config.learning.num_init_params_search != 0: + is_init_params_search = True + else: + is_init_params_search = False + + is_disp = self.config.learning.is_disp + if is_init_params_search: + if is_disp: + print("Start the initial hyper parameter searching ...") + params = self.init_params_search(X, t) + if is_disp: + print("Done\n") + else: + params = np.copy(self.params) + + if is_disp: + print("Start the hyper parameter learning ...") + params = self.one_run(params, X, t) + if is_disp: + print("Done\n") + + return params
+ + +
+[docs] + def one_run(self, params, X, t, max_epoch=None, is_disp=False): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + max_epoch: int + Maximum candidate epochs + Returns + ------- + numpy.ndarray + The solution of the optimization. + + """ + num_data = X.shape[0] + batch_size = self.config.learning.batch_size + + if batch_size > num_data: + batch_size = num_data + + if max_epoch is None: + max_epoch = self.config.learning.max_epoch + is_disp = self.config.learning.is_disp + + num_disp = self.config.learning.num_disp + eval_size = self.config.learning.eval_size + eval_X, eval_t = self.gp.sub_sampling(X, t, eval_size) + timing = range(0, max_epoch, int(np.floor(max_epoch / num_disp))) + temp = 0 + + for num_epoch in range(0, max_epoch): + perm = np.random.permutation(num_data) + + if is_disp and temp < num_disp and num_epoch == timing[temp]: + self.disp_marlik(params, eval_X, eval_t, num_epoch) + temp += 1 + + for n in range(0, num_data, batch_size): + tmp_index = perm[n : n + batch_size] + if len(tmp_index) == batch_size: + self.num_iter += 1 + subX = X[tmp_index, :] + subt = t[tmp_index] + params += self.get_one_update(params, subX, subt) + + if is_disp: + self.disp_marlik(params, eval_X, eval_t, num_epoch + 1) + + self.reset() + return params
+ + +
+[docs] + def disp_marlik(self, params, eval_X, eval_t, num_epoch=None): + """ + Displaying marginal likelihood + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + eval_X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + eval_t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + num_epoch: int + Number of epochs + + Returns + ------- + + """ + marlik = self.gp.eval_marlik(params, eval_X, eval_t) + if num_epoch is not None: + print(num_epoch, end=" ") + print("-th epoch", end=" ") + + print("marginal likelihood", marlik)
+ + + + + +
+[docs] + def get_one_update(self, params, X, t): + raise NotImplementedError
+
+ + + +
+[docs] +class adam(online): + """default""" + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : physbo.gp.core.model object + config: physbo.misc.set_config object + """ + super(adam, self).__init__(gp, config) + + self.alpha = self.config.learning.alpha + self.beta = self.config.learning.beta + self.gamma = self.config.learning.gamma + self.epsilon = self.config.learning.epsilon + self.m = np.zeros(self.gp.num_params) + self.v = np.zeros(self.gp.num_params) + +
+[docs] + def reset(self): + self.m = np.zeros(self.gp.num_params) + self.v = np.zeros(self.gp.num_params) + self.num_iter = 0
+ + +
+[docs] + def get_one_update(self, params, X, t): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + Returns + ------- + + """ + grad = self.gp.get_grad_marlik(params, X, t) + self.m = self.m * self.beta + grad * (1 - self.beta) + self.v = self.v * self.gamma + grad**2 * (1 - self.gamma) + hat_m = self.m / (1 - self.beta ** (self.num_iter)) + hat_v = self.v / (1 - self.gamma ** (self.num_iter)) + return -self.alpha * hat_m / (np.sqrt(hat_v) + self.epsilon)
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/core/model.html b/manual/v2.0.2/en/_modules/physbo/gp/core/model.html new file mode 100644 index 00000000..d05a885b --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/core/model.html @@ -0,0 +1,639 @@ + + + + + + + + physbo.gp.core.model — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.core.model

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+from physbo import blm
+from physbo.gp import inf
+from physbo.gp.core import learning
+from physbo.gp.core.prior import prior
+
+
+
+[docs] +class model: + def __init__(self, lik, mean, cov, inf="exact"): + """ + + Parameters + ---------- + lik + mean + cov + inf + """ + self.lik = lik + self.prior = prior(mean=mean, cov=cov) + self.inf = inf + self.num_params = self.lik.num_params + self.prior.num_params + self.params = self.cat_params(self.lik.params, self.prior.params) + self.stats = () + +
+[docs] + def cat_params(self, lik_params, prior_params): + """ + Concatinate the likelihood and prior parameters + + Parameters + ---------- + lik_params: numpy.ndarray + Parameters for likelihood + prior_params: numpy.ndarray + Parameters for prior + Returns + ------- + params: numpy.ndarray + parameters about likelihood and prior + """ + params = np.append(lik_params, prior_params) + return params
+ + +
+[docs] + def decomp_params(self, params=None): + """ + decomposing the parameters to those of likelifood and priors + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + lik_params: numpy.ndarray + prior_params: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + lik_params = params[0 : self.lik.num_params] + prior_params = params[self.lik.num_params :] + return lik_params, prior_params
+ + +
+[docs] + def set_params(self, params): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters. + """ + self.params = params + lik_params, prior_params = self.decomp_params(params) + self.lik.set_params(lik_params) + self.prior.set_params(prior_params)
+ + +
+[docs] + def sub_sampling(self, X, t, N): + """ + Make subset for sampling + + Parameters + ---------- + X: numpy.ndarray + Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of data in subset + Returns + ------- + subX: numpy.ndarray + subt: numpy.ndarray + """ + num_data = X.shape[0] + + if N is not None and N < num_data: + index = np.random.permutation(num_data) + subX = X[index[0:N], :] + subt = t[index[0:N]] + else: + subX = X + subt = t + return subX, subt
+ + +
+[docs] + def export_blm(self, num_basis): + """ + Exporting the blm(Baysean linear model) predictor + + Parameters + ---------- + num_basis: int + Total number of basis + Returns + ------- + physbo.blm.core.model + """ + if not hasattr(self.prior.cov, "rand_expans"): + raise ValueError("The kernel must be.") + + basis_params = self.prior.cov.rand_expans(num_basis) + basis = blm.basis.fourier(basis_params) + prior = blm.prior.gauss(num_basis) + lik = blm.lik.gauss( + blm.lik.linear(basis, bias=self.prior.get_mean(1)), + blm.lik.cov(self.lik.params), + ) + blr = blm.model(lik, prior) + + return blr
+ + +
+[docs] + def eval_marlik(self, params, X, t, N=None): + """ + Evaluating marginal likelihood. + + Parameters + ---------- + params: numpy.ndarray + Parameters. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of subset data (if not specified, all dataset is used) + Returns + ------- + marlik: float + Marginal likelihood. + """ + subX, subt = self.sub_sampling(X, t, N) + if self.inf == "exact": + marlik = inf.exact.eval_marlik(self, subX, subt, params=params) + else: + pass + + return marlik
+ + +
+[docs] + def get_grad_marlik(self, params, X, t, N=None): + """ + Evaluating gradiant of marginal likelihood. + + Parameters + ---------- + params: numpy.ndarray + Parameters. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of subset data (if not specified, all dataset is used) + + Returns + ------- + grad_marlik: numpy.ndarray + Gradiant of marginal likelihood. + """ + subX, subt = self.sub_sampling(X, t, N) + if self.inf == "exact": + grad_marlik = inf.exact.get_grad_marlik(self, subX, subt, params=params) + return grad_marlik
+ + +
+[docs] + def get_params_bound(self): + """ + Getting boundary of the parameters. + + Returns + ------- + bound: list + An array with the tuple (min_params, max_params). + """ + if self.lik.num_params != 0: + bound = self.lik.get_params_bound() + + if self.prior.mean.num_params != 0: + bound.extend(self.prior.mean.get_params_bound()) + + if self.prior.cov.num_params != 0: + bound.extend(self.prior.cov.get_params_bound()) + return bound
+ + +
+[docs] + def prepare(self, X, t, params=None): + """ + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + """ + if params is None: + params = np.copy(self.params) + if self.inf == "exact": + self.stats = inf.exact.prepare(self, X, t, params) + else: + pass
+ + +
+[docs] + def get_post_fmean(self, X, Z, params=None): + """ + Calculating posterior mean of model (function) + + Parameters + ========== + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + params: numpy.ndarray + Parameters + See also + ======== + physbo.gp.inf.exact.get_post_fmean + """ + if params is None: + params = np.copy(self.params) + + if self.inf == "exact": + post_fmu = inf.exact.get_post_fmean(self, X, Z, params) + + return post_fmu
+ + +
+[docs] + def get_post_fcov(self, X, Z, params=None, diag=True): + """ + Calculating posterior covariance matrix of model (function) + + Parameters + ---------- + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + params: numpy.ndarray + Parameters + diag: bool + If X is the diagonalization matrix, true. + + Returns + ------- + physbo.gp.inf.exact.get_post_fcov + + """ + if params is None: + params = np.copy(self.params) + + if self.inf == "exact": + post_fcov = inf.exact.get_post_fcov(self, X, Z, params, diag) + + return post_fcov
+ + +
+[docs] + def post_sampling(self, X, Z, params=None, N=1, alpha=1): + """ + draws samples of mean value of model + + Parameters + ========== + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + Returns + ======= + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + fmean = self.get_post_fmean(X, Z, params=None) + fcov = self.get_post_fcov(X, Z, params=None, diag=False) + return np.random.multivariate_normal(fmean, fcov * alpha**2, N)
+ + +
+[docs] + def predict_sampling(self, X, Z, params=None, N=1): + """ + + Parameters + ---------- + X: numpy.ndarray + training datasets + Z: numpy.ndarray + input for sampling objective values + params: numpy.ndarray + Parameters + N: int + number of samples + (default: 1) + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + + ndata = Z.shape[0] + if ndata == 0: + return np.zeros((N, 0)) + fmean = self.get_post_fmean(X, Z, params=None) + fcov = self.get_post_fcov(X, Z, params=None, diag=False) + self.lik.get_cov( + ndata + ) + + return np.random.multivariate_normal(fmean, fcov, N)
+ + +
+[docs] + def print_params(self): + """ + Printing parameters + """ + print("\n") + if self.lik.num_params != 0: + print("likelihood parameter = ", self.lik.params) + + if self.prior.mean.num_params != 0: + print("mean parameter in GP prior: ", self.prior.mean.params) + + print("covariance parameter in GP prior: ", self.prior.cov.params) + print("\n")
+ + +
+[docs] + def get_cand_params(self, X, t): + """ + Getting candidate for parameters + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + Returns + ------- + params: numpy.ndarray + Parameters + """ + params = np.zeros(self.num_params) + if self.lik.num_params != 0: + params[0 : self.lik.num_params] = self.lik.get_cand_params(t) + + temp = self.lik.num_params + + if self.prior.mean.num_params != 0: + params[ + temp : temp + self.prior.mean.num_params + ] = self.prior.mean.get_cand_params(t) + + temp += self.prior.mean.num_params + + if self.prior.cov.num_params != 0: + params[temp:] = self.prior.cov.get_cand_params(X, t) + + return params
+ + +
+[docs] + def fit(self, X, t, config): + """ + Fitting function (update parameters) + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + config: physbo.misc.set_config object + + """ + method = config.learning.method + + if method == "adam": + adam = learning.adam(self, config) + params = adam.run(X, t) + + if method in ("bfgs", "batch"): + bfgs = learning.batch(self, config) + params = bfgs.run(X, t) + + self.set_params(params)
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/core/prior.html b/manual/v2.0.2/en/_modules/physbo/gp/core/prior.html new file mode 100644 index 00000000..a3bd0af4 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/core/prior.html @@ -0,0 +1,408 @@ + + + + + + + + physbo.gp.core.prior — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.core.prior

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+
+
+[docs] +class prior: + """prior of gaussian process""" + + def __init__(self, mean, cov): + """ + + Parameters + ---------- + mean: numpy.ndarray + mean values of prior + cov: numpy.ndarray + covariance matrix of priors + """ + self.mean = mean + self.cov = cov + self.num_params = self.cov.num_params + self.mean.num_params + self.params = self.cat_params(self.mean.params, self.cov.params) + +
+[docs] + def cat_params(self, mean_params, cov_params): + """ + + Parameters + ---------- + mean_params: numpy.ndarray + Mean values of parameters + cov_params: numpy.ndarray + Covariance matrix of parameters + Returns + ------- + numpy.ndarray + """ + return np.append(mean_params, cov_params)
+ + +
+[docs] + def decomp_params(self, params): + """ + decomposing the parameters to those of mean values and covariance matrix for priors + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + mean_params: numpy.ndarray + cov_params: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + mean_params = params[0 : self.mean.num_params] + cov_params = params[self.mean.num_params :] + return mean_params, cov_params
+ + +
+[docs] + def get_mean(self, num_data, params=None): + """ + Calculating the mean value of priors + + Parameters + ---------- + num_data: int + Total number of data + params: numpy.ndarray + Parameters + Returns + ------- + float + """ + if params is None: + params = np.copy(self.params) + return self.mean.get_mean(num_data, params[0 : self.mean.num_params])
+ + +
+[docs] + def get_cov(self, X, Z=None, params=None, diag=False): + """ + Calculating the variance-covariance matrix of priors + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + diag: bool + If X is the diagonalization matrix, true. + Returns + ------- + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + return self.cov.get_cov(X, Z, params=params[self.mean.num_params :], diag=diag)
+ + +
+[docs] + def get_grad_mean(self, num_data, params=None): + """ + Calculating the gradiant of mean values of priors + + Parameters + ---------- + num_data: int + Total number of data + params: numpy.ndarray + Parameters + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + + mean_params, cov_params = self.decomp_params(params) + return self.mean.get_grad(num_data, params=mean_params)
+ + +
+[docs] + def get_grad_cov(self, X, params=None): + """ + Calculating the covariance matrix priors + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + params: numpy.ndarray + Parameters. + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + mean_params, cov_params = self.decomp_params(params) + return self.cov.get_grad(X, params=cov_params)
+ + +
+[docs] + def set_params(self, params): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters. + """ + mean_params, cov_params = self.decomp_params(params) + self.set_mean_params(mean_params) + self.set_cov_params(cov_params)
+ + +
+[docs] + def set_mean_params(self, params): + """ + Setting parameters for mean values of priors + + Parameters + ---------- + params: numpy.ndarray + Parameters + """ + if self.mean.num_params != 0: + self.params[0 : self.mean.num_params] = params + self.mean.set_params(params)
+ + +
+[docs] + def set_cov_params(self, params): + """ + Setting parameters for covariance matrix of priors + + Parameters + ---------- + params: numpy.ndarray + Parameters + """ + self.params[self.mean.num_params :] = params + self.cov.set_params(params)
+ + +
+[docs] + def sampling(self, X, N=1): + """ + Sampling from GP prior + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + N: int + + Returns + ------- + float + + """ + num_data = X.shape[0] + G = self.get_cov(X) + 1e-8 * np.identity(num_data) + U = scipy.linalg.cholesky(G, check_finite=False) + Z = np.random.randn(N, num_data) + return np.dot(Z, U) + self.get_mean(num_data)
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/cov/gauss.html b/manual/v2.0.2/en/_modules/physbo/gp/cov/gauss.html new file mode 100644 index 00000000..304439eb --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/cov/gauss.html @@ -0,0 +1,603 @@ + + + + + + + + physbo.gp.cov.gauss — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.cov.gauss

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# -*- coding:utf-8 -*-
+import numpy as np
+from scipy import spatial
+from ._src.enhance_gauss import grad_width64
+
+
+
+[docs] +class gauss: + """gaussian kernel""" + + def __init__( + self, + num_dim, + width=3, + scale=1, + ard=False, + max_width=1e6, + min_width=1e-6, + max_scale=1e6, + min_scale=1e-6, + ): + """ + + Parameters + ---------- + num_dim: int + width: float + scale: float + ard: bool + flag to use Automatic Relevance Determination (ARD). + max_width: float + Maximum value of width + min_width: float + Minimum value of width + max_scale: float + Maximum value of scale + min_scale: float + Minimum value of scale + """ + self.ard = ard + self.num_dim = num_dim + self.scale = scale + self.max_ln_width = np.log(max_width) + self.min_ln_width = np.log(min_width) + self.max_ln_scale = np.log(max_scale) + self.min_ln_scale = np.log(min_scale) + + if self.ard: + # with ARD + self.num_params = num_dim + 1 + if isinstance(width, np.ndarray) and len(width) == self.num_dim: + self.width = width + else: + self.width = width * np.ones(self.num_dim) + else: + # without ARD + self.width = width + self.num_params = 2 + + params = self.cat_params(self.width, self.scale) + self.set_params(params) + +
+[docs] + def print_params(self): + """ + show the current kernel parameters + + """ + + print(" Parameters of Gaussian kernel \n ") + print(" width = ", +self.width) + print(" scale = ", +self.scale) + print(" scale2 = ", +self.scale**2) + print(" \n")
+ + +
+[docs] + def prepare(self, params=None): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + params: numpy.ndarray + width: int + scale: int + + """ + if params is None: + params = self.params + width = self.width + scale = self.scale + else: + params = self.supp_params(params) + width, scale = self.decomp_params(params) + + return params, width, scale
+ + +
+[docs] + def get_grad(self, X, params=None): + """ + Getting gradiant values of X + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + params: numpy.ndarray + + Returns + ------- + grad: numpy.ndarray + + """ + num_data = X.shape[0] + params, width, scale = self.prepare(params) + G = self.get_cov(X, params=params) + + grad = np.zeros((self.num_params, num_data, num_data)) + if self.ard: + grad[0 : self.num_params - 1, :, :] = grad_width64(X, width, G) + else: + pairwise_dists = spatial.distance.pdist(X / width, "euclidean") + grad[0, :, :] = G * spatial.distance.squareform(pairwise_dists**2) + + grad[-1, :, :] = 2 * G + return grad
+ + +
+[docs] + def get_cov(self, X, Z=None, params=None, diag=False): + """ + compute the covariant matrix + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of search candidate. + + params: numpy.ndarray + Parameters + + diag: bool + If X is the diagonalization matrix, true. + + Returns + ------- + G: numpy.ndarray + covariant matrix + """ + params, width, scale = self.prepare(params) + scale2 = scale**2 + + if Z is None: + if diag: + G = scale2 * np.ones(X.shape[0]) + else: + pairwise_dists = spatial.distance.squareform( + spatial.distance.pdist(X / width, "euclidean") ** 2 + ) + G = np.exp(-0.5 * pairwise_dists) * scale2 + else: + pairwise_dists = ( + spatial.distance.cdist(X / width, Z / width, "euclidean") ** 2 + ) + G = np.exp(-0.5 * pairwise_dists) * scale2 + + return G
+ + +
+[docs] + def set_params(self, params): + """ + set kernel parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + + """ + params = self.supp_params(params) + self.params = params + self.width, self.scale = self.decomp_params(params)
+ + +
+[docs] + def supp_params(self, params): + """ + Set maximum (minimum) values for parameters when the parameter is greater(less) than this value. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + params: numpy.ndarray + + """ + index = np.where(params[0:-1] > self.max_ln_width) + params[index[0]] = self.max_ln_width + + index = np.where(params[0:-1] < self.min_ln_width) + params[index[0]] = self.min_ln_width + + if params[-1] > self.max_ln_scale: + params[-1] = self.max_ln_scale + + if params[-1] < self.min_ln_scale: + params[-1] = self.min_ln_scale + + return params
+ + +
+[docs] + def decomp_params(self, params): + """ + decompose the parameters defined on the log region + into width and scale parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + width: float + scale: float + """ + + width = np.exp(params[0:-1]) + scale = np.exp(params[-1]) + return width, scale
+ + +
+[docs] + def save(self, file_name): + """ + save the gaussian kernel + + Parameters + ---------- + file_name: str + file name to save the information of the kernel + + """ + kwarg = { + "name": "gauss", + "params": self.params, + "ard": self.ard, + "num_dim": self.num_dim, + "max_ln_scale": self.max_ln_scale, + "min_ln_scale": self.min_ln_scale, + "max_ln_width": self.max_ln_width, + "min_ln_width": self.min_ln_width, + "num_params": self.num_params, + } + with open(file_name, "wb") as f: + np.savez(f, **kwarg)
+ + +
+[docs] + def load(self, file_name): + """ + Recovering the Gaussian kernel from file + Parameters + ---------- + file_name: str + file name to load the information of the kernel + + """ + temp = np.load(file_name) + + self.num_dim = temp["num_dim"] + self.ard = temp["ard"] + self.max_ln_scale = temp["max_ln_scale"] + self.min_ln_scale = temp["min_ln_scale"] + self.max_ln_width = temp["max_ln_width"] + self.min_ln_width = temp["min_ln_width"] + params = temp["params"] + self.set_params(params)
+ + +
+[docs] + def get_params_bound(self): + """ + Getting boundary array. + + Returns + ------- + bound: list + A num_params-dimensional array with the tuple (min_params, max_params). + + """ + + if self.ard: + bound = [ + (self.min_ln_width, self.max_ln_width) for i in range(0, self.num_dim) + ] + else: + bound = [(self.min_ln_width, self.max_ln_width)] + + bound.append((self.min_ln_scale, self.max_ln_scale)) + return bound
+ + +
+[docs] + def cat_params(self, width, scale): + """ + Taking the logarithm of width and scale parameters + and concatinate them into one ndarray + + Parameters + ---------- + width: int + scale: int + + Returns + ------- + params: numpy.ndarray + Parameters + """ + params = np.zeros(self.num_params) + params[0:-1] = np.log(width) + params[-1] = np.log(scale) + return params
+ + +
+[docs] + def rand_expans(self, num_basis, params=None): + """ + Kernel Expansion + + Parameters + ---------- + num_basis: int + total number of basis + params: numpy.ndarray + Parameters + + Returns + ------- + tupple (W, b, amp) + """ + params, width, scale = self.prepare(params) + scale2 = scale**2 + amp = np.sqrt((2 * scale2) / num_basis) + W = np.random.randn(num_basis, self.num_dim) / width + b = np.random.rand(num_basis) * 2 * np.pi + return (W, b, amp)
+ + +
+[docs] + def get_cand_params(self, X, t): + """ + Getting candidate parameters. + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + params: numpy.ndarray + + """ + if self.ard: + # with ARD + width = np.zeros(self.num_dim) + scale = np.std(t) + u = np.random.uniform(0.4, 0.8) + width = u * (np.max(X, 0) - np.min(X, 0)) * np.sqrt(self.num_dim) + + index = np.where(np.abs(width) < 1e-6) + width[index[0]] = 1e-6 + params = np.append(np.log(width), np.log(scale)) + else: + # without ARD + num_data = X.shape[0] + M = max(2000, int(np.floor(num_data / 5))) + + dist = np.zeros(M) + + for m in range(M): + a = np.random.randint(0, X.shape[0], 2) + dist[m] = np.linalg.norm(X[a[0], :] - X[a[1], :]) + + dist = np.sort(dist) + tmp = int(np.floor(M / 10)) + n = np.random.randint(0, 5) + width = dist[(2 * n + 1) * tmp] + scale = np.std(t) + params = np.append(np.log(width + 1e-8), np.log(scale)) + return params
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/inf/exact.html b/manual/v2.0.2/en/_modules/physbo/gp/inf/exact.html new file mode 100644 index 00000000..694780fd --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/inf/exact.html @@ -0,0 +1,414 @@ + + + + + + + + physbo.gp.inf.exact — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.inf.exact

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+from ... import misc
+from copy import deepcopy
+
+
+
+[docs] +def eval_marlik(gp, X, t, params=None): + """ + Evaluating marginal likelihood. + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + marlik: float + Marginal likelihood. + """ + ndata, ndims = X.shape + lik_params, prior_params = gp.decomp_params(params) + + fmu = gp.prior.get_mean(ndata, params=prior_params) + G = gp.prior.get_cov(X, params=prior_params) + B = gp.lik.get_cov(ndata, params=lik_params) + + A = G + B + 1e-8 * np.identity(ndata) + res = t - fmu + U = scipy.linalg.cholesky(A, check_finite=False) + alpha = scipy.linalg.solve_triangular( + U.transpose(), res, lower=True, overwrite_b=False, check_finite=False + ) + marlik = ( + 0.5 * ndata * np.log(2 * np.pi) + + np.sum(np.log(np.diag(U))) + + 0.5 * np.inner(alpha, alpha) + ) + return marlik
+ + + +
+[docs] +def get_grad_marlik(gp, X, t, params=None): + """ + Evaluating gradiant of marginal likelihood. + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + grad_marlik: numpy.ndarray + Gradiant of marginal likelihood. + """ + ndata, ndims = X.shape + lik_params, prior_params = gp.decomp_params(params) + + fmu = gp.prior.get_mean(ndata, prior_params) + G = gp.prior.get_cov(X, params=prior_params) + B = gp.lik.get_cov(ndata, lik_params) + + A = G + B + 1e-8 * np.identity(ndata) + U = scipy.linalg.cholesky(A, check_finite=False) + res = t - fmu + alpha = misc.gauss_elim(U, res) + invA = scipy.linalg.inv(A, check_finite=False) + + grad_marlik = np.zeros(gp.num_params) + + """ lik """ + if gp.lik.num_params != 0: + lik_grad = gp.lik.get_grad(ndata, lik_params) + temp = lik_grad.dot(alpha) + grad_marlik[0 : gp.lik.num_params] = -0.5 * temp.dot( + alpha + ) + 0.5 * misc.traceAB2(invA, lik_grad) + + ntemp = gp.lik.num_params + """ prior """ + if gp.prior.mean.num_params != 0: + mean_grad = gp.prior.get_grad_mean(ndata, prior_params) + grad_marlik[ntemp : ntemp + gp.prior.mean.num_params] = -np.inner( + alpha, mean_grad + ) + + ntemp += gp.prior.mean.num_params + + if gp.prior.cov.num_params != 0: + cov_grad = gp.prior.get_grad_cov(X, prior_params) + temp = cov_grad.dot(alpha) + grad_marlik[ntemp:] = -0.5 * temp.dot(alpha) + 0.5 * misc.traceAB3( + invA, cov_grad + ) + + return grad_marlik
+ + + +
+[docs] +def prepare(gp, X, t, params=None): + """ + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + stats: tupple + """ + ndata = X.shape[0] + ndims = X.shape[1] + + if params is None: + params = np.copy(gp.params) + + lik_params, prior_params = gp.decomp_params(params) + + G = gp.prior.get_cov(X, params=prior_params) + fmu = gp.prior.get_mean(ndata, params=prior_params) + B = gp.lik.get_cov(ndata, params=lik_params) + A = G + B + 1e-8 * np.identity(ndata) + U = scipy.linalg.cholesky(A, check_finite=False) + residual = t - fmu + alpha = misc.gauss_elim(U, residual) + stats = (U, alpha) + + return stats
+ + + +
+[docs] +def get_post_fmean(gp, X, Z, params=None): + """ + Calculating the mean of posterior + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + + Returns + ------- + numpy.ndarray + """ + + ndata = X.shape[0] + ndims = X.shape[1] + ntest = Z.shape[0] + + lik_params, prior_params = gp.decomp_params(params) + + alpha = gp.stats[1] + + fmu = gp.prior.get_mean(ntest) + G = gp.prior.get_cov(X=Z, Z=X, params=prior_params) + + return G.dot(alpha) + fmu
+ + + +
+[docs] +def get_post_fcov(gp, X, Z, params=None, diag=True): + """ + Calculating the covariance of posterior + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + diag: bool + If X is the diagonalization matrix, true. + Returns + ------- + numpy.ndarray + """ + + lik_params, prior_params = gp.decomp_params(params) + + U = gp.stats[0] + alpha = gp.stats[1] + + G = gp.prior.get_cov(X=X, Z=Z, params=prior_params) + + invUG = scipy.linalg.solve_triangular( + U.transpose(), G, lower=True, overwrite_b=False, check_finite=False + ) + + if diag: + diagK = gp.prior.get_cov(X=Z, params=prior_params, diag=True) + diag_invUG2 = misc.diagAB(invUG.transpose(), invUG) + post_cov = diagK - diag_invUG2 + else: + K = gp.prior.get_cov(X=Z, params=prior_params) + post_cov = K - np.dot(invUG.transpose(), invUG) + + return post_cov
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/lik/gauss.html b/manual/v2.0.2/en/_modules/physbo/gp/lik/gauss.html new file mode 100644 index 00000000..6e4f646c --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/lik/gauss.html @@ -0,0 +1,374 @@ + + + + + + + + physbo.gp.lik.gauss — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.lik.gauss

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class gauss: + """Gaussian likelihood function""" + + def __init__(self, std=1, max_params=1e6, min_params=1e-6): + """ + + Parameters + ---------- + std: numpy.ndarray or float + standard deviation. + max_params: float + The maximum value of the parameter. + If the parameter is greater than this value, it will be replaced by this value. + min_params: float + The minimum value of the parameter. + If the parameter is less than this value, it will be replaced by this value. + """ + self.min_params = np.log(min_params) + self.max_params = np.log(max_params) + self.num_params = 1 + self.std = std + self.params = np.log(std) + self.set_params(self.params) + +
+[docs] + def supp_params(self, params=None): + """ + Set maximum (minimum) values for parameters when the parameter is greater(less) than this value. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + Returns + ------- + + """ + if params is None: + params = np.copy(params) + + if params > self.max_params: + params = self.max_params + + if params < self.min_params: + params = self.min_params + + return params
+ + +
+[docs] + def trans_params(self, params=None): + """ + Get exp[params]. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + std: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + std = np.exp(params) + return std
+ + +
+[docs] + def get_params_bound(self): + """ + Get boundary array. + + Returns + ------- + bound: list + A num_params-dimensional array with the tuple (min_params, max_params). + """ + bound = [(self.min_params, self.max_params) for i in range(0, self.num_params)] + return bound
+ + +
+[docs] + def get_cov(self, num_data, params=None): + """ + Get a covariance matrix + + Parameters + ---------- + num_data: int + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + numpy.ndarray + Diagonal element matrix of exp(2.0*params) + """ + std = self.trans_params(params) + var = std**2 + return var * np.identity(num_data)
+ + +
+[docs] + def get_grad(self, num_data, params=None): + """ + Get a gradient matrix + + Parameters + ---------- + num_data: int + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + numpy.ndarray + Diagonal element matrix of 2.0 * exp(2.0*params) + """ + std = self.trans_params(params) + var = std**2 + return var * np.identity(num_data) * 2
+ + +
+[docs] + def set_params(self, params): + """ + Set parameters. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + + """ + self.params = self.supp_params(params) + self.std = self.trans_params(params)
+ + +
+[docs] + def get_cand_params(self, t): + """ + Getting candidate parameters. + + Parameters + ---------- + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + numpy.ndarray + log[ standard deviation of t] - log 10.0 + """ + return np.log(np.std(t) / 10)
+ + + # [TODO] Check: This function seems not to be used. +
+[docs] + def sampling(self, fmean): + """ + Sampling by adding noise + + Parameters + ---------- + fmean: numpy.ndarray + + Returns + ------- + + """ + num_data = fmean.shape[0] + eps = self.std * np.random.randn(num_data) + return fmean + eps
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/mean/const.html b/manual/v2.0.2/en/_modules/physbo/gp/mean/const.html new file mode 100644 index 00000000..8dfab0b5 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/mean/const.html @@ -0,0 +1,342 @@ + + + + + + + + physbo.gp.mean.const — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.mean.const

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class const: + """constant""" + + def __init__(self, params=None, max_params=1e12, min_params=-1e12): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters + max_params: float + Threshold value for specifying the maximum value of the parameter + min_params: float + Threshold value for specifying the minimum value of the parameter + + """ + self.max_params = max_params + self.min_params = min_params + self.init_params(params) + self.num_params = 1 + +
+[docs] + def supp_params(self, params): + """ + Setting maximum and minimum value of parameters. + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + if params > self.max_params: + params = self.max_params + + if params < self.min_params: + params = self.min_params + + return params
+ + +
+[docs] + def get_params_bound(self): + """ + Getting the boundary list for parameters + + Returns + ------- + bound: list + num_params array with the tupple (min_param, max_params) + + """ + bound = [(self.min_params, self.max_params) for i in range(0, self.num_params)] + return bound
+ + +
+[docs] + def get_mean(self, num_data, params=None): + """ + + Parameters + ---------- + num_data: int + total number of data + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + return params * np.ones(num_data)
+ + +
+[docs] + def get_grad(self, num_data, params=None): + """ + Returning a new array of (num_data), filled with ones. + + Parameters + ---------- + num_data: int + total number of data + params: object + not used + + Returns + ------- + numpy.ndarray + """ + return np.ones(num_data)
+ + +
+[docs] + def set_params(self, params): + """ + Setting parameters defined in const class. + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + self.params = params
+ + +
+[docs] + def init_params(self, params): + """ + Initializing parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + params: numpy.ndarray + initialized parameters + """ + if params is None: + self.params = 0 + else: + self.params = self.supp_params(params)
+ + +
+[docs] + def get_cand_params(self, t): + """ + Getting the median array of candidates. + + Parameters + ---------- + t: array_like + Input array or object that can be converted to an array + + Returns + ------- + median: numpy.ndarray + A new array holding the result. + + """ + return np.median(t)
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/mean/zero.html b/manual/v2.0.2/en/_modules/physbo/gp/mean/zero.html new file mode 100644 index 00000000..05344bf3 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/mean/zero.html @@ -0,0 +1,246 @@ + + + + + + + + physbo.gp.mean.zero — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.mean.zero

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class zero: + """zero""" + + def __init__(self): + self.num_params = 0 + self.params = np.array([]) + +
+[docs] + def get_mean(self, num_data, params=None): + """ + Returning numpy.zeros(num_data) + + Parameters + ---------- + num_data: int + dimension of numpy.zeros + params: object + not used + + Returns + ------- + numpy.ndarray + + """ + return np.zeros(num_data)
+ + +
+[docs] + def get_grad(self, num_data, params=None): + """ + Returning empty numpy.ndarray + + Parameters + ---------- + num_data: int + not used + params: object + not used + + Returns + ------- + numpy.ndarray + + """ + return np.array([])
+ + +
+[docs] + def set_params(self, params): + """ + Not defined + + Parameters + ---------- + params + + Returns + ------- + + """ + pass
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/gp/predictor.html b/manual/v2.0.2/en/_modules/physbo/gp/predictor.html new file mode 100644 index 00000000..dfc498e5 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/gp/predictor.html @@ -0,0 +1,371 @@ + + + + + + + + physbo.gp.predictor — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.gp.predictor

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import physbo.predictor
+
+
+
+[docs] +class predictor(physbo.predictor.base_predictor): + """predictor""" + + def __init__(self, config, model=None): + """ + + Parameters + ---------- + config: physbo.misc.set_config + configuration + model: physbo.gp.core.model + """ + super(predictor, self).__init__(config, model) + +
+[docs] + def fit(self, training, num_basis=None): + """ + Fitting model to training dataset + + Parameters + ---------- + training: physbo.variable + dataset for training + num_basis: int + the number of basis (default: self.config.predict.num_basis) + """ + if self.model.prior.cov.num_dim is None: + self.model.prior.cov.num_dim = training.X.shape[1] + self.model.fit(training.X, training.t, self.config) + self.delete_stats()
+ + +
+[docs] + def get_basis(self, *args, **kwds): + """ + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + pass
+ + +
+[docs] + def get_post_params(self, *args, **kwds): + """ + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + pass
+ + +
+[docs] + def update(self, training, test): + self.prepare(training)
+ + +
+[docs] + def prepare(self, training): + """ + Initializing model by using training data set + + Parameters + ---------- + training: physbo.variable + dataset for training + + """ + self.model.prepare(training.X, training.t)
+ + +
+[docs] + def delete_stats(self): + self.model.stats = None
+ + +
+[docs] + def get_post_fmean(self, training, test): + """ + Calculating posterior mean value of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.get_post_fmean(training.X, test.X)
+ + +
+[docs] + def get_post_fcov(self, training, test, diag=True): + """ + Calculating posterior variance-covariance matrix of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + diag: bool + Diagonlization flag in physbo.exact.get_post_fcov function. + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.get_post_fcov(training.X, test.X, diag=diag)
+ + +
+[docs] + def get_post_samples(self, training, test, alpha=1): + """ + Drawing samples of mean values of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs (not used) + alpha: float + tuning parameter of the covariance by multiplying alpha**2 for np.random.multivariate_normal. + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.post_sampling(training.X, test.X, alpha=alpha)
+ + +
+[docs] + def get_predict_samples(self, training, test, N=1): + """ + Drawing samples of values of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + + Returns + ------- + numpy.ndarray (N x len(test)) + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.predict_sampling(training.X, test.X, N=N)
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/misc/centering.html b/manual/v2.0.2/en/_modules/physbo/misc/centering.html new file mode 100644 index 00000000..a9b1847b --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/misc/centering.html @@ -0,0 +1,199 @@ + + + + + + + + physbo.misc.centering — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.misc.centering

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +def centering(X): + """ + Normalize the mean and standard deviation along the each column of X to 0 and 1, respectively + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + Returns + ------- + X_normalized: numpy array + normalized N x d dimensional matrix. + """ + stdX = np.std(X, 0) + index = np.where(stdX != 0) + X_normalized = (X[:, index[0]] - np.mean(X[:, index[0]], 0)) / stdX[index[0]] + return X_normalized
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/misc/gauss_elim.html b/manual/v2.0.2/en/_modules/physbo/misc/gauss_elim.html new file mode 100644 index 00000000..a1a0a53e --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/misc/gauss_elim.html @@ -0,0 +1,206 @@ + + + + + + + + physbo.misc.gauss_elim — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.misc.gauss_elim

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+
+
+[docs] +def gauss_elim(U, t): + """ + Calculate alpha using scipy.linalg.solve_triangular. + alpha = (U^T U)^-1 t = U^-1 [(U^T)-1 t] + + Parameters + ---------- + U: (M, M) array_like + A triangular matrix + t: (M,) or (M, N) array_like + + Returns + ------- + alpha: numpy.ndarray + Solution to the system L^T alpha = t. Shape of return matches t. + """ + alpha = scipy.linalg.solve_triangular( + U.transpose(), t, lower=True, overwrite_b=False, check_finite=False + ) + + alpha = scipy.linalg.solve_triangular( + U, alpha, lower=False, overwrite_b=False, check_finite=False + ) + return alpha
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/misc/set_config.html b/manual/v2.0.2/en/_modules/physbo/misc/set_config.html new file mode 100644 index 00000000..3730af3c --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/misc/set_config.html @@ -0,0 +1,524 @@ + + + + + + + + physbo.misc.set_config — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.misc.set_config

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import configparser
+
+
+
+[docs] +class set_config: + def __init__(self, search_config=None, learning_config=None): + """ + Setting configuration for search and learning. + + Parameters + ---------- + search_config: physbo.misc.search object + learning_config: physbo.misc.learning object + + """ + if search_config is None: + search_config = search() + self.search = search_config + + if learning_config is None: + learning_config = adam() + self.learning = learning_config + +
+[docs] + def show(self): + """ + Showing information of search and learning objects. + + Returns + ------- + + """ + self.search.show() + self.learning.show()
+ + +
+[docs] + def load(self, file_name="config.ini"): + """ + Loading information of configuration. + + Parameters + ---------- + file_name: str + An input file name of configuration. + Returns + ------- + + """ + config = configparser.SafeConfigParser() + config.read(file_name) + + search_config = search() + self.search = search_config + self.search.load(config) + + temp_dict = config._sections["learning"] + method = temp_dict.get("method", "adam") + + if method == "adam": + learning_config = adam() + self.learning = learning_config + self.learning.load(config) + + if method in ("bfgs", "batch"): + learning_config = batch() + self.learning = learning_config + self.learning.load(config)
+
+ + + + + + + +
+[docs] +class learning(object): + def __init__(self): + self.is_disp = True + self.num_disp = 10 + self.num_init_params_search = 20 + self.method = "adam" + +
+[docs] + def show(self): + """ + Showing information about learning object. + + Returns + ------- + + """ + print("( learning )") + print("method : ", self.method) + print("is_disp: ", self.is_disp) + print("num_disp: ", self.num_disp) + print("num_init_params_search: ", self.num_init_params_search)
+ + +
+[docs] + def load(self, config): + """ + Loading information of configuration from config._sectoins['learning']. + + Parameters + ---------- + config: physbo.misc.set_config object + + + Returns + ------- + + """ + temp_dict = config._sections["learning"] + self.method = temp_dict.get("method", "adam") + self.is_disp = boolean(temp_dict.get("is_disp", True)) + self.num_disp = int(temp_dict.get("num_disp", 10)) + self.num_init_params_search = int(temp_dict.get("num_init_params_search", 20))
+
+ + + +
+[docs] +class batch(learning): + def __init__(self): + super(batch, self).__init__() + self.method = "bfgs" + self.max_iter = 200 + self.max_iter_init_params_search = 20 + self.batch_size = 5000 + +
+[docs] + def show(self): + """ + Showing information about configuration about batch object. + + Returns + ------- + + """ + super(batch, self).show() + print("max_iter: ", self.max_iter) + print("max_iter_init_params_search: ", self.max_iter_init_params_search) + print("batch_size: ", self.batch_size)
+ + +
+[docs] + def load(self, config): + """ + Loading information of configuration from config._sectoins['batch']. + + Parameters + ---------- + config: physbo.misc.set_config object + + Returns + ------- + + """ + super(batch, self).load(config) + temp_dict = config._sections["batch"] + self.max_iter = int(temp_dict.get("max_iter", 200)) + self.max_iter_init_params_search = int( + temp_dict.get("max_iter_init_params_search", 20) + ) + self.batch_size = int(temp_dict.get("batch_size", 5000))
+
+ + + +
+[docs] +class online(learning): + def __init__(self): + super(online, self).__init__() + self.max_epoch = 500 + self.max_epoch_init_params_search = 50 + self.batch_size = 64 + self.eval_size = 5000 + +
+[docs] + def show(self): + """ + Showing information about configuration about online object. + + Returns + ------- + + """ + super(online, self).show() + print("max_epoch: ", self.max_epoch) + print("max_epoch_init_params_search: ", self.max_epoch_init_params_search) + print("batch_size: ", self.batch_size) + print("eval_size: ", self.eval_size)
+ + +
+[docs] + def load(self, config): + """ + Loading information of configuration from config._sectoins['online']. + + Parameters + ---------- + config: physbo.misc.set_config object + + + Returns + ------- + + """ + super(online, self).load(config) + temp_dict = config._sections["online"] + self.max_epoch = int(temp_dict.get("max_epoch", 1000)) + self.max_epoch_init_params_search = int( + temp_dict.get("max_epoch_init_params_search", 50) + ) + self.batch_size = int(temp_dict.get("batch_size", 64)) + self.eval_size = int(temp_dict.get("eval_size", 5000))
+
+ + + +
+[docs] +class adam(online): + def __init__(self): + super(adam, self).__init__() + self.method = "adam" + self.alpha = 0.001 + self.beta = 0.9 + self.gamma = 0.999 + self.epsilon = 1e-6 + +
+[docs] + def show(self): + """ + Showing information about configuration about adam object. + + Returns + ------- + + """ + super(adam, self).show() + print("alpha = ", self.alpha) + print("beta = ", self.beta) + print("gamma = ", self.gamma) + print("epsilon = ", self.epsilon) + print("\n")
+ + +
+[docs] + def load(self, config): + """ + Loading information of configuration from config._sectoins['adam']. + + Parameters + ---------- + config: physbo.misc.set_config object + + Returns + ------- + + """ + super(adam, self).load(config) + temp_dict = config._sections["adam"] + self.alpha = np.float64(temp_dict.get("alpha", 0.001)) + self.beta = np.float64(temp_dict.get("beta", 0.9)) + self.gamma = np.float64(temp_dict.get("gamma", 0.9999)) + self.epsilon = np.float64(temp_dict.get("epsilon", 1e-6))
+
+ + + +
+[docs] +def boolean(str): + """ + Return boolean. + + Parameters + ---------- + str: str or boolean + + Returns + ------- + True or False + """ + if str == "True" or str is True: + return True + else: + return False
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/opt/adam.html b/manual/v2.0.2/en/_modules/physbo/opt/adam.html new file mode 100644 index 00000000..3140b2d8 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/opt/adam.html @@ -0,0 +1,287 @@ + + + + + + + + physbo.opt.adam — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.opt.adam

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class adam: + """ + Optimizer of f(x) with the adam method + + Attributes + ========== + params: numpy.ndarray + current input, x + nparams: int + dimension + grad: function + gradient function, g(x) = f'(x) + m: numpy.ndarray + v: numpy.ndarray + epoch: int + the number of update already done + max_epoch: int + the maximum number of update + alpha: float + beta: float + gamma: float + epsilon: float + """ + + def __init__(self, params, grad, options={}): + """ + + Parameters + ========== + params: + grad: + options: dict + Hyperparameters for the adam method + + - "alpha" (default: 0.001) + - "beta" (default: 0.9) + - "gamma" (default: 0.9999) + - "epsilon" (default: 1e-8) + - "max_epoch" (default: 4000) + """ + self.grad = grad + self.params = params + self.nparams = params.shape[0] + self._set_options(options) + self.m = np.zeros(self.nparams) + self.v = np.zeros(self.nparams) + self.epoch = 0 + +
+[docs] + def set_params(self, params): + self.params = params
+ + +
+[docs] + def update(self, params, *args, **kwargs): + """ + calculates the updates of params + + Parameters + ========== + params: numpy.ndarray + input + args: + will be passed to self.grad + kwargs: + will be passed to self.grad + + Returns + ======= + numpy.ndarray + update of params + """ + g = self.grad(params, *args, **kwargs) + self.m = self.m * self.beta + g * (1 - self.beta) + self.v = self.v * self.gamma + g**2 * (1 - self.gamma) + hat_m = self.m / (1 - self.beta ** (self.epoch + 1)) + hat_v = self.v / (1 - self.gamma ** (self.epoch + 1)) + self.epoch += 1 + return -self.alpha * hat_m / (np.sqrt(hat_v) + self.epsilon)
+ + +
+[docs] + def run(self, *args, **kwargs): + params = self.params + for epoch in range(self.max_epoch): + update = self.update(params, *args, **kwargs) + params += update
+ + + def _set_options(self, options): + """ + set hyperparameters for the method + + Parameters + ========== + options: dict + + """ + self.alpha = options.get("alpha", 0.001) + self.beta = options.get("beta", 0.9) + self.gamma = options.get("gamma", 0.9999) + self.epsilon = options.get("epsilon", 1e-8) + self.max_epoch = options.get("max_epoch", 4000)
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/predictor.html b/manual/v2.0.2/en/_modules/physbo/predictor.html new file mode 100644 index 00000000..751be761 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/predictor.html @@ -0,0 +1,471 @@ + + + + + + + + physbo.predictor — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.predictor

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import pickle as pickle
+import numpy as np
+from physbo import gp
+
+
+
+[docs] +class base_predictor(object): + """ + Base predictor is defined in this class. + + """ + + def __init__(self, config, model=None): + """ + + Parameters + ---------- + config: set_config object (physbo.misc.set_config) + model: model object + A default model is set as gp.core.model + """ + + self.config = config + self.model = model + if self.model is None: + self.model = gp.core.model( + cov=gp.cov.gauss(num_dim=None, ard=False), + mean=gp.mean.const(), + lik=gp.lik.gauss(), + ) + +
+[docs] + def fit(self, *args, **kwds): + """ + + Default fit function. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def prepare(self, *args, **kwds): + """ + + Default prepare function. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def delete_stats(self, *args, **kwds): + """ + + Default function to delete status. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_basis(self, *args, **kwds): + """ + + Default function to get basis + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_post_fmean(self, *args, **kwds): + """ + + Default function to get a mean value of the score. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_post_fcov(self, *args, **kwds): + """ + + Default function to get a covariance of the score. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_post_params(self, *args, **kwds): + """ + + Default function to get parameters. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_post_samples(self, *args, **kwds): + """ + + Default function to get samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_predict_samples(self, *args, **kwds): + """ + + Default function to get prediction variables of samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def get_post_params_samples(self, *args, **kwds): + """ + + Default function to get parameters of samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def update(self, *args, **kwds): + """ + + Default function to update variables. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[docs] + def save(self, file_name): + """ + + Default function to save information by using pickle.dump function. + The protocol version is set as 3. + + Parameters + ---------- + file_name: str + A file name to save self.__dict__ object. + + Returns + ------- + + """ + with open(file_name, "wb") as f: + pickle.dump(self.__dict__, f, 4)
+ + +
+[docs] + def load(self, file_name): + """ + + Default function to load variables. + The information is updated using self.update function. + + Parameters + ---------- + file_name: str + A file name to load variables from the file. + + Returns + ------- + + """ + with open(file_name, "rb") as f: + tmp_dict = pickle.load(f) + self.config = tmp_dict["config"] + self.model = tmp_dict["model"]
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/discrete/policy.html b/manual/v2.0.2/en/_modules/physbo/search/discrete/policy.html new file mode 100644 index 00000000..7a5398e7 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/discrete/policy.html @@ -0,0 +1,1021 @@ + + + + + + + + physbo.search.discrete.policy — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for physbo.search.discrete.policy

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle as pickle
+import itertools
+import time
+
+from .results import history
+from .. import utility
+from .. import score as search_score
+from ...gp import predictor as gp_predictor
+from ...blm import predictor as blm_predictor
+from ...misc import set_config
+
+from physbo.variable import variable
+
+
+
+[docs] +class policy: + def __init__(self, test_X, config=None, initial_data=None, comm=None): + """ + + Parameters + ---------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + config: set_config object (physbo.misc.set_config) + initial_data: tuple[np.ndarray, np.ndarray] + The initial training datasets. + The first elements is the array of actions and the second is the array of value of objective functions + comm: MPI.Comm, optional + MPI Communicator + """ + self.predictor = None + self.training = variable() + self.new_data = None + self.test = self._make_variable_X(test_X) + self.actions = np.arange(0, self.test.X.shape[0]) + self.history = history() + if config is None: + self.config = set_config() + else: + self.config = config + + if initial_data is not None: + if len(initial_data) != 2: + msg = "ERROR: initial_data should be 2-elements tuple or list (actions and objectives)" + raise RuntimeError(msg) + actions, fs = initial_data + if len(actions) != len(fs): + msg = "ERROR: len(initial_data[0]) != len(initial_data[1])" + raise RuntimeError(msg) + self.write(actions, fs) + self.actions = np.array(sorted(list(set(self.actions) - set(actions)))) + + if comm is None: + self.mpicomm = None + self.mpisize = 1 + self.mpirank = 0 + else: + self.mpicomm = comm + self.mpisize = comm.size + self.mpirank = comm.rank + self.actions = np.array_split(self.actions, self.mpisize)[self.mpirank] + self.config.learning.is_disp = ( + self.config.learning.is_disp and self.mpirank == 0 + ) + +
+[docs] + def set_seed(self, seed): + """ + Setting a seed parameter for np.random. + + Parameters + ---------- + seed: int + seed number + ------- + + """ + self.seed = seed + np.random.seed(self.seed)
+ + +
+[docs] + def write( + self, + action, + t, + X=None, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + """ + Writing history (update history, not output to a file). + + Parameters + ---------- + action: numpy.ndarray + Indexes of actions. + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + time_total: numpy.ndarray + N dimenstional array. The total elapsed time in each step. + If None (default), filled by 0.0. + time_update_predictor: numpy.ndarray + N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. + If None (default), filled by 0.0. + time_get_action: numpy.ndarray + N dimenstional array. The elapsed time for getting next action in each step. + If None (default), filled by 0.0. + time_run_simulator: numpy.ndarray + N dimenstional array. The elapsed time for running the simulator in each step. + If None (default), filled by 0.0. + + Returns + ------- + + """ + if X is None: + X = self.test.X[action, :] + Z = self.test.Z[action, :] if self.test.Z is not None else None + else: + Z = self.predictor.get_basis(X) if self.predictor is not None else None + + self.history.write( + t, + action, + time_total=time_total, + time_update_predictor=time_update_predictor, + time_get_action=time_get_action, + time_run_simulator=time_run_simulator, + ) + self.training.add(X=X, t=t, Z=Z) + + # remove the selected actions from the list of candidates if exists + if len(self.actions) > 0: + local_index = np.searchsorted(self.actions, action) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == action + ] + self.actions = self._delete_actions(local_index) + + if self.new_data is None: + self.new_data = variable(X=X, t=t, Z=Z) + else: + self.new_data.add(X=X, t=t, Z=Z)
+ + + + + + + + + @staticmethod + def _warn_no_predictor(method_name): + print("Warning: Since policy.predictor is not yet set,") + print(" a GP predictor (num_rand_basis=0) is used for predicting") + print(" If you want to use a BLM predictor (num_rand_basis>0),") + print(" call bayes_search(max_num_probes=0, num_rand_basis=nrb)") + print(" before calling {}.".format(method_name)) + +
+[docs] + def get_post_fmean(self, xs): + """Calculate mean value of predictor (post distribution)""" + X = self._make_variable_X(xs) + if self.predictor is None: + self._warn_no_predictor("get_post_fmean()") + predictor = gp_predictor(self.config) + predictor.fit(self.training, 0) + predictor.prepare(self.training) + return predictor.get_post_fmean(self.training, X) + else: + self._update_predictor() + return self.predictor.get_post_fmean(self.training, X)
+ + +
+[docs] + def get_post_fcov(self, xs): + """Calculate covariance of predictor (post distribution)""" + X = self._make_variable_X(xs) + if self.predictor is None: + self._warn_no_predictor("get_post_fcov()") + predictor = gp_predictor(self.config) + predictor.fit(self.training, 0) + predictor.prepare(self.training) + return predictor.get_post_fcov(self.training, X) + else: + self._update_predictor() + return self.predictor.get_post_fcov(self.training, X)
+ + +
+[docs] + def get_score( + self, + mode, + *, + actions=None, + xs=None, + predictor=None, + training=None, + parallel=True, + alpha=1 + ): + """ + Calcualte score (acquisition function) + + Parameters + ---------- + mode: str + The type of aquisition funciton. TS, EI and PI are available. + These functions are defined in score.py. + actions: array of int + actions to calculate score + xs: physbo.variable or np.ndarray + input parameters to calculate score + predictor: predictor object + predictor used to calculate score. + If not given, self.predictor will be used. + training:physbo.variable + Training dataset. + If not given, self.training will be used. + parallel: bool + Calculate scores in parallel by MPI (default: True) + alpha: float + Tuning parameter which is used if mode = TS. + In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size). + + Returns + ------- + f: float or list of float + Score defined in each mode. + + Raises + ------ + RuntimeError + If both *actions* and *xs* are given + + Notes + ----- + When neither *actions* nor *xs* are given, scores for actions not yet searched will be calculated. + + When *parallel* is True, it is assumed that the function receives the same input (*actions* or *xs*) for all the ranks. + If you want to split the input array itself, set *parallel* be False and merge results by yourself. + """ + if training is None: + training = self.training + + if training.X is None or training.X.shape[0] == 0: + msg = "ERROR: No training data is registered." + raise RuntimeError(msg) + + if predictor is None: + if self.predictor is None: + self._warn_no_predictor("get_score()") + predictor = gp_predictor(self.config) + predictor.fit(training, 0) + predictor.prepare(training) + else: + self._update_predictor() + predictor = self.predictor + + if xs is not None: + if actions is not None: + raise RuntimeError("ERROR: both actions and xs are given") + test = self._make_variable_X(xs) + if parallel and self.mpisize > 1: + actions = np.array_split(np.arange(test.X.shape[0]), self.mpisize) + test = test.get_subset(actions[self.mpirank]) + else: + if actions is None: + actions = self.actions + else: + if isinstance(actions, int): + actions = [actions] + if parallel and self.mpisize > 1: + actions = np.array_split(actions, self.mpisize)[self.mpirank] + test = self.test.get_subset(actions) + + f = search_score.score( + mode, predictor=predictor, training=training, test=test, alpha=alpha + ) + if parallel and self.mpisize > 1: + fs = self.mpicomm.allgather(f) + f = np.hstack(fs) + return f
+ + + def _get_marginal_score(self, mode, chosen_actions, K, alpha): + """ + Getting marginal scores. + + Parameters + ---------- + mode: str + The type of aquision funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + chosen_actions: numpy.ndarray + Array of selected actions. + K: int + The number of samples for evaluating score. + alpha: float + not used. + + Returns + ------- + f: list + N dimensional scores (score is defined in each mode) + """ + f = np.zeros((K, len(self.actions)), dtype=float) + + # draw K samples of the values of objective function of chosen actions + new_test_local = self.test.get_subset(chosen_actions) + virtual_t_local = self.predictor.get_predict_samples( + self.training, new_test_local, K + ) + if self.mpisize == 1: + new_test = new_test_local + virtual_t = virtual_t_local + else: + new_test = variable() + for nt in self.mpicomm.allgather(new_test_local): + new_test.add(X=nt.X, t=nt.t, Z=nt.Z) + virtual_t = np.concatenate(self.mpicomm.allgather(virtual_t_local), axis=1) + # virtual_t = self.predictor.get_predict_samples(self.training, new_test, K) + + for k in range(K): + predictor = copy.deepcopy(self.predictor) + train = copy.deepcopy(self.training) + virtual_train = new_test + virtual_train.t = virtual_t[k, :] + + if virtual_train.Z is None: + train.add(virtual_train.X, virtual_train.t) + else: + train.add(virtual_train.X, virtual_train.t, virtual_train.Z) + + predictor.update(train, virtual_train) + + f[k, :] = self.get_score( + mode, predictor=predictor, training=train, parallel=False + ) + return np.mean(f, axis=0) + + def _get_actions(self, mode, N, K, alpha): + """ + Getting next candidates + + Parameters + ---------- + mode: str + The type of aquisition funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + N: int + The total number of actions to return. + K: int + The total number of samples to evaluate marginal score + alpha: float + Tuning parameter which is used if mode = TS. + In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size). + + Returns + ------- + chosen_actions: numpy.ndarray + An N-dimensional array of actions selected in each search process. + """ + f = self.get_score( + mode, + predictor=self.predictor, + training=self.training, + alpha=alpha, + parallel=False, + ) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + return np.zeros(0, dtype=int) + if champion == local_champion: + self.actions = self._delete_actions(local_index) + + chosen_actions = [champion] + for n in range(1, N): + f = self._get_marginal_score(mode, chosen_actions[0:n], K, alpha) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + break + if champion == local_champion: + self.actions = self._delete_actions(local_index) + chosen_actions.append(champion) + return np.array(chosen_actions) + + def _find_champion(self, f): + if len(f) == 0: + local_fmax = -float("inf") + local_index = -1 + local_champion = -1 + else: + local_fmax = np.max(f) + local_index = np.argmax(f) + local_champion = self.actions[local_index] + if self.mpisize == 1: + champion = local_champion + else: + local_champions = self.mpicomm.allgather(local_champion) + local_fs = self.mpicomm.allgather(local_fmax) + champion_rank = np.argmax(local_fs) + champion = local_champions[champion_rank] + return champion, local_champion, local_index + + def _get_random_action(self, N): + """ + Getting indexes of actions randomly. + + Parameters + ---------- + N: int + Total number of search candidates. + Returns + ------- + action: numpy.ndarray + Indexes of actions selected randomly from search candidates. + """ + if self.mpisize == 1: + n = len(self.actions) + if n <= N: + index = np.arange(0, n) + else: + index = np.random.choice(len(self.actions), N, replace=False) + action = self.actions[index] + self.actions = self._delete_actions(index) + else: + nactions = self.mpicomm.gather(len(self.actions), root=0) + local_indices = [[] for _ in range(self.mpisize)] + if self.mpirank == 0: + hi = np.add.accumulate(nactions) + lo = np.roll(hi, 1) + lo[0] = 0 + if hi[-1] <= N: + index = np.arange(0, hi[-1]) + else: + index = np.random.choice(hi[-1], N, replace=False) + ranks = np.searchsorted(hi, index, side="right") + for r, i in zip(ranks, index): + local_indices[r].append(i - lo[r]) + local_indices = self.mpicomm.scatter(local_indices, root=0) + local_actions = self.actions[local_indices] + self.actions = self._delete_actions(local_indices) + action = self.mpicomm.allgather(local_actions) + action = itertools.chain.from_iterable(action) + action = np.array(list(action)) + return action + +
+[docs] + def save(self, file_history, file_training=None, file_predictor=None): + """ + + Saving history, training and predictor into the corresponding files. + + Parameters + ---------- + file_history: str + The name of the file that stores the information of the history. + file_training: str + The name of the file that stores the training dataset. + file_predictor: str + The name of the file that stores the predictor dataset. + + Returns + ------- + + """ + if self.mpirank == 0: + self.history.save(file_history) + + if file_training is not None: + self.training.save(file_training) + + if file_predictor is not None: + with open(file_predictor, "wb") as f: + pickle.dump(self.predictor, f)
+ + +
+[docs] + def load(self, file_history, file_training=None, file_predictor=None): + """ + + Loading files about history, training and predictor. + + Parameters + ---------- + file_history: str + The name of the file that stores the information of the history. + file_training: str + The name of the file that stores the training dataset. + file_predictor: str + The name of the file that stores the predictor dataset. + + Returns + ------- + + """ + self.history.load(file_history) + + if file_training is None: + N = self.history.total_num_search + X = self.test.X[self.history.chosen_actions[0:N], :] + t = self.history.fx[0:N] + self.training = variable(X=X, t=t) + else: + self.training = variable() + self.training.load(file_training) + + if file_predictor is not None: + with open(file_predictor, "rb") as f: + self.predictor = pickle.load(f) + + N = self.history.total_num_search + + visited = self.history.chosen_actions[:N] + local_index = np.searchsorted(self.actions, visited) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == visited + ] + self.actions = self._delete_actions(local_index)
+ + +
+[docs] + def export_predictor(self): + """ + Returning the predictor dataset + + Returns + ------- + + """ + return self.predictor
+ + +
+[docs] + def export_training(self): + """ + Returning the training dataset + + Returns + ------- + + """ + return self.training
+ + +
+[docs] + def export_history(self): + """ + Returning the information of the history. + + Returns + ------- + + """ + return self.history
+ + + def _init_predictor(self, is_rand_expans): + """ + Initialize predictor. + + Parameters + ---------- + is_rand_expans: bool + If true, physbo.blm.predictor is selected. + If false, physbo.gp.predictor is selected. + """ + if is_rand_expans: + self.predictor = blm_predictor(self.config) + else: + self.predictor = gp_predictor(self.config) + + def _learn_hyperparameter(self, num_rand_basis): + self.predictor.fit(self.training, num_rand_basis) + self.test.Z = self.predictor.get_basis(self.test.X) + self.training.Z = self.predictor.get_basis(self.training.X) + self.predictor.prepare(self.training) + self.new_data = None + + def _update_predictor(self): + if self.new_data is not None: + self.predictor.update(self.training, self.new_data) + self.new_data = None + + def _make_variable_X(self, test_X): + """ + Make a new *variable* with X=test_X + + Parameters + ---------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + Returns + ------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + """ + if isinstance(test_X, np.ndarray): + test = variable(X=test_X) + elif isinstance(test_X, variable): + test = test_X + else: + raise TypeError("The type of test_X must be ndarray or physbo.variable") + return test + + def _delete_actions(self, index, actions=None): + """ + Returns remaining actions + + Notes + ----- + This method itself does not modify *self* + + Parameters + ---------- + index: int + Index of an action to be deleted. + actions: numpy.ndarray + Array of actions. + Returns + ------- + actions: numpy.ndarray + Array of actions which does not include action specified by index. + """ + if actions is None: + actions = self.actions + return np.delete(actions, index)
+ + + +def _run_simulator(simulator, action, comm=None): + if comm is None: + return simulator(action) + if comm.rank == 0: + t = simulator(action) + else: + t = 0.0 + return comm.bcast(t, root=0) +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/discrete/results.html b/manual/v2.0.2/en/_modules/physbo/search/discrete/results.html new file mode 100644 index 00000000..e5c6bd88 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/discrete/results.html @@ -0,0 +1,378 @@ + + + + + + + + physbo.search.discrete.results — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for physbo.search.discrete.results

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle
+
+from .. import utility
+
+MAX_SEARCH = int(30000)
+
+
+
+[docs] +class history: + def __init__(self): + self.num_runs = int(0) + self.total_num_search = int(0) + self.fx = np.zeros(MAX_SEARCH, dtype=float) + self.chosen_actions = np.zeros(MAX_SEARCH, dtype=int) + self.terminal_num_run = np.zeros(MAX_SEARCH, dtype=int) + + self.time_total_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_update_predictor_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_get_action_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_run_simulator_ = np.zeros(MAX_SEARCH, dtype=float) + + @property + def time_total(self): + return copy.copy(self.time_total_[0 : self.num_runs]) + + @property + def time_update_predictor(self): + return copy.copy(self.time_update_predictor_[0 : self.num_runs]) + + @property + def time_get_action(self): + return copy.copy(self.time_get_action_[0 : self.num_runs]) + + @property + def time_run_simulator(self): + return copy.copy(self.time_run_simulator_[0 : self.num_runs]) + +
+[docs] + def write( + self, + t, + action, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + """ + Overwrite fx and chosen_actions by t and action. + + Parameters + ---------- + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + action: numpy.ndarray + N dimensional array. The indexes of actions of each search candidate. + time_total: numpy.ndarray + N dimenstional array. The total elapsed time in each step. + If None (default), filled by 0.0. + time_update_predictor: numpy.ndarray + N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. + If None (default), filled by 0.0. + time_get_action: numpy.ndarray + N dimenstional array. The elapsed time for getting next action in each step. + If None (default), filled by 0.0. + time_run_simulator: numpy.ndarray + N dimenstional array. The elapsed time for running the simulator in each step. + If None (default), filled by 0.0. + Returns + ------- + + """ + N = utility.length_vector(t) + st = self.total_num_search + en = st + N + + self.terminal_num_run[self.num_runs] = en + self.fx[st:en] = t + self.chosen_actions[st:en] = action + self.num_runs += 1 + self.total_num_search += N + + if time_total is None: + time_total = np.zeros(N, dtype=float) + self.time_total_[st:en] = time_total + + if time_update_predictor is None: + time_update_predictor = np.zeros(N, dtype=float) + self.time_update_predictor_[st:en] = time_update_predictor + + if time_get_action is None: + time_get_action = np.zeros(N, dtype=float) + self.time_get_action_[st:en] = time_get_action + + if time_run_simulator is None: + time_run_simulator = np.zeros(N, dtype=float) + self.time_run_simulator_[st:en] = time_run_simulator
+ + +
+[docs] + def export_sequence_best_fx(self): + """ + Export fx and actions at each sequence. + (The total number of data is num_runs.) + + Returns + ------- + best_fx: numpy.ndarray + best_actions: numpy.ndarray + """ + best_fx = np.zeros(self.num_runs, dtype=float) + best_actions = np.zeros(self.num_runs, dtype=int) + for n in range(self.num_runs): + index = np.argmax(self.fx[0 : self.terminal_num_run[n]]) + best_actions[n] = self.chosen_actions[index] + best_fx[n] = self.fx[index] + + return best_fx, best_actions
+ + +
+[docs] + def export_all_sequence_best_fx(self): + """ + Export all fx and actions at each sequence. + (The total number of data is total_num_research.) + + Returns + ------- + best_fx: numpy.ndarray + best_actions: numpy.ndarray + """ + best_fx = np.zeros(self.total_num_search, dtype=float) + best_actions = np.zeros(self.total_num_search, dtype=int) + best_fx[0] = self.fx[0] + best_actions[0] = self.chosen_actions[0] + + for n in range(1, self.total_num_search): + if best_fx[n - 1] < self.fx[n]: + best_fx[n] = self.fx[n] + best_actions[n] = self.chosen_actions[n] + else: + best_fx[n] = best_fx[n - 1] + best_actions[n] = best_actions[n - 1] + + return best_fx, best_actions
+ + +
+[docs] + def save(self, filename): + """ + Save the information of the history. + + Parameters + ---------- + filename: str + The name of the file which stores the information of the history + Returns + ------- + + """ + N = self.total_num_search + M = self.num_runs + np.savez_compressed( + filename, + num_runs=M, + total_num_search=N, + fx=self.fx[0:N], + chosen_actions=self.chosen_actions[0:N], + terminal_num_run=self.terminal_num_run[0:M], + )
+ + +
+[docs] + def load(self, filename): + """ + Load the information of the history. + + Parameters + ---------- + filename: str + The name of the file which stores the information of the history + Returns + ------- + + """ + data = np.load(filename) + M = int(data["num_runs"]) + N = int(data["total_num_search"]) + self.num_runs = M + self.total_num_search = N + self.fx[0:N] = data["fx"] + self.chosen_actions[0:N] = data["chosen_actions"] + self.terminal_num_run[0:M] = data["terminal_num_run"]
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/policy.html b/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/policy.html new file mode 100644 index 00000000..778ecca6 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/policy.html @@ -0,0 +1,768 @@ + + + + + + + + physbo.search.discrete_multi.policy — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for physbo.search.discrete_multi.policy

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle as pickle
+import time
+
+from .results import history
+from .. import discrete
+from .. import utility
+from .. import score_multi as search_score
+from ...gp import predictor as gp_predictor
+from ...blm import predictor as blm_predictor
+from ...misc import set_config
+from ...variable import variable
+
+from typing import List, Optional
+
+
+
+[docs] +class policy(discrete.policy): + new_data_list: List[Optional[variable]] + + def __init__( + self, test_X, num_objectives, comm=None, config=None, initial_data=None + ): + self.num_objectives = num_objectives + self.history = history(num_objectives=self.num_objectives) + + self.training_list = [variable() for _ in range(self.num_objectives)] + self.predictor_list = [None for _ in range(self.num_objectives)] + self.test_list = [ + self._make_variable_X(test_X) for _ in range(self.num_objectives) + ] + self.new_data_list = [None for _ in range(self.num_objectives)] + + self.actions = np.arange(0, test_X.shape[0]) + if config is None: + self.config = set_config() + else: + self.config = config + + self.TS_candidate_num = None + + if initial_data is not None: + if len(initial_data) != 2: + msg = "ERROR: initial_data should be 2-elements tuple or list (actions and objectives)" + raise RuntimeError(msg) + actions, fs = initial_data + if fs.shape[1] != self.num_objectives: + msg = "ERROR: initial_data[1].shape[1] != num_objectives" + raise RuntimeError(msg) + if len(actions) != fs.shape[0]: + msg = "ERROR: len(initial_data[0]) != initial_data[1].shape[0]" + raise RuntimeError(msg) + self.write(actions, fs) + self.actions = np.array(sorted(list(set(self.actions) - set(actions)))) + + if comm is None: + self.mpicomm = None + self.mpisize = 1 + self.mpirank = 0 + else: + self.mpicomm = comm + self.mpisize = comm.size + self.mpirank = comm.rank + self.actions = np.array_split(self.actions, self.mpisize)[self.mpirank] + +
+[docs] + def write( + self, + action, + t, + X=None, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + self.history.write( + t, + action, + time_total=time_total, + time_update_predictor=time_update_predictor, + time_get_action=time_get_action, + time_run_simulator=time_run_simulator, + ) + action = np.array(action) + t = np.array(t) + + for i in range(self.num_objectives): + test = self.test_list[i] + predictor = self.predictor_list[i] + + if X is None: + X = test.X[action, :] + Z = test.Z[action, :] if test.Z is not None else None + else: + Z = predictor.get_basis(X) if predictor is not None else None + + if self.new_data_list[i] is None: + self.new_data_list[i] = variable(X, t[:, i], Z) + else: + self.new_data_list[i].add(X=X, t=t[:, i], Z=Z) + self.training_list[i].add(X=X, t=t[:, i], Z=Z) + + # remove action from candidates if exists + if len(self.actions) > 0: + local_index = np.searchsorted(self.actions, action) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == action + ] + self.actions = self._delete_actions(local_index)
+ + + def _model(self, i): + training = self.training_list[i] + predictor = self.predictor_list[i] + test = self.test_list[i] + new_data = self.new_data_list[i] + return { + "training": training, + "predictor": predictor, + "test": test, + "new_data": new_data, + } + + + + + + + + def _get_actions(self, mode, N, K, alpha): + f = self.get_score(mode=mode, alpha=alpha, parallel=False) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + return np.zeros(0, dtype=int) + if champion == local_champion: + self.actions = self._delete_actions(local_index) + + chosen_actions = [champion] + for n in range(1, N): + f = self._get_marginal_score(mode, chosen_actions[0:n], K, alpha) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + break + if champion == local_champion: + self.actions = self._delete_actions(local_index) + chosen_actions.append(champion) + return np.array(chosen_actions) + +
+[docs] + def get_post_fmean(self, xs): + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_post_fmean()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(self.training_list[i], 0) + predictor.prepare(self.training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list[:] + X = self._make_variable_X(xs) + fmean = [ + predictor.get_post_fmean(training, X) + for predictor, training in zip(predictor_list, self.training_list) + ] + return np.array(fmean).T
+ + +
+[docs] + def get_post_fcov(self, xs): + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_post_fcov()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(self.training_list[i], 0) + predictor.prepare(self.training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list[:] + X = self._make_variable_X(xs) + fcov = [ + predictor.get_post_fcov(training, X) + for predictor, training in zip(predictor_list, self.training_list) + ] + return np.array(fcov).T
+ + +
+[docs] + def get_score( + self, + mode, + actions=None, + xs=None, + predictor_list=None, + training_list=None, + pareto=None, + parallel=True, + alpha=1, + ): + if training_list is None: + training_list = self.training_list + if pareto is None: + pareto = self.history.pareto + + if training_list[0].X is None or training_list[0].X.shape[0] == 0: + msg = "ERROR: No training data is registered." + raise RuntimeError(msg) + + if predictor_list is None: + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_score()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(training_list[i], 0) + predictor.prepare(training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list + + if xs is not None: + if actions is not None: + raise RuntimeError("ERROR: both actions and xs are given") + if isinstance(xs, variable): + test = xs + else: + test = variable(X=xs) + if parallel and self.mpisize > 1: + actions = np.array_split(np.arange(test.X.shape[0]), self.mpisize) + test = test.get_subset(actions[self.mpirank]) + else: + if actions is None: + actions = self.actions + else: + if isinstance(actions, int): + actions = [actions] + if parallel and self.mpisize > 1: + actions = np.array_split(actions, self.mpisize)[self.mpirank] + test = self.test_list[0].get_subset(actions) + + f = search_score.score( + mode, + predictor_list=predictor_list, + training_list=training_list, + test=test, + pareto=pareto, + reduced_candidate_num=self.TS_candidate_num, + alpha=alpha, + ) + if parallel and self.mpisize > 1: + fs = self.mpicomm.allgather(f) + f = np.hstack(fs) + return f
+ + + def _get_marginal_score(self, mode, chosen_actions, K, alpha): + """ + Getting marginal scores. + + Parameters + ---------- + mode: str + The type of aquision funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + chosen_actions: numpy.ndarray + Array of selected actions. + K: int + The total number of search candidates. + alpha: float + not used. + + Returns + ------- + f: list + N dimensional scores (score is defined in each mode) + """ + f = np.zeros((K, len(self.actions)), dtype=float) + + # draw K samples of the values of objective function of chosen actions + new_test_list = [variable() for _ in range(self.num_objectives)] + virtual_t_list = [np.zeros((K, 0)) for _ in range(self.num_objectives)] + for i in range(self.num_objectives): + new_test_local = self.test_list[i].get_subset(chosen_actions) + virtual_t_local = self.predictor_list[i].get_predict_samples( + self.training_list[i], new_test_local, K + ) + if self.mpisize == 1: + new_test_list[i] = new_test_local + virtual_t_list[i] = virtual_t_local + else: + for nt in self.mpicomm.allgather(new_test_local): + new_test_list[i].add(X=nt.X, t=nt.t, Z=nt.Z) + virtual_t_list[i] = np.concatenate( + self.mpicomm.allgather(virtual_t_local), axis=1 + ) + + for k in range(K): + predictor_list = [copy.deepcopy(p) for p in self.predictor_list] + training_list = [copy.deepcopy(t) for t in self.training_list] + + for i in range(self.num_objectives): + virtual_train = new_test_list[i] + virtual_train.t = virtual_t_list[i][k, :] + + if virtual_train.Z is None: + training_list[i].add(virtual_train.X, virtual_train.t) + else: + training_list[i].add( + virtual_train.X, virtual_train.t, virtual_train.Z + ) + + predictor_list[i].update(training_list[i], virtual_train) + + f[k, :] = self.get_score( + mode, + predictor_list=predictor_list, + training_list=training_list, + parallel=False, + ) + return np.mean(f, axis=0) + +
+[docs] + def save(self, file_history, file_training_list=None, file_predictor_list=None): + if self.mpirank == 0: + self.history.save(file_history) + if file_training_list is not None: + self.save_training_list(file_training_list) + if file_predictor_list is not None: + self.save_predictor_list(file_predictor_list)
+ + +
+[docs] + def load(self, file_history, file_training_list=None, file_predictor_list=None): + self.history.load(file_history) + + if file_training_list is None: + N = self.history.total_num_search + X = self.test_list[0].X[self.history.chosen_actions[0:N], :] + t = self.history.fx[0:N] + self.training_list = [ + variable(X=X, t=t[:, i]) for i in range(self.num_objectives) + ] + else: + self.load_training_list(file_training_list) + + if file_predictor_list is not None: + self.load_predictor_list(file_predictor_list) + + N = self.history.total_num_search + + visited = self.history.chosen_actions[:N] + local_index = np.searchsorted(self.actions, visited) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == visited + ] + self.actions = self._delete_actions(local_index)
+ + +
+[docs] + def save_predictor_list(self, file_name): + with open(file_name, "wb") as f: + pickle.dump(self.predictor_list, f, 2)
+ + +
+[docs] + def save_training_list(self, file_name): + obj = [ + {"X": training.X, "t": training.t, "Z": training.Z} + for training in self.training_list + ] + with open(file_name, "wb") as f: + pickle.dump(obj, f, 2)
+ + +
+[docs] + def load_predictor_list(self, file_name): + with open(file_name, "rb") as f: + self.predictor_list = pickle.load(f)
+ + +
+[docs] + def load_training_list(self, file_name): + with open(file_name, "rb") as f: + data_list = pickle.load(f) + + self.training_list = [variable() for i in range(self.num_objectives)] + for data, training in zip(data_list, self.training_list): + training.X = data["X"] + training.t = data["t"] + training.Z = data["Z"]
+ + + def _learn_hyperparameter(self, num_rand_basis): + for i in range(self.num_objectives): + m = self._model(i) + predictor = m["predictor"] + training = m["training"] + test = m["test"] + + predictor.fit(training, num_rand_basis) + test.Z = predictor.get_basis(test.X) + training.Z = predictor.get_basis(training.X) + predictor.prepare(training) + self.new_data_list[i] = None + # self.predictor_list[i].fit(self.training_list[i], num_rand_basis) + # self.test_list[i].Z = self.predictor_list[i].get_basis(self.test_list[i].X) + # self.training_list[i].Z = self.predictor_list[i].get_basis(self.training_list[i].X) + # self.predictor_list[i].prepare(self.training_list[i]) + # self.new_data_list[i] = None + + def _update_predictor(self): + for i in range(self.num_objectives): + if self.new_data_list[i] is not None: + self.predictor_list[i].update( + self.training_list[i], self.new_data_list[i] + ) + self.new_data_list[i] = None
+ + + +def _run_simulator(simulator, action, comm=None): + if comm is None: + return simulator(action) + if comm.rank == 0: + t = simulator(action) + else: + t = 0.0 + return comm.bcast(t, root=0) +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/results.html b/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/results.html new file mode 100644 index 00000000..8c781a51 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/discrete_multi/results.html @@ -0,0 +1,311 @@ + + + + + + + + physbo.search.discrete_multi.results — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for physbo.search.discrete_multi.results

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import pickle
+import copy
+
+from .. import pareto
+
+MAX_SEARCH = int(30000)
+
+
+
+[docs] +class history(object): + def __init__(self, num_objectives): + self.num_objectives = num_objectives + self.pareto = pareto.Pareto(num_objectives=self.num_objectives) + + self.num_runs = int(0) + self.total_num_search = int(0) + self.fx = np.zeros((MAX_SEARCH, self.num_objectives), dtype=float) + self.chosen_actions = np.zeros(MAX_SEARCH, dtype=int) + self.terminal_num_run = np.zeros(MAX_SEARCH, dtype=int) + + self._time_total = np.zeros(MAX_SEARCH, dtype=float) + self._time_update_predictor = np.zeros(MAX_SEARCH, dtype=float) + self._time_get_action = np.zeros(MAX_SEARCH, dtype=float) + self._time_run_simulator = np.zeros(MAX_SEARCH, dtype=float) + + @property + def time_total(self): + return copy.copy(self._time_total[0 : self.num_runs]) + + @property + def time_update_predictor(self): + return copy.copy(self._time_update_predictor[0 : self.num_runs]) + + @property + def time_get_action(self): + return copy.copy(self._time_get_action[0 : self.num_runs]) + + @property + def time_run_simulator(self): + return copy.copy(self._time_run_simulator[0 : self.num_runs]) + +
+[docs] + def write( + self, + t, + action, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + t = np.array(t) + action = np.array(action) + + if t.ndim == 1: + N = 1 + if len(t) != self.num_objectives: + raise ValueError("t does not match the number of objectives") + else: + N = t.shape[0] + if t.shape[1] != self.num_objectives: + raise ValueError("t does not match the number of objectives") + + st = self.total_num_search + en = st + N + + self.terminal_num_run[self.num_runs] = en + self.fx[st:en] = t + self.chosen_actions[st:en] = action + self.num_runs += 1 + self.total_num_search += N + + # update Pareto set + self.pareto.update_front(t) + + if time_total is None: + time_total = np.zeros(N, dtype=float) + self._time_total[st:en] = time_total + + if time_update_predictor is None: + time_update_predictor = np.zeros(N, dtype=float) + self._time_update_predictor[st:en] = time_update_predictor + + if time_get_action is None: + time_get_action = np.zeros(N, dtype=float) + self._time_get_action[st:en] = time_get_action + + if time_run_simulator is None: + time_run_simulator = np.zeros(N, dtype=float) + self._time_run_simulator[st:en] = time_run_simulator
+ + +
+[docs] + def export_pareto_front(self): + return self.pareto.export_front()
+ + +
+[docs] + def save(self, filename): + N = self.total_num_search + M = self.num_runs + + obj = { + "num_runs": M, + "total_num_search": N, + "fx": self.fx[0:N], + "chosen_actions": self.chosen_actions[0:N], + "terminal_num_run": self.terminal_num_run[0:M], + "pareto": self.pareto, + } + + with open(filename, "wb") as f: + pickle.dump(obj, f)
+ + +
+[docs] + def load(self, filename): + with open(filename, "rb") as f: + data = pickle.load(f) + + M = int(data["num_runs"]) + N = int(data["total_num_search"]) + self.num_runs = M + self.total_num_search = N + self.fx[0:N] = data["fx"] + self.chosen_actions[0:N] = data["chosen_actions"] + self.terminal_num_run[0:M] = data["terminal_num_run"] + self.pareto = data["pareto"]
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/pareto.html b/manual/v2.0.2/en/_modules/physbo/search/pareto.html new file mode 100644 index 00000000..05bce080 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/pareto.html @@ -0,0 +1,404 @@ + + + + + + + + physbo.search.pareto — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.search.pareto

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class Rectangles(object): + def __init__(self, n_dim, dtype): + """ + Initilize a set of hyper-rectangle. + + :param n_dim: dimension of rectangles + """ + self.n_dim = n_dim + self.lb = np.zeros((0, self.n_dim), dtype=dtype) + self.ub = np.zeros((0, self.n_dim), dtype=dtype) + +
+[docs] + def add(self, lb, ub): + """ + Add new rectangles. + + :param lb: lower bounds of rectangles + :param ub: upper bounds of rectangles + """ + self.lb = np.r_[self.lb, lb] + self.ub = np.r_[self.ub, ub]
+
+ + + +
+[docs] +def dominate(t1, t2): + """domination rule for maximization problem""" + return np.all(t1 >= t2) and np.any(t1 > t2)
+ + + +
+[docs] +class Pareto(object): + def __init__(self, num_objectives, dom_rule=None): + self.num_objectives = num_objectives + self.front = np.zeros((0, self.num_objectives)) + self.front_num = np.zeros(0, dtype=int) + self.num_compared = 0 + self.dom_rule = dom_rule + self.front_updated = False + + if self.dom_rule is None: + self.dom_rule = dominate + + self.cells = Rectangles(num_objectives, int) + self.reference_min = None + self.reference_max = None + +
+[docs] + def update_front(self, t): + """ + Update the non-dominated set of points. + + Pareto set is sorted on the first objective in ascending order. + """ + t = np.array(t) + if t.ndim == 1: + tt = [t] + else: + tt = t + + front_updated = False + + for k in range(len(tt)): + point = tt[k] + is_front = True + for i in range(len(self.front)): + if self.dom_rule(self.front[i], point): + is_front = False + break + + if is_front: + front_updated = True + dom_filter = np.full(len(self.front), True, dtype=bool) + for i in range(len(self.front)): + if self.dom_rule(point, self.front[i]): + dom_filter[i] = False + + self.front = np.r_[self.front[dom_filter], point[np.newaxis, :]] + self.front_num = np.r_[self.front_num[dom_filter], self.num_compared] + + self.num_compared += 1 + + if front_updated: + sorted_idx = self.front[:, 0].argsort() + self.front = self.front[sorted_idx, :] + self.front_num = self.front_num[sorted_idx] + self.divide_non_dominated_region() + + self.front_updated = front_updated
+ + +
+[docs] + def export_front(self): + return self.front, self.front_num
+ + +
+[docs] + def set_reference_min(self, reference_min=None): + if reference_min is None: + # estimate reference min point + front_min = np.min(self.front, axis=0, keepdims=True) + w = np.max(self.front, axis=0, keepdims=True) - front_min + reference_min = front_min - w * 2 / self.front.shape[0] + + self.reference_min = reference_min
+ + +
+[docs] + def set_reference_max(self, reference_max=None): + if reference_max is None: + # estimate reference max point + front_max = np.max(self.front, axis=0, keepdims=True) + w = front_max - np.min(self.front, axis=0, keepdims=True) + reference_max = front_max + w * 100 + + self.reference_max = reference_max
+ + +
+[docs] + def volume_in_dominance(self, ref_min, ref_max, dominance_ratio=False): + ref_min = np.array(ref_min) + ref_max = np.array(ref_max) + v_all = np.prod(ref_max - ref_min) + + front = np.r_[[ref_min], self.front, [ref_max]] + ax = np.arange(self.num_objectives) + lb = front[self.cells.lb, ax] + ub = front[self.cells.ub, ax] + + v_non_dom = np.sum(np.prod(ub - lb, axis=1)) + + if dominance_ratio: + return (v_all - v_non_dom) / v_all + else: + return v_all - v_non_dom
+ + +
+[docs] + def divide_non_dominated_region(self, force_binary_search=False): + # clear rectangles + self.cells = Rectangles(self.num_objectives, int) + + if self.num_objectives == 2 and not force_binary_search: + self.__divide_2d() + else: + self.__divide_using_binary_search()
+ + + def __divide_2d(self): + """ + Divide non-dominated region into vertical rectangles for the case of 2-objectives. + + Assumes that Pareto set has been sorted on the first objective in ascending order. + + Notes: + In 2-dimensional cases, the second objective has be sorted in decending order. + """ + n_cells = self.front.shape[0] + 1 + lb_idx = [[i, (i + 1) % n_cells] for i in range(n_cells)] + ub_idx = [[i + 1, n_cells] for i in range(n_cells)] + + self.cells.add(lb_idx, ub_idx) + + def __included_in_non_dom_region(self, p): + return np.all([np.any(pf <= p) for pf in self.front]) + + def __divide_using_binary_search(self): + front = np.r_[ + np.full((1, self.num_objectives), -np.inf), + self.front, + np.full((1, self.num_objectives), np.inf), + ] + + # Pareto front indices when sorted on each dimension's front value in ascending order. + # (indices start from 1) + # Index 0 means anti-ideal value, index `self.front.shape[0] + 1` means ideal point. + front_idx = np.r_[ + np.zeros((1, self.num_objectives), dtype=int), + np.argsort(self.front, axis=0) + 1, + np.full((1, self.num_objectives), self.front.shape[0] + 1, dtype=int), + ] + + rect_candidates = [[np.copy(front_idx[0]), np.copy(front_idx[-1])]] + + while rect_candidates: + rect = rect_candidates.pop() + + lb_idx = [front_idx[rect[0][d], d] for d in range(self.num_objectives)] + ub_idx = [front_idx[rect[1][d], d] for d in range(self.num_objectives)] + lb = [front[lb_idx[d], d] for d in range(self.num_objectives)] + ub = [front[ub_idx[d], d] for d in range(self.num_objectives)] + + if self.__included_in_non_dom_region(lb): + self.cells.add([lb_idx], [ub_idx]) + + elif self.__included_in_non_dom_region(ub): + rect_sizes = rect[1] - rect[0] + + # divide rectangle by the dimension with largest size + if np.any(rect_sizes > 1): + div_dim = np.argmax(rect_sizes) + div_point = rect[0][div_dim] + int(round(rect_sizes[div_dim] / 2.0)) + + # add divided left rectangle + left_ub_idx = np.copy(rect[1]) + left_ub_idx[div_dim] = div_point + rect_candidates.append([np.copy(rect[0]), left_ub_idx]) + + # add divided right rectangle + right_lb_idx = np.copy(rect[0]) + right_lb_idx[div_dim] = div_point + rect_candidates.append([right_lb_idx, np.copy(rect[1])])
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/score.html b/manual/v2.0.2/en/_modules/physbo/search/score.html new file mode 100644 index 00000000..c89df787 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/score.html @@ -0,0 +1,335 @@ + + + + + + + + physbo.search.score — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.search.score

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy.stats
+
+
+
+[docs] +def score(mode, predictor, test, training=None, **kwargs): + """ + Calculate scores (acquisition function) for test data. + + Parameters + ---------- + mode: str + Kind of score. + + "EI", "PI", and "TS" are available. + + predictor: predictor object + Base class is defined in physbo.predictor. + + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + + test: physbo.variable + Inputs + + Other Parameters + ---------------- + fmax: float + Max value of mean of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Used only for mode == "EI" and "PI" + + alpha: float + noise for sampling source (default: 1.0) + Used only for mode == "TS" + + Returns + ------- + score: numpy.ndarray + + Raises + ------ + NotImplementedError + If unknown mode is given + """ + + if test.X.shape[0] == 0: + return np.zeros(0) + + if mode == "EI": + fmax = kwargs.get("fmax", None) + return EI(predictor, training, test, fmax) + elif mode == "PI": + fmax = kwargs.get("fmax", None) + return PI(predictor, training, test, fmax) + elif mode == "TS": + alpha = kwargs.get("alpha", 1.0) + return TS(predictor, training, test, alpha) + else: + raise NotImplementedError("ERROR: mode must be EI, PI or TS.")
+ + + +
+[docs] +def EI(predictor, training, test, fmax=None): + """ + Maximum expected improvement. + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + fmax: float + Max value of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Returns + ------- + score: numpy.ndarray + """ + fmean = predictor.get_post_fmean(training, test) + fcov = predictor.get_post_fcov(training, test) + fstd = np.sqrt(fcov) + + if fmax is None: + fmax = np.max(predictor.get_post_fmean(training, training)) + + temp1 = fmean - fmax + temp2 = temp1 / fstd + score = temp1 * scipy.stats.norm.cdf(temp2) + fstd * scipy.stats.norm.pdf(temp2) + return score
+ + + +
+[docs] +def PI(predictor, training, test, fmax=None): + """ + Maximum probability of improvement. + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + fmax: float + Max value of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Returns + ------- + score: numpy.ndarray + """ + fmean = predictor.get_post_fmean(training, test) + fcov = predictor.get_post_fcov(training, test) + fstd = np.sqrt(fcov) + + if fmax is None: + fmax = np.max(predictor.get_post_fmean(training, training)) + + temp = (fmean - fmax) / fstd + score = scipy.stats.norm.cdf(temp) + return score
+ + + +
+[docs] +def TS(predictor, training, test, alpha=1): + """ + Thompson sampling (See Sec. 2.1 in Materials Discovery Volume 4, June 2016, Pages 18-21) + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + alpha: float + noise for sampling source + (default: 1.0) + Returns + ------- + score: numpy.ndarray + """ + return (predictor.get_post_samples(training, test, alpha=alpha)).flatten()
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/score_multi.html b/manual/v2.0.2/en/_modules/physbo/search/score_multi.html new file mode 100644 index 00000000..363ea923 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/score_multi.html @@ -0,0 +1,377 @@ + + + + + + + + physbo.search.score_multi — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.search.score_multi

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy.stats
+
+from .pareto import Pareto
+
+
+
+[docs] +def score(mode, predictor_list, test, training_list, **kwargs): + if test.X.shape[0] == 0: + return np.zeros(0) + + if mode == "EHVI": + pareto = kwargs["pareto"] + fmean, fstd = _get_fmean_fstd(predictor_list, training_list, test) + f = EHVI(fmean, fstd, pareto) + elif mode == "HVPI": + pareto = kwargs["pareto"] + fmean, fstd = _get_fmean_fstd(predictor_list, training_list, test) + f = HVPI(fmean, fstd, pareto) + elif mode == "TS": + alpha = kwargs.get("alpha", 1.0) + reduced_candidate_num = kwargs["reduced_candidate_num"] + f = TS( + predictor_list, + training_list, + test, + alpha, + reduced_candidate_num=reduced_candidate_num, + ) + else: + raise NotImplementedError("mode must be EHVI, HVPI or TS.") + return f
+ + + +
+[docs] +def HVPI(fmean, fstd, pareto): + """ + Calculate Hypervolume-based Probability of Improvement (HVPI). + + Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization + """ + + N = fmean.shape[0] + n_obj = pareto.num_objectives + + if pareto.reference_min is None: + pareto.set_reference_min() + reference_min = pareto.reference_min + + # Pareto front with reference points + # shape: (front_size, n_obj) + front = np.r_[ + np.array(reference_min).reshape((1, n_obj)), + pareto.front, + np.full((1, n_obj), np.inf), + ] + + ax = np.arange(n_obj) + n_cell = pareto.cells.lb.shape[0] + + # convert to minimization problem + l = front[pareto.cells.ub, ax].reshape((1, n_cell, n_obj)) * -1 + u = front[pareto.cells.lb, ax].reshape((1, n_cell, n_obj)) * -1 + + # convert to minimization problem + fmean = fmean.reshape((N, 1, n_obj)) * -1 + fstd = fstd.reshape((N, 1, n_obj)) + + # calculate cdf + Phi_l = scipy.stats.norm.cdf((l - fmean) / fstd) + Phi_u = scipy.stats.norm.cdf((u - fmean) / fstd) + + # calculate PoI + poi = np.sum(np.prod(Phi_u - Phi_l, axis=2), axis=1) # shape: (N, 1) + + # calculate hypervolume contribution of fmean point + hv_valid = np.all(fmean < u, axis=2) # shape: (N, n_cell) + hv = np.prod(u - np.maximum(l, fmean), axis=2) # shape: (N, n_cell) + hv = np.sum(hv * hv_valid, axis=1) # shape: (N, 1) + + # HVPoI + score = hv * poi + return score
+ + + +
+[docs] +def EHVI(fmean, fstd, pareto): + """ + Calculate Expected Hyper-Volume Improvement (EHVI). + + Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization + """ + + N = fmean.shape[0] + n_obj = pareto.num_objectives + + if pareto.reference_min is None: + pareto.set_reference_min() + if pareto.reference_max is None: + pareto.set_reference_max() + reference_min = pareto.reference_min + reference_max = pareto.reference_max + + # Pareto front with reference points + # shape: (front_size, n_obj) + front = np.r_[ + np.array(reference_min).reshape((1, n_obj)), + pareto.front, + np.array(reference_max).reshape((1, n_obj)), + ] + + ax = np.arange(n_obj) + + # convert to minimization problem + l = front[pareto.cells.ub, ax] * -1 + u = front[pareto.cells.lb, ax] * -1 + + n_cell = pareto.cells.lb.shape[0] + + # shape: (n_cell, 1, n_cell, n_obj) + l = np.tile(l, (n_cell, 1, 1, 1)) + u = np.tile(u, (n_cell, 1, 1, 1)) + a = l.transpose((2, 1, 0, 3)) + b = u.transpose((2, 1, 0, 3)) + + # convert to minimization problem + fmean = fmean.reshape((1, N, 1, n_obj)) * -1 + fstd = fstd.reshape((1, N, 1, n_obj)) + + # calculate pdf, cdf + phi_min_bu = scipy.stats.norm.pdf((np.minimum(b, u) - fmean) / fstd) + phi_max_al = scipy.stats.norm.pdf((np.maximum(a, l) - fmean) / fstd) + Phi_l = scipy.stats.norm.cdf((l - fmean) / fstd) + Phi_u = scipy.stats.norm.cdf((u - fmean) / fstd) + Phi_a = scipy.stats.norm.cdf((a - fmean) / fstd) + Phi_b = scipy.stats.norm.cdf((b - fmean) / fstd) + + ## calculate G + is_type_A = np.logical_and(a < u, l < b) + is_type_B = u <= a + + # note: Phi[max_or_min(x,y)] = max_or_min(Phi[x], Phi[y]) + EI_A = ( + (b - a) * (np.maximum(Phi_a, Phi_l) - Phi_l) + + (b - fmean) * (np.minimum(Phi_b, Phi_u) - np.maximum(Phi_a, Phi_l)) + + fstd * (phi_min_bu - phi_max_al) + ) + EI_B = (b - a) * (Phi_u - Phi_l) + + G = EI_A * is_type_A + EI_B * is_type_B + score = np.sum(np.sum(np.prod(G, axis=3), axis=0), axis=1) # shape: (N, 1) + return score
+ + + +
+[docs] +def TS(predictor_list, training_list, test, alpha=1, reduced_candidate_num=None): + score = [ + predictor.get_post_samples(training, test, alpha=alpha) + for predictor, training in zip(predictor_list, training_list) + ] + score = np.array(score).reshape((len(predictor_list), test.X.shape[0])).T + pareto = Pareto(num_objectives=len(predictor_list)) + + if reduced_candidate_num is None or score.shape[0] <= reduced_candidate_num: + use_idx = np.arange(score.shape[0]) + else: + use_idx = np.arange(reduced_candidate_num) + use_idx = np.random.choice(use_idx, reduced_candidate_num, replace=False) + + # pareto.update_front(score) + pareto.update_front(score[use_idx, :]) + + # randomly choose candidate from pareto frontiers + chosen_idx = np.random.choice(pareto.front_num) + score_res = np.zeros(score.shape[0]) + score_res[use_idx[chosen_idx]] = 1 # only chosen_idx th value is one. + + return score_res
+ + + +def _get_fmean_fstd(predictor_list, training_list, test): + fmean = [ + predictor.get_post_fmean(training, test) + for predictor, training in zip(predictor_list, training_list) + ] + fcov = [ + predictor.get_post_fcov(training, test) + for predictor, training in zip(predictor_list, training_list) + ] + + # shape: (N, n_obj) + fmean = np.array(fmean).T + fstd = np.sqrt(np.array(fcov)).T + return fmean, fstd +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/search/utility.html b/manual/v2.0.2/en/_modules/physbo/search/utility.html new file mode 100644 index 00000000..54e16a61 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/search/utility.html @@ -0,0 +1,287 @@ + + + + + + + + physbo.search.utility — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.search.utility

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +def show_search_results(history, N): + n = history.total_num_search + index = np.argmax(history.fx[0:n]) + + if N == 1: + print( + "%04d-th step: f(x) = %f (action=%d)" + % (n, history.fx[n - 1], history.chosen_actions[n - 1]) + ) + print( + " current best f(x) = %f (best action=%d) \n" + % (history.fx[index], history.chosen_actions[index]) + ) + else: + print( + "current best f(x) = %f (best action = %d) " + % (history.fx[index], history.chosen_actions[index]) + ) + + print("list of simulation results") + st = history.total_num_search - N + en = history.total_num_search + for n in range(st, en): + print("f(x)=%f (action = %d)" % (history.fx[n], history.chosen_actions[n])) + print("\n")
+ + + +
+[docs] +def show_search_results_mo(history, N, disp_pareto_set=False): + n = history.total_num_search + pset, step = history.pareto.export_front() + + def msg_pareto_set_updated(indent=False): + prefix = " " if indent else "" + if history.pareto.front_updated: + print(prefix + "Pareto set updated.") + if disp_pareto_set: + print( + prefix + + "current Pareto set = %s (steps = %s) \n" + % (str(pset), str(step + 1)) + ) + else: + print( + prefix + "the number of Pareto frontiers = %s \n" % str(len(step)) + ) + + if N == 1: + print( + "%04d-th step: f(x) = %s (action = %d)" + % (n, str(history.fx[n - 1]), history.chosen_actions[n - 1]) + ) + + msg_pareto_set_updated(indent=True) + + else: + msg_pareto_set_updated() + + print("list of simulation results") + st = history.total_num_search - N + en = history.total_num_search + for n in range(st, en): + print( + "f(x) = %s (action = %d)" + % (str(history.fx[n]), history.chosen_actions[n]) + ) + print("\n")
+ + + + + + + +
+[docs] +def show_interactive_mode(simulator, history): + if simulator is None and history.total_num_search == 0: + print("interactive mode starts ... \n ")
+ + + +
+[docs] +def length_vector(t): + N = len(t) if hasattr(t, "__len__") else 1 + return N
+ + + +
+[docs] +def is_learning(n, interval): + if interval == 0: + return n == 0 + elif interval > 0: + return np.mod(n, interval) == 0 + else: + return False
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_modules/physbo/variable.html b/manual/v2.0.2/en/_modules/physbo/variable.html new file mode 100644 index 00000000..c7aba1b5 --- /dev/null +++ b/manual/v2.0.2/en/_modules/physbo/variable.html @@ -0,0 +1,426 @@ + + + + + + + + physbo.variable — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for physbo.variable

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[docs] +class variable(object): + def __init__(self, X=None, t=None, Z=None): + """ + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + Z: + + """ + self.X = X + self.Z = Z + self.t = t + +
+[docs] + def get_subset(self, index): + """ + Getting subset of variables. + + Parameters + ---------- + index: int or array of int + Index of selected action. + Returns + ------- + variable: physbo.variable + """ + temp_X = self.X[index, :] if self.X is not None else None + temp_t = self.t[index] if self.t is not None else None + temp_Z = self.Z[index, :] if self.Z is not None else None + + return variable(X=temp_X, t=temp_t, Z=temp_Z)
+ + +
+[docs] + def delete(self, num_row): + """ + Deleting variables of X, t, Z whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + self.delete_X(num_row) + self.delete_t(num_row) + self.delete_Z(num_row)
+ + +
+[docs] + def add(self, X=None, t=None, Z=None): + """ + Adding variables of X, t, Z. + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + Z + + Returns + ------- + + """ + self.add_X(X) + self.add_t(t) + self.add_Z(Z)
+ + +
+[docs] + def delete_X(self, num_row): + """ + Deleting variables of X whose indexes are specified by num_row. + + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.X is not None: + self.X = np.delete(self.X, num_row, 0)
+ + +
+[docs] + def delete_t(self, num_row): + """ + Deleting variables of t whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.t is not None: + self.t = np.delete(self.t, num_row)
+ + +
+[docs] + def delete_Z(self, num_row): + """ + Deleting variables of Z whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.Z is not None: + self.Z = np.delete(self.Z, num_row, 0)
+ + +
+[docs] + def add_X(self, X=None): + """ + Adding variable X. If self.X is None, self.X is set as X. + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + + Returns + ------- + + """ + if X is not None: + if self.X is not None: + self.X = np.vstack((self.X, X)) + else: + self.X = X
+ + +
+[docs] + def add_t(self, t=None): + """ + Adding variable t. If self.t is None, self.t is set as t. + + Parameters + ---------- + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + + """ + if not isinstance(t, np.ndarray): + t = np.array([t]) + + if t is not None: + if self.t is not None: + self.t = np.hstack((self.t, t)) + else: + self.t = t
+ + +
+[docs] + def add_Z(self, Z=None): + """ + Adding variable Z. If self.Z is None, self.Z is set as Z. + + Parameters + ---------- + Z + + Returns + ------- + + """ + if Z is not None: + if self.Z is None: + self.Z = Z + else: + self.Z = np.vstack((self.Z, Z))
+ + +
+[docs] + def save(self, file_name): + """ + Saving variables X, t, Z to the file. + + Parameters + ---------- + file_name: str + A file name for saving variables X, t, Z using numpy.savez_compressed. + + Returns + ------- + + """ + np.savez_compressed(file_name, X=self.X, t=self.t, Z=self.Z)
+ + +
+[docs] + def load(self, file_name): + """ + Loading variables X, t, Z from the file. + + Parameters + ---------- + file_name: str + A file name for loading variables X, t, Z using numpy.load. + + Returns + ------- + + """ + data = np.load(file_name, allow_pickle=True) + self.X = data["X"] + self.t = data["t"] + self.Z = data["Z"]
+
+ +
+ +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/_sources/acknowledgement.rst.txt b/manual/v2.0.2/en/_sources/acknowledgement.rst.txt new file mode 100644 index 00000000..7991efa7 --- /dev/null +++ b/manual/v2.0.2/en/_sources/acknowledgement.rst.txt @@ -0,0 +1,4 @@ +*************************** +Acknowledgement +*************************** +We would like to thank the support from “Project for advancement of software usability in materials science” by The Institute for Solid State Physics, The University of Tokyo, for development of PHYSBO. diff --git a/manual/v2.0.2/en/_sources/algorithm.rst.txt b/manual/v2.0.2/en/_sources/algorithm.rst.txt new file mode 100644 index 00000000..3f8c01d4 --- /dev/null +++ b/manual/v2.0.2/en/_sources/algorithm.rst.txt @@ -0,0 +1,167 @@ +.. _chap_algorithm: + +Algorithm +===================== +This section describes an overview of Bayesian optimization. For technical details, please refer to `this reference `_ . + +Bayesian optimization +--------------------- +Bayesian optimization is a method that can be used in complex simulations or real-world experimental tasks where the evaluation of the objective function (e.g., property values) is very costly. In other words, Bayesian optimization solves the problem of finding explanatory variables (material composition, structure, process and simulation parameters, etc.) that have a better objective function (material properties, etc.) with as few experiments and simulations as possible. In Bayesian optimization, we start from a situation where we have a list of candidates for the explanatory variables to be searched (represented by the vector :math:`{\bf x}`). Then, from among the candidates, the one that is expected to improve the objective function :math:`y` is selected by making good use of prediction by machine learning (using Gaussian process regression). We then evaluate the value of the objective function by performing experiments and simulations on the candidates. By repeating the process of selection by machine learning and evaluation by experimental simulation, optimization can be achieved in as few times as possible. + +The details of the Bayesian optimization algorithm are described below. + +- Step1: Initialization + +Prepare the space to be explored in advance. In other words, list up the composition, structure, process, simulation parameters, etc. of the candidate materials as a vector :math:`{\bf x}`. At this stage, the value of the objective function is not known. A few candidates are chosen as initial conditions and the value of the objective function :math:`y` is estimated by experiment or simulation. This gives us the training data :math:`D = \{ {\bf x}_i, y_i \}_{(i=1, \cdots, N)}` with the explanatory variables :math:`{\bf x}` and the objective function :math:`y`. + +- Step2: Selection of candidates + +Using the training data, learn a Gaussian process. For Gaussian process, the mean of the predictions at arbitary :math:`{\bf x}` is :math:`\mu_c ({\bf x})` and the variance is :math:`\sigma_c ({\bf x})` are given as follows + +.. math:: + + \mu_c ({\bf x}) &= {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf y}, + + \sigma_c({\bf x}) &= k({\bf x}, {\bf x}) + \sigma^2 - {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf k}({\bf x}), + +where :math:`k({\bf x}, {\bf x}')` is a function called as a kernel, and it represents the similarity of two vectors. In general, the following Gaussian kernel is used: + +.. math:: + + k({\bf x}, {\bf x}') = \exp \left[ -\frac{1}{2\eta^2}||{\bf x} - {\bf x}'||^2 \right]. + +Using this kernel function, :math:`{\bf k}({\bf x})` and :math:`K` are computed as follows + +.. math:: + + {\bf k}({\bf x}) = \left( k({\bf x}_1, {\bf x}), k({\bf x}_2, {\bf x}), \cdots, k({\bf x}_N, {\bf x}) \right)^\top + +.. math:: + :nowrap: + + \[ + K = \left( + \begin{array}{cccc} + k({\bf x}_1, {\bf x}_1) & k({\bf x}_1, {\bf x}_2) & \ldots & k({\bf x}_1, {\bf x}_N) \\ + k({\bf x}_2, {\bf x}_1) & k({\bf x}_2, {\bf x}_2) & \ldots & k({\bf x}_2, {\bf x}_N) \\ + \vdots & \vdots & \ddots & \vdots \\ + k({\bf x}_N, {\bf x}_1) & k({\bf x}_N, {\bf x}_2) & \ldots & k({\bf x}_N, {\bf x}_N) + \end{array} + \right) + \] + +For all candidates that have not yet been tested or simulated, the prediction :math:`\mu_c ({\bf x})` and the variance associated with the uncertainty of the prediction :math:`\sigma_c ({\bf x})` are estimated. Using this, the acquisition function is calculated. Then, the candidate :math:`{\bf x}^*` is selected that maximizes the acquisition function from among the candidates for which we do not yet know the value of the objective function. In this case, :math:`\sigma` and :math:`\eta` are called hyperparameters, and PHYSBO will automatically set the best value. + +As an acquisition function, for example, Maximum Probability of Improvement (PI) and Maximum Expected Improvement (EI) are useful. +The score of PI is defined as follows. + +.. math:: + + \text{PI} (\mathbf{x}) = \Phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})}, + +where :math:`\Phi(\cdot)` is the cumulative distribution function. +The PI score represents the probability of exceeding the maximum :math:`y_{\max}` of the currently obtained :math:`y`. +In addition, the EI score is the expected value of the difference between the predicted value and the current maximum :math:`y_{\max}` and is given by + +.. math:: + + \text{EI} (\mathbf{x}) = [\mu_c (\mathbf{x})-y_{\max}] \Phi (z (\mathbf{x})) + \sigma_c (\mathbf{x}) \phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})}, + +where :math:`\phi(\cdot)` is a probability density function. + + +- Step3: Experiment (Simulation) + +Perform an experiment or simulation on the candidate :math:`{\bf x}^*` with the largest acquisition function selected in step 2, and estimate the objective function value :math:`y`. This will add one more piece of training data. Repeat steps 2 and 3 to search for candidates with good scores. + +Accelerating Bayesian Optimization with PHYSBO +----------------------------------------------- + +In PHYSBO, random feature map, Thompson sampling, and Cholesky decomposition are used to accelerate the calculation of Bayesian optimization. +First, the random feature map is introduced. +By introducing the random feature map :math:`\phi (\mathbf{x})`, we can approximate the Gaussian kernel :math:`k(\mathbf{x},\mathbf{x}')` as follows. + +.. math:: + + k(\mathbf{x},\mathbf{x}') = \exp \left[ - \frac{1}{2 \eta^2} \| \mathbf{x} -\mathbf{x}' \| \right]^2 \simeq \phi (\mathbf{x})^\top \phi(\mathbf{x}') \\ + \phi (\mathbf{x}) = \left( z_{\omega_1, b_1} (\mathbf{x}/\eta),..., z_{\omega_l, b_l} (\mathbf{x}/\eta) \right)^\top, + +where :math:`z_{\omega, b} (\mathbf{x}) = \sqrt{2} \cos (\boldsymbol{\omega}^\top \mathbf{x}+b)`. +Then, :math:`\boldsymbol{\omega}` is generated from :math:`p(\boldsymbol{\omega}) = (2\pi)^{-d/2} \exp (-\|\boldsymbol{\omega}\|^2/2)` and :math:`b` is chosen uniformly from :math:`[0, 2 \pi]` is chosen uniformly from :math:`[0, 2 \pi]`. +This approximation is strictly valid in the limit of :math:`l \to \infty`, where the value of :math:`l` is the dimension of the random feature map. + + :math:`\Phi` can be represented as a :math:`l` row :math:`n` column matrix with :math:`\phi(\mathbf{x}_i)` in each column by :math:`\mathbf{x}` vector of training data as follows: + +.. math:: + + \Phi = ( \phi(\mathbf{x}_1),..., \phi(\mathbf{x}_n) ). + +It is seen that the following relation is satisfied: + +.. math:: + + \mathbf{k} (\mathbf{x}) = \Phi^\top \phi(\mathbf{x}) \\ + K= \Phi^\top \Phi. + +Next, a method that uses Thompson sampling to make the computation time for candidate prediction :math:`O(l)` is introduced. +Note that using EI or PI will result in :math:`O(l^2)` because of the need to evaluate the variance. +In order to perform Thompson sampling, the Bayesian linear model defined below is used. + +.. math:: + + y = \mathbf{w}^\top \phi (\mathbf{x}), + +where :math:`\phi(\mathbf{x})` is random feature map described above and :math:`\mathbf{w}` is a coefficient vector. +In a Gaussian process, when the training data :math:`D` is given, this :math:`\mathbf{w}` is determined to follow the following Gaussian distribution. + +.. math:: + + p(\mathbf{w}|D) = \mathcal{N} (\boldsymbol{\mu}, \Sigma) \\ + \boldsymbol{\mu} = (\Phi \Phi^\top + \sigma^2 I)^{-1} \Phi \mathbf{y} \\ + \Sigma = \sigma^2 (\Phi \Phi^\top + \sigma^2 I)^{-1} + +In Thompson sampling, one coefficient vector is sampled according to this posterior probability distribution and set to :math:`\mathbf{w}^*`, which represents the acquisition function as follows + +.. math:: + + \text{TS} (\mathbf{x}) = {\mathbf{w}^*}^\top \phi (\mathbf{x}). + +The :math:`\mathbf{x}^*` that maximizes :math:`\text{TS} (\mathbf{x})` will be selected as the next candidate. +In this case, :math:`\phi (\mathbf{x})` is an :math:`l` dimensional vector, so the acquisition function can be computed with :math:`O(l)`. + +Next, the manner for accelerating the sampling of :math:`\mathbf{w}` is introduced. +The matrix :math:`A` is defined as follows. + +.. math:: + + A = \frac{1}{\sigma^2} \Phi \Phi^\top +I + +Then the posterior probability distribution is given as + +.. math:: + + p(\mathbf{w}|D) = \mathcal{N} \left( \frac{1}{\sigma^2} A^{-1} \Phi \mathbf{y}, A^{-1} \right). + +Therefore, in order to sample :math:`\mathbf{w}`, we need to calculate :math:`A^{-1}`. +Now consider the case of the newly added :math:`(\mathbf{x}', y')` in the Bayesian optimization iteration. +With the addition of this data, the matrix :math:`A` is updated as + +.. math:: + + A' = A + \frac{1}{\sigma^2} \phi (\mathbf{x}') \phi (\mathbf{x}')^\top. + +This update can be done using the Cholesky decomposition ( :math:`A= L^\top L` ), which reduces the time it takes to compute :math:`A^{-1}` to :math:`O(l^2)`. +If we compute :math:`A^{-1}` at every step, the numerical cost becomes :math:`O(l^3)`. +The :math:`\mathbf{w}` is obtained by + +.. math:: + + \mathbf{w}^* = \boldsymbol{\mu} + \mathbf{w}_0, + +where :math:`\mathbf{w}_0` is sampled from :math:`\mathcal{N} (0,A^{-1})` and :math:`\boldsymbol{\mu}` is calculated by + +.. math:: + + L^\top L \boldsymbol{\mu} = \frac{1}{\sigma^2} \Phi \mathbf{y}. + +By using these techniques, a computation time becomes almost linear in the number of training data. diff --git a/manual/v2.0.2/en/_sources/api/modules.rst.txt b/manual/v2.0.2/en/_sources/api/modules.rst.txt new file mode 100644 index 00000000..0f96bbd4 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/modules.rst.txt @@ -0,0 +1,7 @@ +physbo +====== + +.. toctree:: + :maxdepth: 4 + + physbo diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.basis.fourier.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.basis.fourier.rst.txt new file mode 100644 index 00000000..f64d2599 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.basis.fourier.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.basis.fourier module +=============================== + +.. automodule:: physbo.blm.basis.fourier + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.basis.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.basis.rst.txt new file mode 100644 index 00000000..6b5d7474 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.basis.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.basis package +======================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.basis.fourier + +Module contents +--------------- + +.. automodule:: physbo.blm.basis + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.core.model.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.core.model.rst.txt new file mode 100644 index 00000000..0412df90 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.core.model.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.core.model module +============================ + +.. automodule:: physbo.blm.core.model + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.core.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.core.rst.txt new file mode 100644 index 00000000..1e5aabbd --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.core.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.core package +======================= + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.core.model + +Module contents +--------------- + +.. automodule:: physbo.blm.core + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.inf.exact.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.inf.exact.rst.txt new file mode 100644 index 00000000..ac801c82 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.inf.exact.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.inf.exact module +=========================== + +.. automodule:: physbo.blm.inf.exact + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.inf.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.inf.rst.txt new file mode 100644 index 00000000..f63622cc --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.inf.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.inf package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.inf.exact + +Module contents +--------------- + +.. automodule:: physbo.blm.inf + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.lik.gauss.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.gauss.rst.txt new file mode 100644 index 00000000..6e8fda6b --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.lik.gauss module +=========================== + +.. automodule:: physbo.blm.lik.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.lik.linear.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.linear.rst.txt new file mode 100644 index 00000000..5d8ae3c1 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.linear.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.lik.linear module +============================ + +.. automodule:: physbo.blm.lik.linear + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.lik.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.rst.txt new file mode 100644 index 00000000..e1f64bfb --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.lik.rst.txt @@ -0,0 +1,19 @@ +physbo.blm.lik package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.lik.gauss + physbo.blm.lik.linear + +Module contents +--------------- + +.. automodule:: physbo.blm.lik + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.predictor.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.predictor.rst.txt new file mode 100644 index 00000000..e625b7f6 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.predictor module +=========================== + +.. automodule:: physbo.blm.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.prior.gauss.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.prior.gauss.rst.txt new file mode 100644 index 00000000..84d97f99 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.prior.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.prior.gauss module +============================= + +.. automodule:: physbo.blm.prior.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.prior.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.prior.rst.txt new file mode 100644 index 00000000..d9a90114 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.prior.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.prior package +======================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.prior.gauss + +Module contents +--------------- + +.. automodule:: physbo.blm.prior + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.blm.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.blm.rst.txt new file mode 100644 index 00000000..d3e4a37f --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.blm.rst.txt @@ -0,0 +1,30 @@ +physbo.blm package +================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.basis + physbo.blm.core + physbo.blm.inf + physbo.blm.lik + physbo.blm.prior + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.predictor + +Module contents +--------------- + +.. automodule:: physbo.blm + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.core.learning.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.core.learning.rst.txt new file mode 100644 index 00000000..5985e210 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.core.learning.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.learning module +============================== + +.. automodule:: physbo.gp.core.learning + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.core.model.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.core.model.rst.txt new file mode 100644 index 00000000..36a7b16a --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.core.model.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.model module +=========================== + +.. automodule:: physbo.gp.core.model + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.core.prior.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.core.prior.rst.txt new file mode 100644 index 00000000..594dd681 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.core.prior.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.prior module +=========================== + +.. automodule:: physbo.gp.core.prior + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.core.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.core.rst.txt new file mode 100644 index 00000000..46499eb8 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.core.rst.txt @@ -0,0 +1,20 @@ +physbo.gp.core package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.core.learning + physbo.gp.core.model + physbo.gp.core.prior + +Module contents +--------------- + +.. automodule:: physbo.gp.core + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.cov.gauss.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.cov.gauss.rst.txt new file mode 100644 index 00000000..4dd7a21c --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.cov.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.cov.gauss module +========================== + +.. automodule:: physbo.gp.cov.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.cov.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.cov.rst.txt new file mode 100644 index 00000000..61369a91 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.cov.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.cov package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.cov.gauss + +Module contents +--------------- + +.. automodule:: physbo.gp.cov + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.inf.exact.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.inf.exact.rst.txt new file mode 100644 index 00000000..34bce35f --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.inf.exact.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.inf.exact module +========================== + +.. automodule:: physbo.gp.inf.exact + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.inf.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.inf.rst.txt new file mode 100644 index 00000000..77b4176f --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.inf.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.inf package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.inf.exact + +Module contents +--------------- + +.. automodule:: physbo.gp.inf + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.lik.gauss.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.lik.gauss.rst.txt new file mode 100644 index 00000000..19064760 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.lik.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.lik.gauss module +========================== + +.. automodule:: physbo.gp.lik.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.lik.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.lik.rst.txt new file mode 100644 index 00000000..566be484 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.lik.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.lik package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.lik.gauss + +Module contents +--------------- + +.. automodule:: physbo.gp.lik + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.mean.const.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.const.rst.txt new file mode 100644 index 00000000..f934da4a --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.const.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.mean.const module +=========================== + +.. automodule:: physbo.gp.mean.const + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.mean.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.rst.txt new file mode 100644 index 00000000..83cb1b7e --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.rst.txt @@ -0,0 +1,19 @@ +physbo.gp.mean package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.mean.const + physbo.gp.mean.zero + +Module contents +--------------- + +.. automodule:: physbo.gp.mean + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.mean.zero.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.zero.rst.txt new file mode 100644 index 00000000..34fef4f9 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.mean.zero.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.mean.zero module +========================== + +.. automodule:: physbo.gp.mean.zero + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.predictor.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.predictor.rst.txt new file mode 100644 index 00000000..d036e0bb --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.predictor module +========================== + +.. automodule:: physbo.gp.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.gp.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.gp.rst.txt new file mode 100644 index 00000000..f1aca6c3 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.gp.rst.txt @@ -0,0 +1,30 @@ +physbo.gp package +================= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.core + physbo.gp.cov + physbo.gp.inf + physbo.gp.lik + physbo.gp.mean + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.predictor + +Module contents +--------------- + +.. automodule:: physbo.gp + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.misc.centering.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.misc.centering.rst.txt new file mode 100644 index 00000000..5e143933 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.misc.centering.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.centering module +============================ + +.. automodule:: physbo.misc.centering + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.misc.gauss_elim.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.misc.gauss_elim.rst.txt new file mode 100644 index 00000000..9594c9aa --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.misc.gauss_elim.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.gauss\_elim module +============================== + +.. automodule:: physbo.misc.gauss_elim + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.misc.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.misc.rst.txt new file mode 100644 index 00000000..0d5cc640 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.misc.rst.txt @@ -0,0 +1,20 @@ +physbo.misc package +=================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.misc.centering + physbo.misc.gauss_elim + physbo.misc.set_config + +Module contents +--------------- + +.. automodule:: physbo.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.misc.set_config.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.misc.set_config.rst.txt new file mode 100644 index 00000000..4d11fc85 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.misc.set_config.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.set\_config module +============================== + +.. automodule:: physbo.misc.set_config + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.opt.adam.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.opt.adam.rst.txt new file mode 100644 index 00000000..f7e248f1 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.opt.adam.rst.txt @@ -0,0 +1,7 @@ +physbo.opt.adam module +====================== + +.. automodule:: physbo.opt.adam + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.opt.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.opt.rst.txt new file mode 100644 index 00000000..aa7c9063 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.opt.rst.txt @@ -0,0 +1,18 @@ +physbo.opt package +================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.opt.adam + +Module contents +--------------- + +.. automodule:: physbo.opt + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.predictor.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.predictor.rst.txt new file mode 100644 index 00000000..ed9354f3 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.predictor module +======================= + +.. automodule:: physbo.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.rst.txt new file mode 100644 index 00000000..114bf93a --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.rst.txt @@ -0,0 +1,31 @@ +physbo package +============== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm + physbo.gp + physbo.misc + physbo.opt + physbo.search + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.predictor + physbo.variable + +Module contents +--------------- + +.. automodule:: physbo + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete.policy.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.policy.rst.txt new file mode 100644 index 00000000..f7940641 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.policy.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete.policy module +==================================== + +.. automodule:: physbo.search.discrete.policy + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete.results.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.results.rst.txt new file mode 100644 index 00000000..c85dbd53 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.results.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete.results module +===================================== + +.. automodule:: physbo.search.discrete.results + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.rst.txt new file mode 100644 index 00000000..97585687 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete.rst.txt @@ -0,0 +1,19 @@ +physbo.search.discrete package +============================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete.policy + physbo.search.discrete.results + +Module contents +--------------- + +.. automodule:: physbo.search.discrete + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.policy.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.policy.rst.txt new file mode 100644 index 00000000..65202559 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.policy.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete\_multi.policy module +=========================================== + +.. automodule:: physbo.search.discrete_multi.policy + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.results.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.results.rst.txt new file mode 100644 index 00000000..d12c38b5 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.results.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete\_multi.results module +============================================ + +.. automodule:: physbo.search.discrete_multi.results + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.rst.txt new file mode 100644 index 00000000..09a57ac1 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.discrete_multi.rst.txt @@ -0,0 +1,19 @@ +physbo.search.discrete\_multi package +===================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete_multi.policy + physbo.search.discrete_multi.results + +Module contents +--------------- + +.. automodule:: physbo.search.discrete_multi + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.pareto.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.pareto.rst.txt new file mode 100644 index 00000000..9a24fb2a --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.pareto.rst.txt @@ -0,0 +1,7 @@ +physbo.search.pareto module +=========================== + +.. automodule:: physbo.search.pareto + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.rst.txt new file mode 100644 index 00000000..a998ed95 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.rst.txt @@ -0,0 +1,30 @@ +physbo.search package +===================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete + physbo.search.discrete_multi + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.pareto + physbo.search.score + physbo.search.score_multi + physbo.search.utility + +Module contents +--------------- + +.. automodule:: physbo.search + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.score.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.score.rst.txt new file mode 100644 index 00000000..1a6b6809 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.score.rst.txt @@ -0,0 +1,7 @@ +physbo.search.score module +========================== + +.. automodule:: physbo.search.score + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.score_multi.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.score_multi.rst.txt new file mode 100644 index 00000000..59f01d6b --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.score_multi.rst.txt @@ -0,0 +1,7 @@ +physbo.search.score\_multi module +================================= + +.. automodule:: physbo.search.score_multi + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.search.utility.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.search.utility.rst.txt new file mode 100644 index 00000000..14ea05b6 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.search.utility.rst.txt @@ -0,0 +1,7 @@ +physbo.search.utility module +============================ + +.. automodule:: physbo.search.utility + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/api/physbo.variable.rst.txt b/manual/v2.0.2/en/_sources/api/physbo.variable.rst.txt new file mode 100644 index 00000000..66393924 --- /dev/null +++ b/manual/v2.0.2/en/_sources/api/physbo.variable.rst.txt @@ -0,0 +1,7 @@ +physbo.variable module +====================== + +.. automodule:: physbo.variable + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/en/_sources/contact.rst.txt b/manual/v2.0.2/en/_sources/contact.rst.txt new file mode 100644 index 00000000..060d0423 --- /dev/null +++ b/manual/v2.0.2/en/_sources/contact.rst.txt @@ -0,0 +1,22 @@ +Contact +========================================= + +- Bug Reports + + Please report all problems and bugs on the github `Issues `_ page. + + To resolve bugs early, follow these guidelines when reporting: + + 1. Please specify the version of PHYSBO you are using. + + 2. If there are problems for installation, please inform us about your operating system and the compiler. + + 3. If a problem occurs during execution, enter the input file used for execution and its output. + + Thank you for your cooperation. + +- Others + + If you have any questions about your research that are difficult to consult at Issues on GitHub, please send an e-mail to the following address: + + E-mail: ``physbo-dev__at__issp.u-tokyo.ac.jp`` (replace _at_ by @) diff --git a/manual/v2.0.2/en/_sources/index.rst.txt b/manual/v2.0.2/en/_sources/index.rst.txt new file mode 100644 index 00000000..62ccc38c --- /dev/null +++ b/manual/v2.0.2/en/_sources/index.rst.txt @@ -0,0 +1,19 @@ +.. PHYSBO documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PHYSBO's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + introduction + install + notebook/index + algorithm + API Reference + acknowledgement + contact diff --git a/manual/v2.0.2/en/_sources/install.rst.txt b/manual/v2.0.2/en/_sources/install.rst.txt new file mode 100644 index 00000000..dce4561b --- /dev/null +++ b/manual/v2.0.2/en/_sources/install.rst.txt @@ -0,0 +1,125 @@ +Basic usage +===================== + +Install +--------------------- + +Required Packages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Python >= 3.6 +* numpy < 2.0.0 +* scipy + +Download and Install +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- From ``PyPI`` (recommended) :: + + $ pip3 install physbo + + - Required packages such as NumPy will also be installed at the same time. + + - If you add the ``--user`` option, it will be installed under the user's home directory :: + + $ pip3 install --user physbo + + +- From source (for developers) + + #. Download or clone the github repository + + $ git clone https://github.com/issp-center-dev/PHYSBO + + #. Update ``pip`` to 19.0 or higher :: + + $ pip3 install -U pip + + - If you don't have ``pip3``, you can install it with ``python3 -m ensurepip``. + + #. Install :: + + $ cd PHYSBO + $ pip3 install --user ./ + +Uninstall +~~~~~~~~~~~~~~~~~~~~~~~~ + +#. Execute the following command. :: + + $ pip uninstall physbo + + +Basic structures +-------------------------- + +PHYSBO has the following structure (shown up to the second level). + +.. + |--physbo + | |--blm + | |--gp + | |--misc + | |--opt + | |--search + | |--predictor.py + | |--variable.py + +Each module is created with the following structure. + +- ``blm`` :Module for Baysean linear model +- ``gp`` :Module for Gaussian Process +- ``opt`` :Module for optimazation +- ``search`` :Module for searching for optimal solutions +- ``predictor.py`` :Abstract class for predictors +- ``variable.py`` :Class defined for variable associations used in physbo +- ``misc`` : Others (e.g., modules for normalizing the search space) + +For more information about each module, please refer to the API reference. + +Calculation flow +-------------------------- + +Bayesian optimization is well suited for optimization problems such as complex simulations or real-world experimental tasks where the objective function is very costly to evaluate. +In PHYSBO, the following steps are used to perform the optimization (please refer to the tutorial and API reference for details on each). + +1. Defining the search space + + Define each parameter set (d-dimensional vector) as a search candidate, where N: the number of search candidates , d: the number of input parameter dimensions. The parameter set should list all the candidates. + +2. Defining the simulator + + For searching candidates defined above, define a simulator that gives the objective function values (values to be optimized, such as material property values) for each search candidate. In PHYSBO, the direction of optimization is to maximize the objective function, so if you want to minimize the objective function, you can do so by applying a negative value to the value returned by the simulator. + +3. Performing optimization + + First, set the optimization policy (the search space is passed to policy as an argument at this stage). You can choose between the following two optimization methods. + + - ``random_search`` + - ``bayes_search`` + + In ``random_search``, we randomly select parameters from the search space and search for the largest objective function among them. It is used to prepare an initial set of parameters as a preprocessing step for Bayesian optimization. ``bayes_search`` performs Bayesian optimization. The type of score (acquisition function) in Bayesian optimization can be one of the following. + + - TS (Thompson Sampling): Sample one regression function from the posterior probability distribution of the learned Gaussian process, and select the point where the predicetd value becomes maximum as a next candidate. + - EI (Expected Improvement): Select the point where the expected value of the difference between the predicted value by the Gaussian process and the maximum value in the current situation becomes the maximum as a next candidate. + - PI (Probability of Improvement): Select the point with the highest probability of exceeding the current maximum of the current acquisition function as a next candidate. + + Details of Gaussian processes are described in :ref:`chap_algorithm` . For other details of each method, please see `this reference `_ . + If you specify the simulator and the number of search steps in these methods, the following loop will rotate by the number of search steps. + + i). Select the next parameter to be executed from the list of candidate parameters. + + ii). Run the simulator with the selected parameters. + + The number of parameter returned in i) is one by default, but it is possible to return multiple parameters in one step. For more details, please refer to the "Exploring multiple candidates at once" section of the tutorial. Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYSBO (e.g., by experiment rather than numerical calculation), and register the evaluated value in PHYSBO. For more details, please refer to the "Running Interactively" section of the tutorial. + +4. Check numerical results + + The search result ``res`` is returned as an object of the ``history`` class ( ``physbo.search.discrete.results.history`` ). The following is a reference to the search results. + + - ``res.fx``: The logs of evaluation values for simulator (objective function) simulator. + - ``res.chosen_actions``: The logs of the action ID (parameter) when the simulator has executed. + - ``fbest, best_action= res.export_all_sequence_best_fx()``: The logs of the best values and their action IDs (parameters) at each step where the simulator has executed. + - ``res.total_num_search``: Total number steps where the simulator has executed. + + The search results can be saved to an external file using the ``save`` method, and the output results can be loaded using the ``load`` method. See the tutorial for details on how to use it. diff --git a/manual/v2.0.2/en/_sources/introduction.rst.txt b/manual/v2.0.2/en/_sources/introduction.rst.txt new file mode 100644 index 00000000..66c72512 --- /dev/null +++ b/manual/v2.0.2/en/_sources/introduction.rst.txt @@ -0,0 +1,59 @@ +Introduction +===================== + +About PHYSBO +---------------------- + +PHYSBO (optimization tools for PHYSics based on Bayesian Optimization) is a Python library for fast and scalable Bayesian optimization. It is based on COMBO (Common Bayesian Optimization) and has been developed mainly for researchers in the materials science field. There are many attempts to accelerate scientific discovery through data-driven design-of-experiment algorithms in the fields of physics, chemistry, and materials. Bayesian optimization is an effective tool for accelerating these scientific discoveries. Bayesian optimization is a technique that can be used for complex simulations and real-world experimental tasks where the evaluation of objective function values (e.g., characteristic values) is very costly. In other words, the problem solved by Bayesian optimization is to find a parameter (e.g., material composition, structure, process and simulation parameters) with a better objective function value (e.g., material properties) in as few experiments and simulations as possible. In Bayesian optimization, the candidate parameters to be searched for are listed in advance, and the candidate with the largest objective function value is selected from among the candidates by making good use of machine learning (using Gaussian process regression) prediction. Experiments and simulations are performed on the candidates and the objective function values are evaluated. By repeating the process of selection by machine learning and evaluation by experimental simulation, we can reduce the number of times of optimization. On the other hand, Bayesian optimization is generally computationally expensive, and standard implementations such as scikit-learn are difficult to handle a large amount of data. PHYSBO achieves high scalability due to the following features + +- Thompson Sampling +- random feature map +- one-rank Cholesky update +- automatic hyperparameter tuning + +Please see `this reference `_ for technical details. + +Citation +---------------------- + +When citing PHYSBO, please cite the following reference: + +Yuichi Motoyama, Ryo Tamura, Kazuyoshi Yoshimi, Kei Terayama, Tsuyoshi Ueno, Koji Tsuda, +Bayesian optimization package: PHYSBO, +Computer Physics Communications Volume 278, September 2022, 108405. Available from https://www.sciencedirect.com/science/article/pii/S0010465522001242?via%3Dihub (open access). + +Bibtex is given as follows: :: + + @misc{@article{MOTOYAMA2022108405, + title = {Bayesian optimization package: PHYSBO}, + journal = {Computer Physics Communications}, + volume = {278}, + pages = {108405}, + year = {2022}, + issn = {0010-4655}, + doi = {https://doi.org/10.1016/j.cpc.2022.108405}, + author = {Yuichi Motoyama and Ryo Tamura and Kazuyoshi Yoshimi and Kei Terayama and Tsuyoshi Ueno and Koji Tsuda}, + keywords = {Bayesian optimization, Multi-objective optimization, Materials screening, Effective model estimation} + } + +Main Developers +---------------------- + +- ver. 1.0- + + - Ryo Tamura (International Center for Materials Nanoarchitectonics, National Institute for Materials Science) + - Tsuyoshi Ueno (Magne-Max Capital Management Company) + - Kei Terayama (Graduate School of Medical Life Science, Yokohama City University) + - Koji Tsuda (Graduate School of Frontier Sciences, The University of Tokyo) + - Yuichi Motoyama (The Institute for Solid State Physics, The University of Tokyo) + - Kazuyoshi Yoshimi (The Institute for Solid State Physics, The University of Tokyo) + - Naoki Kawashima (The Institute for Solid State Physics, The University of Tokyo) + +License +---------------------- + +PHYSBO v2 is distributed under `the Mozilla Public License version 2.0 (MPL v2) `_. + +Copyright (c) <2020-> The University of Tokyo. All rights reserved. + +Part of this software is developed under the support of "Project for advancement of software usability in materials science" by The Institute for Solid State Physics, The University of Tokyo. diff --git a/manual/v2.0.2/en/_sources/notebook/index.rst.txt b/manual/v2.0.2/en/_sources/notebook/index.rst.txt new file mode 100644 index 00000000..1374b15b --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/index.rst.txt @@ -0,0 +1,14 @@ +Tutorials +================================== +Here, the usage of PHYSBO is introduced through tutorials. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + tutorial_basic + tutorial_Gaussian_process + tutorial_interactive_mode + tutorial_once_mode + tutorial_multi_probe + tutorial_multi_objective diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_Gaussian_process.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_Gaussian_process.ipynb.txt new file mode 100644 index 00000000..2be47fc7 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_Gaussian_process.ipynb.txt @@ -0,0 +1,780 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Gaussian process\n", + "\n", + "PHYSBO performs Bayesian optimization while running Gaussian process regression.\n", + "\n", + "Therefore, it is possible to run Gaussian process regression given training data, and to predict test data using the trained model.\n", + "\n", + "In this section, the procedure is introduced.\n", + "\n", + "\n", + "## Preparation of search candidate data\n", + "\n", + "In this tutorial, the problem of finding a stable interface structure for Cu is used as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references\n", + "\n", + "- S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "\n", + "Save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:41.987250Z", + "start_time": "2020-12-04T06:11:41.537168Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering( X )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Defining training data\n", + "\n", + "A randomly selected 10% of the target data will be used as training data, and another randomly selected 10% will be used as test data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:51.077070Z", + "start_time": "2020-12-04T06:11:51.072211Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ntrain = 1798\n", + "Ntest = 1798\n" + ] + } + ], + "source": [ + "N = len(t)\n", + "Ntrain = int(N*0.1)\n", + "Ntest = min(int(N*0.1), N-Ntrain)\n", + "\n", + "id_all = np.random.choice(N, N, replace=False)\n", + "id_train = id_all[0:Ntrain]\n", + "id_test = id_all[Ntrain:Ntrain+Ntest]\n", + "\n", + "X_train = X[id_train]\n", + "X_test = X[id_test]\n", + "\n", + "t_train = t[id_train]\n", + "t_test = t[id_test]\n", + "\n", + "print(\"Ntrain =\", Ntrain)\n", + "print(\"Ntest =\", Ntest)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Learning and Prediction of Gaussian Processes\n", + "\n", + "The following process is used to learn the Gaussian process and predict the test data.\n", + "\n", + "1. Generate a model of the Gaussian process\n", + "\n", + "2. The model is trained using X_train (parameters of the training data) and t_train (objective function value of the training data).\n", + "\n", + "3. Run predictions on the test data (X_test) using the trained model.\n", + "\n", + "Definition of covariance (Gaussian)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:55.403677Z", + "start_time": "2020-12-04T06:11:55.399915Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Definition of mean value" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:56.279543Z", + "start_time": "2020-12-04T06:11:56.277082Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "mean = physbo.gp.mean.const()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Definition of likelihood function (Gaussian)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.077507Z", + "start_time": "2020-12-04T06:11:57.075581Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "lik = physbo.gp.lik.gauss()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Generation of a Gaussian Process Model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.832602Z", + "start_time": "2020-12-04T06:11:57.828902Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n", + "config = physbo.misc.set_config()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Learning a Gaussian process model." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.218792Z", + "start_time": "2020-12-04T06:11:58.261609Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood 17312.31220145003\n", + "50 -th epoch marginal likelihood 6291.292745798703\n", + "100 -th epoch marginal likelihood 3269.1167759139516\n", + "150 -th epoch marginal likelihood 1568.3930580794922\n", + "200 -th epoch marginal likelihood 664.2847129159145\n", + "250 -th epoch marginal likelihood -249.28468708456558\n", + "300 -th epoch marginal likelihood -869.7604930929888\n", + "350 -th epoch marginal likelihood -1316.6809532065581\n", + "400 -th epoch marginal likelihood -1546.1623851368954\n", + "450 -th epoch marginal likelihood -1660.7298135295766\n", + "500 -th epoch marginal likelihood -1719.5056128528097\n", + "Done\n", + "\n" + ] + } + ], + "source": [ + "gp.fit(X_train, t_train, config)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output the parameters in the learned Gaussian process." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.227479Z", + "start_time": "2020-12-04T06:12:58.221821Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "likelihood parameter = [-2.81666924]\n", + "mean parameter in GP prior: [-1.05939674]\n", + "covariance parameter in GP prior: [-0.91578975 -2.45544347]\n", + "\n", + "\n" + ] + } + ], + "source": [ + "gp.print_params()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Calculating the mean (predicted value) and variance of the test data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.605713Z", + "start_time": "2020-12-04T06:12:58.244883Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.618218Z", + "start_time": "2020-12-04T06:12:58.607794Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,\n", + " -0.97015759, -1.11076236])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of covariance" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.628483Z", + "start_time": "2020-12-04T06:12:58.622345Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,\n", + " 0.00073499])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output mean square error of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.636081Z", + "start_time": "2020-12-04T06:12:58.631461Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.008107085662147708" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Prediction by trained models\n", + "\n", + "Read the parameters of the trained model as gp_params and make predictions using them.\n", + "\n", + "By storing gp_params and training data (X_train, t_train), prediction by the trained model is possible." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare the learned parameters (must be done immediately after learning)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.645968Z", + "start_time": "2020-12-04T06:12:58.639012Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.81666924, -1.05939674, -0.91578975, -2.45544347])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Prepare the learned parameters as a 1D array\n", + "gp_params = np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)\n", + "\n", + "gp_params" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare a model similar to the one used for training as gp" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.666019Z", + "start_time": "2020-12-04T06:12:58.653259Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Definition of covariance (Gaussian)\n", + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )\n", + "\n", + "#Definition of mean value\n", + "mean = physbo.gp.mean.const()\n", + "\n", + "#Definition of likelihood function (Gaussian)\n", + "lik = physbo.gp.lik.gauss()\n", + "\n", + "#Generation of a Gaussian Process Model\n", + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare a model similar to the one used for training as gp" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.016429Z", + "start_time": "2020-12-04T06:12:58.673034Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Input learned parameters into the Gaussian process.\n", + "gp.set_params(gp_params)\n", + "\n", + "\n", + "#Calculate the mean (predicted value) and variance of the test data\n", + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.020795Z", + "start_time": "2020-12-04T06:12:59.017606Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,\n", + " -0.97015759, -1.11076236])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of covariance" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.026523Z", + "start_time": "2020-12-04T06:12:59.023035Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,\n", + " 0.00073499])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output mean square error of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.033497Z", + "start_time": "2020-12-04T06:12:59.027871Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.008107085662147708" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "Note: In the example above, we used the same pre-registered X to make predictions.\n", + "If you want to make predictions for parameters X_new that is not included in X using the trained model,\n", + "you first obtain the mean (X_{mean}) and standard deviation (X_{std}) of the data X and\n", + "then normalize X_{new} by (X_{new} - X_{mean}) / X_{std}.\n", + "Also, the data format for X is ndarray format.\n", + "Therefore, if X_{new} is a single data, it must be transformed to ndarray format.\n", + "For example, if X_{new} is a real number, you should replace X_new as\n", + "X_new = np.array(X_new).reshape(1)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} \ No newline at end of file diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_basic.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_basic.ipynb.txt new file mode 100644 index 00000000..817c2a53 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_basic.ipynb.txt @@ -0,0 +1,590 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic usage of PHYSBO\n", + "\n", + "## Introduction\n", + "\n", + "In this tutorial, we will introduce how to define the simulator class and find the minimum value of a one-dimensional function using PHYSBO.\n", + "\n", + "First, we will import PHYSBO." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.091028Z", + "start_time": "2021-03-05T04:50:29.600019Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the search space\n", + "\n", + "In the following example, the search space ``X`` is defined as a grid chopped by ``window_num=10001`` divisions from ``x_min = -2.0`` to ``x_max = 2.0``.\n", + "Note that ``X`` must be in ``window_num`` x ``d`` ndarray format (``d`` is the number of dimensions, in this case one). In this case, ``d`` is the number of dimensions, in this case two, so we use reshape to transform it." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.097211Z", + "start_time": "2021-03-05T04:50:30.092637Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the simulator class\n", + "\n", + "Here, we define the simulator class to set as the objective function.\n", + "\n", + "In this case, the problem is to find the minimum $x$ such that $f(x) = 3 x^4 + 4 x ^3 + 1.0$ (the answer is $x=-1.0$).\n", + "\n", + "In the simulator class, we define the ``__call__`` function (or ``__init__`` if there are initial variables, etc.).\n", + "(If there are initial variables, define ``__init__``.) The action indicates the index number of the grid to be retrieved from the search space, and is generally in the form of an ndarray so that multiple candidates can be calculated at once.\n", + "In this case, we choose one candidate point from ``X`` as ``action_idx=action[0]`` to calculate only one candidate at a time.\n", + "Since **PHYSBO is designed to find the maximum value of the objective function**, it returns the value of f(x) at the candidate point multiplied by -1." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.104491Z", + "start_time": "2021-03-05T04:50:30.099622Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action ):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting policy\n", + "\n", + "First, set the optimization `policy`. \n", + "\n", + "Next, set `test_X` to the matrix of search candidates (`numpy.array`)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.117205Z", + "start_time": "2021-03-05T04:50:30.108470Z" + } + }, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `policy` is set, no optimization is done yet.\n", + "Execute the following methods on `policy` to optimize it.\n", + "\n", + "- `random_search`. \n", + "- `bayes_search`.\n", + "\n", + "If you specify the `simulator` and the number of search steps in these methods, the following loop will be executed for the number of search steps.\n", + "\n", + "i) Select the next parameter to be executed from the candidate parameters.\n", + "\n", + "ii) Execute `simulator` with the selected parameters.\n", + "\n", + "The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step.\n", + "See the section \"Searching for multiple candidates at once\" for details. \n", + "\n", + "Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYSBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the \"Running Interactively\" section of the tutorial.\n", + "\n", + "### Random Search\n", + "\n", + "First of all, let's perform a random search.\n", + "\n", + "Since Bayesian optimization requires at least two objective function values to be obtained (the initial number of data required depends on the problem to be optimized and the dimension d of the parameters), we will first perform a random search. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.149378Z", + "start_time": "2021-03-05T04:50:30.120660Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "\n", + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When executed, the objective function value and its action ID for each step, and the best value up to now and its action ID will be printed as follows.\n", + "\n", + "````\n", + "0020-th step: f(x) = -19.075990 (action=8288)\n", + " current best f(x) = -0.150313 (best action=2949) \n", + "````\n", + "\n", + "\n", + "### Bayesian Optimization\n", + "\n", + "Next, we run the Bayesian optimization as follows.\n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). \n", + "- `score`: The type of acquisition function. You can specify one of the following\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "The hyperparameters are trained at the specified interval. \n", + "If a negative value is specified, no hyperparameter will be learned. \n", + "0 means that hyperparameter learning will be performed only in the first step. \n", + "- `num_rand_basis`: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.482575Z", + "start_time": "2021-03-05T04:50:30.151250Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS', \n", + " interval=0, num_rand_basis=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking the results\n", + "\n", + "The search result ``res`` is returned as an object of the ``history`` class (`physbo.search.discrete.results.history`). \n", + "The following is a reference to the search results.\n", + "\n", + "- `res.fx` : The history of evaluated values of simulator (objective function).\n", + "- `res.chosen_actions`: The history of action IDs (parameters) when the simulator was evaluated. \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.\n", + "- `res.total_num_search`: Total number of simulator evaluations.\n", + "\n", + "Let's plot the objective function value and the best value at each step. \n", + "`res.fx` and `best_fx` should range up to `res.total_num_search`, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.747272Z", + "start_time": "2021-03-05T04:50:32.484125Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.897286Z", + "start_time": "2021-03-05T04:50:32.754938Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD3CAYAAADv7LToAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAp40lEQVR4nO3deXDkZ33n8fe3b90zkua0RzPjA7AxGOzBB2BsbHMkBJJyKnFBWEgKMJvKVkLNVrZqQ4VcewaTbLHxkji3QxYvSbFZAwXB9mLHxh6D7QDxwYJtPJ6x55BGmtHV9+/ZP379a0mtbvWhnpl+NJ9XlcpWS9N6pNF89NX3ucw5h4iI+C12tgcgIiLrpzAXEdkAFOYiIhuAwlxEZANQmIuIbACJs/FBx8fH3Z49e87GhxYR8dYTTzwx5ZzbUu9tZyXM9+zZw+OPP342PrSIiLfM7GCjt6nNIiKyASjMRUQ2AIW5iMgGoDAXEdkAFOYiIhuAwlxEZAPoapib2X4zO2Bm+7v5vCIisraurTM3s13AbufcNWb2FTO7xzn3XLeeX86MIHBMzec5cipXecmyZSjNe163AzOr+2emFwoAjA6kWvoYU/N5DrxwgkPTWXaMZNgxkmHnpj62j2RIxlurL5xzvDC1wGMvTJOIG5fuGOairYNkkvEVn8vR2RyHphc5mS0ynyuxUCgxlyuRL5ZXPWc6GSediNGXipNJxBlIJxjpS7KpP8lIX5J0Isb0QoHJuTyT83km5/KkEzFG+lNs7k+yqS9FOhkjVyyTKwZki2WyhXLl9TLZyuOBcyTjRjIeIxGPkYgZpXJAsewolgNKgaMcOJyDwDmcc8RixmA6wVAmwWA6yUA6Tr4UVD+n+XyJYik8ztoMDIjFDDOImxEzIxYz+lNxhjNJhvsSDGeSpBIxTmWLnFwscnKxwKlskVLgCAJHUPn4/ak452/u5/zNfewa7Wdzf5JT2SKHZ7K8fDLLKyezxMzYNpxm63CGrUNphtJJJufzHJvNcWw2x/G5PIFzpOIx0okYqUSMmBmBc5QDKAcB5cBRChzFsgu/HoED58CMmIFhxGOQSsTIVP6u0ok4fak4A6kE/enwv4m4kS2EX+/FQplsoUSuGFT/HvKlYNXnWO8o8NGBFHu3DLJ3bIDzNvcRjxnz+RIvTi1w8MQih2cWSSdijA6mGR9IMTqYIm7G1HyBqfk8J+bznMwWSSVi9CXj4Usqzq7Rfq6Y2NzS93k7urlp6J3A3WZ2JbAVuA6ohrmZ3QbcBjAxMdHFD3t6BJVvrFSi9V9evv7UEe569CB/85GricfqB18vc85x8x8+yAuTC6ve9ujVJ/id972WRE3YPvL8FL/yt0/igP926xu44dVb6z7vo8+f4N5nj/Ho8yf4wdG5uh8/ETM+9rYL+LfveNWqjwOQK5b5yveP8K3npnjk+SmOzeZXvD0eMy7cMsD2kT5enlnk0EyWQilo+Pku/9mkY/1bl4gZpWDjfcHW+n5IxWMMZhLVwmU93nf5zp4P863Ad4FPEYb2u5e/0Tl3J3AnwL59+7r2nXB8LsfJxSIXbhnsaoDu/+J3+cYzx7j5km289/KdvO1V46QT8TX/zEM/muKR50/w5EszvGnPaNfGcqbkSwEvTC7wE5dt55YrzmfHSIbtIxn+7KEf88cPPs8rJ7P80QeuYCCdwDnHXz/yIr/31We5YHyAeMz4pb/6Dr9208X86o0XE6v8Xfzo2By/+5VneOhHU6QTMd60Z5Rff9dO3nzhGBduHeT4bJ4jp8Lq7sAL03zuged58uAM//39b2TrcKY6tod+NMlv/sNTvHhikbGBFNdeOMabLxzn2gvHcM7x7JE5nj0yy7NHZjk2l+PirUPcfMk2Jsb6mRjtZ3N/qlLVJhjMJFb9XTrnKJQDcsWAfKWKns+XOLVY5FQ2fMkVy4wOptkymGbLUJrxwRTFsuPkYoGTleo2VyxXK7BMMk4mGVZlmUpllknGMYNSEFafhXJYkSZiMVLxGIm4kYhbtZo2AzOjHDjm82EFPp8L/5tOxKqfz2A6QSoew1U+F0dUcYb/DRyUA0e2UGY2F34+s9kihVLASOW3ik39SYb7kqTiMWJG9ePP5Uu8PJPl0PQih2eyHJ/LMz6Y4vzNfezc1Md5m/pwEFbgs3mOz+WYy5XYMpRm61CmWrHHzSiUAwql8PMOAkc8ZksvFn7uiVjl6xCz6m+DbtnnUCiHf0f5UlD9jWexUGYhX2KxUKZYDqp/B/2ppa99OhknU6nq632Na78fJufz/HhygRdPLPDjqUVOZQvsGu1nz9gAu8f62TXaT6EUML1Q4MR8gemFAmXnGB9IMT6UZmwgxab+FMXy0jizhTLp5No50inr1k1DZvZRIHoZAF7nnPuzeu+7b98+163t/Lf+yaM89uNpBlJxXn/+Jt4wsYk3XzjGdRfXPb6gZbf8j2/x46mwQp1ZLDKUSfBTr9/J77zvtQ2r9Y/+9Xe479nj3Pa2C/iNn7xkXR//bDg+m+Oq/3Q/v/czl/Gvrtm94m1/+9hBfvMfnuKSHcP88Qev5LP3/4i/e+Iw77h0G3946xuIm/HJf/gXvvTky1z/qi38zvtey1898iJ/c+Ag/ak4n7j5VfzC1RMr2iD1fOnJw3zyfz/FQDrBZ9//Bi7aMsjvffVZvvy9V9gz1s9vv++1vO3iLdUfFiLnEjN7wjm3r97bulmZ3wu82zn3lJn9V+CuLj53QycXi7xm+xBX7R3lu4dO8qf/9AKfe+B5Dvz7m9g+kmn+BA1kiwFX7h7lcx+8gm89N8XnD7zEF779Ej+/73ze2OBXpKOzOQDue+ZYT4b5d16cZiCV4NKdw3XfPpsrATCcWf1t8QtX72bnSB+/8j+f5PpPf5PAwa/edDGfuGmpCv/Mz13Ovt2j/PY9T3PD7Q8QM3j/VRPsf8erGBtMtzTGW644n8vOG+GXP/8EH/yzx+hPJSiUAj5x88X86+svbPrDQORc1bUwd84drKxkeQz4snPu6W4991qKQcClO4b53Z++DIB7nznGx+56nGOzuXWFeb5YJpOMkYzHuOHVW9k6lOG+Z49x5FSONzb4M0dP5ehLxnlhaoHnjs9z0dbBjj9+twWB45c//wSXn7+JP//FN9V9n9lcEYDhTLLu29/+mq188ePX8h+++gwfvnYPP/G6HSvebmZ84OoJLjtvmC98+xAfunY3l+yo/4NjLa/aNsQ9/+at/PY9TzOzWOCT77mUveMDbT+PyLmkq6cmOuduB27v5nM2UywHpJZNlo0PhisqTizkG/2RlkS9z8jOTeEPhldOZuu+f6EUMDVf4NZ9u/hfjx/i3meOnbYwL5UDfvZzj/CrN13MTZdsa+nPfPfwSabmC8wsNp7AmYsq877G3xaXnTfC3bddu+bHev35m3j9+ZtaGlcjA+kEn/65y9f1HCLnEu83DRVLjkR8qX86Xvl1fmp+fbPO2WJ5xa/0I31J+pJxjpzK1X3/43Ph42+c2MRl5w1z37PH1vXx13JiocD3Dp/ioR9Ntfxn7q+MJ2ql1DObDSvzoQaVuYj0Lv/DvBysWJs8FlXm6wzzXDGgL7UU5mbGjk0ZjpyqX5kfrYT8tpEM77hkO0++NMPk3Pp+O2gkWh4VTdC24v5njwNLgV1PtTJXmIt4Z8OFeX8qQV8yzon5zoPUORdW5jWrVnaO9DWszKPJzx0jGW6+dCvOwTd/cLzjMaxlphLmL55oLcwPzyzyg6NzDKTinFojzKOe+VCdCVAR6W0bIMxXb+wZG0xxYh2L+/OVjSa160F3jGQ4crJBmFdCfvtwhkt3DHPepj6+8czpabVMV/reh2eyFMuNN8VEoqr8J163o7o2t565XJF4ZZegiPhlA4R5QKJmzfHYYJqpdVTm+WIYkH21Yb6pj+NzOUp1AvToqVy4tbsviZlx8yVbefi5SbKF+sG5HlFlXg4ch2fqt32Wu+/ZY1ywZYDLzx8BltoptWazJYYyiYbb9kWkd3kd5tGW+9rzPMYHUuvqmWcrlWvtmuadIxkCB8fq9MKPzubYMZKpBuE7Lt1Orhjw8HOtT1K2anphqVXyYpO++Xy+xGMvTHPzJdsY7gt74VE7pdZcrqh+uYinvA7zYhBWyPXbLJ1X5lEboi+18nl3bOoD4Eid5YnHZnNsW7b9/OoLRhnKJLivTqvlxHyef3z6KP/hK8/w03/0MFf83r1NQ3m5mcVC9eiCZpOgD/1wkkI54KbXbK0GdaO++WyupH65iKe8/pdbKodHESTjq9ssJ+YLOOc6ahlUK/PE6soc4JU6k6BHTuW4cvfSztBos9H9PzhGOXD88Ngc//j0Ub7x9DGeOTILhD+EXn/eCNMLBb7xzFFue9uFLY1veqHA+Zv7mJ4vNJ0Eve/Z44z0Jbly92a+d/gk0HhFiypzEX95HebR5F8iVlOZD6QoBY7ZbImR/vbDKdegzdKoMnfOcXw2v2rH6Tsu3caXv/cKb/4v93NsNo8ZXDmxmV9/16u5au8orz9/hHQizs1/8CAPP3ei5TCfWSwwOhAeHPXiicWG71cOHN/8f8d5+6u3kIiH/XxovNZ8Nlti91h/S2MQkd7idZgXKmGerGmzRBuHTizkOwzz8Hlrwzw6T7p2eeL0QoFCOWD78Mowf/urt/Ca7UNsH8nwiZu3c9Ml4bEAtd560Th3f+clcjUblRqZXiiwfThDXyrO9w+favh+3z00w/RCobpLNKq616zM+1SZi/jI7555pc2SWtVmibb0dzYJulSZr/7y7BzpW7Wl/8iyZYnLDWWSfP0Tb+Ovfukq3n/VRN0gB7ju4nFyxYAnD860NL6ZhQKbB1LsHR/g8MxiwzO773v2OImYcf2rwxMko6BWz1xk4/E6zKMlgrWrWaIbbzrdOLQ0Abq6Sg53ga6szI9VNgx1erDX1ReMkYgZD7W48mW60mbZMzZA4ODQTP1Wy/3PHuOqvaPVijyTjJNKxOquZonOy1bPXMRPXod5sUGYr/d8lkYToAA7RvpWbemvVuYdhvlgOsEbJzbxrRbCPLyGLGBTf5I9lZME662EOTS9yA+Pza86iGs4k2Q2u7pnPl/po6syF/GT12FeKNVfzbK5f33nszTqmUO4omVqvkC+tLQZ6NhsjpjBlhbP7K7nrRdt4V9ePlXdENRItPtztD9VPRa23iRo9IPh+leNr3h8uC9Rt2dePf5WPXMRL3kd5o0q81RlJ2ana82rbZY6YR6taDm6rNVy9FSOLUPpuvdWtuqtF4/hHDzy/Ik13y8K+80D4SXCQ5lE3cr8wAsn2DKU5sItK4/hHc4k67ZZ5ta4mEJEet+GDHOobBxaZ5slXWcCdEe01nzZGS1HZ3OrJj/bdfn5mxhKJ3j4uck13y86MXF0IIWZsXd8YNVac+ccj75wgmsuGFu1zn6kL7l2Za6euYiXPA/zqM2y+tMYH+j8fJZ8sYwZpOvc9RmF+fK++dFT67vVCCARj3HNhWNNt/9Hl0tEraQ9YwOrdoG+eGKRY7N5rrlg9aXSw33JuuvM56o9c4W5iI88D/OoMl+9y3M9JyeGx9/G6+4e3TFS2Th0qruVOYTrzQ9NZzm4xq7O5ZU5wJ7xAV45mV3Rwz/wQtiqueaCsVV/fjiTqLs0MarW17plSER61wYJ80Ztlk575kHdNeYQLlfc3J+srjVfyJeYy5XYts7KHOCtF4eTlWvdIDSzUMCM6m7OveP94fLE6aXfFB59/gRbh9JcUOfezKjN4pxb8fhcTrcMifhs44b5QJqZxWLd42qbqb3/s9aOZZdULL+UYr0uGB9g50iGh9cI8+nFApv6ktWDtnaPrVye6JzjQIN+OYRtllLgqvMCkVktTRTxmudhXtkBmlgdWtHFzjOLjW/WaaT2/s9aOzdlqpX5sei6uC60WcyMt1w0ziPPT1EOXN33mVkosrnSYgHYG4V5pTXzwtQCx+fydVssQMOTE+dyRfqS8bo/GEWk93n9L3ftNsvS+SztCtssrVXmjbbyd+qtF48zmyvxLy/XP3NleqHAaP9SmG8eSDHSl6xOgkb98msvbBDmlZ547cah2WxJ/XIRj22IMK+3vntsoPONQ+GBV42/NDs2ZTiVLbJYKFXbLOtdzRJ5y0Vh3/zhH9VfojizWFhRmUM4CXqwsnHowAvTbBtOs6fB6YcjDS6omMsX1S8X8ZjXYV5ocJ45LB221cnyxGanF+6srGh55WSOY7M5hjMJ+lPdqWrHB9NcuGWg4WmItZU5wN6xfn48tRCuL3++cb8cGp+cOJstacOQiMe8DvNi5bTAVIMJUOiwMi81mwBdWmt+pAtrzGvtGRvgpenVW/Sdcw0r81dOZXnmyCxT83mubdAvh8YnJ87lVJmL+MzrMC8FjXvmI5UVH530zLOFZhOg0SUVYWW+vVKpd8uu0X4OTS+uWj44ny9RLDtGB1aG7p6xAZyDv3v8MFB/fXmk2maprcxzJZ3LIuIxr8M8Ws2SqNNmicWM0Q4vdm42AbptOIMZvHIqG+7+HO78gK16Jkb7WSiUqxuEIjOVi5w396+uzAG+9ORhtg9n1rwtKFp6WLsLNKzM1WYR8ZXXYR5dypCM1f80xgZSHR2D22wCNJWIMT6Y5tB0lsn5fNdWskQmRsMwrm21VE9MHKjtmYdhPpsrce2FjfvlEP4W05+Kr2qzhD1zVeYivvI6zIvlgETMiMXqh9f4YLrDpYnNr2/bOZLhe4dP4hxdb7NElXVtmFfPZakJ85H+JJsr1+PVO4+lVnim+VKY54plCuVAlbmIx7wO81Lg1tzk0snJic45cqVgzQlQCNeaP3d8HoDtI91ts5y/OQzzQ7VhvrB0lnmtqNWyVr88MtK38hhcnWUu4r+2w9zMEmb2a2Y2WfP4fjM7YGb7uze8tRVKQd1liZGxgXTb57MUy45y4NZss0C41jzSjd2fy/Wl4mwdSq9usyzUr8wBLts5wgXjA9UWzVrCCyqWeuY6y1zEf538600AjwHfjx4ws13AbufcNWb2FTO7xzn3XLcG2UixHDStzBcK5ZZvvYdwWSLUv2VouZ3LWis7utxmgbBvXq/NEo9Z3dD95HsuIVcsr9kvjwxnkitOfayemKieuYi32q7MnXM559wBYPm6uXcCd5vZlcBW4LoujW9NzcI8Op+lnaNwc4XWwjyqzFOJWLVf3U0To/0rTkIEmF4osrk/VTewM8k4m+q0X+qpbbPM6ZAtEe81DXMz+5CZ3bfspV4bZStQAD4F3AZsq30HM7vNzB43s8cnJ9e+TadVxbIjWeeQrcjSxqHWWy1r3f+5XFSNbx/OtFQNt2vXaD+vnMpWV+xA2DOvXWPeieGa24bUMxfxX9NSzDl3F3BXk3ebBO4APgoMAKvOcHXO3QncCbBv3776RwK2qZU2C7S3CzRqszSbAN1Zqcy7vSwxMjHaj3Pw8sls9eLm6cXCqjXmnRjOJJjLlwgCRyxmqsxFNoBurWa5FzjsnHsKuAV4tEvPu6ZiOWi4xhzCpYnQ3vks2WqbZe0vzdahDPGYdeVSinomKssTl986FFbmXQjzviTOwVw+DHH1zEX815Uwd84dBA6Y2WPAnHPu6W48bzPN2ixR8LXVMy+2VpnHY8bP79vFu167qqPUFdGqlOXLE+udy9KJ4Zot/XO5EvGY0Z9qbZJYRHpPx79XO+durnn9duD2dY+oDc3aLP2pOJlkrK2eeXQDT7qF1S//+ZbXtfy87doymCadiFVXtASBY2axWHeNebuqJydWeuWzla38p6P3LyJnhtebhpqFuZlV1pq3U5lHE6Bn90sTi9mK5YlzuRLlwHWpMg9/hp9aVpmrXy7iN8/D3NU9/na58cEUU220WfItToCeCWGYh8sTl85lWX9fe+nkxKWeufrlIn7zPMyDuicmLjc22N4u0GyL68zPhOVH4VZ3f56GNosqcxH/eR3m4Xb+tT+FsTaPwW11AvRMmBjtZz5fYmaxWD2XpSthXjMBOptTZS7iO6/DvBQ0b7OMDaaZXiisuuihkWyLm4bOhOVH4TY6/rYTQ+kEZitXs+iWIRG/eR3m4QTo2m2W8cEUhXJQXVPdTFSZpxNn/0szsewo3Jk1DtlqVyxmDKUT1QsqZrPF6qSoiPjp7CfWOhRLAYmmlXl7u0BzpTLpRKzhGeln0q5lR+FOLxZIxWMMdGkteLSlPwgc8wVV5iK+8zrMC+W1zzOH9s9nyTW5//NM6kvF2TKU5qUTYWW+eSDZtbXgw5kkp7JF5vIlnNPxtyK+8/pfcLEckGq6miWszFu9Pi5XbH4xxZkUrTUfSCe6MvkZiU5OnMtpK7/IRuB1ZV5qsmkIls5nafX6uGyT+z/PtCjMZxa7cy5LJLqgIlprrp65iN96J7U6EJ7NsvanEFWzU3OtVua902aBMMxfOZXl2GyuK5OfkeHMyspcPXMRv3kb5s45CuWAZJOJylQixmA6seo2+kZypaDnwtw5ODyT7cq5LJHhvrBnPlu9Mk5hLuIzb8O8FITrxpu1WQAG0wnm8y2GeaHH2ixjS3d6drMyH+lLslgoV5c8ageoiN96J7XaVCpXwryF9eBDmUT1AoZmcqVyz02ARka7eD1dtHrl8Mnw7BfdMiTiN2/DvFAOd2q2Upm3E+bZHlqaCEtH4UJ3K/MovA/PhKcyqjIX8Zu3YV6shnnzddeDmWR1oq+ZXKm3wjwWM3ZVqvNurmYZqYZ5lr5kvKUfiiLSu7z9F1xstzJveTt/b02AwlKrpZvrzKPK/OWZrKpykQ3A3zAvtT4BOtxOz7zHJkBhKcy7us68snrl6GxO/XKRDaC3UqsNxaCNNks60VabpZcmQAH27dnM9uFMdTdrN0SbhMqBU2UusgF4+684arM0OwIXwg0xuWLQ9Jq5UjmgWHY912b5qdfv5Kdev7OrzzmyrBrXGnMR//lbmVfaLM1OTYSllRrzTVotuVJv3P95JvQl4yQqG65UmYv4z9vUKrSzmiUdhlWzvnkv3TJ0uplZtVeunrmI/7wN81KbbRaAuSa7QKP7P9PnQJjDUqtFlbmI/7wN82IbO0Cj3Y7NKvN86dypzGHp66KeuYj/PA7zsDJPtHAjULUybxLm2ULv3P95JlTbLKrMRbznbZi3s51/sFqZr91myVUq83NhAhSWKnL1zEX8521qVZcmtnjQFsB8k12g59IEKCyFuHrmIv7zNsyrpya2sTSxeZslqszPlTBXz1xko/A2zNtZmphOxEnFY8w2bbOcYz3zTFSZK8xFfOdtmLdz0BaE1XnTTUOFc6tnvnUojVl3z3wRkbPD22ZpsdR+mDfdNFQ6t9os7718JxdsGWDLUPpsD0VE1qmjEtTMPmtmD5rZXyx7bL+ZHTCz/d0bXmNL18Y1b7NAuKKl6WqWc2wCNJOMc+Xu0bM9DBHpgrbD3MwGgL93zl0PHDOz68xsF7DbOXcNcKOZXdTtgdZqZ2kiwFA62XQ1y7m2zlxENo62w9w5t+Cc+6fKq9NAHngncLeZXQlsBa6r/XNmdpuZPW5mj09OTq5nzEB755lD622WVDxGvIWNSCIivaRpEprZh8zsvmUv+yuPXwxc4Zz7NmGAF4BPAbcB22qfxzl3p3Nun3Nu35YtW9Y98GI5IGa0HLxDmWRLSxPT58jkp4hsLE0nQJ1zdwF3LX/MzHYCvw98uPLQJHAH8FFgAJjq7jBXa3Y2ea2hTKLp0sR8j93/KSLSqk7L0M8AH3fOzVZevxc47Jx7CrgFeLQbg1tLsexaOjExMpRJMJ8v4Zxr+D65YnDOTH6KyMbSyQToVcANwBfN7AEze59z7iBwwMweA+acc093eZyrFMtBSycmRoYyCZyDhcpa8nqyPXj/p4hIK9peZ17pke+o8/jtwO3dGFQriuWgpRMTI4Pp6OTEYvWyilq9eP+niEgrvC1DCx30zGHtq+PCCVCFuYj4x9swL5VdSycmRqIwn10jzHOlQBOgIuIlb8M8XM3SeptlqIUzzfPFMn3qmYuIh7xNrrBn3k5l3vy2oWxRSxNFxE/ehnmh7NpezQJrX1CRK2oCVET85G2Yl8oBqbbaLEurWRoJlyYqzEXEP96Gebs7QPuTcczWbrPkSoG284uIl7xNrkLZkWgjzGMxYzDd+LCtIHAUStoBKiJ+8jbMi6X22iwQXpPWKMzPtYspRGRj8TfM22yzAJXKvH7PPFcMzzJXZS4iPvI2zEuBazvMo8O26skWz637P0VkY/E2uQql9ivztS6oyBXVZhERf3kb5u3uAAUYzCTXaLMozEXEX56HuSpzERHwOMxL5c565nMNeuaaABURn3kb5oVyQDLRXptlKJ2gUArIl1ZfUJEtaAJURPzlbXIVywHJNg7agrUP29I6cxHxmZdhXg4cgaOjNgvUv6BCbRYR8ZmXYV4sh8Hbdptljco8Wmeus1lExEdeJlcU5qkOdoBC/ZMT85UwV2UuIj7yNMwd0Hmbpd6KlqUJUIW5iPjH0zAPK/NEBwdtQeMJ0HjM2v4BISLSC7xMrkKp0jNvt82yxj2guaKOvxURf3kZ5qUgbLO02zNfutS5/gSo1piLiK+8TK/qapY2wzwZj5FJxuqenJjTZc4i4jEvwzxqs7TbMwcYTNc/bEthLiI+8zLMO12aCDCcSTDbYNOQ2iwi4isv06vTpYlQuaCibpiXNQEqIt7yMsxL1Z55+22WoQZnmmfVZhERj3kZ5oXqdv72hx/eA9qozaIwFxE/dRTmZvY5M/ummd2+7LFbzewxM/t094ZXX7XN0uapidD4HlBNgIqIzzqtzH/LOfd2YNTMLjCzfuC9zrmrgUEzu7F7Q1yt04O2IGqzNAjzDip9EZFe0FF6OeeOm1kfsA04BVwLfNXMJoDXANd3b4irdbrOHMJdoPP5EuXKxqNIrlimL6XKXET81DQNzexDZnbfspf9ldD+IfCSc+4EsJUw1P8A+DBhyNc+z21m9riZPT45ObmuQUdtlk6XJgKrWi2aABURnyWavYNz7i7grtrHK4F+h5m9BZgEPg38OyAPTNV5njuBOwH27dvnat/ejk4P2oJlF1TkS4z0JaOxaQJURLzWdmlroQnnnAPmgEHgUWAGuA+4BXikq6Ossa42Szo6OXFpeWK+sqNUm4ZExFedpNcI8Fkz+yYwDtzrnFsA/hT4DnAp8LXuDXG1Tk9NhPqHbeUqF1NkEqrMRcRPTdsstZxzJ4GfqfP4F4AvrH9IzXV6aiLUvwe0ev+nJkBFxFNe9hWKpfXtAAWYXdZmOZktALoyTkT85WeYV3rm8VjnE6DL2yxfevJl4jHjTXtHuzNAEZEzzMswL5QdqXgMs/WH+UK+xBe+/RLvvmw7523q6+o4RUTOFC/DvFQOOmqxQNhKiceM+XzYZvm7xw8xlyvxkbfu7eYQRUTOKC/DvFgOOjpkC8DMqodtlQPHXz7yIm+c2MQVE5u7PEoRkTPHyzAvlB2JDg7ZigxlwjC//9ljHDyxqKpcRLznZZgXywGpDtsssHTY1p8//GPO29THu1+7vYujExE589peZ94LSutoswAMpRN899BJpubz/MZPvoZEB+vVRUR6iZcpViy7jnZ/RoYyCabm8/Sn4tz6pokujkxE5OzwMswL5WDdYQ7w8/t2VQ/bEhHxmZdhXlzH0kSAkb4kZvBLb9nTvUGJiJxFXvbMi+uszH/xLXu59sIxdo8NdHFUIiJnj6dh7tZVme8dH2DvuIJcRDYOj9ssXg5dROS08DIRFeYiIit5mYjF0vraLCIiG42fYR6oMhcRWc7LRAy383s5dBGR08LLRAzbLF4OXUTktPAyEYvlgIR65iIiVV6G+Xq384uIbDReJmKp7Eit49REEZGNxstEXO/ZLCIiG413YR4EjlKwvpuGREQ2Gu8SsRgEAGqziIgs410ilsoOQG0WEZFlvAvzYjmszLWaRURkiXeJWFCYi4is4l0iFtVmERFZxb8wL6kyFxGp1XEimtnlZva1Za/vN7MDZra/O0OrrxQozEVEanWUiGYWAz4CJCuv7wJ2O+euAW40s4u6N8SVCqWozaIwFxGJdJqIHwP+ctnr7wTuNrMrga3AdesdWCNLq1nUMxcRiTS90NnMPgR8aNlD/xfIOOf+2awaqFuB7wKfAm4D3l3neW6rvI2JiYmOB6yliSIiqzVNROfcXc65m6MX4BTwDjN7ALjSzH4ZmATuAD4JpIGpOs9zp3Nun3Nu35YtWzoe8NJqFoW5iEik7UR0zt3hnLvWOXcD8IRz7nPAvcBh59xTwC3Ao90d5pKoMk8l1GYREYl0pbx1zh0EDpjZY8Ccc+7pbjxvPVGY66AtEZElTXvma6m0XaL/vx24fd0jakI9cxGR1bxLxEKlZ642i4jIEu/CvKTKXERkFe8SUW0WEZHVvEvEqM2S0KYhEZEq78I8OmgrpcpcRKTKu0TUQVsiIqt5l4jaASoispp3iVgo6aAtEZFa3oV5sRyQiBnLDvkSETnneRnmarGIiKzkXSoWy04tFhGRGh6GeUAq4d2wRUROK+9SMeyZezdsEZHTyrtULJYdSR2yJSKygodhrglQEZFa3qVisRxoK7+ISA3vUrFYdjpkS0SkhodhrjaLiEgt71JRYS4ispp3qVgsO/XMRURqeJeKYWWunrmIyHLehXmhFJBQZS4isoJ3qailiSIiq3mXiqVAB22JiNTyLsyLJa1mERGp5V0qFspOPXMRkRrepWLYM1ebRURkOe/CvKRNQyIiq3iXiuERuN4NW0TktPIqFZ1zFFSZi4is4lUqlgIHQDKmnrmIyHIdhbmZHTWzByovV1Ye229mB8xsf3eHuKRYDgDUZhERqdFpKn7dOXdD5eUJM9sF7HbOXQPcaGYXdXGMVcVypTJXm0VEZIVOU/FtZvaQmX3GzAx4J3B3pUrfClzXtREuE1XmWpooIrJS0zA3sw+Z2X3LXvYDn3DOXQckgJ8kDPAC8CngNmBbnee5zcweN7PHJycnOxpsFObaNCQislKi2Ts45+4C7mrw5q8CbwAmgTuAjwIDwFSd57kTuBNg3759rpPBFktqs4iI1NN2KprZqJndWHl1H/AccC9w2Dn3FHAL8Gj3hrikGFQmQNVmERFZoZMSdxb4gJk9CFwC/B/n3EHggJk9Bsw5557u5iAjSz1zVeYiIss1bbPUcs6VCNsptY/fDtzejUE1ojaLiEh9XqXiYCbBe163g+0jmbM9FBGRntJ2ZX427R0f4I5fuOJsD0NEpOd4VZmLiEh9CnMRkQ1AYS4isgEozEVENgCFuYjIBqAwFxHZABTmIiIbgMJcRGQDMOc6OsBwfR/UbBI4uI6nGKfOyYw9TOM9vTTe00vjPb3aGe9u59yWem84K2G+Xmb2uHNu39keR6s03tNL4z29NN7Tq1vjVZtFRGQDUJiLiGwAvob5nWd7AG3SeE8vjff00nhPr66M18ueuYiIrORrZS4iIssozEVENgDvwtzM9pvZATPbf7bHUo+ZJczs1ypr6aPHen3MnzWzB83sLyqv9/R4Aczsc2b2TTO7vfL6rWb2mJl9+myPrR4zu9zMvlb5fx++vkfN7IHKy5W9PmYz+2Dle/geM+vr5fGa2cSyr+0hM/uZbozXqzA3s12Ei+avAW40s4vO9pjqSACPAd+H3h+zmQ0Af++cux44ZmbX0cPjXea3nHNvB0bN7FLgvc65q4FBM7vxLI9tBTOLAR8Bkr3+/bDM151zNzjnbgCO08NjNrMM8F7g7cAthJtwena8zrmXln1tnwKeoAvj9SrMgXcCd5vZlcBW4LqzPJ5VnHM559wBIJpZ7ukxO+cWnHP/VHl1GngzPTzeiHPuuJn1AduAS4CvmtkE8Brg+rM6uNU+Bvxl5f97+vthmbeZ2UNm9hl6f8xXA1ngH4FP0fvjBcDMLgBepkvj9S3MtwIFwr+w2wj/Ifc6L8ZsZhcDVxB+T/gw3gngh8BLQAo4BfwB8GF6aMxmth04zzn3z5WHvPh+AD7hnLuO8DfN7fT2mHcAA8C7gL348zW+FbibLo3XtzCfBO4APgmk8eP8hZ4fs5ntBH4f+DgejBfCX1WBCcLfgF4F/EfgT4A8vTXmnwXeYWYPAFcC8/jx9b2n8r9fBYr09pgXgAedcwHwIBDQ2+ONvBN4gC79m/MtzO8FDjvnniLsjT16lsfTCh/G/Bng4865WTwYr4UmXLhJYg74LjAD3Ec45kfO4vBWcM7d4Zy7ttIffQK4h97/+o4um3fYBxyjt8f8BGEwArwWOEBvjzdqsRx1zpXo0r85r8LcOXcQOGBmjwFzzrmnz/aYmun1MZvZVcANwBcr1ePl9PB4K0aAz5rZNwknu74M/CnwHeBS4GtncWxr6vXvh4pZ4ANm9iDhfMTn6eExO+deAb5jZo8ASefcg/TweCt+mvD7tmvfE9oBKiKyAXhVmYuISH0KcxGRDUBhLiKyASjMRUQ2AIW5iMgGoDAXEdkAFOYiIhvA/wcvthzl6qMzpgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.056830Z", + "start_time": "2021-03-05T04:50:32.899063Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD3CAYAAADv7LToAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAARoElEQVR4nO3dX4xcZ3nH8e+zHm8cnMQlxE4clI2DAiWpSqp4BaGVSbDAoBYoSi+QaBUuCEa9qEB7wQ1SuOpFweEikoVqJJCsqliIm4ZGoUpEYpDIGmyBkC2kCKl1mhLCmoBtQpL5c55ezMzu7OzaG++ezc47+/1IKzxnNmd/s6x/ev3MOe9GZiJJKtvERgeQJK2dZS5JY8Ayl6QxYJlL0hiwzCVpDDQ24ovecMMNuWfPno340pJUrFOnTp3LzJ3LPbchZb5nzx5Onjy5EV9akooVEWcv9ZxjFkkaA5a5JI0By1ySxoBlLkljwDKXpDFgmUvSGKi1zCNiJiJmI2KmzvNKki6vtuvMI+IW4NbMvCci/jMiHs3MX9Z1fr0xOlXy2z+8xgvnX+WF86/wwvlXOf9Ka6NjrUl/l+dc7qD0BnvHTdfykXfdXPt567xp6ABwLCL2AruAfcB8mUfEQeAgwNTUVI1fdn38sdnm93+8fIlVmTz30h/5xQsX+cULF/jFCxd4/nevvEEJ65GZtKuk3UnaVUW1iTouYqMTaDP6yLtuHvky3wX8DHiIbml/ePDJzDwCHAGYnp6urTJevPAqz754cc3naXUqnn3xD5z51QXO/Oo8/33u5StavO289iru2H0dd0+9mS0TZbVEYyJobJno/W/wlu2T3LTjanbv2MbuHdt485smiy++KP0FSCuos8zngMPAg8B24FyN576kf/r3n/Lj/3mptvO99U+u5s6br+Njd93MTddtW7HEdu+4mjt2X8fOa6+qLYMkXak6y/wJ4MOZeToi/gU4WuO5L+n8Ky3efdv1fOFDf7qm80xMBLe9ZTtv3j5ZUzJJeuPUVuaZebZ3JcsJ4LuZeaauc19Oq6rYde1VTO+5/o34cpI0kmrdNTEzDwGH6jznSlqdiq1bvFxe0uZWfAu22snWLb65JWlzK7/MXZlLkmUuSeOg+BZsdZLJRvEvQ5LWpPgWbHUqGoXdpCNJdSu6zKuqeyu6YxZJm13RLdiqKgDHLJI2vaJbsN3pbp7ipYmSNruiy7zV6a7MGxNFvwxJWrOiW7DZK/OtjlkkbXJFt2CrN2aZdMwiaZMruszb/ZW5V7NI2uSKbsGWZS5JQOFl3mx7NYskQeFl7spckrqKbkHLXJK6im7B1vxNQ0W/DElas6JbcGFl7sxc0uY2JmVe9MuQpDUrugUtc0nqKroF5+8AbThmkbS5FV7mrswlCcakzBuWuaRNrugWbLqfuSQBhZd5q937TUOuzCVtckW3YLtyZi5JUHiZ969maThmkbTJFV3mzd6YZau/Nk7SJld0C7Y6FY2JYGLClbmkza3oMm9X6bxcklhFmUdEIyI+FxFzQ8dnImI2Imbqi3d5zXblZYmSxOpW5g3gBPDz/oGIuAW4NTPvAfZHxO015busVqdyZS5JrKLMM/PVzJwFcuDwAeBYROwFdgH7asp3WZa5JHWt2IQR8UBEPDnwsdwYZRfQBB4CDgI3LnOegxFxMiJOzs3NDT+9Kq1OstVNtiSJxkqfkJlHgaMrfNoccBh4ENgOnFvmPEeAIwDT09M5/PxquDKXpK66mvAJ4PnMPA3cDzxT03kvq9WpvMZckqipzDPzLDAbESeAi5l5po7zrsQxiyR1rThmuZTM/MDQ40PAoTUnugKOWSSpq+gmtMwlqavoJmx10u1vJYniy7xyx0RJovAy797OX/RLkKRaFN2E7coxiyRB4WXefQPUMYsklV3m7YqGK3NJKrvMmx33M5ckKLzMW52KSccsklR2mbe9aUiSgMLLvLs3S9EvQZJqUWwTZibNTsVWf5mzJJVb5u2quyW6YxZJKrnMO70yd8wiSeWWebNTAa7MJQkKLvPWfJk7M5ekMSjzYl+CJNWm2CZstX0DVJL6im3CVuWYRZL6yi3z3pjFLXAlqeQy741Z3DVRkgou86ZXs0jSvGLLvO2YRZLmFduELe8AlaR5xTZh/w3QhhttSVK5Ze7t/JK0oNgmnL800TGLJJVb5vO7Jroyl6Ryy9xLEyVpQbFl7kZbkrSg2CZstS1zSepbVRNGxCMRcTwivjFwbCYiZiNipr54l7bwa+Mcs0jSFZd5RGwHvpOZ9wIvRsS+iLgFuDUz7wH2R8TtdQcd5qWJkrTgipswM1/OzB/0Hr4EvAYcAI5FxF5gF7Bv+L+LiIMRcTIiTs7Nza0lM+B+5pI0aMUmjIgHIuLJgY+Z3vG3A3dn5o/pFngTeAg4CNw4fJ7MPJKZ05k5vXPnzjUHb3UqJgK2eAeoJNFY6RMy8yhwdPBYRNwMfBn4VO/QHHAYeBDYDpyrN+ZSrU7lqlySelbbhg8Dn83MC73HTwDPZ+Zp4H7gmTrCXU6rk+6YKEk9q3kD9N3AfcC3I+LpiPhYZp4FZiPiBHAxM8/UnHOJVqei4ZUskgS8jjHLsN6MfPcyxw8Bh+oI9Xo4ZpGkBcW2YdMyl6R5xbZhu5PumChJPcW2YXfM4sxckqDwMm9MFBtfkmpVbBs2O+nv/5SknmLbsN2pmHTMIklAwWXupYmStKDYNmx2koZlLklAwWXeajtmkaS+csvcMYskzSu2DdtVWuaS1FNsGzbbrswlqa/YNvQOUElaUHiZFxtfkmpVbBu2O87MJamv2DZsdiq2NhyzSBIUXOatTsVWN9qSJKDQMu9USZU4ZpGkniLbsNWpAByzSFJP0WU+6cpckoBiyzwBxyyS1FdkG/ZX5g1vGpIkoNAyb7Z7M3NX5pIEFFrm7ao7ZnFmLkldRbbh/NUslrkkAYWWeX/M4sxckrqKLHMvTZSkxYpsQy9NlKTFimzD9vzM3DGLJEGhZd6cv52/yPiSVLtVtWFEfC0inoqIQwPHPhERJyLiK/XFW978mMVdEyUJWP3K/EuZ+X7g+oh4W0S8CfhoZr4HuCYi9tcXcSk32pKkxVZV5pn5m4i4GrgROA+8F3gsIqaAdwL31hdxKa8zl6TFVmzDiHggIp4c+JjplfazwHOZ+VtgF91S/yrwKbolP3yegxFxMiJOzs3NrSl0f8zipYmS1NVY6RMy8yhwdPh4r9APR8RfAXPAV4AvAK8B55Y5zxHgCMD09HSuJbQbbUnSYle8tI2uqcxM4CJwDfAM8DvgSeB+4Ee1phzimEWSFltNG+4AHomIp4AbgCcy82Xg68BPgDuBx+uLuJS7JkrSYiuOWYZl5u+Bjy9z/FvAt9YeaWXumihJixXZhq22d4BK0qAyy7w3M98yYZlLEhRa5s1OMrllggjLXJKg0DJvdypHLJI0oMgyb3UqN9mSpAFFNmKzkzTcZEuS5hXZiK1OxaRjFkmaV2SZtx2zSNIiRTZiq5Pe/SlJA4psxGansswlaUCRjdjy0kRJWqTgMi8yuiStiyIbsTszd2UuSX2Flrkrc0kaVGQjWuaStFiRjdhqO2aRpEFllnnlylySBhXZiN3b+YuMLknroshG7I5ZiowuSeuiyEZsdSoazswlaV6RZe7t/JK0WJGN2O4kk+6aKEnzimxE92aRpMWKK/OqStqVv2lIkgYV14itqgJwzCJJA4prxHYnARyzSNKA4sq81emuzL2aRZIWFNeITctckpYorhFbjlkkaYnyyrztylyShq26ESPiroh4fODxTETMRsRMPdGW164sc0katqpGjIgJ4NPA1t7jW4BbM/MeYH9E3F5fxMWa7f6YxTKXpL7VNuJngG8OPD4AHIuIvcAuYN9ag13KwtUszswlqa+x0idExAPAAwOHvg9sy8yfRswX6i7gZ8BDwEHgw8uc52DvOaamplYd2EsTJWmpFRsxM49m5gf6H8B54IMR8TSwNyL+EZgDDgNfBK4Czi1zniOZOZ2Z0zt37lx14IWrWSxzSeq74kbMzMOZ+d7MvA84lZlfA54Ans/M08D9wDP1xlzQX5lPNhyzSFJfLcvbzDwLzEbECeBiZp6p47zL6Ze5G21J0oIVZ+aX0xu79P98CDi05kQrcGYuSUsV14jN3szcMYskLSiuzNuuzCVpieIa0TGLJC1VXCP2xywNbxqSpHnFlXl/o61JV+aSNK+4RnSjLUlaqrhG9A5QSVqquEZstt1oS5KGFVfmrU5FYyIY2ORLkja9IsvcEYskLVZcK7Y66YhFkoYUWOYVk43iYkvSuiquFbsz8+JiS9K6Kq4VW51kq5tsSdIiBZa5b4BK0rDiWrHVqbyVX5KGFNeKrU66yZYkDSmwzB2zSNKw4lrRMpekpYprxVYnnZlL0pDiWrG7MndmLkmDiivzZrui4cpckhYprhW9NFGSliquFduVG21J0rDiyrzV9moWSRpWXCs2O+nMXJKGFNeK3Zm5YxZJGlRcmbe9aUiSliiuFbtb4BYXW5LWVVGtmJk0XZlL0hJFtWK7SgC2Tjgzl6RBqyrziPh1RDzd+9jbOzYTEbMRMVNvxAWtTgXgmEWShqy2Fb+Xmff1Pk5FxC3ArZl5D7A/Im6vMeO8Vqe3MnfMIkmLrLYV3xcRP4yIhyMigAPAsd4qfRewr7aEA/orcy9NlKTFVizziHggIp4c+JgBPp+Z+4AG8Nd0C7wJPAQcBG5c5jwHI+JkRJycm5tbVdh+mXvTkCQt1ljpEzLzKHD0Ek8/BvwFMAccBh4EtgPnljnPEeAIwPT0dK4mbKvtmEWSlnPFrRgR10fE/t7DaeCXwBPA85l5GrgfeKa+iAtaVe8NUMcskrTIapa4F4BPRsRx4A7gPzLzLDAbESeAi5l5ps6QfQszc1fmkjRoxTHLsMxs0x2nDB8/BByqI9SlOGaRpOUV1YrXbGvwN3++m5t2bNvoKJI0Uq54Zb6RbrthO4f//u6NjiFJI6eolbkkaXmWuSSNActcksaAZS5JY8Ayl6QxYJlL0hiwzCVpDFjmkjQGInNVGxiu7YtGzAFn13CKG1hmZ8YRZt71Zd71Zd71dSV5b83Mncs9sSFlvlYRcTIzpzc6x+tl3vVl3vVl3vVVV17HLJI0BixzSRoDpZb5kY0OcIXMu77Mu77Mu75qyVvkzFyStFipK3NJ0gDLXJLGQHFlHhEzETEbETMbnWU5EdGIiM/1rqXvHxv1zI9ExPGI+Ebv8UjnBYiIr0XEUxFxqPf4ExFxIiK+stHZlhMRd0XE470/l/D9/XVEPN372DvqmSPiH3o/w49GxNWjnDcipga+t/8bER+vI29RZR4Rt9C9aP4eYH9E3L7RmZbRAE4AP4fRzxwR24HvZOa9wIsRsY8RzjvgS5n5fuD6iLgT+Ghmvge4JiL2b3C2RSJiAvg0sHXUfx4GfC8z78vM+4DfMMKZI2Ib8FHg/cD9dG/CGdm8mfncwPf2NHCKGvIWVebAAeBYROwFdgH7NjjPEpn5ambOAv13lkc6c2a+nJk/6D18CfhLRjhvX2b+JiKuBm4E7gAei4gp4J3AvRsabqnPAN/s/Xmkfx4GvC8ifhgRDzP6md8DvAL8F/AQo58XgIh4G/B/1JS3tDLfBTTp/h92kO5f5FFXROaIeDtwN92fiRLyTgHPAs8Bk8B54KvApxihzBFxE/DWzPxp71ARPw/A5zNzH91/ad7EaGfeDWwHPgTcRjnf408Ax6gpb2llPgccBr4IXEUZ+y+MfOaIuBn4MvBZCsgL3X+qAlN0/wX0DuCfgX8FXmO0Mv8d8MGIeBrYC/yBMr6/j/b++BjQYrQzvwwcz8wKOA5UjHbevgPA09T0d660Mn8CeD4zT9OdjT2zwXlejxIyPwx8NjMvUEDe6JrK7k0SF4GfAb8DnqSb+UcbGG+RzDycme/tzUdPAY8y+t/f6wfed5gGXmS0M5+iW4wAfwbMMtp5+yOWX2dmm5r+zhVV5pl5FpiNiBPAxcw8s9GZVjLqmSPi3cB9wLd7q8e7GOG8PTuARyLiKbpvdn0X+DrwE+BO4PENzHZZo/7z0HMB+GREHKf7fsS/McKZM/NXwE8i4kfA1sw8zgjn7flbuj+3tf1MeAeoJI2BolbmkqTlWeaSNAYsc0kaA5a5JI0By1ySxoBlLkljwDKXpDHw/1LbHgnW9ANzAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Serializing the results\n", + "\n", + "The search results can be saved to an external file using the `save` method." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.064021Z", + "start_time": "2021-03-05T04:50:33.058426Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.067954Z", + "start_time": "2021-03-05T04:50:33.065107Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the saved result file as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.080105Z", + "start_time": "2021-03-05T04:50:33.073810Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the candidate with the best score can be displayed as follows. You can see that we have arrived at the correct solution $x=-1$." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.112487Z", + "start_time": "2021-03-05T04:50:33.081409Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.002]\n" + ] + } + ], + "source": [ + "print(X[int(best_action[-1])])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prediction\n", + "\n", + "`policy` serves `get_post_fmean` and `get_post_fcov` methods for calculating mean value and variance of Gaussian process (post distribution). " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.700354Z", + "start_time": "2021-03-05T04:50:33.118203Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD3CAYAAADv7LToAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAlCklEQVR4nO3deXhU933v8fd3Vu1IgCQkIbFjY7DBRtgkeMEEE8eJcUqWtr6Jk5sF37RZerm5XeIbJ03de9vESdM810nrtOmNmybO0izebRzvC9hgGwwYA2ZHAiQQktCume/9Y0a2jLGRxEijGX1ez3OemTkzc85XP4bPOfOb3znH3B0REclsgXQXICIiZ09hLiKSBRTmIiJZQGEuIpIFFOYiIlkglI6VTpw40adOnZqOVYuIZKyNGzc2unvp6Z5LS5hPnTqVDRs2pGPVIiIZy8z2vd1z6mYREckCCnMRkSygMBcRyQIKcxGRLKAwFxHJAgpzEZEskNIwN7M1ZrbOzNakcrkiIvLOUjbO3MyqgSnuvtjM7jGzu9x9V6qWL2/l7nTH4nR0x2jvjtHZE8OBxFmNHXdwIBgwIsEA0XCAaChINBQgEgwQCFh6/wARSZlUHjS0ArjTzBYCZcBlgMJ8iJo7etjT0Mbexnb2NLZxuLmTYye7aGzr5tjJLpo6uunojhE7i/PRh4MBcsNB8iOhxBQNUdB/yglREA1T+Pr9EEW5IQpzQhTlhinMCTEuL0ReJIiZNgwi6ZTKMC8DXgJuBlYDV/d/0sxWJ+dTU1OTwtVmvgPHOnhh3wlePtjMlroWXj3STFNH95teUxQNU5wTZVw0yrRxxSwoj5AbDpIbDiVvg0RCAQJmBAwwIwCYGb3xOF29cXpi/W9jdPUmbtu6e2nv6aG9p5ejHd3s7W2no6eX9p5eOntjZ6w/YEZ+JEReOBH4+ZHERqAgmgj+xG349Y1B3+PcSOJbQjQcICf5jSEnHCASChIJ2esbiLfbTpzt9uPU9/d//Hb3RUarVIZ5A3Ab8BkgH2js/6S73w7cDlBbWzumL290pLmLx15p5Jldx3h+/zHqWtoBCJoxpaSQRVVlVI8rYHJxPpVF+VSX5DEuP0g0CtEoBIMQCLxxGwgMPHDcE1M8npj634/Hobf3zVNXd5zWzhgnu3po7+5NBn8vbd09tPX00t73OLkxaOtOzGs82cW+4ydpS87ricUH1UYGRIIBwsFgokvIDDOSGysjaEYgkLgfgDfuvz4lNmR9GzTrm8cpzydvE/N5y3qMvnnJ5wOJdUdDAXLDIXLCAXIjIfLCQXIjQfIiQfKiQYpywkwoCFOcHyEvEnz93+nUSSRVUhnma4Gr3X2Lmf09cEcKl53x9jd0cO/mwzy49TCb648Td8iPhFhQOYEPzp3KnIklTC0upCAvSH4+5OVBOAyhUCK0U8UsMQ08SAJAAPfwm0L/dBuAWCwx9b/f1wvUHYu9EfzdifDv7o3THYvRE4/THYvTE4/RE3vjfncs8S2iJxYnjhOPe+LWnbiTeOxOzP1N990h7o4nX+fEiTnEY4n3v/E8yWUl7yefi8UdJ/ne/s8nb3s9nqx9YBuoSDBAYTRMYTRCUTTMuJwIE/JymJiXQ1lhlEnjcqgozqGyJIdx+aHX/81DIX0rkIFLWZi7+77kSJb1wN3uvjVVy85U7V0x7nnxCL/YcICNBxtxYGpJAR+7aCYXV5UzvWQcOVGjqCgR3n173aORWaK2wdbXt+fvHiQeDxKPR9/07aDvtrf39BuKU79BwBuPzd647VtXKsPvTMuOxeN09sYSU0+Mrlgs0X0Vj9HW3cPJ7h5au7pp7e6htStxv7mjh/3NrWw81Eh7T+9b1lkUDVNZlE9lYR6VRfnUlOQxrTSf2RUFTCwKEw4nNvIKeTlVSs+a6O63AremcpmZaO+RDn74xF7u2nKA1q4eJhXm8l8XzWJJTSWTiwqIRqGkBHJzIRJJd7XDq28jkGp9e/z9f/9N9bXJT7fsvg1R4n4gOYXfsmHq/y2l7/GpG6GO3l6Ot3dyvKOTY8npSGsHB5vb2NbQxKO76+j/J5Xm5zCtpIjp4wuZXVbE3MmFnFtZQG6OKeAlPafAzVab97Xy/Ud38/COQ8TdWTqjgqtnV3N+2USiEaOkBPLzsz/AR0JfcGVSgLm/EeqJ2xC9vQX09BTQ3Q3d3W8Evxl09cY4crKD+pNtHGw+yZ6mFl471srGLQ3E4omYzwuHOKe0mPPKirmwuoRLZpRQVhImEsmstpGzpzBPgR117Xzr/ld5eGcd0VCQD86bwnVzplGWl0d+Powfn9gL13+usc0s0Q9+Jm/s1QeZGiugs7OAzs5yuroSG4KeWJz9J06y50QLrzY2sfXICX62aRf/8VLi/TPHF7FwcilLZkxkyewSigqChMPD+qfJKGCe6u+mA1BbW+vZcHGKw03d3Hr/Dn67ZT/BgPGR+dP4gznTKYxEKC6G4mLthUtq9XXd9PRAZye0tydve3p59egJXmls4qX6Rl4+3EQs7kSDARZUTuTy6ZO4Zn45lRMi2mvPYGa20d1rT/ucwnzwenudHz95gO8+tp227l6unVvN9RfMojiaQ0lJoj9ce0IyUtwTXTQ9PdDWlpia23t5+fAxXqxvZN2BI9S3dBAwY0HFBJbOqOC6iyqomBDWzkaGUZin0Et7W/jKr19m29ETzK8cz5eWzKOqoJCiIpgwQXviMjr09EBXF7S0QGurs7Oxhaf31/Pk3noONrcTDQa4dGoFK+dWs3TueAoKbNSOpJI3KMxToKfX+ccHX+Ofnt5BQSTMny6Zw2XVVeTkGOXliT5xkdEoHk8Ee2srnDjhvNrQzEO7DvDIa3W0dfcyeVw+H5o3jY/UTqZsQlA7JKOYwvws7Trcxp/9bBNbjjRx5cxJfOFd51MQjlBeDkVF6n+UzBGPJ/rYT5yAhqYYT+2t5+5X97L9aDPFORGunTOV/3LxFKZVRohG012tnEphfhZ+ub6Om+/eTCBgrLl8Hu+uqqSoyCgrU7+4ZLbe3sTe+rFjzouHjvPrbbt5dt9R8iMhPjx3Oh+/ZBrVFSGF+ijyTmGuoYlvo6snztd/8wo/e2Ev8yaVcNOVFzIhN5eKCigsTHd1ImcvFEr8WF9cbEyaNIFFUybwSn0LP9m0gx+/uIPfbd/L9RfM4mPvqqFsYmBAwyolffTPcxp1TZ3ceMcLvFzfxEfnT+MTC86lqCDApEnaG5fsYwYFBYkD2kpLi5hTUctLB5r48Yvb+f76rTy46wBffPc8ls4rUbfiKKYwP8Wm/c18+scbONnVw9dXXMjiykrKyhJ7MPoQSzYz4/WTvE2YUML5lYt5dNdh/vm5bXzp7me4+tVqvnDpHGZOCavrZRRSmPfz4MtH+NLPX6QwGuZ7K9/NtJIiqqoSH26RscIs0ZWYn2+MH19B7eRS/uOlHfznlj28UNfIly+dz1XzJ1BcrB2c0URnVE76l8f38rmfbqCmOJ/vXbuEc8qLmDpVQS5jVyCQ+EY6d3aIP1t6Ht9+37uJBAP8+QPr+Jt7trHvQJzet574UdJkzO+ZuzvfvH8nP3hiJ0umlvM/lyygfGKI8nJdPEAEEr8TVVXB8qISZky8lH/ZsJ1fb93D9oYmbl6+kAWzc8jJSXeVMqbjKh53vvqbbfzgiZ1cc+5kvnL5QmqqQkyapCAXOVVhIZw3O8RfvGceX1l6EXuaWvncb57k7vXHaGlJd3UyZiMrFnfW/HwzP3luLx8+fxqfv+QCqicb48erH1Dk7YRCUFkJH7mkgu++fwmF0TB/+cB6/u2xAxw/nvpzysvAjclult5YnC/+dBP3ba3jhotmcf0Fs6ipMfWPiwyAWaIv/fL5hUwqWsI3fv8C//DMZo62dfCFK2dRXm7aIUqDMbdn3rdHft/WOj6z6Fw+fuFspk5VkIsMVm4unDcrzDffv4irZk3mPzbt5Ov3vsyhOn/9En8ycsbUnnk87vzFL1/mrs2H+OTC2fzxghlMnozGzIoMUTgM06YG+Ov3XUBpXg4/3bSLrliMb7x/PlUVAf32NIIG3dRmFjKzL5lZwynz1yQv6LwmdeWljrtz02+28KsXD3D9/Jl8/KJZVFcryEXOViAAFRXGf19+Dp+86Bwe3V3HV+/ZxKH6uPrQR9BQtpshYD2wuW+GmVUDU9x9MbDMzGamqL6U+d/3budnz+/nI/Om86lFs6mu1rnHRVLFDEpL4YvLZ/Lphefy2J46/tc9L1F/2BXoI2TQYe7une6+Dt504fAVwJ1mthAoAy5LUX0p8cMn9vDDp3bzgXNruHHxudTUmIJcZBiMHw+fXz6DTy08l8f31PN/HtxKY6PSfCScsc/czG4Abug36z53/84pLysDXgJuBlYDV59mOauTz1FTUzPEcgfvty/W8bf3bWPJlEl8/l3zqK5WkIsMp5IS+MLyGbR0dfOrLbsZlxPly1fPorg43ZVltzOGubvfAdxxhpc1ALcBnwHygcbTLOd24HZInM980JUOwVM7G/nyL1/i/PLx/OXlC5g6xdRHLjICSkrgK9ecy4mObn7y0g4m5EW5cXmNRo0No1T91rwWOOjuW4BVwLMpWu6QbT3UzOp/38jkogK+tqyWGdOCOuRYZASNH2/csvJ8aqtK+b/rtnDf88fo7k53VdkrJWHu7vuAdWa2Hmh1962pWO5QHW7u5JM/ep68UIhvLF/E7Glh7RGIpEF5WYC/v+5CKgvz+MajG3l+WzuxWLqryk5DDnN3X37K41vd/RJ3v+Xsyxq6ju4Yn/q3DZzs6uUbyxcxd1ouRUXprEhk7DKD6dVhvrVyEe5w04Mb2HOwVyNchkFWDemPx50v/nQTrxxu5i+XXsiF04oYPz7dVYmMbWaw6Nx8vnbVRew/0cotD7xMU5PSPNWyKsy/ed9O1m6vZ/Ul53LFzHLKy3XSLJHRIBiElRdP5IaLZvPYnjp+/NQBOjvTXVV2yZow/+Vzh/inp3byvnMm86G506ms1GlsRUaTSAS+fM1MLqqcyA/Wb+XJl1vUf55CWRF3z792gq/8bjMXVIznTy4+n6oqjSUXGY0K8o1vrlpAfiTMNx5+gQP1ulRRqmR8mNcd6+JPfrqRCXlRvnrlQirKA+Tnp7sqEXk7M6qi/PV7F3CguY1vP7ydtrZ0V5QdMjrMOzrj/MlPXqS5s5uvL19IeXGECRPSXZWIvBMzuKZ2Ih+aN427t+/j3o2N6m5JgYwN895e+NqvX+Wl+mN8een5TC8ZR0WFfvAUyQShEPyvlecwuSifbz2+ib2HetJdUsbLyDCPxeAnT9Tzi827WXX+FC6vnkxFReLcyiKSGUqKgtxy7XyOtXfydw9to7093RVltowL83gcnn65lb97ZBPzJhXz2drzKClJXGxWRDLL5XNL+OMFM1i76yD3bmjUFYrOQsaF+ZHjPfzVfRvJi4T46xULiYQCTJyY7qpEZCgCAfjz98+iojCP7z61hfqj6jwfqowK83jcuemuTRxubedvrr6IPMuhoiJxQIKIZKZxBUG++r55HGpp4wePvaaTcQ1RRoX5M68d45EdR1h98RxmFY9n4kR0Ai2RLHD1glKWzazk55tf4/ntJ9NdTkbKqDC/dNZE7vjEu7hm5lRCITQMUSRLBALw9evmEAkG+OYjWzh5UuduGayMCnOACyePJxAwKip0uL5INqkpzeFzl57DpsPH+PVzR/Rj6CBlZBwWF0NubrqrEJFU++yVNUwpLuAHz75CwzH9GDoYGRfmhYVQVZXuKkRkOEQjAf7q6vOob23nX5/cS69O3TJgGRfmIpLd3ju/lMU1pfzkxV3sPtSV7nIyhsJcREYVM/jqtefR2RvjHx/ZoaGKA6QwF5FRZ251AasuqOH+HQd4aZdOqzgQCnMRGZX+x9WzCAcDfP/JHboq0QAMKczN7Htm9riZ/ajfvDVmts7M1qSuPBEZqypKoly/cCqP7alj3faWdJcz6g06zM0sH/iVu18BHDGzy8ysGpji7ouBZWY2M9WFisjY84WrZlAQCfH9p17V3vkZDDrM3b3N3Z9IPjwOdAErgDvNbCFQBlyWuhJFZKwaXxDmk4tn8NzBozyy+Xi6yxnVzhjmZnaDmT3cb1qTnD8LuMjdnyMR4N3AzcBqoPw0y1ltZhvMbENDQ0Nq/woRyVr/bdlUinMi/NMzO+joSHc1o9cZw9zd73D35f2m75hZJfBN4MbkyxqA24CbgCjQeJrl3O7ute5eW1pamsI/QUSyWUFOiM8umcnmw8e0d/4Ohjqa5dvAje7e96vEWuCgu28BVgHPpqI4ERGAT1xWTXFOhB+t36W+87cxlB9ALwaWAr8ws8fMbKW77wPWmdl6oNXdt6a4ThEZwwpyQnxi8TQ21jXw1LYT6S5nVBrKD6DPuXuFuy9NTncl59/q7pe4+y2pL1NExrpPXT6FgkiIf312F106yv8tdNCQiGSEcXlhPnbxNJ49cITndmjc+akU5iKSMVYvnUpuOMi/PK3Ly51KYS4iGWN8QYQ/WjiVJ/bWsWWvztnSn8JcRDLKZ6+YSjBg/L9n9uh85/0ozEUko1SW5PC+86p4cOdBDhxRX0sfhbmIZJwbl06jKxbj35/dr2uFJinMRSTjzJtcxCVTJvKbLXtpalaag8JcRDLUjVdMp6mzi1+sr8M93dWkn8JcRDLSlXMmMmNCIT9/aTft7UpzhbmIZCQz49OXTmPviVYe2nws3eWkncJcRDLWqtpKinMi/Hzj3jF/EJHCXEQyVk44yIcvqua5Q0d49UB7ustJK4W5iGS0T1w6BYCfrNtPLJbmYtJIYS4iGa16fC5XzCzn/h0HON48dtNcYS4iGe+TS6bS0tXNfz5XP2aHKSrMRSTjXX7OBKaU5PPrl/eN2XOdK8xFJOOZGR9fPJUdx07wzPYT6S4nLRTmIpIVPnpxFbnhID99ft+YPJuiwlxEskJRbpgPzKviib111B/rSXc5I25IYW5mPzCzR83s1n7z/tDM1pvZt1JXnojIwF2/uJruWJxfPndozP0QOtQ986+5+5XAeDObbmZ5wLXufglQYGbLUleiiMjALKgZx+zSIu7ZdoCOjrGV5kMKc3c/ama5QDnQDLwLuNfMaoBzgStSV6KIyMCYGX+0qJrdTS08t3NsXfT5jGFuZjeY2cP9pjXJ0N4B7Hf3Y0AZiVD/DvAJEiF/6nJWm9kGM9vQ0NCQ4j9DRCThQ4uqiIYC/GLj/jH1Q+gZw9zd73D35f2m77j7fqAGcDNbAjQAfwv8M9AFNJ5mObe7e62715aWlqb4zxARSRiXG2bFnAoe3V1HQ9PYSfNBd7NYQo27O9AKFADPAk3Aw8Aq4JmUVikiMggfW1xDR28vv95Qn+5SRsxQ+szHAd8zs0eBicBad28Dfgg8D5wH3J+6EkVEBufi6SVMKcnn7q376exMdzUjY9Bh7u4n3P2D7n6lu3/a3ePJ+T9LdqN8IbnXLiKSFmbGH9bWsL3xBC/ubk13OSNCBw2JSFb66MVVBM341cYDxMfANZ8V5iKSlSYWRrlsZhm/f62O1rbsT3OFuYhkrY/UTuZEZxcPbXrLALusozAXkax11dwyxuWEuevlg/Rk+elaFOYikrUioQDvP7+SdQeOUNeY3WmuMBeRrPbRRZPpicf5zca6rD75lsJcRLLa/OpxTJtQwAPbD2b1VYgU5iKS1cyMD104me2NJ9i6/2S6yxk2CnMRyXofXlRFwOBXGw9l7ZhzhbmIZL1J43JYPLWUh3ceoj1Lz3OuMBeRMeHDtVU0tHfwyJZj6S5lWCjMRWRMuOaCSeSFQ9yz5RCxWLqrST2FuYiMCTnhIFfNmcRTew9zvDn70lxhLiJjxqqFlbT39PLApqPpLiXlFOYiMmYsmTmB8XlRHnilLusO71eYi8iYEQoGuGZeBc8dPMqR49mV5gpzERlTVi2spCce53cbD6e7lJRSmIvImHJhTTGTx+WxdkddVh3erzAXkTHFzLh2fiWbjzSy90j2XCBUYS4iY86qhZXEHX73Qn3WnElxyGFuZvPN7P5+j9eY2TozW5Oa0kREhses8kLOKSti7c5DWdPVMqQwN7MA8GkgnHxcDUxx98XAMjObmboSRURS74MLqth5rJltB9rSXUpKDHXP/LPAv/V7vAK408wWAmXAZae+wcxWm9kGM9vQ0NAwxNWKiKTGBxdWYMBvX8iOi1acMczN7AYze7jf9BWgyt1f7PeyMqAbuBlYDZSfuhx3v93da929trS0NFX1i4gMScW4XBbWjOf3rx2iIwvOpHjGMHf3O9x9ed8ENANXmdljwEIz+xzQANwG3AREgey/FLaIZLzrFlRxqKWN53e1pLuUszbobhZ3v83d3+XuS4GN7v4DYC1w0N23AKuAZ1NbpohI6n1g/iSCAeOezXUZf9GKlAxNdPd9wDozWw+0uvvWVCxXRGQ4leRHWDx1Io/vqae9PbO7Ws4qzJPdLn33b3X3S9z9lrMvS0RkZFw7v4KjbR2s29Gc7lLOig4aEpEx7X0XTCIUMO7bWpfRF61QmIvImDYuN8y7p5fyxJ76jL4+qMJcRMa8lfMraGzv5OntTekuZcgU5iIy5r33/HLCwQD3b63P2K4WhbmIjHmFOWEunVHKE3vrOdmWmV0tCnMREWDl/EqaOrp48pXj6S5lSBTmIiLAinllREMBHthWT29vuqsZPIW5iAiQHw1x+cwyntxbT8vJzDscVGEuIpJ07fxKmru6eXxb5nW1KMxFRJKumltGbijIQ6/U09OT7moGR2EuIpKUGwlyxaxyntpXT3NrZnW1KMxFRPpZuaCC1u4eHt16LN2lDIrCXESkn2XnlZIXDvHQ9jq6u9NdzcApzEVE+skJB7lydjnP7D/MiZbM6WpRmIuInGLlggraenp5eEvmXK9YYS4icoor55RSEAnx+x31dHWlu5qBUZiLiJwiEgqwbPYknj1whKbmzDjzlsJcROQ0Vl5YQXtPL2u3NOIZcO4thbmIyGlcce5EiqJhHtlZlxFdLUMKczM7bGaPJaeFyXlrzGydma1JbYkiIiMvHAzwnnMSXS2NTaO/q2Woe+YPuPvS5LTRzKqBKe6+GFhmZjNTWKOISFpcu6CCzt4Ya7ccHfVdLUMN88vN7Ekz+7aZGbACuDO5l14GXJayCkVE0uSy2RMYlxPh0dfq6exMdzXv7IxhbmY3mNnD/aY1wJ+5+2VACLiGRIB3AzcDq4Hy0yxntZltMLMNDQ2ZM3ZTRMaucCjA8nMmsf7AUY4eH90nOT9jmLv7He6+vN/0HXe/K/n0vcBcoAG4DbgJiAKNp1nO7e5e6+61paWlKfwTRESGz7ULKuiKxVi7pYH4KD4gdNDdLGY23syWJR/WAruAtcBBd98CrAKeTV2JIiLpc+nsCZTkRnl0dx0dHemu5u0Npc+8BbjezB4H5gC/c/d9wDozWw+0uvvWVBYpIpIuoaCx/JxJPH/wKPUNo7erZdBh7u697v4Zd7/C3T/u7rHk/Fvd/RJ3vyX1ZYqIpM/KBZV0x+L8/pUjxEbpKEUdNCQicgbvmlnChLwoj++pH7VdLQpzEZEzCIWM5bMreP5gAwcOj87rySnMRUQGYOWFFfTE4zy648iovD6owlxEZAAumVFCaX4Oj++pp7093dW8lcJcRGQAQiHjPbMr2Hiogf2jsKtFYS4iMkDXLaikN+48tvPwqDuTosJcRGSAFs0YR3lBLk/srefkyXRX82YKcxGRAerrannhUCP7DnePqjMpKsxFRAZh5fxKYu48sfvwqDqTosJcRGQQFk4voqIwjyf31tPcnO5q3qAwFxEZhHDYWDazghfrjnHgaNeoObxfYS4iMkjXXVhJ3J0n9xweNYf3K8xFRAZp/pRCJhfl8+S+eo4fT3c1CQpzEZFBikaNK2dWsKn+GIeOddLdne6KFOYiIkOyckElcYen9x+mrS3d1SjMRUSG5IIphUwpLuDJffU0NZH2MecKcxGRIYhE4MoZlWyuO87h5s60jzlXmIuIDIEZfOCCChx4en/6x5wrzEVEhmjelAKmlRTyxN56WlpI65hzhbmIyBBFo7B0egUv1zdx9GRHWn8IHVKYm9nHzOxxM7vLzHKT89aY2TozW5PaEkVERiczeP8FlQA8czC9Y84HHeZmlgNcC1wJrHL3DjOrBqa4+2JgmZnNTHGdIiKj0nnV+cyeOI6Hdx6iq4u0/RA6lD3zS4AO4EHg5uS8FcCdZrYQKAMuO/VNZrbazDaY2YaGhoah1isiMqrk5MB7ZlSxo6GFgy2ttLSkp44zhrmZ3WBmD/dNwBIgH3gvMM3MFpAI8G4S4b4aKD91Oe5+u7vXunttaWlpKv8GEZG0CQTgAxdUEjDjsb2HOHEiPT+EnjHM3f0Od1/eNwEvA4+7exx4HDgHaABuA24CokDjMNYsIjKqTJ0U5aLKiTy0o464e1p+CB1KN8tGEt0qAHOBncBa4KC7bwFWAc+mpjwRkdEvJwfeM7OKI60d7Gg6zrFjI39E6KDD3N3rgOfN7Bkg7O4vuPs+YJ2ZrQda3X1rqgsVERmtgkFYcV45OaFg2n4IHdLQRHf/G3d/t7t/vt+8W939Ene/JXXliYhkhvIJIZZMmcSju+rxQIwTJ0Z2/TpoSEQkBXJz4crplbR29fLi4QZaW6GnZ+TWrzAXEUmBYBAunTWRktwID716CDNobR259SvMRURSZHxxgKXTKnl6z1F6rIfjxyEeH5l1K8xFRFIkLw+WzaiiJx7n8d31xOOM2DBFhbmISIqEQnDB5HFUF+fzwPZDRKOM2DBFhbmISAoVFxvvmV7FprrjHGlrG7FhigpzEZEUysuDq2ZNJmBw7ysHCYcTe+fDTWEuIpJC4TBUleSyqLqU+7YdJBxxTp6Erq7hXa/CXEQkxUpKYMXMahraOnl+fwPhMDQ1De86FeYiIimWmwsXTy5jXE6Ye7YdJCcHmpuhu3v41qkwFxFJsUgECvOCXDW7iid2H6a5s5tgkGE9xF9hLiIyDEpKYPn0anrjzkOvHiI3N9HVMlyH+CvMRUSGQW4uTCsp4tyycdyz7QDgBIPD13euMBcRGQaRCESj8L5zJ7OrsZUdDS1Eo3Dy5PCsT2EuIjJMiovh8poqIsEAd23dj9nwrUthLiIyTPLyIC8c5j2zKnhw+yHau3uHbV0KcxGRYdLX1bLyvCm098RYu6Nu2NalMBcRGUYlJTCjuJhZE4v47ZZ9+DCddUthLiIyjHJzwd34g/Nr2NnYwvaGE8OynkGHuZnVmNljyemAmX0wOX+Nma0zszUpr1JEJEP1dbVcOb2K3HCQu7btH5b1hAb7BnffDywFMLP7gQfNrBqY4u6LzeweM7vL3XeltlQRkcxUUgLdR0L86ZI5lOblDcs6Bh3mfcxsOnDI3TvMbAVwp5ktBMqAywCFuYgIiVEt7nDd3CnpOwLUzG4ws4f7TX3dKH8I3Jm8XwZ0AzcDq4Hy0yxntZltMLMNDQ0NKSpfRGT0C4cTfefDFeQwgD1zd78DuOM0T60AvpW83wDcBnwGyAcaT7Oc24HbAWpra0fgIkoiIqNHcTHU1SX60IfDkEazJLtYDrt73wj4tcBBd98CrAKeTVF9IiJZoa+rZbgMdWjidcDdfQ/cfR+wzszWA63uvjUVxYmIZItQCPLzIR4fpuUP5U3u/g+nmXcrcOtZVyQikqWKi6HxLZ3QqaGDhkRERkheXmLM+XBQmIuIjJBQCKqqhmfZCnMRkSygMBcRyQIKcxGRLKAwFxHJAgpzEZEsoDAXEckCCnMRkSygMBcRyQI2XNeje8eVmjUA+85iERM5zZkZRwHVNTiqa3BU1+BkY11T3L30dE+kJczPlpltcPfadNdxKtU1OKprcFTX4Iy1utTNIiKSBRTmIiJZIFPD/PZ0F/A2VNfgqK7BUV2DM6bqysg+cxERebNM3TMXEZF+FOYiIllg1Ie5mX3PzB43sx+d4XVrzGydma0ZgZpCZval5Hj5M732sJk9lpwWjqK6Rqy9BrO+EW6vM9Y00u00iLpGrJ2S6xvQZysNn6uB1jWi7ZVc5xmzK5XtNarD3MzygV+5+xXAETO77G1eV01iMP1iYJmZzRzm0kLAemDzAF77gLsvTU4bR0NdI91eg1zfiLTXQGpKw+dqMOscyc8VDOCzlY72GkhdSSPaXgPJrlS316gOc3dvc/cnkg+PA11v89IVwJ3JLW4ZcNrQT2Fdne6+DhjIr8eXm9mTZvZtM7NRUteIttcg1zdS7TWQmka6nQazzhH7XMGAP1sj3l6D+MyPdHsNJLtS2l6jKszN7AYze7jftCY5fxZwkbs/9zZvLQO6gZuB1UD5SNQ1QH/m7peR2IO4ZpTUNaLtBUwaxPqGrb1OMZA2GNZ2Oou6YOTaaTDS0V4DlZb2OkN2pbS9Qmfz5lRz9zuAO/rPM7NK4JvAJ97hrQ3AbcBngHxSfD6G09U1iPfelbx7L7AgeZsSZ1HXiLaXmX1moOsbzvY6xUDaYFjb6SzqGsl2Gox0tNeApKO9BpBdKW2vUbVn/ja+Ddzo7i3v8Jq1wEF33wKsAp4dkcrOwMzGm9my5MNaYFc66+lnpNtrQOsb4fYaSE3p+FydcZ36XA1OGtvrTNmV0vYa1WFuZhcDS4FfJH+FXpmcX2xm3+17nbvvA9aZ2Xqg1d23pqneN9UFtADXm9njwBzgd6OhrpFur7dbXzrb63Q1pbudBloX+lwNqi7S0F6ny67hbi8dASoikgVG9Z65iIgMjMJcRCQLKMxFRLKAwlxEJAsozEVEsoDCXEQkCyjMRUSywP8Hut2ajhZgppUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean = policy.get_post_fmean(X)\n", + "var = policy.get_post_fcov(X)\n", + "std = np.sqrt(var)\n", + "xs = X[:,0]\n", + "\n", + "ax = plt.subplot()\n", + "ax.plot(xs, mean)\n", + "ax.fill_between(xs, mean-std, mean+std, color=\"blue\", alpha=.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acquisition function\n", + "\n", + "`policy` serves `get_score` method for calculating acquisition function." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:34.220216Z", + "start_time": "2021-03-05T04:50:33.701874Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "scores = policy.get_score(mode=\"EI\", xs=X)\n", + "plt.plot(scores)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parallelization\n", + "\n", + "PHYSBO can calculate acquisition functions for candidates in parallel by using MPI via `mpi4py` .\n", + "To enable MPI parallelization, pass a MPI communicator such as `MPI.COMM_WORLD` to a keyword argument, `comm` of the constructor of the `policy`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:34.224416Z", + "start_time": "2021-03-05T04:50:34.222375Z" + } + }, + "outputs": [], + "source": [ + "# from mpi4py import MPI\n", + "# policy = physbo.search.discrete.policy(test_X=X, comm=MPI.COMM_WORLD)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_basic_org.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_basic_org.ipynb.txt new file mode 100644 index 00000000..26238c42 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_basic_org.ipynb.txt @@ -0,0 +1,565 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic usage of PHYSBO\n", + "\n", + "## Introduction\n", + "\n", + "In this tutorial, the problem of finding a stable interface structure for Cu is solved as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references\n", + "\n", + "- S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "---\n", + "\n", + "Let's try each step using the sample data.\n", + "\n", + "First, we will import PHYSBO." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:05.943971Z", + "start_time": "2020-12-04T06:02:05.507138Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparation of search candidate data\n", + "\n", + "First, load the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:05.950047Z", + "start_time": "2020-12-04T06:02:05.945622Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.105894Z", + "start_time": "2020-12-04T06:02:05.961463Z" + } + }, + "outputs": [], + "source": [ + "X, t = load_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following, N is defined as the number of search candidates and d is defined as the dimensionality of the input parameters.\n", + "\n", + "X is an N x d matrix, where each row represents a parameter set (a d-dimensional vector) for each candidate. \n", + "t is a vector of N dimensions, corresponding to the negative energy of each candidate (the value of the objective function to be optimized).\n", + "Normally, when we perform Bayesian optimization, we start with only X given and t does not exist. Therefore, in actual use, the value of t can only be obtained by receiving a candidate Bayesian optimization proposal and evaluating it with a simulator. Since this is a tutorial, we will skip the calculations and give t in advance.\n", + "\n", + "**PHYSBO assumes that the direction of optimization is \"maximization\".** \n", + "\n", + "Therefore, the original problem setting is \"energy minimization\", but when optimizing with PHYSBO, the objective function value is multiplied by a negative value and treated as a \"negative energy maximization\" problem." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.115603Z", + "start_time": "2020-12-04T06:02:06.107365Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0. , 1. , 0. ],\n", + " [0. , 1. , 0.1],\n", + " [0. , 1. , 0.2],\n", + " ...,\n", + " [8. , 1.5, 3.4],\n", + " [8. , 1.5, 3.5],\n", + " [8. , 1.5, 3.6]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.120704Z", + "start_time": "2020-12-04T06:02:06.116918Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01301176, -1.01487066, -1.02044168, ..., -1.11680203,\n", + " -2.48876352, -2.4971452 ])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To scale the search parameters, standardize each column of X so that the mean is 0 and the variance is 1, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.127129Z", + "start_time": "2020-12-04T06:02:06.121967Z" + } + }, + "outputs": [], + "source": [ + "X = physbo.misc.centering( X )" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.132603Z", + "start_time": "2020-12-04T06:02:06.129255Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.71079785, -1.46385011, -1.68585446],\n", + " [-1.71079785, -1.46385011, -1.59219588],\n", + " [-1.71079785, -1.46385011, -1.4985373 ],\n", + " ...,\n", + " [ 1.71079785, 1.46385011, 1.4985373 ],\n", + " [ 1.71079785, 1.46385011, 1.59219588],\n", + " [ 1.71079785, 1.46385011, 1.68585446]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator\n", + "\n", + "Define the simulator class called in PHYSBO. \n", + "The return value of the `__call__` method is the value of the objective function when action is given. \n", + "action is the ID of the search candidate (0, 1, ..., N-1). , N-1).\n", + "\n", + "In this tutorial, we have defined a simulator that only returns the already computed value of t when action is given. \n", + "Please customize the simulator class if you want to apply it to other problems." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.136850Z", + "start_time": "2020-12-04T06:02:06.134076Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting policy\n", + "\n", + "First, set the optimization `policy`. \n", + "\n", + "Next, set `test_X` to the matrix of search candidates (`numpy.array`)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.149593Z", + "start_time": "2020-12-04T06:02:06.143075Z" + } + }, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `policy` is set, no optimization is done yet.\n", + "Execute the following methods on `policy` to optimize it.\n", + "\n", + "- `random_search`. \n", + "- `bayes_search`.\n", + "\n", + "If you specify the `simulator` and the number of search steps in these methods, the following loop will be executed for the number of search steps.\n", + "\n", + "i) Select the next parameter to be executed from the candidate parameters.\n", + "\n", + "ii) Execute `simulator` with the selected parameters.\n", + "\n", + "The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step.\n", + "See the section \"Searching for multiple candidates at once\" for details. \n", + "\n", + "Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the \"Running Interactively\" section of the tutorial.\n", + "\n", + "### Random Search\n", + "\n", + "First of all, let's perform a random search.\n", + "\n", + "Since Bayesian optimization requires at least two objective function values to be obtained (the initial number of data required depends on the problem to be optimized and the dimension d of the parameters), we will first perform a random search. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.380266Z", + "start_time": "2020-12-04T06:02:06.154735Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When executed, the objective function value and its action ID for each step, and the best value up to now and its action ID will be printed as follows.\n", + "\n", + "````\n", + "0020-th step: f(x) = -1.048733 (action=1022)\n", + " current best f(x) = -0.963795 (best action=5734) \n", + "````\n", + "\n", + "\n", + "### Bayesian Optimization\n", + "\n", + "Next, we run the Bayesian optimization as follows.\n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). \n", + "- `score`: The type of acquisition function. You can specify one of the following\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "The hyperparameters are trained at the specified interval. \n", + "If a negative value is specified, no hyperparameter will be learned. \n", + "0 means that hyperparameter learning will be performed only in the first step. \n", + "- `num_rand_basis`: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.374318Z", + "start_time": "2020-12-04T06:02:06.382690Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=80, simulator=simulator(), score='TS', \n", + " interval=20, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking the results\n", + "\n", + "The search result ``res`` is returned as an object of the ``history`` class (`physbo.search.discrete.results.history`). \n", + "The following is a reference to the search results.\n", + "\n", + "- `res.fx` : The history of evaluated values of simulator (objective function).\n", + "- `res.chosen_actions`: The history of action IDs (parameters) when the simulator was evaluated. \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.\n", + "- `res.total_num_search`: Total number of simulator evaluations.\n", + "\n", + "Let's plot the objective function value and the best value at each step. \n", + "`res.fx` and `best_fx` should range up to `res.total_num_search`, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.620065Z", + "start_time": "2020-12-04T06:03:19.375626Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.774131Z", + "start_time": "2020-12-04T06:03:19.621947Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.873280Z", + "start_time": "2020-12-04T06:03:19.775506Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Serializing the results\n", + "\n", + "The search results can be saved to an external file using the `save` method." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.880149Z", + "start_time": "2020-12-04T06:03:19.874622Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.883409Z", + "start_time": "2020-12-04T06:03:19.881419Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the saved result file as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.892245Z", + "start_time": "2020-12-04T06:03:19.884981Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_interactive_mode.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_interactive_mode.ipynb.txt new file mode 100644 index 00000000..8c4031a2 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_interactive_mode.ipynb.txt @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Running PHYSBO interactively\n", + "\n", + "You can run PHYSBO interactively in the following way:\n", + "\n", + "1. Get the next parameter to run from PHYSBO\n", + "2. Get the evaluation values outside of PHYSBO\n", + "3. Register the evaluation values into PHYSBO\n", + "\n", + "For example, it is suitable for the following cases.\n", + "\n", + "- You want to perform an experiment manually and give the evaluation values to PHYSBO.\n", + "- You want to control the execution flexibly, such as running the simulator in a separate process.\n", + "\n", + "## Preparation of search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.663215Z", + "start_time": "2020-12-04T06:17:28.658656Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [], + "source": [ + "# Set policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# Set seed\n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In each search step, the following processes are performed.\n", + "\n", + "1. Running random_search or bayes_search with `max_num_probes=1, simulator=None` to get action IDs (parameters). \n", + "2. Getting the evaluation value (array of actions) by `t = simulator(actions)`. \n", + "3. Registering the evaluation value for the action ID (parameter) with `policy.write(actions, t)`. \n", + "4. Showing the history with `physbo.search.utility.show_search_results`.\n", + "\n", + "In the following, we will perform two random sampling (1st, and 2nd steps) and two Bayesian optimization proposals (3rd, and 4th steps)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:47.726433Z", + "start_time": "2020-12-04T06:17:28.677429Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "simulator = simulator()\n", + "\n", + "''' 1st step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 2nd step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 3rd step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "''' 4-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Suspend and restart\n", + "\n", + "You can suspend and restart the optimization process by saving the following predictor, training, and history to an external file.\n", + "\n", + "- predictor: Prediction model of the objective function\n", + "- training: Data used to train the predictor (`physbo.variable` object)\n", + "- history: History of optimization runs (`physbo.search.discrete.results.history` object)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:48.722691Z", + "start_time": "2020-12-04T06:17:47.728006Z" + } + }, + "outputs": [], + "source": [ + "policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:18:05.746742Z", + "start_time": "2020-12-04T06:17:48.724101Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "# delete policy \n", + "del policy\n", + "\n", + "# load policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')\n", + "\n", + "''' 5-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "# It is also possible to specify predictor and training separately.\n", + "''' 6-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, \n", + " predictor=policy.predictor, training=policy.training,\n", + " simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_multi_objective.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_multi_objective.ipynb.txt new file mode 100644 index 00000000..e26b0fe8 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_multi_objective.ipynb.txt @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-objective optimization\n", + "\n", + "When there are multiple objective functions ($p$) to be optimized, multi-objective optimization is used. \n", + "Note that in this tutorial, \"solution\" means the pair of objective functions $y = (y_1(x), y_2(x), \\dots, y_p(x))$. \n", + "Define the solution size relation $\\prec$ as follows. \n", + "\n", + "$y \\prec y^{'}\\Longleftrightarrow \\forall \\ i \\le p, y_i \\le y^{'}_i \\land \\exists \\ j \\le p, y_j < y^{'}_j$ \n", + "\n", + "A **Pareto solution** (in the maximization problem) is one in which no solution is larger than itself satisfying the above relations. \n", + "In other words, if you try to improve the value of any objective function, one of the other objective functions will deteriorate. \n", + "When there is a trade-off between objective functions, there are multiple Pareto solutions, and the numerical task is to find them efficiently.\n", + "\n", + "PHYSBO implements a Bayesian optimization method to find Pareto solutions efficiently. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.657438Z", + "start_time": "2021-01-05T06:06:13.061216Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import physbo\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test functions\n", + "\n", + "In this tutorial, we will use VLMOP2, which is a benchmark function for multi-objective optimization. \n", + "The number of objective functions is two.\n", + "\n", + "$$\n", + "\\begin{split}\n", + " y_1(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i - 1/\\sqrt{N}\\right)^2\\right] \\\\\n", + " y_2(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i + 1/\\sqrt{N}\\right)^2\\right],\n", + "\\end{split}\n", + "$$\n", + "\n", + "where $y_1$ and $y_2$ have minimums at $x_1 = x_2 = \\cdots x_N = 1/\\sqrt{N}$ and $x_1 = x_2 = \\cdots x_N = -1/\\sqrt{N}$, respectively, both of which are 0. Also, the upper bound is 1.\n", + "\n", + "Since PHYSBO solves a maximization problem, the objective function is again multiplied by -1.\n", + "\n", + "- Refernce\n", + " - Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.662277Z", + "start_time": "2021-01-05T06:06:13.658957Z" + } + }, + "outputs": [], + "source": [ + "def vlmop2_minus(x):\n", + " n = x.shape[1]\n", + " y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))\n", + " y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))\n", + "\n", + " return np.c_[-y1, -y2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparation of search candidate data\n", + "\n", + "Let the input space $\\vec{x}$ be two-dimensional, and generate a grid of candidate points on [-2, 2] × [-2, 2]." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.676772Z", + "start_time": "2021-01-05T06:06:13.664110Z" + } + }, + "outputs": [], + "source": [ + "import itertools\n", + "a = np.linspace(-2,2,101)\n", + "test_X = np.array(list(itertools.product(a, a)))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.683329Z", + "start_time": "2021-01-05T06:06:13.678152Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-2. , -2. ],\n", + " [-2. , -1.96],\n", + " [-2. , -1.92],\n", + " ...,\n", + " [ 2. , 1.92],\n", + " [ 2. , 1.96],\n", + " [ 2. , 2. ]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.688238Z", + "start_time": "2021-01-05T06:06:13.684556Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(10201, 2)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.693027Z", + "start_time": "2021-01-05T06:06:13.690029Z" + } + }, + "outputs": [], + "source": [ + "class simulator(object):\n", + " def __init__(self, X):\n", + " self.t = vlmop2_minus(X)\n", + " \n", + " def __call__( self, action):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.699166Z", + "start_time": "2021-01-05T06:06:13.694489Z" + } + }, + "outputs": [], + "source": [ + "simu = simulator(test_X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting the functions\n", + "\n", + "Let's plot each of the two objective functions. The first objective function has a peak in the upper right corner, and the second objective function has a trade-off with a peak in the lower left corner (The star is the position of the peak.).\n", + "\n", + "### First objective function" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.958020Z", + "start_time": "2021-01-05T06:06:13.701129Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 1\")\n", + "plt.colorbar()\n", + "plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Second objective function" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.158089Z", + "start_time": "2021-01-05T06:06:13.960026Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot objective 2\n", + "plt.figure()\n", + "plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 2\")\n", + "plt.colorbar()\n", + "plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimizations.\n", + "\n", + "## Setting policy\n", + "\n", + "Use `physbo.search.discrete_multi.policy` for multi-objective optimization. \n", + "Specify the number of objective functions in `num_objectives`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.163097Z", + "start_time": "2021-01-05T06:06:14.159742Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As with the usual usage of `physbo.search.discrete.policy` (with one objective function), optimization is done by calling the `random_search` or `bayes_search` methods. The basic API and usage are roughly the same as `discrete.policy`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Random search" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.316770Z", + "start_time": "2021-01-05T06:06:14.164245Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The evaluation value of the objective function (the array) and the action ID at that time are displayed. \n", + "It also displays a message when the Pareto set is updated.\n", + "\n", + "If you want to display the contents of the Pareto set when it is updated, specify `disp_pareto_set=True`. \n", + "Pareto set is sorted in ascending order of the first objective function value. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.493398Z", + "start_time": "2021-01-05T06:06:14.318132Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu, disp_pareto_set=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Checking results\n", + "\n", + " #### History of evaluation values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.498984Z", + "start_time": "2021-01-05T06:06:14.494679Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res_random.fx[0:res_random.num_runs]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Obtaining the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.504080Z", + "start_time": "2021-01-05T06:06:14.500385Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[-0.95713719, -0.09067194],\n", + " [-0.92633083, -0.29208351],\n", + " [-0.63329589, -0.63329589],\n", + " [-0.52191048, -0.72845916],\n", + " [-0.26132949, -0.87913689],\n", + " [-0.17190645, -0.91382463]]),\n", + " array([40, 3, 19, 16, 29, 41]))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "front, front_num = res_random.export_pareto_front()\n", + "front, front_num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the solution (evaluated value)\n", + "\n", + "Note again that the space to be plotted is $y = (y_1, y_2)$ and not $x = (x_1, x_2)$.\n", + "\n", + "The red plot is the Pareto solution." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.511086Z", + "start_time": "2021-01-05T06:06:14.505221Z" + } + }, + "outputs": [], + "source": [ + "def plot_pareto_front(res):\n", + " front, front_num = res.export_pareto_front()\n", + " dominated = [i for i in range(res.num_runs) if i not in front_num]\n", + " points = res.fx[dominated, :]\n", + "\n", + " plt.figure(figsize=(7, 7))\n", + " plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = \"blue\")\n", + " plt.scatter(front[:, 0], front[:, 1], c = \"red\")\n", + " plt.title('Pareto front')\n", + " plt.xlabel('Objective 1')\n", + " plt.ylabel('Objective 2')\n", + " plt.xlim([-1.0,0.0])\n", + " plt.ylim([-1.0,0.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.661288Z", + "start_time": "2021-01-05T06:06:14.512392Z" + }, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAG5CAYAAAAOKnSzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAkTElEQVR4nO3de3QkZ3nn8e+jscdG2MSegRhzkcTFXEyGEKyYWwgcYnNINmDD4RJWAfuQMJtlycnZhBBnxUKWRIFwyW0J50SB4AvKcrHBNpdgxnaAkJgETSA4Ngk2xBK+MtgQMIKM8Tz7R5U8PbJU6ml1d3VXfz/n6HRXdXX1o5qRfqq33nrfyEwkSdL6xuouQJKkQWZQSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDEppREXECRHxmYj4bkS8ve56pEFlUEpdFhE3RMT3I+LOiLgtIs6NiGN68DnnRsTvbWEXu4FvAvfLzN/oUln3KI/Dad3er9RvBqXUG8/NzGOAJwLTwOsO581R6PXP5yRwbW4w6khEHNHjz5eGgkEp9VBm3gT8NfBjEXF8RHw0IvZFxLfK5w9Z3TYiPhURcxHxd8AK8PCIeExE7ImIOyLi3yLixeW2u4EZ4LXlmetHyvWPLffz7Yi4JiKet15dEXEucFbL+0+LiN+JiAsj4r0R8R3g7Ih4UERcWn7+9RHxypZ9/E5EfCAizi+bb6+JiOnytQuACeAj5f5f2/2jK/WHQSn1UEQ8FPg54AsUP2/voTiTmwC+D7xjzVteRtEkeiywD9gD/BXwo8AvAO+MiJMzcx5YAN6Smcdk5nMj4kjgI8Any+1/FViIiEevrSszz17z/svLl84ALgSOK19/H3Aj8CDghcDvR8SzWnb1vHKb44BLV7+fzHwZsEx5Zp2ZbzmsAycNEINS6o2LI+LbwGeBTwO/n5m3Z+ZFmbmSmd8F5oBnrHnfuZl5TWb+EHgOcENmviczf5iZXwAuAl60wWc+GTgGeHNm7s/MK4GPAi89jLqvysyLM/MAcH/gacBvZeYPMvOLwLuAl7ds/9nM/Hhm3g1cAPz4YXyWNBS8BiH1xpktZ2kARMQ48EcUAXh8ufrYiNhWBg3A11veMgk8qQzcVUdQBNJ6HgR8vQy5VUvAgw+j7tbPfxBwRxnqrfubblm+teX5CnB0RBxRBr3UCAal1D+/ATwaeFJm3hoRT6Boko2WbVo71nwd+HRmnr7B/tZ2wrkZeGhEjLWE5QTwlcOosXWfNwM7IuLYlrCcAG7qYF/S0LLpVeqfYymuS347InYAb9hk+48Cj4qIl0XEkeXXT0bEY8vXbwMe3rL9P1Cc1b223PaZwHMpriEetsz8OvD3wJsi4uiIeDzwS8B729zF2vqkoWRQSv3zx8B9KO5d/BzwiaqNy7O4Z1N04rmZopnzD4Cjyk3eDZxc9nC9ODP3UwTjz5af8U7g5Zn5r1uo+aXAVPn5HwbesLZJucKbgNeV9b1mCzVItQonbpYkaWOeUUqSVKHWoIyI55Q3UV8fEees8/pREfH+8vV/iIipGsqUJI2w2oIyIrYBf0ZxPeVk4KURcfKazX4J+FZmPpKiW/0f9LdKSdKoq/OM8lTg+sz8WtkJ4X0Uo4K0OgM4r3x+IfAzERFIktQndd5H+WAOvbn5RuBJG22TmT+MiP8AdlL06LtHOe7lboD73ve+pzzmMY/pVc2SpCG0d+/eb2bmAzp5byMGHCjHvZwHmJ6ezsXFxZorkiQNkohY6vS9dTa93gQ8tGX5Idx7xI97timn/PkR4Pa+VCdJEvUG5eeBkyLiYRGxneKm6kvXbHMpxVRAUMxccOVGc+dJktQLtTW9ltccXw1cBmwD/jIzr4mINwKLmXkpxcgjF0TE9cAdFGEqSVLf1HqNMjM/Dnx8zbrXtzz/ARtPKSRJUs85Mo8kSRUMSkmSKhiUkiRVMCglSapgUEqSVMGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqmBQSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDEpJkioYlJIkVTAoJUmqYFBKklTBoJQkqYJBKUlSBYNSkqQKBqUkSRUMSkmSKhiUrRYWYGoKxsaKx4WFuiuSJNXsiLoLGBgLC7B7N6ysFMtLS8UywMxMfXVJkmrlGeWq2dmDIblqZaVYL0kaWQblquXlw1svSRoJBuWqiYnDWy9JGgkG5aq5ORgfP3Td+HixXpI0sgzKVTMzMD8Pk5MQUTzOz9uRR5JGnL1eW83MGIySpEN4RilJUgWDUpKkCgalJEkVDEpJkioYlJIkVTAoJUmqYFBKklTBoJQkqYJBKUlSBYNSkqQKBqUkSRUMSkmSKhiUkiRVMCglSapgUEqSVMGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqmBQSpJUwaCUJKmCQSlJUoXGBeXVV8PYGExNwcJC3dVIkobdEXUX0G379xePS0uwe3fxfGamvnokScOtcWeUrVZWYHa27iokScOs0UEJsLxcdwWSpGHW+KCcmKi7AknSMGt0UI6Pw9xc3VVIkoZZ44Jy+3aIgMlJmJ+3I48kaWsa1+t11y5YXKy7CklSU9RyRhkROyJiT0RcVz4ev842T4iIqyLimoj4UkS8pI5aJUmjra6m13OAKzLzJOCKcnmtFeDlmfk44DnAH0fEcf0rUZKk+oLyDOC88vl5wJlrN8jMr2TmdeXzm4FvAA/oV4GSJEF9QXlCZt5SPr8VOKFq44g4FdgOfHWD13dHxGJELO7bt6+7lUqSRlrPOvNExOXAA9d56ZCxcjIzIyIr9nMicAFwVmYeWG+bzJwH5gGmp6c33JckSYerZ0GZmadt9FpE3BYRJ2bmLWUQfmOD7e4HfAyYzczP9ahUSZI2VFfT66XAWeXzs4BL1m4QEduBDwPnZ+aFfaxNkqR71BWUbwZOj4jrgNPKZSJiOiLeVW7zYuCngbMj4ovl1xNqqVaSNLIis1mX9Kanp3PREQckSS0iYm9mTnfy3sYNYSdJUjcZlJIkVTAoJUmqYFBKklTBoJQkqYJBKUlSBYNSkqQKBqUkSRUMSkmSKhiUkiRVMCglSapgUEqSVMGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqmBQSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDEpJkioYlJIkVTAot2JhAaamYGyseFxYqLsiSVKXHVF3AUNrYQF274aVlWJ5aalYBpiZqa8uSVJXeUbZqdnZgyG5amWlWC9JagyDslPLy4e3XpI0lAzKTk1MHN56SdJQMig7NTcH4+OHrhsfL9ZLkhrDoOzUzAzMz8PkJEQUj/PzduSRpIax1+tWzMwYjJLUcJ5RSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDEpJkioYlJIkVTAoJUmqYFBKklTBoJQkqYJBKUlSBYNSkqQKBqUkSRUMSkmSKhiUkiRVMCglSapgUEqSVMGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqmBQSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDEpJkioYlJIkVTAoJUmqYFBKklShlqCMiB0RsScirisfj6/Y9n4RcWNEvKOfNUqSBPWdUZ4DXJGZJwFXlMsb+V3gM32pSpKkNeoKyjOA88rn5wFnrrdRRJwCnAB8sj9lSZJ0qLqC8oTMvKV8fitFGB4iIsaAtwOv2WxnEbE7IhYjYnHfvn3drVSSNNJ6FpQRcXlE/Ms6X2e0bpeZCeQ6u3gV8PHMvHGzz8rM+cyczszpW299AGNjMDUFCwvd+V4kSaPriF7tODNP2+i1iLgtIk7MzFsi4kTgG+ts9hTg6RHxKuAYYHtE3JmZVdcz2b+/eFxagt27i+czMx19C5Ik1db0eilwVvn8LOCStRtk5kxmTmTmFEXz6/mbheRaKyswO7vVUiVJo6yuoHwzcHpEXAecVi4TEdMR8a5uftDycjf3JkkaNVFcImyOiOmExXuWJyfhhhvqq0eSVL+I2JuZ0528t9Ej84yPw9xc3VVIkoZZ44Jy+3aIKM4k5+ftyCNJ2pqe9Xqty65dsLi4+XaSJLWjcWeUkiR1k0EpSVIFg1KSpAoGpSRJFTYMynIeyDdFxAUR8V/XvPbO3pcmSVL9qs4o3wMEcBHwCxFxUUQcVb725J5XJknSAKgKykdk5jmZeXFmPg/4J+DKiNjZp9okSapd1X2UR0XEWGYeAMjMuYi4CfgMxWwekiQ1XtUZ5UeAZ7WuyMxzgd8A9vewJkmSBsaGZ5SZ+doN1n8COKlnFUmSNEC8PUSSpAoGpSRJFQxKSZIqbBqUETEeEf87Iv6iXD4pIn6+96VJklS/ds4o3wP8J/CUcvkm4Pd6VlGXLCzA1BSMjRWPCwt1VyRJGkbtBOUjMvMtwF0AmblCMWLPwFpYgN27YWkJMovH3bsNS0nS4WsnKPdHxH2ABIiIR1CcYQ6s2VlYWTl03cpKsV6SpMNRNTLPqt8BPgE8NCIWgKcBZ/ewpi1bXj689ZIkbWTToMzMT0bEXoqB0AP4tcz8Zs8r24KJiaK5db31kiQdjnZ6vX4EeDbwqcz86KCHJMDcHIyPH7pufLxYL0nS4WjnGuXbgKcD10bEhRHxwog4usd1bcnMDMzPw+QkRBSP8/PFekmSDkdkZnsbRmyjGCT9lcBzMvN+vSysU9PT07m4uFh3GZKkARIRezNzupP3ttOZh7LX63OBlwBPBM7r5MMkSRo2mwZlRHwAOJWi5+s7gE+vzlEpSVLTtXNG+W7gpZl5d6+LkSRp0GwYlBHxrMy8ErgvcEbEoYPxZOaHelybJEm1qzqjfAZwJcW1ybUSMCglSY23YVBm5hvKp2/MzH9vfS0iHtbTqiRJGhDt3Ed50TrrLux2IZIkDaKqa5SPAR4H/EhEvKDlpfsBAz3ggCRJ3VJ1jfLRwM8Dx3HodcrvUgw6IElS41Vdo7wEuCQinpKZV/WxJkmSBkY71yh/JSKOW12IiOMj4i97V5IkSYOjnaB8fGZ+e3UhM78F/ETPKpIkaYC0E5RjEXH86kJE7KDNMWIlSRp27QTe24GrIuKD5fKLAGd2lCSNhE3PKDPzfOAFwG3l1wsy84JeF9apq6+GsTGYmoKFhbqrkSQNu3aaXgF2AN/LzHcA+wZ5ZJ79+yETlpZg927DUpK0NZsGZUS8Afgt4LfLVUcC7+1lUd2ysgKzs3VXIUkaZu2cUT4feB7wPYDMvBk4tpdFddPyct0VSJKGWTtBuT8zk2LGECLivr0tqbsmJuquQJI0zNoJyg9ExJ8Dx0XEK4HLgb/obVndMT4Oc/bPlSRtwaa3h2Tm2yLidOA7FOO/vj4z9/S8sg5t3w533VWcSc7NwcxM3RVJkoZZWwMHlME4sOHYatcuWFysuwpJUlNs2PQaEZ8tH78bEd9Z5+vfI+JV/StVkqT+q5o95KfKx3V7uEbETuDvgXf2pjRJkurXVtNrRDwR+CmKnq+fzcwvZObtEfHMHtYmSVLt2hlw4PXAecBO4P7AuRHxOoDMvKW35UmSVK92zihngB/PzB8ARMSbgS8Cv9fDuiRJGgjt3Ed5M3B0y/JRwE29KUeSpMGy4RllRPxfimuS/wFcExF7yuXTgX/sT3mSJNWrqul19W7EvcCHW9Z/qmfVSJI0YKpuDzkPICKOBh5Zrr5+9VqlJEmjoGrAgSMi4i3AjRS9Xs8Hvh4Rb4mII/tVoCRJdarqzPNWigmbH5aZp2TmE4FHAMcBb+tDbZIk1a4qKH8eeGVmfnd1RWZ+B/jvwM/1ujBJkgZBVVBmOQ/l2pV3U85NKUlS01UF5bUR8fK1KyPiF4F/7V1JkiQNjqrbQ/4H8KGIeAXFLSIA08B9gOf3ujBJkgZB1e0hNwFPiohnAY8rV388M6/oS2WSJA2ATcd6zcwrgSv7UIskSQOnnbFeJUkaWQalJEkVDEpJkioYlJIkVaglKCNiR0TsiYjrysfjN9huIiI+GRFfjohrI2Kqz6VKkkZcXWeU5wBXZOZJwBXl8nrOB96amY8FTgW+0af6JEkC6gvKMyhmJKF8PHPtBhFxMnBEZu4ByMw7M3OlbxVKkkR9QXlCZt5SPr8VOGGdbR4FfDsiPhQRX4iIt0bEtvV2FhG7I2IxIhb37dvXq5olSSNo0wEHOhURlwMPXOel2daFzMyIWG+Q9SOApwM/ASwD7wfOBt69dsPMnAfmAaanpx2wXZLUNT0Lysw8baPXIuK2iDgxM2+JiBNZ/9rjjcAXM/Nr5XsuBp7MOkEpSVKv1NX0eilwVvn8LOCSdbb5PHBcRDygXH4WcG0fapMk6R51BeWbgdMj4jrgtHKZiJiOiHfBPfNevga4IiKuBgL4i5rqlSSNqFhnbuahdtRR03nXXYtMTMDcHMzM1F2RJKluEbE3M6c7eW/PrlHWZf/+4nFpCXbvLp4blpKkTjV6CLuVFZid3Xw7SZI20uigBFhevve6hQWYmoKxseJxYaHfVUmShkXjg3Ji4tDlhYWiSXZpCTIPNtEaliPOv54kbaBxnXkiphMWARgfh/n5Q69RTk0V4bjW5CTccENfStSgWf3raaVlhMT1/vNIGlpb6czTuKDcrNfr2FhxJrlWBBw40J8aNWD860lqPHu9tti1CxYXN359YmL934lrm2g1Qta7kF21XtJIafw1yrXm5opWtVbj48V6jaiN/kryrydJjGBQzswUl54mJ4vm1slJL0WNPP96klShcU2v7ZiZMRjVYvU/w+xs0dzqsE6SWoxkUEr34l9PkjYwck2vkiQdjpEJSu8nlyR1YiSaXtfeT+6A6ZKkdo3EGeXs7KGDroADpkuS2jMSQen95JKkTo1EUHo/uSSpUyMRlN5PLknq1EgEpaPxSJI6NRK9XsH7ySVJnRmJM0pJkjplUEqSVMGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqmBQSpJUwaCUJKmCQSlJUgWDUpKkCgalJEkVDMotWFiAqSkYGyseFxbqrkiS1G0jMx9lty0swO7dsLJSLC8tFcvgvJeS1CSeUXZodvZgSK5aWSnWS5Kaw6Ds0PLy4a2XJA0ng7JDExOHt16SNJwMyg7NzcH4+KHrxseL9VJP2YtM6iuDskMzMzA/D5OTEFE8zs/bkUc9ttqLbGkJMg/2IjMspZ6JzKy7hq6anp7OxcXFusuQemNqqgjHtSYn4YYb+l2NNDQiYm9mTnfy3sadUV59tS1SajB7kUl917ig3L/fFik1mL3IpL5rXFC28r5GNY69yKS+a3RQgi1Sahh7kUl917jOPBHTCQc789jHQZJkZ54N2CIlSdqqxgXl9u22SEmSuqdxs4fs2gXeRilJ6pbGnVHecYeje0mSuqdxZ5RLS3DgwMHnzhEpSdqKxp1RrobkKu+llCRtReOCcj3eSylJ6tRIBKWje0mSOtW4oBxb8x15L6UkaSsaF5STk47uNQicW1hSUzSu1+uOHd5HWbfVuYVXVoplex9LGmaNO6NU/WZnD4bkKnsfSxpWjQvKvXtt6qubcwtLapLGBSU4aXPdnFtYUpM0MijBpr46ObewpCZpbFCCTX11cW5hSU3S6ImbnbRZkgRO3Lwum/rUT943KjVX4+6jhOJMcm7Opj71h/eNSs3WuKbX6enpXHTEAfXR1FQRjmvZ9C8NjqFreo2IHRGxJyKuKx+P32C7t0TENRHx5Yj404iIXtdmE5oOl/eNSs1W1zXKc4ArMvMk4Ipy+RAR8VTgacDjgR8DfhJ4Ri+LWm1CW1qCTO/HVHu8b1RqtrqC8gzgvPL5ecCZ62yTwNHAduAo4Ejgtl4W5dBr6oT3jUrNVldQnpCZt5TPbwVOWLtBZl4F/A1wS/l1WWZ+eb2dRcTuiFiMiMV9+/Z1XJRNaOqE941KzdazXq8RcTnwwHVeOuT8LDMzIu7VoygiHgk8FnhIuWpPRDw9M/927baZOQ/MQ9GZp9OaJybW75RhE5o2MzNjMEpN1bOgzMzTNnotIm6LiBMz85aIOBH4xjqbPR/4XGbeWb7nr4GnAPcKym6Zmzu0mz/YhCZJo66uptdLgbPK52cBl6yzzTLwjIg4IiKOpOjIs27Ta7fYhCZJWquW+ygjYifwAWACWAJenJl3RMQ08CuZ+csRsQ14J/DTFB17PpGZv77Zvr2PUpK01lbuo6xlZJ7MvB34mXXWLwK/XD6/G/hvfS5NkqRDNHasV0mSusGglCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIqGJSSJFUwKCVJqtC4oLz6aiddliR1T+OCcv/+e0+6vLBQBKcBKkk6XLWM9dpLEdMJB8d63bkTvv/9e88I4mDnkjQ6tjLWa+POKNe6/fZDQxKK5dnZ9beXJKlV44NyI8vLdVcgSRoGIxuUExN1VyBJGgYjGZTj4zA3V3cVkqRhMBJBuXMnTE5CRPFoRx5JUrtqmbi5l8bG4MCBg8vj4/Anf2IwSpI607gzyoiDz3fu9OxRkrQ1jQvKu+8++Pz736+vDklSMzQuKFt5v6QkaasaHZTg/ZKSpK1pfFB6v6SkvnBQ6cZqXK/XVt4vKakvFhaKWRhWx8tcnZUB7E3YAI0bFP2oo6bzrrsWmZgoQtL/o5J6bmqqCMe1Jifhhhv6XY3WsZVB0Rt3RrlrFywubr6dJHXNRp0h7CTRCI2/RilJPbdRZwg7STSCQSlJWzU3V3SKaGUnicYwKCVpq2ZmimHAHFS6kRp3jVKSajEzYzA2lGeUkiRVMCglSapgUEqSVMGglCSpgkEpSVIFg1KSmsYB2rvK20MkqUkcoL3rPKOUpCaZnT0YkqucxX5LDEpJahIHaO86g7JNNvlLGgoO0N51BmUbVpv8l5Yg82CTv2EpaeA4QHvXGZRtsMlf0tBwgPaui8ysu4aump6ezsUuz9w8NlacSa4VAQcOdPWjJEk9EBF7M3O6k/c27ozy6qu7fx3RJn9JdbOfRH0aF5T793f/OqJN/pLqZD+JejWu6TViOuFg0+vkJNxww9b3u7BQXJNcXi7OJOfmbPKX1B9TU0U4rtWt32+jYCtNr40PSlj/+qIkDQv7SWyd1ygrbNtm276k4WY/iXo1Pijvvtu2fUnDzX4S9Wp8UG7b5j2Qkoabt0bWq9HXKMfH7x2SB7ezbV+SRoXXKFts337oX1yTk+tvZ9u+JKkdjZuPctcuWDswT+vUbGDbviSpfY07o1zLtn1J0lY07oxyPTMzBqMkqTONO6PsxVivkqTR1bgzyv37i8elJXjFK4rnnk1KkjrVuDPKVvv3w6/9Wt1VSJKGWaODEuD22+uuQJI0zBoflJJGj+M7q5sad41yrZ07665AUj+tzt24eu/06vjOYH8FdabxZ5QvfnHdFUjqp9lZx3dWdzU+KM87z2YXaZQsLx/eemkzjQ9K/5KURotzN6rbGh+UUFyjkDQanLtR3TYSQbltm73gpFHh+M7qtkbPR9lq7dyU4+P+8EgaPgsLxeWk5eWiOXluzt9j7XA+yk1E2AtOOly2wgye1VtflpYg8+CtL/7b9FYtQRkRL4qIayLiQERsmPAR8ZyI+LeIuD4izun08zY6aR7WXnDd+gW22X6G4RdluzX2+3sZhmNXpd+/kIf9ePWLt77UJDP7/gU8Fng08ClgeoNttgFfBR4ObAf+GTh5832fksWP9uZfk5M5dN773szx8UO/j/HxYn0399Otz+mldmvs9/cyDMduM5OT/fuZacLx6peI9f9dIuqubPABi9lpZnX6xm58bRKUTwEua1n+beC3N99ne0E5rD+I3foFttl++vmLslPt1tjv72UYjt1m+vkLuQnHq188Vp3bSlDW2pknIj4FvCYz79X7JiJeCDwnM3+5XH4Z8KTMfPU62+4GykGqjjoFfmydT7v7h3DgABy5He7aDzffBN+8o3vfTb+ccsrGr+3du7X97AMeUO6nW5/TS+3W2PPv5f7AN/v4eX3w+F3Fz8pad+2HL13dpQ8pj1sTjle/3H8H3GcKfjQOrssDsLw0nL/P+urRmXlsJ2/s2VivEXE58MB1XprNzEu6+VmZOQ/Ml5+7mLnYUc+mUVccuyWP3WEqjltnvelGmcetM8VxW/a4HaaIuPftEG3qWVBm5mlb3MVNwENblh9SrpMkqW8G+faQzwMnRcTDImI78AvApTXXJEkaMXXdHvL8iLiRosPOxyLisnL9gyLi4wCZ+UPg1cBlwJeBD2TmNW3sfr5HZY8Cj11nPG6d8bh1xuPWmY6PW+NG5pEkqZsGuelVkqTaGZSSJFUY+qDs93B4TRIROyJiT0RcVz4ev8F2bymP8Zcj4k8jItbbblQcxnGbiIhPlsft2oiY6nOpA6Xd41Zue7+IuDEi3tHPGgdRO8ctIp4QEVeVP6dfioiX1FHrINjsd31EHBUR7y9f/4d2fi6HPiiBfwFeAHxmow0iYhvwZ8DPAicDL42Ik/tT3kA7B7giM08CriiXDxERTwWeBjyeYiSHnwSe0c8iB9Cmx610PvDWzHwscCrwjT7VN6jaPW4Av0vFz/SIaee4rQAvz8zHAc8B/jgijutfiYOhzd/1vwR8KzMfCfwR8Aeb7XfogzIzv5yZ/7bJZqcC12fm1zJzP/A+4IzeVzfwzgDOK5+fB5y5zjYJHE0x3u5RwJHAbf0oboBtetzKH84jMnMPQGbemZkra7cbMe38fyMiTgFOAD7Zn7IG3qbHLTO/kpnXlc9vpvij7AH9KnCAtPO7vvV4Xgj8zGatZEMflG16MPD1luUby3Wj7oTMvKV8fivFL6dDZOZVwN8At5Rfl2Xml/tX4kDa9LgBjwK+HREfiogvRMRby792R9mmxy0ixoC3A6/pZ2EDrp3/b/eIiFMp/rD9aq8LG0Dt/K6/Z5vyNsT/AHZW7bRnI/N0Uz+Hw2uaqmPXupCZGRH3ulcoIh5JMdvLQ8pVeyLi6Zn5t10vdoBs9bhR/Gw9HfgJYBl4P3A28O7uVjpYunDcXgV8PDNvHKVL4V04bqv7ORG4ADgrMw90t8rRNRRB6XB4nas6dhFxW0ScmJm3lD9g611Dez7wucy8s3zPX1MMFNHooOzCcbsR+GJmfq18z8XAk2l4UHbhuD0FeHpEvAo4BtgeEXdmZqM74HXhuBER9wM+RnEC8bkelTro2vldv7rNjRFxBPAjwO1VOx2VpleHw1vfpcBZ5fOzgPXOzpeBZ0TEERFxJEVHnlFvem3nuH0eOC4iVq8TPQu4tg+1DbJNj1tmzmTmRGZOUTS/nt/0kGzDpset/L32YYrjdWEfaxs07fyubz2eLwSuzM1G3ul0fq5B+aI447kR+E+KTiaXlesfRNGEs7rdzwFfoWi3n6277kH4omiXvwK4Drgc2FGunwbeVT7fBvw5RTheC/xh3XXX/dXOcSuXTwe+BFwNnAtsr7v2YThuLdufDbyj7rrr/mrz5/QXgbuAL7Z8PaHu2ms6Xvf6XQ+8EXhe+fxo4IPA9cA/Ag/fbJ8OYSdJUoVRaXqVJKkjBqUkSRUMSkmSKhiUkiRVMCglSapgUEp9FBEPiYhLypkgvhoRf1Le70VEnL3RbBkR8fcdft6ZrYNCR8QbI2KrA3i0PWuP1AQGpdQn5cDLHwIuzmImiEdRjD4zt9l7M/OpHX7smRSzKKzu5/WZeXmH+2q16aw9UlMYlFL/PAv4QWa+ByAz7wb+J/CKiBgvt3loRHyqPON8w+obI+LOlue/GRGfL+cd/D8t619ervvniLignCLtecBbI+KLEfGIiDg3Il5Yztn3wZb3PjMiPlo+f3Y5t+E/RcQHI+KYtd9Itjdrj9QIQzHWq9QQjwP2tq7IzO9ExDLwyHLVqRTzfq4An4+Ij2Xm4ur2EfFs4KRyuwAujYifphir8nXAUzPzmxGxIzPviIhLgY9mOaxZy0DjlwPzEXHfzPwe8BLgfRFx/3I/p2Xm9yLit4BfpxjZRBpJBqU0WPZk5u0AEfEh4KeAxZbXn11+faFcPoYiOH8c+GBmfhMgM++o+pDM/GFEfAJ4bkRcCPwX4LUUY/meDPxdGarbgau6861Jw8mglPrnWopBmO9RzvgwQTHu5BMpJsputXY5gDdl5p+v2c+vdlDP+4BXA3cAi5n53fI66p7MfGkH+5MayWuUUv9cAYxHxMsByomc3w6cm5kr5TanR8SOiLgPRUecv1uzj8sormkeU+7jwRHxo8CVwIsiYme5fke5/XeBYzeo59MU4fxKitAE+BzwtHIeUiLivhHxqC18z9LQMyilPsliBoLnUwTadRQzHPwA+F8tm/0jcBHFrCMXtVyfzHIfnwT+CrgqIq4GLgSOzcxrKHrPfjoi/hn4w/J97wN+MyK+EBGPWFPP3cBHgZ8tH8nMfRSzdvy/iPgSRbPrY9Z+LxHx/Ii4kWL+yI9FxGUdHxhpwDl7iDTgyrPEf8rMybprkUaRZ5TSAIuIB1Gc1b2t7lqkUeUZpSRJFTyjlCSpgkEpSVIFg1KSpAoGpSRJFQxKSZIq/H9/YsaKiEZ7oAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_random)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Calculate the volume of the dominated region\n", + "\n", + "A solution that is not a Pareto solution, i.e., a solution $y$ for which there exists a solution $y'$ that is better than itself, is called a inferior solution ($\\exists y' y\\prec y'$). The volume of the inferior solution region, which is the space occupied by inferior solutions in the solution space (a subspace of the solution space), is one of the indicators of the results of multi-objective optimization. The larger this value is, the more good Pareto solutions are obtained.`res_random.pareto.volume_in_dominance(ref_min, ref_max)` calculates the volume of the inferior solution region in the hyper-rectangle specified by `ref_min` and `ref_max`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.666649Z", + "start_time": "2021-01-05T06:06:14.662809Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2376881844865093" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_random.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bayesian optimization\n", + "\n", + "For `bayes_search` in the multi-objective case, `score` can be selected from the following method\n", + "\n", + "- HVPI (HyperVolume-based Probability of Improvement)\n", + "- EHVI (Expected Hyper-Volume Improvement)\n", + "- TS (Thompson Sampling)\n", + "\n", + "The following 50 evaluations (10 random searches + 40 Bayesian optimizations) will be performed with different scores." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### HVPI (HyperVolume-based Probability of Improvement)\n", + "\n", + "The improvement probability of a non-dominated region in a multi-dimensional objective function space is obtained as a score. \n", + "\n", + "- Reference\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.019463Z", + "start_time": "2021-01-05T06:06:14.668034Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution\n", + "\n", + "We can see that more Pareto solutions are obtained compared to random sampling." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.190434Z", + "start_time": "2021-01-05T06:06:29.020967Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_HVPI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.196389Z", + "start_time": "2021-01-05T06:06:29.191710Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.32877907991633726" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### EHVI (Expected Hyper-Volume Improvement)\n", + "\n", + "The expected improvement of the non-dominated region in the multi-dimensional objective function space is obtained as score. \n", + "\n", + "- Reference\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.237335Z", + "start_time": "2021-01-05T06:06:29.201353Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.386473Z", + "start_time": "2021-01-05T06:08:41.239067Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_EHVI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.402348Z", + "start_time": "2021-01-05T06:08:41.394521Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3200467412741881" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TS (Thompson Sampling)\n", + "\n", + "In Thompson Sampling for the single objective case, at each candidate (test_X), sampling is performed from the posterior distribution of the objective function, and the candidate with the largest value is recommended as the next search point. In the multi-objective case, one candidate is randomly selected as the next search point from among the candidates with the maximum value based on the Pareto rule for the sampled values, i.e., the Pareto-optimal candidates.\n", + "\n", + "- Reference\n", + " - Yahyaa, Saba Q., and Bernard Manderick. \"Thompson sampling for multi-objective multi-armed bandits problem.\" Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.534284Z", + "start_time": "2021-01-05T06:08:41.405209Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.716955Z", + "start_time": "2021-01-05T06:09:52.535519Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_TS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.722260Z", + "start_time": "2021-01-05T06:09:52.718300Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.16415446221006114" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_TS.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "code_folding": [] + }, + "source": [ + "## Appendix: Full search\n", + "\n", + "In `random_search`, you can easily do a full search by passing the number of all data (`N = test_X.shape[0]`) to `max_num_probes`. \n", + "Since it takes time to evaluate all data, reduce the number of data in advance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.049904Z", + "start_time": "2021-01-05T06:09:52.723545Z" + } + }, + "outputs": [], + "source": [ + "test_X_sparse = np.array(list(itertools.product(np.linspace(-2, 2, 21), repeat=2)))\n", + "simu_sparse = simulator(test_X_sparse)\n", + "\n", + "policy = physbo.search.discrete_multi.policy(test_X=test_X_sparse, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "N = test_X_sparse.shape[0]\n", + "res_all = policy.random_search(max_num_probes=N, simulator=simu_sparse)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.212669Z", + "start_time": "2021-01-05T06:09:53.051682Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_all)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.218237Z", + "start_time": "2021-01-05T06:09:53.214184Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30051687493437484" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_all.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_multi_probe.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_multi_probe.ipynb.txt new file mode 100644 index 00000000..0f5e93e4 --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_multi_probe.ipynb.txt @@ -0,0 +1,316 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Search multiple candidates at once\n", + "\n", + "This is a tutorial for evaluating two or more candidates at once in a single search step.\n", + "\n", + "## Prepare the search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.096798Z", + "start_time": "2020-12-04T06:19:54.436605Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator \n", + "\n", + "If `num_search_each_probe` (described below) is set to 2 or more, action will be input as an array of action IDs. \n", + "Thus, define the simulator to return a list of evaluation values for each action ID.\n", + "\n", + "The definitions in the basic tutorial and simulator are the same, but keep in mind that t is a ``numpy.array``, and when action is an array, `self.t[action]` will also be an array." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.100697Z", + "start_time": "2020-12-04T06:19:55.098103Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example of running the simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.218606Z", + "start_time": "2020-12-04T06:19:55.102879Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01487066, -1.22884748, -1.05572838])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim = simulator()\n", + "sim([1,12,123])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimizations" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.224761Z", + "start_time": "2020-12-04T06:19:55.220423Z" + } + }, + "outputs": [], + "source": [ + "# set policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`num_search_each_probe` allows you to specify the number of candidates to evaluate in each search step.\n", + "\n", + "In the following example, the simulator will be evaluated 2 × 10 = 20 times by random search and 8 × 10 = 80 times by Bayesian optimization. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `num_search_each_probe`: Number of candidates to evaluate at each search step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.195375Z", + "start_time": "2020-12-04T06:19:55.226486Z" + } + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())\n", + "\n", + "res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI', \n", + " interval=2, num_rand_basis=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.312635Z", + "start_time": "2020-12-04T06:20:24.196633Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.415783Z", + "start_time": "2020-12-04T06:20:24.314259Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With `res.export_sequence_best_fx()`, you can get the best value obtained at each step and the history of the action. \n", + "\n", + "The difference between `res.export_all_sequence_best_fx()` and `res.export_all_sequence_best_fx()` is that the information is not for each evaluation of the simulator, but for each search step. In this case, the total number of steps is 10, and the number of evaluations is 100." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.535770Z", + "start_time": "2020-12-04T06:20:24.418352Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/_sources/notebook/tutorial_once_mode.ipynb.txt b/manual/v2.0.2/en/_sources/notebook/tutorial_once_mode.ipynb.txt new file mode 100644 index 00000000..6d56f8ae --- /dev/null +++ b/manual/v2.0.2/en/_sources/notebook/tutorial_once_mode.ipynb.txt @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Restart calculations by reading existing calculation results\n", + "\n", + "You can read existing action IDs (parameters) and their evaluation values and run PHYSBO in the following flow. \n", + "\n", + "1. Load an external file and read the existing action IDs (parameters) and their evaluation values. \n", + "2. Register the action ID (parameter) and evaluation value to PHYSBO. \n", + "3. Get the parameters for the next execution from PHYSBO.\n", + "\n", + "This can be used in cases where PHYSBO cannot be left open for a long time due to time constraints, and thus cannot be executed interactively.\n", + "\n", + "## Prepare the search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparing the precomputed data\n", + "\n", + "In the `load_data` function above, all X and t are stored. Here, as precomputed, we get a random list of 20 actoin IDs and their evaluation values." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]\n" + ] + } + ], + "source": [ + "import random\n", + "random.seed(0)\n", + "calculated_ids = random.sample(range(t.size), 20)\n", + "print(calculated_ids)\n", + "t_initial = t[calculated_ids]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Register action ID (parameter) and evaluation value to PHYSBO.\n", + "\n", + "Register `calculated_ids` and `t[calculated_ids]` as a list in the initial variable `initial_data` of policy." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])\n", + "\n", + "# set seed \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get the next parameter to be executed from PHYSBO\n", + "\n", + "Perform Bayesian optimization to obtain the next candidate point." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood -20.09302189053099\n", + "50 -th epoch marginal likelihood -23.11964735598211\n", + "100 -th epoch marginal likelihood -24.83020118385076\n", + "150 -th epoch marginal likelihood -25.817906570042602\n", + "200 -th epoch marginal likelihood -26.42342027124426\n", + "250 -th epoch marginal likelihood -26.822598600211865\n", + "300 -th epoch marginal likelihood -27.10872736571494\n", + "350 -th epoch marginal likelihood -27.331572599126865\n", + "400 -th epoch marginal likelihood -27.517235815448124\n", + "450 -th epoch marginal likelihood -27.67892333553869\n", + "500 -th epoch marginal likelihood -27.82299469827059\n", + "Done\n", + "\n", + "[73] [[-1.6680279 -1.46385011 1.68585446]]\n" + ] + } + ], + "source": [ + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score=\"TS\", interval=0, num_rand_basis = 5000)\n", + "print(actions, X[actions])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Perform external calculations on the obtained candidate points, and register the actions and their scores in a file. The process of reading the file again, running the Bayesian optimization, and obtaining the next candidate point is repeated to advance the Bayesian optimization." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/_static/_sphinx_javascript_frameworks_compat.js b/manual/v2.0.2/en/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/manual/v2.0.2/en/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/manual/v2.0.2/en/_static/basic.css b/manual/v2.0.2/en/_static/basic.css new file mode 100644 index 00000000..7ebbd6d0 --- /dev/null +++ b/manual/v2.0.2/en/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/css/badge_only.css b/manual/v2.0.2/en/_static/css/badge_only.css new file mode 100644 index 00000000..88ba55b9 --- /dev/null +++ b/manual/v2.0.2/en/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff2 b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff2 b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.eot b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.svg b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.ttf b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff2 b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff b/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff2 b/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff b/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff2 b/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-bold.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff b/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff2 b/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff b/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff differ diff --git a/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff2 b/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/manual/v2.0.2/en/_static/css/fonts/lato-normal.woff2 differ diff --git a/manual/v2.0.2/en/_static/css/theme.css b/manual/v2.0.2/en/_static/css/theme.css new file mode 100644 index 00000000..0f14f106 --- /dev/null +++ b/manual/v2.0.2/en/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/doctools.js b/manual/v2.0.2/en/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/manual/v2.0.2/en/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/manual/v2.0.2/en/_static/documentation_options.js b/manual/v2.0.2/en/_static/documentation_options.js new file mode 100644 index 00000000..909cb461 --- /dev/null +++ b/manual/v2.0.2/en/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '2.0.2', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/file.png b/manual/v2.0.2/en/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/manual/v2.0.2/en/_static/file.png differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.eot b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.ttf b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff2 b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.eot b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.ttf b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff2 b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.eot b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.ttf b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff2 b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.eot b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.ttf b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff2 b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/manual/v2.0.2/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/manual/v2.0.2/en/_static/jquery.js b/manual/v2.0.2/en/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/manual/v2.0.2/en/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t a.language.name.localeCompare(b.language.name)); + + const languagesHTML = ` +
+
Languages
+ ${languages + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} +
+ `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/language_data.js b/manual/v2.0.2/en/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/manual/v2.0.2/en/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/manual/v2.0.2/en/_static/logo.png b/manual/v2.0.2/en/_static/logo.png new file mode 100644 index 00000000..b773f891 Binary files /dev/null and b/manual/v2.0.2/en/_static/logo.png differ diff --git a/manual/v2.0.2/en/_static/minus.png b/manual/v2.0.2/en/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/manual/v2.0.2/en/_static/minus.png differ diff --git a/manual/v2.0.2/en/_static/nbsphinx-broken-thumbnail.svg b/manual/v2.0.2/en/_static/nbsphinx-broken-thumbnail.svg new file mode 100644 index 00000000..4919ca88 --- /dev/null +++ b/manual/v2.0.2/en/_static/nbsphinx-broken-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/manual/v2.0.2/en/_static/nbsphinx-code-cells.css b/manual/v2.0.2/en/_static/nbsphinx-code-cells.css new file mode 100644 index 00000000..a3fb27c3 --- /dev/null +++ b/manual/v2.0.2/en/_static/nbsphinx-code-cells.css @@ -0,0 +1,259 @@ +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nbinput.container div.prompt pre > code { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nboutput.container div.prompt pre > code { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars and line breaks on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; + white-space: pre; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copy button on prompts for 'sphinx_copybutton' extension ... */ +.prompt .copybtn, +/* ... and 'sphinx_immaterial' theme */ +.prompt .md-clipboard.md-icon { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +.jp-RenderedHTMLCommon table, +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +.jp-RenderedHTMLCommon thead, +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +.jp-RenderedHTMLCommon tr, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon td, +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.jp-RenderedHTMLCommon th, +div.rendered_html th { + font-weight: bold; +} +.jp-RenderedHTMLCommon tbody tr:nth-child(odd), +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +.jp-RenderedHTMLCommon tbody tr:hover, +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + diff --git a/manual/v2.0.2/en/_static/nbsphinx-gallery.css b/manual/v2.0.2/en/_static/nbsphinx-gallery.css new file mode 100644 index 00000000..365c27a9 --- /dev/null +++ b/manual/v2.0.2/en/_static/nbsphinx-gallery.css @@ -0,0 +1,31 @@ +.nbsphinx-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 5px; + margin-top: 1em; + margin-bottom: 1em; +} + +.nbsphinx-gallery > a { + padding: 5px; + border: 1px dotted currentColor; + border-radius: 2px; + text-align: center; +} + +.nbsphinx-gallery > a:hover { + border-style: solid; +} + +.nbsphinx-gallery img { + max-width: 100%; + max-height: 100%; +} + +.nbsphinx-gallery > a > div:first-child { + display: flex; + align-items: start; + justify-content: center; + height: 120px; + margin-bottom: 5px; +} diff --git a/manual/v2.0.2/en/_static/nbsphinx-no-thumbnail.svg b/manual/v2.0.2/en/_static/nbsphinx-no-thumbnail.svg new file mode 100644 index 00000000..9dca7588 --- /dev/null +++ b/manual/v2.0.2/en/_static/nbsphinx-no-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/manual/v2.0.2/en/_static/plus.png b/manual/v2.0.2/en/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/manual/v2.0.2/en/_static/plus.png differ diff --git a/manual/v2.0.2/en/_static/pygments.css b/manual/v2.0.2/en/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/manual/v2.0.2/en/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/manual/v2.0.2/en/_static/searchtools.js b/manual/v2.0.2/en/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/manual/v2.0.2/en/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/manual/v2.0.2/en/_static/sphinx_highlight.js b/manual/v2.0.2/en/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/manual/v2.0.2/en/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/manual/v2.0.2/en/acknowledgement.html b/manual/v2.0.2/en/acknowledgement.html new file mode 100644 index 00000000..ab85c5ab --- /dev/null +++ b/manual/v2.0.2/en/acknowledgement.html @@ -0,0 +1,177 @@ + + + + + + + + + Acknowledgement — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Acknowledgement

+

We would like to thank the support from “Project for advancement of software usability in materials science” by The Institute for Solid State Physics, The University of Tokyo, for development of PHYSBO.

+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/algorithm.html b/manual/v2.0.2/en/algorithm.html new file mode 100644 index 00000000..20b174f7 --- /dev/null +++ b/manual/v2.0.2/en/algorithm.html @@ -0,0 +1,287 @@ + + + + + + + + + Algorithm — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Algorithm

+

This section describes an overview of Bayesian optimization. For technical details, please refer to this reference .

+
+

Bayesian optimization

+

Bayesian optimization is a method that can be used in complex simulations or real-world experimental tasks where the evaluation of the objective function (e.g., property values) is very costly. In other words, Bayesian optimization solves the problem of finding explanatory variables (material composition, structure, process and simulation parameters, etc.) that have a better objective function (material properties, etc.) with as few experiments and simulations as possible. In Bayesian optimization, we start from a situation where we have a list of candidates for the explanatory variables to be searched (represented by the vector \({\bf x}\)). Then, from among the candidates, the one that is expected to improve the objective function \(y\) is selected by making good use of prediction by machine learning (using Gaussian process regression). We then evaluate the value of the objective function by performing experiments and simulations on the candidates. By repeating the process of selection by machine learning and evaluation by experimental simulation, optimization can be achieved in as few times as possible.

+

The details of the Bayesian optimization algorithm are described below.

+
    +
  • Step1: Initialization

  • +
+

Prepare the space to be explored in advance. In other words, list up the composition, structure, process, simulation parameters, etc. of the candidate materials as a vector \({\bf x}\). At this stage, the value of the objective function is not known. A few candidates are chosen as initial conditions and the value of the objective function \(y\) is estimated by experiment or simulation. This gives us the training data \(D = \{ {\bf x}_i, y_i \}_{(i=1, \cdots, N)}\) with the explanatory variables \({\bf x}\) and the objective function \(y\).

+
    +
  • Step2: Selection of candidates

  • +
+

Using the training data, learn a Gaussian process. For Gaussian process, the mean of the predictions at arbitary \({\bf x}\) is \(\mu_c ({\bf x})\) and the variance is \(\sigma_c ({\bf x})\) are given as follows

+
+\[ \begin{align}\begin{aligned}\mu_c ({\bf x}) &= {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf y},\\\sigma_c({\bf x}) &= k({\bf x}, {\bf x}) + \sigma^2 - {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf k}({\bf x}),\end{aligned}\end{align} \]
+

where \(k({\bf x}, {\bf x}')\) is a function called as a kernel, and it represents the similarity of two vectors. In general, the following Gaussian kernel is used:

+
+\[k({\bf x}, {\bf x}') = \exp \left[ -\frac{1}{2\eta^2}||{\bf x} - {\bf x}'||^2 \right].\]
+

Using this kernel function, \({\bf k}({\bf x})\) and \(K\) are computed as follows

+
+\[{\bf k}({\bf x}) = \left( k({\bf x}_1, {\bf x}), k({\bf x}_2, {\bf x}), \cdots, k({\bf x}_N, {\bf x}) \right)^\top\]
+
+ \[ + K = \left( + \begin{array}{cccc} + k({\bf x}_1, {\bf x}_1) & k({\bf x}_1, {\bf x}_2) & \ldots & k({\bf x}_1, {\bf x}_N) \\ + k({\bf x}_2, {\bf x}_1) & k({\bf x}_2, {\bf x}_2) & \ldots & k({\bf x}_2, {\bf x}_N) \\ + \vdots & \vdots & \ddots & \vdots \\ + k({\bf x}_N, {\bf x}_1) & k({\bf x}_N, {\bf x}_2) & \ldots & k({\bf x}_N, {\bf x}_N) + \end{array} + \right) + \]

For all candidates that have not yet been tested or simulated, the prediction \(\mu_c ({\bf x})\) and the variance associated with the uncertainty of the prediction \(\sigma_c ({\bf x})\) are estimated. Using this, the acquisition function is calculated. Then, the candidate \({\bf x}^*\) is selected that maximizes the acquisition function from among the candidates for which we do not yet know the value of the objective function. In this case, \(\sigma\) and \(\eta\) are called hyperparameters, and PHYSBO will automatically set the best value.

+

As an acquisition function, for example, Maximum Probability of Improvement (PI) and Maximum Expected Improvement (EI) are useful. +The score of PI is defined as follows.

+
+\[\text{PI} (\mathbf{x}) = \Phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})},\]
+

where \(\Phi(\cdot)\) is the cumulative distribution function. +The PI score represents the probability of exceeding the maximum \(y_{\max}\) of the currently obtained \(y\). +In addition, the EI score is the expected value of the difference between the predicted value and the current maximum \(y_{\max}\) and is given by

+
+\[\text{EI} (\mathbf{x}) = [\mu_c (\mathbf{x})-y_{\max}] \Phi (z (\mathbf{x})) + \sigma_c (\mathbf{x}) \phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})},\]
+

where \(\phi(\cdot)\) is a probability density function.

+
    +
  • Step3: Experiment (Simulation)

  • +
+

Perform an experiment or simulation on the candidate \({\bf x}^*\) with the largest acquisition function selected in step 2, and estimate the objective function value \(y\). This will add one more piece of training data. Repeat steps 2 and 3 to search for candidates with good scores.

+
+
+

Accelerating Bayesian Optimization with PHYSBO

+

In PHYSBO, random feature map, Thompson sampling, and Cholesky decomposition are used to accelerate the calculation of Bayesian optimization. +First, the random feature map is introduced. +By introducing the random feature map \(\phi (\mathbf{x})\), we can approximate the Gaussian kernel \(k(\mathbf{x},\mathbf{x}')\) as follows.

+
+\[\begin{split}k(\mathbf{x},\mathbf{x}') = \exp \left[ - \frac{1}{2 \eta^2} \| \mathbf{x} -\mathbf{x}' \| \right]^2 \simeq \phi (\mathbf{x})^\top \phi(\mathbf{x}') \\ +\phi (\mathbf{x}) = \left( z_{\omega_1, b_1} (\mathbf{x}/\eta),..., z_{\omega_l, b_l} (\mathbf{x}/\eta) \right)^\top,\end{split}\]
+

where \(z_{\omega, b} (\mathbf{x}) = \sqrt{2} \cos (\boldsymbol{\omega}^\top \mathbf{x}+b)\). +Then, \(\boldsymbol{\omega}\) is generated from \(p(\boldsymbol{\omega}) = (2\pi)^{-d/2} \exp (-\|\boldsymbol{\omega}\|^2/2)\) and \(b\) is chosen uniformly from \([0, 2 \pi]\) is chosen uniformly from \([0, 2 \pi]\). +This approximation is strictly valid in the limit of \(l \to \infty\), where the value of \(l\) is the dimension of the random feature map.

+
+

\(\Phi\) can be represented as a \(l\) row \(n\) column matrix with \(\phi(\mathbf{x}_i)\) in each column by \(\mathbf{x}\) vector of training data as follows:

+
+
+\[\Phi = ( \phi(\mathbf{x}_1),..., \phi(\mathbf{x}_n) ).\]
+

It is seen that the following relation is satisfied:

+
+\[\begin{split}\mathbf{k} (\mathbf{x}) = \Phi^\top \phi(\mathbf{x}) \\ +K= \Phi^\top \Phi.\end{split}\]
+

Next, a method that uses Thompson sampling to make the computation time for candidate prediction \(O(l)\) is introduced. +Note that using EI or PI will result in \(O(l^2)\) because of the need to evaluate the variance. +In order to perform Thompson sampling, the Bayesian linear model defined below is used.

+
+\[y = \mathbf{w}^\top \phi (\mathbf{x}),\]
+

where \(\phi(\mathbf{x})\) is random feature map described above and \(\mathbf{w}\) is a coefficient vector. +In a Gaussian process, when the training data \(D\) is given, this \(\mathbf{w}\) is determined to follow the following Gaussian distribution.

+
+\[\begin{split}p(\mathbf{w}|D) = \mathcal{N} (\boldsymbol{\mu}, \Sigma) \\ +\boldsymbol{\mu} = (\Phi \Phi^\top + \sigma^2 I)^{-1} \Phi \mathbf{y} \\ +\Sigma = \sigma^2 (\Phi \Phi^\top + \sigma^2 I)^{-1}\end{split}\]
+

In Thompson sampling, one coefficient vector is sampled according to this posterior probability distribution and set to \(\mathbf{w}^*\), which represents the acquisition function as follows

+
+\[\text{TS} (\mathbf{x}) = {\mathbf{w}^*}^\top \phi (\mathbf{x}).\]
+

The \(\mathbf{x}^*\) that maximizes \(\text{TS} (\mathbf{x})\) will be selected as the next candidate. +In this case, \(\phi (\mathbf{x})\) is an \(l\) dimensional vector, so the acquisition function can be computed with \(O(l)\).

+

Next, the manner for accelerating the sampling of \(\mathbf{w}\) is introduced. +The matrix \(A\) is defined as follows.

+
+\[A = \frac{1}{\sigma^2} \Phi \Phi^\top +I\]
+

Then the posterior probability distribution is given as

+
+\[p(\mathbf{w}|D) = \mathcal{N} \left( \frac{1}{\sigma^2} A^{-1} \Phi \mathbf{y}, A^{-1} \right).\]
+

Therefore, in order to sample \(\mathbf{w}\), we need to calculate \(A^{-1}\). +Now consider the case of the newly added \((\mathbf{x}', y')\) in the Bayesian optimization iteration. +With the addition of this data, the matrix \(A\) is updated as

+
+\[A' = A + \frac{1}{\sigma^2} \phi (\mathbf{x}') \phi (\mathbf{x}')^\top.\]
+

This update can be done using the Cholesky decomposition ( \(A= L^\top L\) ), which reduces the time it takes to compute \(A^{-1}\) to \(O(l^2)\). +If we compute \(A^{-1}\) at every step, the numerical cost becomes \(O(l^3)\). +The \(\mathbf{w}\) is obtained by

+
+\[\mathbf{w}^* = \boldsymbol{\mu} + \mathbf{w}_0,\]
+

where \(\mathbf{w}_0\) is sampled from \(\mathcal{N} (0,A^{-1})\) and \(\boldsymbol{\mu}\) is calculated by

+
+\[L^\top L \boldsymbol{\mu} = \frac{1}{\sigma^2} \Phi \mathbf{y}.\]
+

By using these techniques, a computation time becomes almost linear in the number of training data.

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/modules.html b/manual/v2.0.2/en/api/modules.html new file mode 100644 index 00000000..232ae1a4 --- /dev/null +++ b/manual/v2.0.2/en/api/modules.html @@ -0,0 +1,221 @@ + + + + + + + + + physbo — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.basis.fourier.html b/manual/v2.0.2/en/api/physbo.blm.basis.fourier.html new file mode 100644 index 00000000..be493e8c --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.basis.fourier.html @@ -0,0 +1,288 @@ + + + + + + + + + physbo.blm.basis.fourier module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.basis.fourier module

+
+
+class physbo.blm.basis.fourier.fourier(params)[source]
+

Bases: object

+

random feature maps +Psi(X; W,b) = cos[X * Wt + b] * alpha +where

+
+
    +
  • X: input, N-by-d matrix

  • +
  • W: weight, l-by-d matrix

  • +
  • Wt: transpose of W

  • +
  • b: bias, 1-by-l matrix

  • +
  • alpha: coefficient

  • +
+
+

and

+
+
    +
  • N: number of data

  • +
  • d: dimension of input

  • +
  • l: number of basis

  • +
+
+
+
+params
+

W, b, alpha

+
+
Type:
+

Tuple

+
+
+
+ +
+
+nbasis
+

number of basis

+
+
Type:
+

int

+
+
+
+ +

References

+

A. Rahimi and B. Recht, “Random features for large-scale kernel machines,” +in “Advances in neural information processing systems,” 2007, pp. 1177-1184.

+
+
+get_basis(X, params=None)[source]
+

compute the value of basis

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – input

  • +
  • params (Tuple) – W, b, alpha +(default: self.params)

  • +
+
+
Returns:
+

Psi(X; W,b) – N-by-l matrix

+

cos[X * Wt + b] * alpha

+

where Wt is the transpose of W.

+

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[source]
+

update basis parameters

+
+
Parameters:
+

params (tuple) – W, b, alpha

+
+
+
+ +
+
+show()[source]
+

print parameters

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.basis.html b/manual/v2.0.2/en/api/physbo.blm.basis.html new file mode 100644 index 00000000..22d023da --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.basis.html @@ -0,0 +1,216 @@ + + + + + + + + + physbo.blm.basis package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.basis package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.core.html b/manual/v2.0.2/en/api/physbo.blm.core.html new file mode 100644 index 00000000..bdaae8a7 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.core.html @@ -0,0 +1,224 @@ + + + + + + + + + physbo.blm.core package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.core.model.html b/manual/v2.0.2/en/api/physbo.blm.core.model.html new file mode 100644 index 00000000..c82d74ed --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.core.model.html @@ -0,0 +1,423 @@ + + + + + + + + + physbo.blm.core.model module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.core.model module

+
+
+class physbo.blm.core.model.model(lik, prior, options={})[source]
+

Bases: object

+

Baysean Linear Model

+
+
+prior
+

prior distribution of weights

+
+
Type:
+

physbo.blm.prior.gauss

+
+
+
+ +
+
+lik
+

kernel

+
+
Type:
+

physbo.blm.lik.gauss

+
+
+
+ +
+
+nbasis
+

number of features in random feature map

+
+
Type:
+

int

+
+
+
+ +
+
+stats
+

auxially parameters for sampling

+
+
Type:
+

Tuple

+
+
+
+ +
+
+method
+

sampling method

+
+
Type:
+

str

+
+
+
+ +
+
+get_post_fcov(X, Psi=None, diag=True)[source]
+

calculates posterior covariance of model

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • diag (bool) – if True, returns only variances as a diagonal matrix +(default: True)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+ +
+ +
+
+get_post_fmean(X, Psi=None, w=None)[source]
+

calculates posterior mean of model (function)

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature maps

  • +
  • w (numpy.ndarray) – weight

  • +
+
+
+ +
+ +
+
+get_post_params_mean()[source]
+

calculates posterior mean of weights

+
+
Return type:
+

numpy.ndarray

+
+
+ +
+ +
+
+post_sampling(Xtest, Psi=None, N=1, alpha=1.0)[source]
+

draws samples of mean value of model

+
+
Parameters:
+
    +
  • Xtest (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature maps +(default: blm.lik.get_basis(Xtest))

  • +
  • N (int) – number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+predict_sampling(Xtest, Psi=None, N=1)[source]
+

draws samples from model

+
+
Parameters:
+
    +
  • Xtest (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature map +(default: blm.lik.get_basis(Xtest))

  • +
  • N (int) – number of samples +(default: 1)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+prepare(X, t, Psi=None)[source]
+

initializes model by using the first training dataset

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • t (numpy.ndarray) – target (label)

  • +
  • Psi (numpy.ndarray) – feature maps

  • +
+
+
+ +
+ +
+
+sampling(w_mu=None, N=1, alpha=1.0)[source]
+

draws samples of weights

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model) – model

  • +
  • w_mu (numpy.ndarray) – mean of weight

  • +
  • N (int) – the number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source +(default: 1.0)

  • +
+
+
Returns:
+

samples of weights

+
+
Return type:
+

numpy.ndarray

+
+
+ +
+ +
+
+update_stats(x, t, psi=None)[source]
+

updates model by using another training data

+
+
Parameters:
+
    +
  • x (numpy.ndarray) – input

  • +
  • t (float) – target (label)

  • +
  • psi (numpy.ndarray) – feature map

  • +
+
+
+ +
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.html b/manual/v2.0.2/en/api/physbo.blm.html new file mode 100644 index 00000000..96dc9156 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.html @@ -0,0 +1,295 @@ + + + + + + + + + physbo.blm package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.inf.exact.html b/manual/v2.0.2/en/api/physbo.blm.inf.exact.html new file mode 100644 index 00000000..f0e58d49 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.inf.exact.html @@ -0,0 +1,317 @@ + + + + + + + + + physbo.blm.inf.exact module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.inf.exact module

+
+
+physbo.blm.inf.exact.get_post_fcov(blm, X, Psi=None, diag=True)[source]
+

calculates posterior covariance of model

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model)

  • +
  • X (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • diag (bool) – if True, returns only variances as a diagonal matrix +(default: True)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.get_post_fmean(blm, X, Psi=None, w=None)[source]
+

calculates posterior mean of model

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model)

  • +
  • X (numpy.ndarray) – inputs

  • +
  • Psi (numpy.ndarray) – feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • w (numpy.ndarray) – weights +(default: get_post_params_mean(blm))

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.get_post_params_mean(blm)[source]
+

calculates mean of weight

+
+
Parameters:
+

blm (physbo.blm.core.model)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.prepare(blm, X, t, Psi=None)[source]
+

initializes auxiaialy parameters for quick sampling

+

blm.stats will be updated.

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model) – model

  • +
  • X (numpy.ndarray) – inputs

  • +
  • t (numpy.ndarray) – target (label)

  • +
  • Psi – feature maps (default: blm.lik.get_basis(X))

  • +
+
+
+
+ +
+
+physbo.blm.inf.exact.sampling(blm, w_mu=None, N=1, alpha=1.0)[source]
+

draws samples of weights

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model) – model

  • +
  • w_mu (numpy.ndarray) – mean of weight

  • +
  • N (int) – the number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source +(default: 1.0)

  • +
+
+
Returns:
+

samples of weights

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.update_stats(blm, x, t, psi=None)[source]
+

calculates new auxiaialy parameters for quick sampling by fast-update

+
+
Parameters:
+
    +
  • blm (physbo.blm.core.model) – model

  • +
  • x (numpy.ndarray) – input

  • +
  • t (numpy.ndarray) – target (label)

  • +
  • psi – feature map (default: blm.lik.get_basis(X))

  • +
+
+
Returns:
+

(U, b, alpha) – new auxially parameters

+
+
Return type:
+

Tuple

+
+
+

Notes

+

blm.stats[0] (U) will be mutated while the others not.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.inf.html b/manual/v2.0.2/en/api/physbo.blm.inf.html new file mode 100644 index 00000000..ce4e815f --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.inf.html @@ -0,0 +1,214 @@ + + + + + + + + + physbo.blm.inf package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.inf package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.lik.gauss.html b/manual/v2.0.2/en/api/physbo.blm.lik.gauss.html new file mode 100644 index 00000000..40b1534f --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.lik.gauss.html @@ -0,0 +1,330 @@ + + + + + + + + + physbo.blm.lik.gauss module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.lik.gauss module

+
+
+class physbo.blm.lik.gauss.gauss(linear, cov)[source]
+

Bases: object

+

Gaussian

+
+
+linear
+
+ +
+
+cov
+

covariance

+
+
Type:
+

blm.lik.cov

+
+
+
+ +
+
+stats
+
+ +
+
+get_basis(X)[source]
+

calculates value of basis function at input

+
+
Parameters:
+

X (numpy.ndarray) – input

+
+
+
+

See also

+

blm.basis.fourier.get_basis

+
+
+ +
+
+get_cov(N, params=None)[source]
+

Returns covariance matrix

+
+
Parameters:
+
    +
  • N (int) – dimension

  • +
  • params (float) – half of log of variance +(default: self.cov.params)

  • +
+
+
Returns:
+

NxN covariance matrix

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(X, Psi=None, params=None, bias=None)[source]
+

calculates mean value

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – raw input

  • +
  • Psi (numpy.ndarray) – value of feature maps

  • +
  • params (numpy.ndarray) – weight

  • +
  • bias (float) – bias

  • +
+
+
+
+

See also

+

blm.basis.fourier.get_mean

+
+
+ +
+
+get_prec(N, params=None)[source]
+

Returns precision matrix

+
+
Parameters:
+
    +
  • N (int) – dimension

  • +
  • params (float) – half of log of variance +(default: self.cov.params)

  • +
+
+
Returns:
+

NxN precision matrix

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+sampling(fmean)[source]
+

draws samples

+
+
Parameters:
+

fmean (numpy.ndarray) – means of samples

+
+
Returns:
+

samples

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_bias(bias)[source]
+

sets bias

+
+ +
+
+set_params(params)[source]
+

sets parameters

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.lik.html b/manual/v2.0.2/en/api/physbo.blm.lik.html new file mode 100644 index 00000000..92c2cbc4 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.lik.html @@ -0,0 +1,235 @@ + + + + + + + + + physbo.blm.lik package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.lik.linear.html b/manual/v2.0.2/en/api/physbo.blm.lik.linear.html new file mode 100644 index 00000000..5fa4bc9f --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.lik.linear.html @@ -0,0 +1,281 @@ + + + + + + + + + physbo.blm.lik.linear module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.lik.linear module

+
+
+class physbo.blm.lik.linear.linear(basis, params=None, bias=None)[source]
+

Bases: object

+
+
+basis
+

basis for random feature map

+
+ +
+
+nbasis
+

number of basis

+
+
Type:
+

int

+
+
+
+ +
+
+bias
+
+ +
+
+params
+
+ +
+
+_init_params[source]
+

initial value of the parameter

+
+ +
+
+get_mean(X, Psi=None, params=None, bias=None)[source]
+

calculate mean values

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – input as an N-by-d matrix

  • +
  • Psi (numpy.ndarray) – feature maps Psi(X) as an N-by-l matrix +(default: self.get_basis(X))

  • +
  • params (numpy.ndarray) – weight as a vector with size l +(default: self.params)

  • +
  • bias (float) – (default: self.bias)

  • +
+
+
Returns:
+

Psi * params + bias

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_bias(bias)[source]
+

set bias

+
+
Parameters:
+

bias (float)

+
+
+
+ +
+
+set_params(params)[source]
+

set parameters

+
+
Parameters:
+

params (np.ndarray)

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.predictor.html b/manual/v2.0.2/en/api/physbo.blm.predictor.html new file mode 100644 index 00000000..1d3573e2 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.predictor.html @@ -0,0 +1,382 @@ + + + + + + + + + physbo.blm.predictor module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.predictor module

+
+
+class physbo.blm.predictor.predictor(config, model=None)[source]
+

Bases: base_predictor

+

Predictor using Baysean linear model

+
+
+blm
+
+
Type:
+

physbo.blm.core.model

+
+
+
+ +
+
+config
+

configuration

+
+
Type:
+

physbo.misc.set_config

+
+
+
+ +
+
+delete_stats()[source]
+

resets model

+
+ +
+
+fit(training, num_basis=None)[source]
+

fit model to training dataset

+
+
Parameters:
+
    +
  • training (physbo.variable) – dataset for training

  • +
  • num_basis (int) – the number of basis (default: self.config.predict.num_basis)

  • +
+
+
+
+ +
+
+get_basis(X)[source]
+

calculates feature maps Psi(X)

+
+
Parameters:
+

X (numpy.ndarray) – inputs

+
+
Returns:
+

Psi – feature maps

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fcov(training, test)[source]
+

calculates posterior variance-covariance matrix of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fmean(training, test)[source]
+

calculates posterior mean value of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_params(training, test)[source]
+

calculates posterior weights

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs (not used)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_samples(training, test, N=1, alpha=1.0)[source]
+

draws samples of mean values of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
  • N (int) – number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source +(default: 1.0)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_predict_samples(training, test, N=1)[source]
+

draws samples of values of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
  • N (int) – number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source +(default: 1.0)

  • +
+
+
Return type:
+

numpy.ndarray (N x len(test))

+
+
+
+ +
+
+prepare(training)[source]
+

initializes model by using training data set

+
+
Parameters:
+

training (physbo.variable) – dataset for training

+
+
+
+ +
+
+update(training, test)[source]
+

updates the model.

+

If not yet initialized (prepared), the model will be prepared by training. +Otherwise, the model will be updated by test.

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset for initialization (preparation). +If already prepared, the model ignore this.

  • +
  • test (physbo.variable) – training data for update. +If not prepared, the model ignore this.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.prior.gauss.html b/manual/v2.0.2/en/api/physbo.blm.prior.gauss.html new file mode 100644 index 00000000..76de1f6a --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.prior.gauss.html @@ -0,0 +1,375 @@ + + + + + + + + + physbo.blm.prior.gauss module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.prior.gauss module

+
+
+class physbo.blm.prior.gauss.cov_const(params=None)[source]
+

Bases: object

+

isotropic variance-covariance

+

All elements have the same variance and are independent with each other

+
+
+params
+

half of log of covariance

+
+
Type:
+

float

+
+
+
+ +
+
+sigma2
+

covariance

+
+
Type:
+

float

+
+
+
+ +
+
+prec
+

precision (= inv. of covariance)

+
+
Type:
+

float

+
+
+
+ +
+
+get_cov(nbasis, params=None)[source]
+

computes the covariance

+
+
Parameters:
+
    +
  • nbasis (int) – the number of components

  • +
  • params (float) – half of log of variance +(default: self.params)

  • +
+
+
Returns:
+

nbasis-by-n-basis covariance matrix

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_prec(nbasis, params=None)[source]
+

computes the precision

+
+
Parameters:
+
    +
  • nbasis (int) – the number of components

  • +
  • params (float) – half of log of variance +(default: self.params)

  • +
+
+
Returns:
+

nbasis-by-n-basis precision matrix

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[source]
+

sets params

+
+
Parameters:
+

params (float) – half of log of variance

+
+
+
+ +
+ +
+
+class physbo.blm.prior.gauss.gauss(nbasis, cov=None)[source]
+

Bases: object

+

Gaussian prior

+
+
+nbasis
+

number of components

+
+
Type:
+

int

+
+
+
+ +
+
+cov
+

covariance

+
+
Type:
+

cov_const

+
+
+
+ +
+
+get_cov(params=None)[source]
+

calculates the variance-covariance matrix of priors

+
+
Parameters:
+

params (float) – half of log of variance +(default: self.cov.params)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(params=None)[source]
+

calculates the mean value of priors

+
+
Parameters:
+

params (float) – half of log of variance +(not used)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_prec(params=None)[source]
+

calculates the precise matrix of priors

+
+
Parameters:
+

params (float) – half of log of variance +(default: self.cov.params)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[source]
+

sets params

+
+
Parameters:
+

params (float) – half of log of variance

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.blm.prior.html b/manual/v2.0.2/en/api/physbo.blm.prior.html new file mode 100644 index 00000000..be9a08c2 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.blm.prior.html @@ -0,0 +1,226 @@ + + + + + + + + + physbo.blm.prior package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.core.html b/manual/v2.0.2/en/api/physbo.gp.core.html new file mode 100644 index 00000000..1d9e7290 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.core.html @@ -0,0 +1,265 @@ + + + + + + + + + physbo.gp.core package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.core.learning.html b/manual/v2.0.2/en/api/physbo.gp.core.learning.html new file mode 100644 index 00000000..32998750 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.core.learning.html @@ -0,0 +1,382 @@ + + + + + + + + + physbo.gp.core.learning module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.learning module

+
+
+class physbo.gp.core.learning.adam(gp, config)[source]
+

Bases: online

+

default

+
+
+get_one_update(params, X, t)[source]
+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
+
+ +
+
+reset()[source]
+
+ +
+ +
+
+class physbo.gp.core.learning.batch(gp, config)[source]
+

Bases: object

+

basis class for batch learning

+
+ +
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
Returns:
+

The parameters which give the minimum marginal likelihood.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+one_run(params, X, t, max_iter=None)[source]
+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Initial guess for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • max_iter (int) – Maximum number of iterations to perform.

  • +
+
+
Returns:
+

The solution of the optimization.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+run(X, t)[source]
+

Performing optimization using the L-BFGS-B algorithm

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
Returns:
+

The solution of the optimization.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+
+class physbo.gp.core.learning.online(gp, config)[source]
+

Bases: object

+

base class for online learning

+
+
+disp_marlik(params, eval_X, eval_t, num_epoch=None)[source]
+

Displaying marginal likelihood

+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • eval_X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • eval_t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • num_epoch (int) – Number of epochs

  • +
+
+
+
+ +
+
+get_one_update(params, X, t)[source]
+
+ +
+ +

Initial parameter searchs

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
Returns:
+

The parameter which gives the minimum likelihood.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+one_run(params, X, t, max_epoch=None, is_disp=False)[source]
+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • max_epoch (int) – Maximum candidate epochs

  • +
+
+
Returns:
+

The solution of the optimization.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+run(X, t)[source]
+

Run initial search and hyper parameter running.

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
Returns:
+

The solution of the optimization.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.core.model.html b/manual/v2.0.2/en/api/physbo.gp.core.model.html new file mode 100644 index 00000000..33cc4a7c --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.core.model.html @@ -0,0 +1,483 @@ + + + + + + + + + physbo.gp.core.model module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.model module

+
+
+class physbo.gp.core.model.model(lik, mean, cov, inf='exact')[source]
+

Bases: object

+
+
+cat_params(lik_params, prior_params)[source]
+

Concatinate the likelihood and prior parameters

+
+
Parameters:
+
    +
  • lik_params (numpy.ndarray) – Parameters for likelihood

  • +
  • prior_params (numpy.ndarray) – Parameters for prior

  • +
+
+
Returns:
+

params – parameters about likelihood and prior

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params=None)[source]
+

decomposing the parameters to those of likelifood and priors

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Returns:
+

    +
  • lik_params (numpy.ndarray)

  • +
  • prior_params (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+eval_marlik(params, X, t, N=None)[source]
+

Evaluating marginal likelihood.

+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Parameters.

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) – Total number of subset data (if not specified, all dataset is used)

  • +
+
+
Returns:
+

    +
  • marlik (float)

  • +
  • Marginal likelihood.

  • +
+

+
+
+
+ +
+
+export_blm(num_basis)[source]
+

Exporting the blm(Baysean linear model) predictor

+
+
Parameters:
+

num_basis (int) – Total number of basis

+
+
Return type:
+

physbo.blm.core.model

+
+
+
+ +
+
+fit(X, t, config)[source]
+

Fitting function (update parameters)

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • config (physbo.misc.set_config object)

  • +
+
+
+
+ +
+
+get_cand_params(X, t)[source]
+

Getting candidate for parameters

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
+
+
Returns:
+

params – Parameters

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_marlik(params, X, t, N=None)[source]
+

Evaluating gradiant of marginal likelihood.

+
+
Parameters:
+
    +
  • params (numpy.ndarray) – Parameters.

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) – Total number of subset data (if not specified, all dataset is used)

  • +
+
+
Returns:
+

grad_marlik – Gradiant of marginal likelihood.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[source]
+

Getting boundary of the parameters.

+
+
Returns:
+

bound – An array with the tuple (min_params, max_params).

+
+
Return type:
+

list

+
+
+
+ +
+
+get_post_fcov(X, Z, params=None, diag=True)[source]
+

Calculating posterior covariance matrix of model (function)

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • Z (numpy.ndarray) – feature maps

  • +
  • params (numpy.ndarray) – Parameters

  • +
  • diag (bool) – If X is the diagonalization matrix, true.

  • +
+
+
Return type:
+

physbo.gp.inf.exact.get_post_fcov

+
+
+
+ +
+
+get_post_fmean(X, Z, params=None)[source]
+

Calculating posterior mean of model (function)

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • Z (numpy.ndarray) – feature maps

  • +
  • params (numpy.ndarray) – Parameters

  • +
+
+
+ +
+ +
+
+post_sampling(X, Z, params=None, N=1, alpha=1)[source]
+

draws samples of mean value of model

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – inputs

  • +
  • Z (numpy.ndarray) – feature maps

  • +
  • N (int) – number of samples +(default: 1)

  • +
  • alpha (float) – noise for sampling source

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+predict_sampling(X, Z, params=None, N=1)[source]
+
+
Parameters:
+
    +
  • X (numpy.ndarray) – training datasets

  • +
  • Z (numpy.ndarray) – input for sampling objective values

  • +
  • params (numpy.ndarray) – Parameters

  • +
  • N (int) – number of samples +(default: 1)

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+prepare(X, t, params=None)[source]
+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
+
+ +
+
+print_params()[source]
+

Printing parameters

+
+ +
+
+set_params(params)[source]
+

Setting parameters

+
+
Parameters:
+

params (numpy.ndarray) – Parameters.

+
+
+
+ +
+
+sub_sampling(X, t, N)[source]
+

Make subset for sampling

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) – Total number of data in subset

  • +
+
+
Returns:
+

    +
  • subX (numpy.ndarray)

  • +
  • subt (numpy.ndarray)

  • +
+

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.core.prior.html b/manual/v2.0.2/en/api/physbo.gp.core.prior.html new file mode 100644 index 00000000..4017f618 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.core.prior.html @@ -0,0 +1,357 @@ + + + + + + + + + physbo.gp.core.prior module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.prior module

+
+
+class physbo.gp.core.prior.prior(mean, cov)[source]
+

Bases: object

+

prior of gaussian process

+
+
+cat_params(mean_params, cov_params)[source]
+
+
Parameters:
+
    +
  • mean_params (numpy.ndarray) – Mean values of parameters

  • +
  • cov_params (numpy.ndarray) – Covariance matrix of parameters

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params)[source]
+

decomposing the parameters to those of mean values and covariance matrix for priors

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Returns:
+

    +
  • mean_params (numpy.ndarray)

  • +
  • cov_params (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+get_cov(X, Z=None, params=None, diag=False)[source]
+

Calculating the variance-covariance matrix of priors

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) – N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) – Parameters.

  • +
  • diag (bool) – If X is the diagonalization matrix, true.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_cov(X, params=None)[source]
+

Calculating the covariance matrix priors

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_mean(num_data, params=None)[source]
+

Calculating the gradiant of mean values of priors

+
+
Parameters:
+
    +
  • num_data (int) – Total number of data

  • +
  • params (numpy.ndarray) – Parameters

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[source]
+

Calculating the mean value of priors

+
+
Parameters:
+
    +
  • num_data (int) – Total number of data

  • +
  • params (numpy.ndarray) – Parameters

  • +
+
+
Return type:
+

float

+
+
+
+ +
+
+sampling(X, N=1)[source]
+

Sampling from GP prior

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • N (int)

  • +
+
+
Return type:
+

float

+
+
+
+ +
+
+set_cov_params(params)[source]
+

Setting parameters for covariance matrix of priors

+
+
Parameters:
+

params (numpy.ndarray) – Parameters

+
+
+
+ +
+
+set_mean_params(params)[source]
+

Setting parameters for mean values of priors

+
+
Parameters:
+

params (numpy.ndarray) – Parameters

+
+
+
+ +
+
+set_params(params)[source]
+

Setting parameters

+
+
Parameters:
+

params (numpy.ndarray) – Parameters.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.cov.gauss.html b/manual/v2.0.2/en/api/physbo.gp.cov.gauss.html new file mode 100644 index 00000000..7d7ac3bb --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.cov.gauss.html @@ -0,0 +1,410 @@ + + + + + + + + + physbo.gp.cov.gauss module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.cov.gauss module

+
+
+class physbo.gp.cov.gauss.gauss(num_dim, width=3, scale=1, ard=False, max_width=1000000.0, min_width=1e-06, max_scale=1000000.0, min_scale=1e-06)[source]
+

Bases: object

+

gaussian kernel

+
+
+cat_params(width, scale)[source]
+

Taking the logarithm of width and scale parameters +and concatinate them into one ndarray

+
+
Parameters:
+
    +
  • width (int)

  • +
  • scale (int)

  • +
+
+
Returns:
+

params – Parameters

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params)[source]
+

decompose the parameters defined on the log region +into width and scale parameters

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Returns:
+

    +
  • width (float)

  • +
  • scale (float)

  • +
+

+
+
+
+ +
+
+get_cand_params(X, t)[source]
+

Getting candidate parameters.

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
+
+
Returns:
+

params

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_cov(X, Z=None, params=None, diag=False)[source]
+

compute the covariant matrix +:param X: N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. +:type X: numpy.ndarray +:param Z: N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of search candidate. +:type Z: numpy.ndarray +:param params: Parameters +:type params: numpy.ndarray +:param diag: If X is the diagonalization matrix, true. +:type diag: bool

+
+
Returns:
+

G – covariant matrix

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(X, params=None)[source]
+

Getting gradiant values of X

+
+
Parameters:
+
    +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • params (numpy.ndarray)

  • +
+
+
Returns:
+

grad

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[source]
+

Getting boundary array.

+
+
Returns:
+

bound – A num_params-dimensional array with the tuple (min_params, max_params).

+
+
Return type:
+

list

+
+
+
+ +
+
+load(file_name)[source]
+

Recovering the Gaussian kernel from file +:param file_name: file name to load the information of the kernel +:type file_name: str

+
+ +
+
+prepare(params=None)[source]
+

Setting parameters

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Returns:
+

    +
  • params (numpy.ndarray)

  • +
  • width (int)

  • +
  • scale (int)

  • +
+

+
+
+
+ +
+
+print_params()[source]
+

show the current kernel parameters

+
+ +
+
+rand_expans(num_basis, params=None)[source]
+

Kernel Expansion

+
+
Parameters:
+
    +
  • num_basis (int) – total number of basis

  • +
  • params (numpy.ndarray) – Parameters

  • +
+
+
Return type:
+

tupple (W, b, amp)

+
+
+
+ +
+
+save(file_name)[source]
+

save the gaussian kernel

+
+
Parameters:
+

file_name (str) – file name to save the information of the kernel

+
+
+
+ +
+
+set_params(params)[source]
+

set kernel parameters

+
+
Parameters:
+

params (numpy.ndarray) – Parameters for optimization.

+
+
+
+ +
+
+supp_params(params)[source]
+

Set maximum (minimum) values for parameters when the parameter is greater(less) than this value.

+
+
Parameters:
+

params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
Returns:
+

params

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.cov.html b/manual/v2.0.2/en/api/physbo.gp.cov.html new file mode 100644 index 00000000..48733fec --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.cov.html @@ -0,0 +1,224 @@ + + + + + + + + + physbo.gp.cov package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.html b/manual/v2.0.2/en/api/physbo.gp.html new file mode 100644 index 00000000..db729f9d --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.html @@ -0,0 +1,300 @@ + + + + + + + + + physbo.gp package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.inf.exact.html b/manual/v2.0.2/en/api/physbo.gp.inf.exact.html new file mode 100644 index 00000000..735787de --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.inf.exact.html @@ -0,0 +1,303 @@ + + + + + + + + + physbo.gp.inf.exact module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.inf.exact module

+
+
+physbo.gp.inf.exact.eval_marlik(gp, X, t, params=None)[source]
+

Evaluating marginal likelihood.

+
+
Parameters:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
Returns:
+

marlik – Marginal likelihood.

+
+
Return type:
+

float

+
+
+
+ +
+
+physbo.gp.inf.exact.get_grad_marlik(gp, X, t, params=None)[source]
+

Evaluating gradiant of marginal likelihood.

+
+
Parameters:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
Returns:
+

grad_marlik – Gradiant of marginal likelihood.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.get_post_fcov(gp, X, Z, params=None, diag=True)[source]
+

Calculating the covariance of posterior

+
+
Parameters:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) – N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) – Parameters.

  • +
  • diag (bool) – If X is the diagonalization matrix, true.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.get_post_fmean(gp, X, Z, params=None)[source]
+

Calculating the mean of posterior

+
+
Parameters:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) – N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.prepare(gp, X, t, params=None)[source]
+
+
Parameters:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) – N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) – Parameters.

  • +
+
+
Returns:
+

stats

+
+
Return type:
+

tupple

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.inf.html b/manual/v2.0.2/en/api/physbo.gp.inf.html new file mode 100644 index 00000000..525fcd51 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.inf.html @@ -0,0 +1,213 @@ + + + + + + + + + physbo.gp.inf package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.inf package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.lik.gauss.html b/manual/v2.0.2/en/api/physbo.gp.lik.gauss.html new file mode 100644 index 00000000..d08e6d66 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.lik.gauss.html @@ -0,0 +1,329 @@ + + + + + + + + + physbo.gp.lik.gauss module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.lik.gauss module

+
+
+class physbo.gp.lik.gauss.gauss(std=1, max_params=1000000.0, min_params=1e-06)[source]
+

Bases: object

+

Gaussian likelihood function

+
+
+get_cand_params(t)[source]
+

Getting candidate parameters.

+
+
Parameters:
+

t (numpy.ndarray) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

+
+
Returns:
+

log[ standard deviation of t] - log 10.0

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_cov(num_data, params=None)[source]
+

Get a covariance matrix

+
+
Parameters:
+
    +
  • num_data (int)

  • +
  • params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
+
+
Returns:
+

Diagonal element matrix of exp(2.0*params)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(num_data, params=None)[source]
+

Get a gradient matrix

+
+
Parameters:
+
    +
  • num_data (int)

  • +
  • params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
+
+
Returns:
+

Diagonal element matrix of 2.0 * exp(2.0*params)

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[source]
+

Get boundary array.

+
+
Returns:
+

bound – A num_params-dimensional array with the tuple (min_params, max_params).

+
+
Return type:
+

list

+
+
+
+ +
+
+sampling(fmean)[source]
+

Sampling by adding noise

+
+
Parameters:
+

fmean (numpy.ndarray)

+
+
+
+ +
+
+set_params(params)[source]
+

Set parameters.

+
+
Parameters:
+

params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
+
+ +
+
+supp_params(params=None)[source]
+

Set maximum (minimum) values for parameters when the parameter is greater(less) than this value.

+
+
Parameters:
+

params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
+
+ +
+
+trans_params(params=None)[source]
+

Get exp[params].

+
+
Parameters:
+

params (numpy.ndarray) – Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
Returns:
+

std

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.lik.html b/manual/v2.0.2/en/api/physbo.gp.lik.html new file mode 100644 index 00000000..a34765ca --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.lik.html @@ -0,0 +1,219 @@ + + + + + + + + + physbo.gp.lik package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.mean.const.html b/manual/v2.0.2/en/api/physbo.gp.mean.const.html new file mode 100644 index 00000000..8e8256b5 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.mean.const.html @@ -0,0 +1,312 @@ + + + + + + + + + physbo.gp.mean.const module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.mean.const module

+
+
+class physbo.gp.mean.const.const(params=None, max_params=1000000000000.0, min_params=-1000000000000.0)[source]
+

Bases: object

+

constant

+
+
+get_cand_params(t)[source]
+

Getting the median array of candidates.

+
+
Parameters:
+

t (array_like) – Input array or object that can be converted to an array

+
+
Returns:
+

median – A new array holding the result.

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(num_data, params=None)[source]
+

Returning a new array of (num_data), filled with ones.

+
+
Parameters:
+
    +
  • num_data (int) – total number of data

  • +
  • params (object) – not used

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[source]
+
+
Parameters:
+
    +
  • num_data (int) – total number of data

  • +
  • params (numpy.ndarray) – parameters

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[source]
+

Getting the boundary list for parameters

+
+
Returns:
+

bound – num_params array with the tupple (min_param, max_params)

+
+
Return type:
+

list

+
+
+
+ +
+
+init_params(params)[source]
+

Initializing parameters

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Returns:
+

params – initialized parameters

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[source]
+

Setting parameters defined in const class.

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+supp_params(params)[source]
+

Setting maximum and minimum value of parameters.

+
+
Parameters:
+

params (numpy.ndarray) – parameters

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.mean.html b/manual/v2.0.2/en/api/physbo.gp.mean.html new file mode 100644 index 00000000..7b91aa83 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.mean.html @@ -0,0 +1,227 @@ + + + + + + + + + physbo.gp.mean package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.mean.zero.html b/manual/v2.0.2/en/api/physbo.gp.mean.zero.html new file mode 100644 index 00000000..4d995a36 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.mean.zero.html @@ -0,0 +1,247 @@ + + + + + + + + + physbo.gp.mean.zero module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.mean.zero module

+
+
+class physbo.gp.mean.zero.zero[source]
+

Bases: object

+
+
+get_grad(num_data, params=None)[source]
+

Returning empty numpy.ndarray

+
+
Parameters:
+
    +
  • num_data (int) – not used

  • +
  • params (object) – not used

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[source]
+

Returning numpy.zeros(num_data)

+
+
Parameters:
+
    +
  • num_data (int) – dimension of numpy.zeros

  • +
  • params (object) – not used

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[source]
+

Not defined

+
+
Parameters:
+

params

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.gp.predictor.html b/manual/v2.0.2/en/api/physbo.gp.predictor.html new file mode 100644 index 00000000..7476c88c --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.gp.predictor.html @@ -0,0 +1,354 @@ + + + + + + + + + physbo.gp.predictor module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.predictor module

+
+
+class physbo.gp.predictor.predictor(config, model=None)[source]
+

Bases: base_predictor

+
+
+delete_stats()[source]
+

Default function to delete status. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+fit(training, num_basis=None)[source]
+

Fitting model to training dataset

+
+
Parameters:
+
    +
  • training (physbo.variable) – dataset for training

  • +
  • num_basis (int) – the number of basis (default: self.config.predict.num_basis)

  • +
+
+
+
+ +
+
+get_basis(*args, **kwds)[source]
+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fcov(training, test, diag=True)[source]
+

Calculating posterior variance-covariance matrix of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
  • diag (bool) – Diagonlization flag in physbo.exact.get_post_fcov function.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fmean(training, test)[source]
+

Calculating posterior mean value of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_params(*args, **kwds)[source]
+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_samples(training, test, alpha=1)[source]
+

Drawing samples of mean values of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs (not used)

  • +
  • alpha (float) – tuning parameter of the covariance by multiplying alpha**2 for np.random.multivariate_normal.

  • +
+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+get_predict_samples(training, test, N=1)[source]
+

Drawing samples of values of model

+
+
Parameters:
+
    +
  • training (physbo.variable) – training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) – inputs

  • +
  • N (int) – number of samples +(default: 1)

  • +
+
+
Return type:
+

numpy.ndarray (N x len(test))

+
+
+
+ +
+
+prepare(training)[source]
+

Initializing model by using training data set

+
+
Parameters:
+

training (physbo.variable) – dataset for training

+
+
+
+ +
+
+update(training, test)[source]
+

Default function to update variables. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.html b/manual/v2.0.2/en/api/physbo.html new file mode 100644 index 00000000..6d37cdb9 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.html @@ -0,0 +1,408 @@ + + + + + + + + + physbo package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo package

+
+

Subpackages

+
+ +
+
+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.misc.centering.html b/manual/v2.0.2/en/api/physbo.misc.centering.html new file mode 100644 index 00000000..a27b2041 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.misc.centering.html @@ -0,0 +1,211 @@ + + + + + + + + + physbo.misc.centering module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.centering module

+
+
+physbo.misc.centering.centering(X)[source]
+

Normalize the mean and standard deviation along the each column of X to 0 and 1, respectively

+
+
Parameters:
+

X (numpy array) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

+
+
Returns:
+

X_normalized – normalized N x d dimensional matrix.

+
+
Return type:
+

numpy array

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.misc.gauss_elim.html b/manual/v2.0.2/en/api/physbo.misc.gauss_elim.html new file mode 100644 index 00000000..11d0b063 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.misc.gauss_elim.html @@ -0,0 +1,217 @@ + + + + + + + + + physbo.misc.gauss_elim module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.gauss_elim module

+
+
+physbo.misc.gauss_elim.gauss_elim(U, t)[source]
+

Calculate alpha using scipy.linalg.solve_triangular. +alpha = (U^T U)^-1 t = U^-1 [(U^T)-1 t]

+
+
Parameters:
+
    +
  • U ((M, M) array_like)

  • +
  • matrix (A triangular)

  • +
  • t ((M,) or (M, N) array_like)

  • +
+
+
Returns:
+

    +
  • alpha (numpy.ndarray)

  • +
  • Solution to the system L^T alpha = t. Shape of return matches t.

  • +
+

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.misc.html b/manual/v2.0.2/en/api/physbo.misc.html new file mode 100644 index 00000000..0ac1c540 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.misc.html @@ -0,0 +1,245 @@ + + + + + + + + + physbo.misc package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.misc.set_config.html b/manual/v2.0.2/en/api/physbo.misc.set_config.html new file mode 100644 index 00000000..1e2646cb --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.misc.set_config.html @@ -0,0 +1,349 @@ + + + + + + + + + physbo.misc.set_config module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.set_config module

+
+
+class physbo.misc.set_config.adam[source]
+

Bases: online

+
+
+load(config)[source]
+

Loading information of configuration from config._sectoins[‘adam’].

+
+
Parameters:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[source]
+

Showing information about configuration about adam object.

+
+ +
+ +
+
+class physbo.misc.set_config.batch[source]
+

Bases: learning

+
+
+load(config)[source]
+

Loading information of configuration from config._sectoins[‘batch’].

+
+
Parameters:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[source]
+

Showing information about configuration about batch object.

+
+ +
+ +
+
+physbo.misc.set_config.boolean(str)[source]
+

Return boolean.

+
+
Parameters:
+

str (str or boolean)

+
+
Return type:
+

True or False

+
+
+
+ +
+
+class physbo.misc.set_config.learning[source]
+

Bases: object

+
+
+load(config)[source]
+

Loading information of configuration from config._sectoins[‘learning’].

+
+
Parameters:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[source]
+

Showing information about learning object.

+
+ +
+ +
+
+class physbo.misc.set_config.online[source]
+

Bases: learning

+
+
+load(config)[source]
+

Loading information of configuration from config._sectoins[‘online’].

+
+
Parameters:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[source]
+

Showing information about configuration about online object.

+
+ +
+ +
+
+class physbo.misc.set_config.search[source]
+

Bases: object

+
+
+load(config)[source]
+

Loading information of configuration from config._sectoins[‘search’].

+
+
Parameters:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[source]
+

Showing information about search object.

+
+ +
+ +
+
+class physbo.misc.set_config.set_config(search_config=None, learning_config=None)[source]
+

Bases: object

+
+
+load(file_name='config.ini')[source]
+

Loading information of configuration.

+
+
Parameters:
+
    +
  • file_name (str)

  • +
  • configuration. (An input file name of)

  • +
+
+
+
+ +
+
+show()[source]
+

Showing information of search and learning objects.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.opt.adam.html b/manual/v2.0.2/en/api/physbo.opt.adam.html new file mode 100644 index 00000000..73ca667c --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.opt.adam.html @@ -0,0 +1,347 @@ + + + + + + + + + physbo.opt.adam module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.opt.adam module

+
+
+class physbo.opt.adam.adam(params, grad, options={})[source]
+

Bases: object

+

Optimizer of f(x) with the adam method

+
+
+params
+

current input, x

+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+nparams
+

dimension

+
+
Type:
+

int

+
+
+
+ +
+
+grad
+

gradient function, g(x) = f’(x)

+
+
Type:
+

function

+
+
+
+ +
+
+m
+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+v
+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+epoch
+

the number of update already done

+
+
Type:
+

int

+
+
+
+ +
+
+max_epoch
+

the maximum number of update

+
+
Type:
+

int

+
+
+
+ +
+
+alpha
+
+
Type:
+

float

+
+
+
+ +
+
+beta
+
+
Type:
+

float

+
+
+
+ +
+
+gamma
+
+
Type:
+

float

+
+
+
+ +
+
+epsilon
+
+
Type:
+

float

+
+
+
+ +
+
+run(*args, **kwargs)[source]
+
+ +
+
+set_params(params)[source]
+
+ +
+
+update(params, *args, **kwargs)[source]
+

calculates the updates of params

+
+
Parameters:
+
    +
  • params (numpy.ndarray) – input

  • +
  • args – will be passed to self.grad

  • +
  • kwargs – will be passed to self.grad

  • +
+
+
Returns:
+

update of params

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.opt.html b/manual/v2.0.2/en/api/physbo.opt.html new file mode 100644 index 00000000..b22e5cdc --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.opt.html @@ -0,0 +1,223 @@ + + + + + + + + + physbo.opt package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.predictor.html b/manual/v2.0.2/en/api/physbo.predictor.html new file mode 100644 index 00000000..f59fb2e9 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.predictor.html @@ -0,0 +1,385 @@ + + + + + + + + + physbo.predictor module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.predictor module

+
+
+class physbo.predictor.base_predictor(config, model=None)[source]
+

Bases: object

+

Base predictor is defined in this class.

+
+
+delete_stats(*args, **kwds)[source]
+

Default function to delete status. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+fit(*args, **kwds)[source]
+

Default fit function. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_basis(*args, **kwds)[source]
+

Default function to get basis +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fcov(*args, **kwds)[source]
+

Default function to get a covariance of the score. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fmean(*args, **kwds)[source]
+

Default function to get a mean value of the score. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_params(*args, **kwds)[source]
+

Default function to get parameters. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_params_samples(*args, **kwds)[source]
+

Default function to get parameters of samples. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_samples(*args, **kwds)[source]
+

Default function to get samples. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_predict_samples(*args, **kwds)[source]
+

Default function to get prediction variables of samples. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+load(file_name)[source]
+

Default function to load variables. +The information is updated using self.update function.

+
+
Parameters:
+

file_name (str) – A file name to load variables from the file.

+
+
+
+ +
+
+prepare(*args, **kwds)[source]
+

Default prepare function. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+save(file_name)[source]
+

Default function to save information by using pickle.dump function. +The protocol version is set as 3.

+
+
Parameters:
+

file_name (str) – A file name to save self.__dict__ object.

+
+
+
+ +
+
+update(*args, **kwds)[source]
+

Default function to update variables. +This function must be overwritten in each model.

+
+
Parameters:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete.html b/manual/v2.0.2/en/api/physbo.search.discrete.html new file mode 100644 index 00000000..032f3761 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete.html @@ -0,0 +1,238 @@ + + + + + + + + + physbo.search.discrete package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete.policy.html b/manual/v2.0.2/en/api/physbo.search.discrete.policy.html new file mode 100644 index 00000000..5e982f96 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete.policy.html @@ -0,0 +1,390 @@ + + + + + + + + + physbo.search.discrete.policy module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete.policy module

+
+
+class physbo.search.discrete.policy.policy(test_X, config=None, initial_data=None, comm=None)[source]
+

Bases: object

+
+ +

Performing Bayesian optimization.

+
+
Parameters:
+
    +
  • training (physbo.variable) – Training dataset.

  • +
  • max_num_probes (int) – Maximum number of searching process by Bayesian optimization.

  • +
  • num_search_each_probe (int) – Number of searching by Bayesian optimization at each process.

  • +
  • predictor (predictor object) – Base class is defined in physbo.predictor. +If None, blm_predictor is defined.

  • +
  • is_disp (bool) – If true, process messages are outputted.

  • +
  • simulator (callable) – Callable (function or object with __call__) +Here, action is an integer which represents the index of the candidate.

  • +
  • score (str) – The type of aquision funciton. +TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available.

  • +
  • interval (int) – The interval number of learning the hyper parameter. +If you set the negative value to interval, the hyper parameter learning is not performed. +If you set zero to interval, the hyper parameter learning is performed only at the first step.

  • +
  • num_rand_basis (int) – The number of basis function. If you choose 0, ordinary Gaussian process run.

  • +
+
+
Returns:
+

history

+
+
Return type:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+export_history()[source]
+

Returning the information of the history.

+
+ +
+
+export_predictor()[source]
+

Returning the predictor dataset

+
+ +
+
+export_training()[source]
+

Returning the training dataset

+
+ +
+
+get_post_fcov(xs)[source]
+

Calculate covariance of predictor (post distribution)

+
+ +
+
+get_post_fmean(xs)[source]
+

Calculate mean value of predictor (post distribution)

+
+ +
+
+get_score(mode, *, actions=None, xs=None, predictor=None, training=None, parallel=True, alpha=1)[source]
+

Calcualte score (acquisition function)

+
+
Parameters:
+
    +
  • mode (str) – The type of aquisition funciton. TS, EI and PI are available. +These functions are defined in score.py.

  • +
  • actions (array of int) – actions to calculate score

  • +
  • xs (physbo.variable or np.ndarray) – input parameters to calculate score

  • +
  • predictor (predictor object) – predictor used to calculate score. +If not given, self.predictor will be used.

  • +
  • training (physbo.variable) – Training dataset. +If not given, self.training will be used.

  • +
  • parallel (bool) – Calculate scores in parallel by MPI (default: True)

  • +
  • alpha (float) – Tuning parameter which is used if mode = TS. +In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size).

  • +
+
+
Returns:
+

f – Score defined in each mode.

+
+
Return type:
+

float or list of float

+
+
Raises:
+

RuntimeError – If both actions and xs are given

+
+
+

Notes

+

When neither actions nor xs are given, scores for actions not yet searched will be calculated.

+

When parallel is True, it is assumed that the function receives the same input (actions or xs) for all the ranks. +If you want to split the input array itself, set parallel be False and merge results by yourself.

+
+ +
+
+load(file_history, file_training=None, file_predictor=None)[source]
+

Loading files about history, training and predictor.

+
+
Parameters:
+
    +
  • file_history (str) – The name of the file that stores the information of the history.

  • +
  • file_training (str) – The name of the file that stores the training dataset.

  • +
  • file_predictor (str) – The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+ +

Performing random search.

+
+
Parameters:
+
    +
  • max_num_probes (int) – Maximum number of random search process.

  • +
  • num_search_each_probe (int) – Number of search at each random search process.

  • +
  • simulator (callable) – Callable (function or object with __call__) from action to t +Here, action is an integer which represents the index of the candidate.

  • +
  • is_disp (bool) – If true, process messages are outputted.

  • +
+
+
Returns:
+

history

+
+
Return type:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+save(file_history, file_training=None, file_predictor=None)[source]
+

Saving history, training and predictor into the corresponding files.

+
+
Parameters:
+
    +
  • file_history (str) – The name of the file that stores the information of the history.

  • +
  • file_training (str) – The name of the file that stores the training dataset.

  • +
  • file_predictor (str) – The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+set_seed(seed)[source]
+

Setting a seed parameter for np.random.

+
+
Parameters:
+
    +
  • seed (int) – seed number

  • +
  • -------

  • +
+
+
+
+ +
+
+write(action, t, X=None, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[source]
+

Writing history (update history, not output to a file).

+
+
Parameters:
+
    +
  • action (numpy.ndarray) – Indexes of actions.

  • +
  • t (numpy.ndarray) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • time_total (numpy.ndarray) – N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) – N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) – N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) – N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete.results.html b/manual/v2.0.2/en/api/physbo.search.discrete.results.html new file mode 100644 index 00000000..ccf99906 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete.results.html @@ -0,0 +1,300 @@ + + + + + + + + + physbo.search.discrete.results module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete.results module

+
+
+class physbo.search.discrete.results.history[source]
+

Bases: object

+
+
+export_all_sequence_best_fx()[source]
+
+
Export all fx and actions at each sequence.

(The total number of data is total_num_research.)

+
+
+
+
Returns:
+

    +
  • best_fx (numpy.ndarray)

  • +
  • best_actions (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+export_sequence_best_fx()[source]
+

Export fx and actions at each sequence. +(The total number of data is num_runs.)

+
+
Returns:
+

    +
  • best_fx (numpy.ndarray)

  • +
  • best_actions (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+load(filename)[source]
+

Load the information of the history.

+
+
Parameters:
+

filename (str) – The name of the file which stores the information of the history

+
+
+
+ +
+
+save(filename)[source]
+

Save the information of the history.

+
+
Parameters:
+

filename (str) – The name of the file which stores the information of the history

+
+
+
+ +
+
+property time_get_action
+
+ +
+
+property time_run_simulator
+
+ +
+
+property time_total
+
+ +
+
+property time_update_predictor
+
+ +
+
+write(t, action, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[source]
+

Overwrite fx and chosen_actions by t and action.

+
+
Parameters:
+
    +
  • t (numpy.ndarray) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • action (numpy.ndarray) – N dimensional array. The indexes of actions of each search candidate.

  • +
  • time_total (numpy.ndarray) – N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) – N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) – N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) – N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete_multi.html b/manual/v2.0.2/en/api/physbo.search.discrete_multi.html new file mode 100644 index 00000000..ce724dfe --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete_multi.html @@ -0,0 +1,238 @@ + + + + + + + + + physbo.search.discrete_multi package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete_multi.policy.html b/manual/v2.0.2/en/api/physbo.search.discrete_multi.policy.html new file mode 100644 index 00000000..4cab50a1 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete_multi.policy.html @@ -0,0 +1,383 @@ + + + + + + + + + physbo.search.discrete_multi.policy module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete_multi.policy module

+
+
+class physbo.search.discrete_multi.policy.policy(test_X, num_objectives, comm=None, config=None, initial_data=None)[source]
+

Bases: policy

+
+ +

Performing Bayesian optimization.

+
+
Parameters:
+
    +
  • training (physbo.variable) – Training dataset.

  • +
  • max_num_probes (int) – Maximum number of searching process by Bayesian optimization.

  • +
  • num_search_each_probe (int) – Number of searching by Bayesian optimization at each process.

  • +
  • predictor (predictor object) – Base class is defined in physbo.predictor. +If None, blm_predictor is defined.

  • +
  • is_disp (bool) – If true, process messages are outputted.

  • +
  • simulator (callable) – Callable (function or object with __call__) +Here, action is an integer which represents the index of the candidate.

  • +
  • score (str) – The type of aquision funciton. +TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available.

  • +
  • interval (int) – The interval number of learning the hyper parameter. +If you set the negative value to interval, the hyper parameter learning is not performed. +If you set zero to interval, the hyper parameter learning is performed only at the first step.

  • +
  • num_rand_basis (int) – The number of basis function. If you choose 0, ordinary Gaussian process run.

  • +
+
+
Returns:
+

history

+
+
Return type:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+get_post_fcov(xs)[source]
+

Calculate covariance of predictor (post distribution)

+
+ +
+
+get_post_fmean(xs)[source]
+

Calculate mean value of predictor (post distribution)

+
+ +
+
+get_score(mode, actions=None, xs=None, predictor_list=None, training_list=None, pareto=None, parallel=True, alpha=1)[source]
+

Calcualte score (acquisition function)

+
+
Parameters:
+
    +
  • mode (str) – The type of aquisition funciton. TS, EI and PI are available. +These functions are defined in score.py.

  • +
  • actions (array of int) – actions to calculate score

  • +
  • xs (physbo.variable or np.ndarray) – input parameters to calculate score

  • +
  • predictor (predictor object) – predictor used to calculate score. +If not given, self.predictor will be used.

  • +
  • training (physbo.variable) – Training dataset. +If not given, self.training will be used.

  • +
  • parallel (bool) – Calculate scores in parallel by MPI (default: True)

  • +
  • alpha (float) – Tuning parameter which is used if mode = TS. +In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size).

  • +
+
+
Returns:
+

f – Score defined in each mode.

+
+
Return type:
+

float or list of float

+
+
Raises:
+

RuntimeError – If both actions and xs are given

+
+
+

Notes

+

When neither actions nor xs are given, scores for actions not yet searched will be calculated.

+

When parallel is True, it is assumed that the function receives the same input (actions or xs) for all the ranks. +If you want to split the input array itself, set parallel be False and merge results by yourself.

+
+ +
+
+load(file_history, file_training_list=None, file_predictor_list=None)[source]
+

Loading files about history, training and predictor.

+
+
Parameters:
+
    +
  • file_history (str) – The name of the file that stores the information of the history.

  • +
  • file_training (str) – The name of the file that stores the training dataset.

  • +
  • file_predictor (str) – The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+load_predictor_list(file_name)[source]
+
+ +
+
+load_training_list(file_name)[source]
+
+ +
+
+new_data_list: List[variable | None]
+
+ +
+ +

Performing random search.

+
+
Parameters:
+
    +
  • max_num_probes (int) – Maximum number of random search process.

  • +
  • num_search_each_probe (int) – Number of search at each random search process.

  • +
  • simulator (callable) – Callable (function or object with __call__) from action to t +Here, action is an integer which represents the index of the candidate.

  • +
  • is_disp (bool) – If true, process messages are outputted.

  • +
+
+
Returns:
+

history

+
+
Return type:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+save(file_history, file_training_list=None, file_predictor_list=None)[source]
+

Saving history, training and predictor into the corresponding files.

+
+
Parameters:
+
    +
  • file_history (str) – The name of the file that stores the information of the history.

  • +
  • file_training (str) – The name of the file that stores the training dataset.

  • +
  • file_predictor (str) – The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+save_predictor_list(file_name)[source]
+
+ +
+
+save_training_list(file_name)[source]
+
+ +
+
+write(action, t, X=None, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[source]
+

Writing history (update history, not output to a file).

+
+
Parameters:
+
    +
  • action (numpy.ndarray) – Indexes of actions.

  • +
  • t (numpy.ndarray) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • X (numpy.ndarray) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • time_total (numpy.ndarray) – N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) – N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) – N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) – N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.discrete_multi.results.html b/manual/v2.0.2/en/api/physbo.search.discrete_multi.results.html new file mode 100644 index 00000000..939e6eb5 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.discrete_multi.results.html @@ -0,0 +1,242 @@ + + + + + + + + + physbo.search.discrete_multi.results module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete_multi.results module

+
+
+class physbo.search.discrete_multi.results.history(num_objectives)[source]
+

Bases: object

+
+
+export_pareto_front()[source]
+
+ +
+
+load(filename)[source]
+
+ +
+
+save(filename)[source]
+
+ +
+
+property time_get_action
+
+ +
+
+property time_run_simulator
+
+ +
+
+property time_total
+
+ +
+
+property time_update_predictor
+
+ +
+
+write(t, action, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[source]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.html b/manual/v2.0.2/en/api/physbo.search.html new file mode 100644 index 00000000..a4ea5197 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.html @@ -0,0 +1,281 @@ + + + + + + + + + physbo.search package — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.pareto.html b/manual/v2.0.2/en/api/physbo.search.pareto.html new file mode 100644 index 00000000..c12e28a6 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.pareto.html @@ -0,0 +1,259 @@ + + + + + + + + + physbo.search.pareto module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.pareto module

+
+
+class physbo.search.pareto.Pareto(num_objectives, dom_rule=None)[source]
+

Bases: object

+
+
+divide_non_dominated_region(force_binary_search=False)[source]
+
+ +
+
+export_front()[source]
+
+ +
+
+set_reference_max(reference_max=None)[source]
+
+ +
+
+set_reference_min(reference_min=None)[source]
+
+ +
+
+update_front(t)[source]
+

Update the non-dominated set of points.

+

Pareto set is sorted on the first objective in ascending order.

+
+ +
+
+volume_in_dominance(ref_min, ref_max, dominance_ratio=False)[source]
+
+ +
+ +
+
+class physbo.search.pareto.Rectangles(n_dim, dtype)[source]
+

Bases: object

+
+
+add(lb, ub)[source]
+

Add new rectangles.

+
+
Parameters:
+
    +
  • lb – lower bounds of rectangles

  • +
  • ub – upper bounds of rectangles

  • +
+
+
+
+ +
+ +
+
+physbo.search.pareto.dominate(t1, t2)[source]
+

domination rule for maximization problem

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.score.html b/manual/v2.0.2/en/api/physbo.search.score.html new file mode 100644 index 00000000..032f9de2 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.score.html @@ -0,0 +1,300 @@ + + + + + + + + + physbo.search.score module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.score module

+
+
+physbo.search.score.EI(predictor, training, test, fmax=None)[source]
+

Maximum expected improvement.

+
+
Parameters:
+
    +
  • predictor (predictor object) – Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) – Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) – Inputs

  • +
  • fmax (float) – Max value of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used.

  • +
+
+
Returns:
+

score

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.PI(predictor, training, test, fmax=None)[source]
+

Maximum probability of improvement.

+
+
Parameters:
+
    +
  • predictor (predictor object) – Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) – Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) – Inputs

  • +
  • fmax (float) – Max value of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used.

  • +
+
+
Returns:
+

score

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.TS(predictor, training, test, alpha=1)[source]
+

Thompson sampling (See Sec. 2.1 in Materials Discovery Volume 4, June 2016, Pages 18-21)

+
+
Parameters:
+
    +
  • predictor (predictor object) – Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) – Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) – Inputs

  • +
  • alpha (float) – noise for sampling source +(default: 1.0)

  • +
+
+
Returns:
+

score

+
+
Return type:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.score(mode, predictor, test, training=None, **kwargs)[source]
+

Calculate scores (acquisition function) for test data.

+
+
Parameters:
+
    +
  • mode (str) –

    Kind of score.

    +

    ”EI”, “PI”, and “TS” are available.

    +

  • +
  • predictor (predictor object) – Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) – Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) – Inputs

  • +
  • fmax (float) – Max value of mean of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used. +Used only for mode == “EI” and “PI”

  • +
  • alpha (float) – noise for sampling source (default: 1.0) +Used only for mode == “TS”

  • +
+
+
Returns:
+

score

+
+
Return type:
+

numpy.ndarray

+
+
Raises:
+

NotImplementedError – If unknown mode is given

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.score_multi.html b/manual/v2.0.2/en/api/physbo.search.score_multi.html new file mode 100644 index 00000000..2cf1250c --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.score_multi.html @@ -0,0 +1,219 @@ + + + + + + + + + physbo.search.score_multi module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.score_multi module

+
+
+physbo.search.score_multi.EHVI(fmean, fstd, pareto)[source]
+

Calculate Expected Hyper-Volume Improvement (EHVI).

+

Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization

+
+ +
+
+physbo.search.score_multi.HVPI(fmean, fstd, pareto)[source]
+

Calculate Hypervolume-based Probability of Improvement (HVPI).

+

Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization

+
+ +
+
+physbo.search.score_multi.TS(predictor_list, training_list, test, alpha=1, reduced_candidate_num=None)[source]
+
+ +
+
+physbo.search.score_multi.score(mode, predictor_list, test, training_list, **kwargs)[source]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.search.utility.html b/manual/v2.0.2/en/api/physbo.search.utility.html new file mode 100644 index 00000000..d93cb0e5 --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.search.utility.html @@ -0,0 +1,225 @@ + + + + + + + + + physbo.search.utility module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.utility module

+
+
+physbo.search.utility.is_learning(n, interval)[source]
+
+ +
+
+physbo.search.utility.length_vector(t)[source]
+
+ +
+
+physbo.search.utility.show_interactive_mode(simulator, history)[source]
+
+ +
+
+physbo.search.utility.show_search_results(history, N)[source]
+
+ +
+
+physbo.search.utility.show_search_results_mo(history, N, disp_pareto_set=False)[source]
+
+ +
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/api/physbo.variable.html b/manual/v2.0.2/en/api/physbo.variable.html new file mode 100644 index 00000000..9784e53e --- /dev/null +++ b/manual/v2.0.2/en/api/physbo.variable.html @@ -0,0 +1,326 @@ + + + + + + + + + physbo.variable module — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.variable module

+
+
+class physbo.variable.variable(X=None, t=None, Z=None)[source]
+

Bases: object

+
+
+add(X=None, t=None, Z=None)[source]
+

Adding variables of X, t, Z.

+
+
Parameters:
+
    +
  • X (numpy array) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • t (numpy array) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • Z

  • +
+
+
+
+ +
+
+add_X(X=None)[source]
+

Adding variable X. If self.X is None, self.X is set as X.

+
+
Parameters:
+

X (numpy array) – N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

+
+
+
+ +
+
+add_Z(Z=None)[source]
+

Adding variable Z. If self.Z is None, self.Z is set as Z.

+
+
Parameters:
+

Z

+
+
+
+ +
+
+add_t(t=None)[source]
+

Adding variable t. If self.t is None, self.t is set as t.

+
+
Parameters:
+

t (numpy array) – N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

+
+
+
+ +
+
+delete(num_row)[source]
+

Deleting variables of X, t, Z whose indexes are specified by num_row.

+
+
Parameters:
+

num_row (numpy array) – Index array to be deleted.

+
+
+
+ +
+
+delete_X(num_row)[source]
+

Deleting variables of X whose indexes are specified by num_row.

+
+
Parameters:
+

num_row (numpy array) – Index array to be deleted.

+
+
+
+ +
+
+delete_Z(num_row)[source]
+

Deleting variables of Z whose indexes are specified by num_row.

+
+
Parameters:
+

num_row (numpy array) – Index array to be deleted.

+
+
+
+ +
+
+delete_t(num_row)[source]
+

Deleting variables of t whose indexes are specified by num_row.

+
+
Parameters:
+

num_row (numpy array) – Index array to be deleted.

+
+
+
+ +
+
+get_subset(index)[source]
+

Getting subset of variables.

+
+
Parameters:
+

index (int or array of int) – Index of selected action.

+
+
Returns:
+

variable

+
+
Return type:
+

physbo.variable

+
+
+
+ +
+
+load(file_name)[source]
+

Loading variables X, t, Z from the file.

+
+
Parameters:
+

file_name (str) – A file name for loading variables X, t, Z using numpy.load.

+
+
+
+ +
+
+save(file_name)[source]
+

Saving variables X, t, Z to the file.

+
+
Parameters:
+

file_name (str) – A file name for saving variables X, t, Z using numpy.savez_compressed.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/contact.html b/manual/v2.0.2/en/contact.html new file mode 100644 index 00000000..f7b92b20 --- /dev/null +++ b/manual/v2.0.2/en/contact.html @@ -0,0 +1,190 @@ + + + + + + + + + Contact — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contact

+
    +
  • Bug Reports

    +

    Please report all problems and bugs on the github Issues page.

    +

    To resolve bugs early, follow these guidelines when reporting:

    +
      +
    1. Please specify the version of PHYSBO you are using.

    2. +
    3. If there are problems for installation, please inform us about your operating system and the compiler.

    4. +
    5. If a problem occurs during execution, enter the input file used for execution and its output.

    6. +
    +

    Thank you for your cooperation.

    +
  • +
  • Others

    +

    If you have any questions about your research that are difficult to consult at Issues on GitHub, please send an e-mail to the following address:

    +

    E-mail: physbo-dev__at__issp.u-tokyo.ac.jp (replace _at_ by @)

    +
  • +
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/genindex.html b/manual/v2.0.2/en/genindex.html new file mode 100644 index 00000000..c5f5e13e --- /dev/null +++ b/manual/v2.0.2/en/genindex.html @@ -0,0 +1,1515 @@ + + + + + + + + Index — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ _ + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + | Z + +
+

_

+ + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ +

Z

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/index.html b/manual/v2.0.2/en/index.html new file mode 100644 index 00000000..f2d7c2ae --- /dev/null +++ b/manual/v2.0.2/en/index.html @@ -0,0 +1,216 @@ + + + + + + + + + Welcome to PHYSBO’s documentation! — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/install.html b/manual/v2.0.2/en/install.html new file mode 100644 index 00000000..3ca50fc9 --- /dev/null +++ b/manual/v2.0.2/en/install.html @@ -0,0 +1,317 @@ + + + + + + + + + Basic usage — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Basic usage

+
+

Install

+
+

Required Packages

+
    +
  • Python >= 3.6

  • +
  • numpy < 2.0.0

  • +
  • scipy

  • +
+
+
+

Download and Install

+
    +
  • From PyPI (recommended)

    +
    $ pip3 install physbo
    +
    +
    +
      +
    • Required packages such as NumPy will also be installed at the same time.

    • +
    • If you add the --user option, it will be installed under the user’s home directory

      +
      $ pip3 install --user physbo
      +
      +
      +
    • +
    +
  • +
  • From source (for developers)

    +
      +
    1. Download or clone the github repository

      +
      +
      +
    2. +
    3. Update pip to 19.0 or higher

      +
      $ pip3 install -U pip
      +
      +- If you don't have ``pip3``, you can install it with ``python3 -m ensurepip``.
      +
      +
      +
    4. +
    5. Install

      +
      $ cd PHYSBO
      +$ pip3 install --user ./
      +
      +
      +
    6. +
    +
  • +
+
+
+

Uninstall

+
    +
  1. Execute the following command.

    +
    $ pip uninstall physbo
    +
    +
    +
  2. +
+
+
+
+

Basic structures

+

PHYSBO has the following structure (shown up to the second level).

+

Each module is created with the following structure.

+
    +
  • blm :Module for Baysean linear model

  • +
  • gp :Module for Gaussian Process

  • +
  • opt :Module for optimazation

  • +
  • search :Module for searching for optimal solutions

  • +
  • predictor.py :Abstract class for predictors

  • +
  • variable.py :Class defined for variable associations used in physbo

  • +
  • misc : Others (e.g., modules for normalizing the search space)

  • +
+

For more information about each module, please refer to the API reference.

+
+
+

Calculation flow

+

Bayesian optimization is well suited for optimization problems such as complex simulations or real-world experimental tasks where the objective function is very costly to evaluate. +In PHYSBO, the following steps are used to perform the optimization (please refer to the tutorial and API reference for details on each).

+
    +
  1. Defining the search space

  2. +
+
+

Define each parameter set (d-dimensional vector) as a search candidate, where N: the number of search candidates , d: the number of input parameter dimensions. The parameter set should list all the candidates.

+
+
    +
  1. Defining the simulator

  2. +
+
+

For searching candidates defined above, define a simulator that gives the objective function values (values to be optimized, such as material property values) for each search candidate. In PHYSBO, the direction of optimization is to maximize the objective function, so if you want to minimize the objective function, you can do so by applying a negative value to the value returned by the simulator.

+
+
    +
  1. Performing optimization

  2. +
+
+

First, set the optimization policy (the search space is passed to policy as an argument at this stage). You can choose between the following two optimization methods.

+
+
    +
  • random_search

  • +
  • bayes_search

  • +
+

In random_search, we randomly select parameters from the search space and search for the largest objective function among them. It is used to prepare an initial set of parameters as a preprocessing step for Bayesian optimization. bayes_search performs Bayesian optimization. The type of score (acquisition function) in Bayesian optimization can be one of the following.

+
    +
  • TS (Thompson Sampling): Sample one regression function from the posterior probability distribution of the learned Gaussian process, and select the point where the predicetd value becomes maximum as a next candidate.

  • +
  • EI (Expected Improvement): Select the point where the expected value of the difference between the predicted value by the Gaussian process and the maximum value in the current situation becomes the maximum as a next candidate.

  • +
  • PI (Probability of Improvement): Select the point with the highest probability of exceeding the current maximum of the current acquisition function as a next candidate.

  • +
+

Details of Gaussian processes are described in Algorithm . For other details of each method, please see this reference . +If you specify the simulator and the number of search steps in these methods, the following loop will rotate by the number of search steps.

+
+

i). Select the next parameter to be executed from the list of candidate parameters.

+

ii). Run the simulator with the selected parameters.

+
+

The number of parameter returned in i) is one by default, but it is possible to return multiple parameters in one step. For more details, please refer to the “Exploring multiple candidates at once” section of the tutorial. Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYSBO (e.g., by experiment rather than numerical calculation), and register the evaluated value in PHYSBO. For more details, please refer to the “Running Interactively” section of the tutorial.

+
+
+
    +
  1. Check numerical results

  2. +
+
+

The search result res is returned as an object of the history class ( physbo.search.discrete.results.history ). The following is a reference to the search results.

+
    +
  • res.fx: The logs of evaluation values for simulator (objective function) simulator.

  • +
  • res.chosen_actions: The logs of the action ID (parameter) when the simulator has executed.

  • +
  • fbest, best_action= res.export_all_sequence_best_fx(): The logs of the best values and their action IDs (parameters) at each step where the simulator has executed.

  • +
  • res.total_num_search: Total number steps where the simulator has executed.

  • +
+

The search results can be saved to an external file using the save method, and the output results can be loaded using the load method. See the tutorial for details on how to use it.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/introduction.html b/manual/v2.0.2/en/introduction.html new file mode 100644 index 00000000..ce550ba7 --- /dev/null +++ b/manual/v2.0.2/en/introduction.html @@ -0,0 +1,236 @@ + + + + + + + + + Introduction — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Introduction

+
+

About PHYSBO

+

PHYSBO (optimization tools for PHYSics based on Bayesian Optimization) is a Python library for fast and scalable Bayesian optimization. It is based on COMBO (Common Bayesian Optimization) and has been developed mainly for researchers in the materials science field. There are many attempts to accelerate scientific discovery through data-driven design-of-experiment algorithms in the fields of physics, chemistry, and materials. Bayesian optimization is an effective tool for accelerating these scientific discoveries. Bayesian optimization is a technique that can be used for complex simulations and real-world experimental tasks where the evaluation of objective function values (e.g., characteristic values) is very costly. In other words, the problem solved by Bayesian optimization is to find a parameter (e.g., material composition, structure, process and simulation parameters) with a better objective function value (e.g., material properties) in as few experiments and simulations as possible. In Bayesian optimization, the candidate parameters to be searched for are listed in advance, and the candidate with the largest objective function value is selected from among the candidates by making good use of machine learning (using Gaussian process regression) prediction. Experiments and simulations are performed on the candidates and the objective function values are evaluated. By repeating the process of selection by machine learning and evaluation by experimental simulation, we can reduce the number of times of optimization. On the other hand, Bayesian optimization is generally computationally expensive, and standard implementations such as scikit-learn are difficult to handle a large amount of data. PHYSBO achieves high scalability due to the following features

+
    +
  • Thompson Sampling

  • +
  • random feature map

  • +
  • one-rank Cholesky update

  • +
  • automatic hyperparameter tuning

  • +
+

Please see this reference for technical details.

+
+
+

Citation

+

When citing PHYSBO, please cite the following reference:

+

Yuichi Motoyama, Ryo Tamura, Kazuyoshi Yoshimi, Kei Terayama, Tsuyoshi Ueno, Koji Tsuda, +Bayesian optimization package: PHYSBO, +Computer Physics Communications Volume 278, September 2022, 108405. Available from https://www.sciencedirect.com/science/article/pii/S0010465522001242?via%3Dihub (open access).

+

Bibtex is given as follows:

+
@misc{@article{MOTOYAMA2022108405,
+title = {Bayesian optimization package: PHYSBO},
+journal = {Computer Physics Communications},
+volume = {278},
+pages = {108405},
+year = {2022},
+issn = {0010-4655},
+doi = {https://doi.org/10.1016/j.cpc.2022.108405},
+author = {Yuichi Motoyama and Ryo Tamura and Kazuyoshi Yoshimi and Kei Terayama and Tsuyoshi Ueno and Koji Tsuda},
+keywords = {Bayesian optimization, Multi-objective optimization, Materials screening, Effective model estimation}
+}
+
+
+
+
+

Main Developers

+
    +
  • ver. 1.0-

    +
      +
    • Ryo Tamura (International Center for Materials Nanoarchitectonics, National Institute for Materials Science)

    • +
    • Tsuyoshi Ueno (Magne-Max Capital Management Company)

    • +
    • Kei Terayama (Graduate School of Medical Life Science, Yokohama City University)

    • +
    • Koji Tsuda (Graduate School of Frontier Sciences, The University of Tokyo)

    • +
    • Yuichi Motoyama (The Institute for Solid State Physics, The University of Tokyo)

    • +
    • Kazuyoshi Yoshimi (The Institute for Solid State Physics, The University of Tokyo)

    • +
    • Naoki Kawashima (The Institute for Solid State Physics, The University of Tokyo)

    • +
    +
  • +
+
+
+

License

+

PHYSBO v2 is distributed under the Mozilla Public License version 2.0 (MPL v2).

+

Copyright (c) <2020-> The University of Tokyo. All rights reserved.

+

Part of this software is developed under the support of “Project for advancement of software usability in materials science” by The Institute for Solid State Physics, The University of Tokyo.

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/index.html b/manual/v2.0.2/en/notebook/index.html new file mode 100644 index 00000000..0805832c --- /dev/null +++ b/manual/v2.0.2/en/notebook/index.html @@ -0,0 +1,243 @@ + + + + + + + + + Tutorials — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.html b/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.html new file mode 100644 index 00000000..652bfc62 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.html @@ -0,0 +1,564 @@ + + + + + + + + + Gaussian process — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gaussian process

+

PHYSBO performs Bayesian optimization while running Gaussian process regression.

+

Therefore, it is possible to run Gaussian process regression given training data, and to predict test data using the trained model.

+

In this section, the procedure is introduced.

+
+

Preparation of search candidate data

+

In this tutorial, the problem of finding a stable interface structure for Cu is used as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references

+
    +
    1. +
    2. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).

    3. +
    +
  • +
+

Save the dataset file s5-210.csv into the subdirectory data, and load dataset from this file as the following:

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering( X )
+
+
+
+
+
+

Defining training data

+

A randomly selected 10% of the target data will be used as training data, and another randomly selected 10% will be used as test data.

+
+
[2]:
+
+
+
N = len(t)
+Ntrain = int(N*0.1)
+Ntest = min(int(N*0.1), N-Ntrain)
+
+id_all   = np.random.choice(N, N, replace=False)
+id_train  = id_all[0:Ntrain]
+id_test = id_all[Ntrain:Ntrain+Ntest]
+
+X_train = X[id_train]
+X_test = X[id_test]
+
+t_train = t[id_train]
+t_test = t[id_test]
+
+print("Ntrain =", Ntrain)
+print("Ntest =", Ntest)
+
+
+
+
+
+
+
+
+Ntrain = 1798
+Ntest = 1798
+
+
+
+
+

Learning and Prediction of Gaussian Processes

+

The following process is used to learn the Gaussian process and predict the test data.

+
    +
  1. Generate a model of the Gaussian process

  2. +
  3. The model is trained using X_train (parameters of the training data) and t_train (objective function value of the training data).

  4. +
  5. Run predictions on the test data (X_test) using the trained model.

  6. +
+

Definition of covariance (Gaussian)

+
+
[3]:
+
+
+
cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )
+
+
+
+

Definition of mean value

+
+
[4]:
+
+
+
mean = physbo.gp.mean.const()
+
+
+
+

Definition of likelihood function (Gaussian)

+
+
[5]:
+
+
+
lik = physbo.gp.lik.gauss()
+
+
+
+

Generation of a Gaussian Process Model

+
+
[6]:
+
+
+
gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)
+config = physbo.misc.set_config()
+
+
+
+

Learning a Gaussian process model.

+
+
[7]:
+
+
+
gp.fit(X_train, t_train, config)
+
+
+
+
+
+
+
+
+Start the initial hyper parameter searching ...
+Done
+
+Start the hyper parameter learning ...
+0 -th epoch marginal likelihood 17312.31220145003
+50 -th epoch marginal likelihood 6291.292745798703
+100 -th epoch marginal likelihood 3269.1167759139516
+150 -th epoch marginal likelihood 1568.3930580794922
+200 -th epoch marginal likelihood 664.2847129159145
+250 -th epoch marginal likelihood -249.28468708456558
+300 -th epoch marginal likelihood -869.7604930929888
+350 -th epoch marginal likelihood -1316.6809532065581
+400 -th epoch marginal likelihood -1546.1623851368954
+450 -th epoch marginal likelihood -1660.7298135295766
+500 -th epoch marginal likelihood -1719.5056128528097
+Done
+
+
+
+

Output the parameters in the learned Gaussian process.

+
+
[8]:
+
+
+
gp.print_params()
+
+
+
+
+
+
+
+
+
+
+likelihood parameter =   [-2.81666924]
+mean parameter in GP prior:  [-1.05939674]
+covariance parameter in GP prior:  [-0.91578975 -2.45544347]
+
+
+
+
+

Calculating the mean (predicted value) and variance of the test data

+
+
[9]:
+
+
+
gp.prepare(X_train, t_train)
+fmean = gp.get_post_fmean(X_train, X_test)
+fcov = gp.get_post_fcov(X_train, X_test)
+
+
+
+

Results of prediction

+
+
[10]:
+
+
+
fmean
+
+
+
+
+
[10]:
+
+
+
+
+array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,
+       -0.97015759, -1.11076236])
+
+
+

Results of covariance

+
+
[11]:
+
+
+
fcov
+
+
+
+
+
[11]:
+
+
+
+
+array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,
+       0.00073499])
+
+
+

Output mean square error of prediction

+
+
[12]:
+
+
+
np.mean((fmean-t_test)**2)
+
+
+
+
+
[12]:
+
+
+
+
+0.008107085662147708
+
+
+
+
+

Prediction by trained models

+

Read the parameters of the trained model as gp_params and make predictions using them.

+

By storing gp_params and training data (X_train, t_train), prediction by the trained model is possible.

+

Prepare the learned parameters (must be done immediately after learning)

+
+
[13]:
+
+
+
#Prepare the learned parameters as a 1D array
+gp_params =  np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)
+
+gp_params
+
+
+
+
+
[13]:
+
+
+
+
+array([-2.81666924, -1.05939674, -0.91578975, -2.45544347])
+
+
+

Prepare a model similar to the one used for training as gp

+
+
[14]:
+
+
+
#Definition of covariance (Gaussian)
+cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )
+
+#Definition of mean value
+mean = physbo.gp.mean.const()
+
+#Definition of likelihood function (Gaussian)
+lik = physbo.gp.lik.gauss()
+
+#Generation of a Gaussian Process Model
+gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)
+
+
+
+

Prepare a model similar to the one used for training as gp

+
+
[15]:
+
+
+
#Input learned parameters into the Gaussian process.
+gp.set_params(gp_params)
+
+
+#Calculate the mean (predicted value) and variance of the test data
+gp.prepare(X_train, t_train)
+fmean = gp.get_post_fmean(X_train, X_test)
+fcov = gp.get_post_fcov(X_train, X_test)
+
+
+
+

Results of prediction

+
+
[16]:
+
+
+
fmean
+
+
+
+
+
[16]:
+
+
+
+
+array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,
+       -0.97015759, -1.11076236])
+
+
+

Results of covariance

+
+
[17]:
+
+
+
fcov
+
+
+
+
+
[17]:
+
+
+
+
+array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,
+       0.00073499])
+
+
+

Output mean square error of prediction

+
+
[18]:
+
+
+
np.mean((fmean-t_test)**2)
+
+
+
+
+
[18]:
+
+
+
+
+0.008107085662147708
+
+
+
+
[ ]:
+
+
+
Note: In the example above, we used the same pre-registered X to make predictions.
+If you want to make predictions for parameters X_new that is not included in X using the trained model,
+you first obtain the mean (X_{mean}) and standard deviation (X_{std}) of the data X and
+then normalize X_{new} by (X_{new} - X_{mean}) / X_{std}.
+Also, the data format for X is ndarray format.
+Therefore, if X_{new} is a single data, it must be transformed to ndarray format.
+For example, if X_{new} is a real number, you should replace X_new as
+X_new = np.array(X_new).reshape(1)
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.ipynb b/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.ipynb new file mode 100644 index 00000000..e83820b6 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_Gaussian_process.ipynb @@ -0,0 +1,780 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Gaussian process\n", + "\n", + "PHYSBO performs Bayesian optimization while running Gaussian process regression.\n", + "\n", + "Therefore, it is possible to run Gaussian process regression given training data, and to predict test data using the trained model.\n", + "\n", + "In this section, the procedure is introduced.\n", + "\n", + "\n", + "## Preparation of search candidate data\n", + "\n", + "In this tutorial, the problem of finding a stable interface structure for Cu is used as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references\n", + "\n", + "- S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "\n", + "Save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:41.987250Z", + "start_time": "2020-12-04T06:11:41.537168Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering( X )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Defining training data\n", + "\n", + "A randomly selected 10% of the target data will be used as training data, and another randomly selected 10% will be used as test data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:51.077070Z", + "start_time": "2020-12-04T06:11:51.072211Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ntrain = 1798\n", + "Ntest = 1798\n" + ] + } + ], + "source": [ + "N = len(t)\n", + "Ntrain = int(N*0.1)\n", + "Ntest = min(int(N*0.1), N-Ntrain)\n", + "\n", + "id_all = np.random.choice(N, N, replace=False)\n", + "id_train = id_all[0:Ntrain]\n", + "id_test = id_all[Ntrain:Ntrain+Ntest]\n", + "\n", + "X_train = X[id_train]\n", + "X_test = X[id_test]\n", + "\n", + "t_train = t[id_train]\n", + "t_test = t[id_test]\n", + "\n", + "print(\"Ntrain =\", Ntrain)\n", + "print(\"Ntest =\", Ntest)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Learning and Prediction of Gaussian Processes\n", + "\n", + "The following process is used to learn the Gaussian process and predict the test data.\n", + "\n", + "1. Generate a model of the Gaussian process\n", + "\n", + "2. The model is trained using X_train (parameters of the training data) and t_train (objective function value of the training data).\n", + "\n", + "3. Run predictions on the test data (X_test) using the trained model.\n", + "\n", + "Definition of covariance (Gaussian)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:55.403677Z", + "start_time": "2020-12-04T06:11:55.399915Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Definition of mean value" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:56.279543Z", + "start_time": "2020-12-04T06:11:56.277082Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "mean = physbo.gp.mean.const()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Definition of likelihood function (Gaussian)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.077507Z", + "start_time": "2020-12-04T06:11:57.075581Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "lik = physbo.gp.lik.gauss()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Generation of a Gaussian Process Model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.832602Z", + "start_time": "2020-12-04T06:11:57.828902Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n", + "config = physbo.misc.set_config()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Learning a Gaussian process model." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.218792Z", + "start_time": "2020-12-04T06:11:58.261609Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood 17312.31220145003\n", + "50 -th epoch marginal likelihood 6291.292745798703\n", + "100 -th epoch marginal likelihood 3269.1167759139516\n", + "150 -th epoch marginal likelihood 1568.3930580794922\n", + "200 -th epoch marginal likelihood 664.2847129159145\n", + "250 -th epoch marginal likelihood -249.28468708456558\n", + "300 -th epoch marginal likelihood -869.7604930929888\n", + "350 -th epoch marginal likelihood -1316.6809532065581\n", + "400 -th epoch marginal likelihood -1546.1623851368954\n", + "450 -th epoch marginal likelihood -1660.7298135295766\n", + "500 -th epoch marginal likelihood -1719.5056128528097\n", + "Done\n", + "\n" + ] + } + ], + "source": [ + "gp.fit(X_train, t_train, config)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output the parameters in the learned Gaussian process." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.227479Z", + "start_time": "2020-12-04T06:12:58.221821Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "likelihood parameter = [-2.81666924]\n", + "mean parameter in GP prior: [-1.05939674]\n", + "covariance parameter in GP prior: [-0.91578975 -2.45544347]\n", + "\n", + "\n" + ] + } + ], + "source": [ + "gp.print_params()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Calculating the mean (predicted value) and variance of the test data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.605713Z", + "start_time": "2020-12-04T06:12:58.244883Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.618218Z", + "start_time": "2020-12-04T06:12:58.607794Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,\n", + " -0.97015759, -1.11076236])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of covariance" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.628483Z", + "start_time": "2020-12-04T06:12:58.622345Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,\n", + " 0.00073499])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output mean square error of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.636081Z", + "start_time": "2020-12-04T06:12:58.631461Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.008107085662147708" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Prediction by trained models\n", + "\n", + "Read the parameters of the trained model as gp_params and make predictions using them.\n", + "\n", + "By storing gp_params and training data (X_train, t_train), prediction by the trained model is possible." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare the learned parameters (must be done immediately after learning)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.645968Z", + "start_time": "2020-12-04T06:12:58.639012Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.81666924, -1.05939674, -0.91578975, -2.45544347])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Prepare the learned parameters as a 1D array\n", + "gp_params = np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)\n", + "\n", + "gp_params" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare a model similar to the one used for training as gp" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.666019Z", + "start_time": "2020-12-04T06:12:58.653259Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Definition of covariance (Gaussian)\n", + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )\n", + "\n", + "#Definition of mean value\n", + "mean = physbo.gp.mean.const()\n", + "\n", + "#Definition of likelihood function (Gaussian)\n", + "lik = physbo.gp.lik.gauss()\n", + "\n", + "#Generation of a Gaussian Process Model\n", + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Prepare a model similar to the one used for training as gp" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.016429Z", + "start_time": "2020-12-04T06:12:58.673034Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#Input learned parameters into the Gaussian process.\n", + "gp.set_params(gp_params)\n", + "\n", + "\n", + "#Calculate the mean (predicted value) and variance of the test data\n", + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.020795Z", + "start_time": "2020-12-04T06:12:59.017606Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.00420815, -1.10923758, -0.97840623, ..., -1.00323733,\n", + " -0.97015759, -1.11076236])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Results of covariance" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.026523Z", + "start_time": "2020-12-04T06:12:59.023035Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00056069, 0.00075529, 0.00043006, ..., 0.0016925 , 0.00070103,\n", + " 0.00073499])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Output mean square error of prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.033497Z", + "start_time": "2020-12-04T06:12:59.027871Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.008107085662147708" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "Note: In the example above, we used the same pre-registered X to make predictions.\n", + "If you want to make predictions for parameters X_new that is not included in X using the trained model,\n", + "you first obtain the mean (X_{mean}) and standard deviation (X_{std}) of the data X and\n", + "then normalize X_{new} by (X_{new} - X_{mean}) / X_{std}.\n", + "Also, the data format for X is ndarray format.\n", + "Therefore, if X_{new} is a single data, it must be transformed to ndarray format.\n", + "For example, if X_{new} is a real number, you should replace X_new as\n", + "X_new = np.array(X_new).reshape(1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_basic.html b/manual/v2.0.2/en/notebook/tutorial_basic.html new file mode 100644 index 00000000..cbb49f91 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_basic.html @@ -0,0 +1,559 @@ + + + + + + + + + Basic usage of PHYSBO — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Basic usage of PHYSBO

+
+

Introduction

+

In this tutorial, we will introduce how to define the simulator class and find the minimum value of a one-dimensional function using PHYSBO.

+

First, we will import PHYSBO.

+
+
[1]:
+
+
+
import physbo
+
+
+
+
+
+

Defining the search space

+

In the following example, the search space X is defined as a grid chopped by window_num=10001 divisions from x_min = -2.0 to x_max = 2.0. Note that X must be in window_num x d ndarray format (d is the number of dimensions, in this case one). In this case, d is the number of dimensions, in this case two, so we use reshape to transform it.

+
+
[2]:
+
+
+
#In
+import numpy as np
+import scipy
+import physbo
+import itertools
+
+#In
+#Create candidate
+window_num=10001
+x_max = 2.0
+x_min = -2.0
+
+X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)
+
+
+
+
+
+

Defining the simulator class

+

Here, we define the simulator class to set as the objective function.

+

In this case, the problem is to find the minimum \(x\) such that \(f(x) = 3 x^4 + 4 x ^3 + 1.0\) (the answer is \(x=-1.0\)).

+

In the simulator class, we define the __call__ function (or __init__ if there are initial variables, etc.). (If there are initial variables, define __init__.) The action indicates the index number of the grid to be retrieved from the search space, and is generally in the form of an ndarray so that multiple candidates can be calculated at once. In this case, we choose one candidate point from X as action_idx=action[0] to calculate only one candidate at a time. Since PHYSBO +is designed to find the maximum value of the objective function, it returns the value of f(x) at the candidate point multiplied by -1.

+
+
[3]:
+
+
+
# Declare the class for calling the simulator.
+class simulator:
+
+    def __call__(self, action ):
+        action_idx = action[0]
+        x = X[action_idx][0]
+        fx = 3.0*x**4 + 4.0*x**3 + 1.0
+        fx_list.append(fx)
+        x_list.append(X[action_idx][0])
+
+        print ("*********************")
+        print ("Present optimum interactions")
+
+        print ("x_opt=", x_list[np.argmin(np.array(fx_list))])
+
+        return -fx
+
+
+
+
+
+

Performing optimization

+
+

Setting policy

+

First, set the optimization policy.

+

Next, set test_X to the matrix of search candidates (numpy.array).

+
+
[4]:
+
+
+
# set policy
+policy = physbo.search.discrete.policy(test_X=X)
+
+# set seed
+policy.set_seed(0)
+
+
+
+

When policy is set, no optimization is done yet. Execute the following methods on policy to optimize it.

+
    +
  • random_search.

  • +
  • bayes_search.

  • +
+

If you specify the simulator and the number of search steps in these methods, the following loop will be executed for the number of search steps.

+
    +
  1. Select the next parameter to be executed from the candidate parameters.

  2. +
  3. Execute simulator with the selected parameters.

  4. +
+

The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step. See the section “Searching for multiple candidates at once” for details.

+

Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYSBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the “Running Interactively” section of the +tutorial.

+
+ +
+

Bayesian Optimization

+

Next, we run the Bayesian optimization as follows.

+

argument.

+
    +
  • max_num_probes: Number of search steps.

  • +
  • simulator: The simulator of the objective function (an object of class simulator).

  • +
  • score: The type of acquisition function. You can specify one of the following

    +
      +
    • TS (Thompson Sampling)

    • +
    • EI (Expected Improvement)

    • +
    • PI (Probability of Improvement)

    • +
    +
  • +
  • interval: +The hyperparameters are trained at the specified interval. +If a negative value is specified, no hyperparameter will be learned. +0 means that hyperparameter learning will be performed only in the first step.

  • +
  • num_rand_basis: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used.

  • +
+
+
[ ]:
+
+
+
res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS',
+                                                  interval=0, num_rand_basis=500)
+
+
+
+
+
+
+

Checking the results

+
+
The search result res is returned as an object of the history class (physbo.search.discrete.results.history).
+
The following is a reference to the search results.
+
+
    +
  • res.fx : The history of evaluated values of simulator (objective function).

  • +
  • res.chosen_actions: The history of action IDs (parameters) when the simulator was evaluated.

  • +
  • fbest, best_action= res.export_all_sequence_best_fx(): The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.

  • +
  • res.total_num_search: Total number of simulator evaluations.

  • +
+
+
Let’s plot the objective function value and the best value at each step.
+
res.fx and best_fx should range up to res.total_num_search, respectively.
+
+
+
[7]:
+
+
+
import matplotlib.pyplot as plt
+%matplotlib inline
+
+
+
+
+
[8]:
+
+
+
plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[8]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f816129d820>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_15_1.png +
+
+
+
[9]:
+
+
+
best_fx, best_action = res.export_all_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[9]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f8130b30f70>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_16_1.png +
+
+
+
+

Serializing the results

+

The search results can be saved to an external file using the save method.

+
+
[10]:
+
+
+
res.save('search_result.npz')
+
+
+
+
+
[11]:
+
+
+
del res
+
+
+
+

Load the saved result file as follows:

+
+
[12]:
+
+
+
res = physbo.search.discrete.results.history()
+res.load('search_result.npz')
+
+
+
+

Finally, the candidate with the best score can be displayed as follows. You can see that we have arrived at the correct solution \(x=-1\).

+
+
[13]:
+
+
+
print(X[int(best_action[-1])])
+
+
+
+
+
+
+
+
+[-1.002]
+
+
+
+
+

Prediction

+

policy serves get_post_fmean and get_post_fcov methods for calculating mean value and variance of Gaussian process (post distribution).

+
+
[14]:
+
+
+
mean = policy.get_post_fmean(X)
+var = policy.get_post_fcov(X)
+std = np.sqrt(var)
+xs = X[:,0]
+
+ax = plt.subplot()
+ax.plot(xs, mean)
+ax.fill_between(xs, mean-std, mean+std, color="blue", alpha=.1)
+
+
+
+
+
[14]:
+
+
+
+
+<matplotlib.collections.PolyCollection at 0x7f81613d8370>
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_25_1.png +
+
+
+
+

Acquisition function

+

policy serves get_score method for calculating acquisition function.

+
+
[15]:
+
+
+
scores = policy.get_score(mode="EI", xs=X)
+plt.plot(scores)
+
+
+
+
+
[15]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f8130b84070>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_27_1.png +
+
+
+
+

Parallelization

+

PHYSBO can calculate acquisition functions for candidates in parallel by using MPI via mpi4py . To enable MPI parallelization, pass a MPI communicator such as MPI.COMM_WORLD to a keyword argument, comm of the constructor of the policy.

+
+
[16]:
+
+
+
# from mpi4py import MPI
+# policy = physbo.search.discrete.policy(test_X=X, comm=MPI.COMM_WORLD)
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_basic.ipynb b/manual/v2.0.2/en/notebook/tutorial_basic.ipynb new file mode 100644 index 00000000..817c2a53 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_basic.ipynb @@ -0,0 +1,590 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic usage of PHYSBO\n", + "\n", + "## Introduction\n", + "\n", + "In this tutorial, we will introduce how to define the simulator class and find the minimum value of a one-dimensional function using PHYSBO.\n", + "\n", + "First, we will import PHYSBO." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.091028Z", + "start_time": "2021-03-05T04:50:29.600019Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the search space\n", + "\n", + "In the following example, the search space ``X`` is defined as a grid chopped by ``window_num=10001`` divisions from ``x_min = -2.0`` to ``x_max = 2.0``.\n", + "Note that ``X`` must be in ``window_num`` x ``d`` ndarray format (``d`` is the number of dimensions, in this case one). In this case, ``d`` is the number of dimensions, in this case two, so we use reshape to transform it." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.097211Z", + "start_time": "2021-03-05T04:50:30.092637Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the simulator class\n", + "\n", + "Here, we define the simulator class to set as the objective function.\n", + "\n", + "In this case, the problem is to find the minimum $x$ such that $f(x) = 3 x^4 + 4 x ^3 + 1.0$ (the answer is $x=-1.0$).\n", + "\n", + "In the simulator class, we define the ``__call__`` function (or ``__init__`` if there are initial variables, etc.).\n", + "(If there are initial variables, define ``__init__``.) The action indicates the index number of the grid to be retrieved from the search space, and is generally in the form of an ndarray so that multiple candidates can be calculated at once.\n", + "In this case, we choose one candidate point from ``X`` as ``action_idx=action[0]`` to calculate only one candidate at a time.\n", + "Since **PHYSBO is designed to find the maximum value of the objective function**, it returns the value of f(x) at the candidate point multiplied by -1." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.104491Z", + "start_time": "2021-03-05T04:50:30.099622Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action ):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting policy\n", + "\n", + "First, set the optimization `policy`. \n", + "\n", + "Next, set `test_X` to the matrix of search candidates (`numpy.array`)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.117205Z", + "start_time": "2021-03-05T04:50:30.108470Z" + } + }, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `policy` is set, no optimization is done yet.\n", + "Execute the following methods on `policy` to optimize it.\n", + "\n", + "- `random_search`. \n", + "- `bayes_search`.\n", + "\n", + "If you specify the `simulator` and the number of search steps in these methods, the following loop will be executed for the number of search steps.\n", + "\n", + "i) Select the next parameter to be executed from the candidate parameters.\n", + "\n", + "ii) Execute `simulator` with the selected parameters.\n", + "\n", + "The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step.\n", + "See the section \"Searching for multiple candidates at once\" for details. \n", + "\n", + "Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYSBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the \"Running Interactively\" section of the tutorial.\n", + "\n", + "### Random Search\n", + "\n", + "First of all, let's perform a random search.\n", + "\n", + "Since Bayesian optimization requires at least two objective function values to be obtained (the initial number of data required depends on the problem to be optimized and the dimension d of the parameters), we will first perform a random search. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:30.149378Z", + "start_time": "2021-03-05T04:50:30.120660Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "\n", + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When executed, the objective function value and its action ID for each step, and the best value up to now and its action ID will be printed as follows.\n", + "\n", + "````\n", + "0020-th step: f(x) = -19.075990 (action=8288)\n", + " current best f(x) = -0.150313 (best action=2949) \n", + "````\n", + "\n", + "\n", + "### Bayesian Optimization\n", + "\n", + "Next, we run the Bayesian optimization as follows.\n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). \n", + "- `score`: The type of acquisition function. You can specify one of the following\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "The hyperparameters are trained at the specified interval. \n", + "If a negative value is specified, no hyperparameter will be learned. \n", + "0 means that hyperparameter learning will be performed only in the first step. \n", + "- `num_rand_basis`: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.482575Z", + "start_time": "2021-03-05T04:50:30.151250Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS', \n", + " interval=0, num_rand_basis=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking the results\n", + "\n", + "The search result ``res`` is returned as an object of the ``history`` class (`physbo.search.discrete.results.history`). \n", + "The following is a reference to the search results.\n", + "\n", + "- `res.fx` : The history of evaluated values of simulator (objective function).\n", + "- `res.chosen_actions`: The history of action IDs (parameters) when the simulator was evaluated. \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.\n", + "- `res.total_num_search`: Total number of simulator evaluations.\n", + "\n", + "Let's plot the objective function value and the best value at each step. \n", + "`res.fx` and `best_fx` should range up to `res.total_num_search`, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.747272Z", + "start_time": "2021-03-05T04:50:32.484125Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:32.897286Z", + "start_time": "2021-03-05T04:50:32.754938Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.056830Z", + "start_time": "2021-03-05T04:50:32.899063Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Serializing the results\n", + "\n", + "The search results can be saved to an external file using the `save` method." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.064021Z", + "start_time": "2021-03-05T04:50:33.058426Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.067954Z", + "start_time": "2021-03-05T04:50:33.065107Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the saved result file as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.080105Z", + "start_time": "2021-03-05T04:50:33.073810Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the candidate with the best score can be displayed as follows. You can see that we have arrived at the correct solution $x=-1$." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.112487Z", + "start_time": "2021-03-05T04:50:33.081409Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.002]\n" + ] + } + ], + "source": [ + "print(X[int(best_action[-1])])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prediction\n", + "\n", + "`policy` serves `get_post_fmean` and `get_post_fcov` methods for calculating mean value and variance of Gaussian process (post distribution). " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:33.700354Z", + "start_time": "2021-03-05T04:50:33.118203Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean = policy.get_post_fmean(X)\n", + "var = policy.get_post_fcov(X)\n", + "std = np.sqrt(var)\n", + "xs = X[:,0]\n", + "\n", + "ax = plt.subplot()\n", + "ax.plot(xs, mean)\n", + "ax.fill_between(xs, mean-std, mean+std, color=\"blue\", alpha=.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acquisition function\n", + "\n", + "`policy` serves `get_score` method for calculating acquisition function." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:34.220216Z", + "start_time": "2021-03-05T04:50:33.701874Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "scores = policy.get_score(mode=\"EI\", xs=X)\n", + "plt.plot(scores)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parallelization\n", + "\n", + "PHYSBO can calculate acquisition functions for candidates in parallel by using MPI via `mpi4py` .\n", + "To enable MPI parallelization, pass a MPI communicator such as `MPI.COMM_WORLD` to a keyword argument, `comm` of the constructor of the `policy`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:50:34.224416Z", + "start_time": "2021-03-05T04:50:34.222375Z" + } + }, + "outputs": [], + "source": [ + "# from mpi4py import MPI\n", + "# policy = physbo.search.discrete.policy(test_X=X, comm=MPI.COMM_WORLD)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_basic_org.html b/manual/v2.0.2/en/notebook/tutorial_basic_org.html new file mode 100644 index 00000000..440666b6 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_basic_org.html @@ -0,0 +1,524 @@ + + + + + + + + + Basic usage of PHYSBO — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Basic usage of PHYSBO

+
+

Introduction

+

In this tutorial, the problem of finding a stable interface structure for Cu is solved as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references

+
    +
    1. +
    2. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).

    3. +
    +
  • +
+
+

Let’s try each step using the sample data.

+

First, we will import PHYSBO.

+
+
[1]:
+
+
+
import physbo
+
+
+
+
+
+

Preparation of search candidate data

+

First, load the data.

+
+
[2]:
+
+
+
import numpy as np
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+
+
+
+
[3]:
+
+
+
X, t = load_data()
+
+
+
+

In the following, N is defined as the number of search candidates and d is defined as the dimensionality of the input parameters.

+
+
X is an N x d matrix, where each row represents a parameter set (a d-dimensional vector) for each candidate.
+
t is a vector of N dimensions, corresponding to the negative energy of each candidate (the value of the objective function to be optimized). Normally, when we perform Bayesian optimization, we start with only X given and t does not exist. Therefore, in actual use, the value of t can only be obtained by receiving a candidate Bayesian optimization proposal and evaluating it with a simulator. Since this is a tutorial, we will skip the calculations and give t in advance.
+
+

PHYSBO assumes that the direction of optimization is “maximization”.

+

Therefore, the original problem setting is “energy minimization”, but when optimizing with PHYSBO, the objective function value is multiplied by a negative value and treated as a “negative energy maximization” problem.

+
+
[4]:
+
+
+
X
+
+
+
+
+
[4]:
+
+
+
+
+array([[0. , 1. , 0. ],
+       [0. , 1. , 0.1],
+       [0. , 1. , 0.2],
+       ...,
+       [8. , 1.5, 3.4],
+       [8. , 1.5, 3.5],
+       [8. , 1.5, 3.6]])
+
+
+
+
[5]:
+
+
+
t
+
+
+
+
+
[5]:
+
+
+
+
+array([-1.01301176, -1.01487066, -1.02044168, ..., -1.11680203,
+       -2.48876352, -2.4971452 ])
+
+
+

To scale the search parameters, standardize each column of X so that the mean is 0 and the variance is 1, respectively.

+
+
[6]:
+
+
+
X = physbo.misc.centering( X )
+
+
+
+
+
[7]:
+
+
+
X
+
+
+
+
+
[7]:
+
+
+
+
+array([[-1.71079785, -1.46385011, -1.68585446],
+       [-1.71079785, -1.46385011, -1.59219588],
+       [-1.71079785, -1.46385011, -1.4985373 ],
+       ...,
+       [ 1.71079785,  1.46385011,  1.4985373 ],
+       [ 1.71079785,  1.46385011,  1.59219588],
+       [ 1.71079785,  1.46385011,  1.68585446]])
+
+
+
+
+

Definition of simulator

+
+
Define the simulator class called in PHYSBO.
+
The return value of the __call__ method is the value of the objective function when action is given.
+
action is the ID of the search candidate (0, 1, …, N-1). , N-1).
+
+
+
In this tutorial, we have defined a simulator that only returns the already computed value of t when action is given.
+
Please customize the simulator class if you want to apply it to other problems.
+
+
+
[8]:
+
+
+
class simulator:
+    def __init__( self ):
+        _, self.t = load_data()
+
+    def __call__( self, action ):
+        return self.t[action]
+
+
+
+
+
+

Performing optimization

+
+

Setting policy

+

First, set the optimization policy.

+

Next, set test_X to the matrix of search candidates (numpy.array).

+
+
[9]:
+
+
+
# set policy
+policy = physbo.search.discrete.policy(test_X=X)
+
+# set seed
+policy.set_seed(0)
+
+
+
+

When policy is set, no optimization is done yet. Execute the following methods on policy to optimize it.

+
    +
  • random_search.

  • +
  • bayes_search.

  • +
+

If you specify the simulator and the number of search steps in these methods, the following loop will be executed for the number of search steps.

+
    +
  1. Select the next parameter to be executed from the candidate parameters.

  2. +
  3. Execute simulator with the selected parameters.

  4. +
+

The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step. See the section “Searching for multiple candidates at once” for details.

+

Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the “Running Interactively” section of the tutorial.

+
+ +
+

Bayesian Optimization

+

Next, we run the Bayesian optimization as follows.

+

argument.

+
    +
  • max_num_probes: Number of search steps.

  • +
  • simulator: The simulator of the objective function (an object of class simulator).

  • +
  • score: The type of acquisition function. You can specify one of the following

    +
      +
    • TS (Thompson Sampling)

    • +
    • EI (Expected Improvement)

    • +
    • PI (Probability of Improvement)

    • +
    +
  • +
  • interval: +The hyperparameters are trained at the specified interval. +If a negative value is specified, no hyperparameter will be learned. +0 means that hyperparameter learning will be performed only in the first step.

  • +
  • num_rand_basis: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used.

  • +
+
+
[11]:
+
+
+
res = policy.bayes_search(max_num_probes=80, simulator=simulator(), score='TS',
+                                                  interval=20, num_rand_basis=5000)
+
+
+
+
+
+
+

Checking the results

+
+
The search result res is returned as an object of the history class (physbo.search.discrete.results.history).
+
The following is a reference to the search results.
+
+
    +
  • res.fx : The history of evaluated values of simulator (objective function).

  • +
  • res.chosen_actions: The history of action IDs (parameters) when the simulator was evaluated.

  • +
  • fbest, best_action= res.export_all_sequence_best_fx(): The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.

  • +
  • res.total_num_search: Total number of simulator evaluations.

  • +
+
+
Let’s plot the objective function value and the best value at each step.
+
res.fx and best_fx should range up to res.total_num_search, respectively.
+
+
+
[12]:
+
+
+
import matplotlib.pyplot as plt
+%matplotlib inline
+
+
+
+
+
[13]:
+
+
+
plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[13]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7fe0d9310580>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_org_22_1.png +
+
+
+
[14]:
+
+
+
best_fx, best_action = res.export_all_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[14]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7fe0d93eaaf0>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_org_23_1.png +
+
+
+
+

Serializing the results

+

The search results can be saved to an external file using the save method.

+
+
[15]:
+
+
+
res.save('search_result.npz')
+
+
+
+
+
[16]:
+
+
+
del res
+
+
+
+

Load the saved result file as follows:

+
+
[17]:
+
+
+
res = physbo.search.discrete.results.history()
+res.load('search_result.npz')
+
+
+
+
+
[ ]:
+
+
+

+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_basic_org.ipynb b/manual/v2.0.2/en/notebook/tutorial_basic_org.ipynb new file mode 100644 index 00000000..26238c42 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_basic_org.ipynb @@ -0,0 +1,565 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic usage of PHYSBO\n", + "\n", + "## Introduction\n", + "\n", + "In this tutorial, the problem of finding a stable interface structure for Cu is solved as an example. The values that have already been evaluated are used, although the evaluation of the objective function, i.e., the structural relaxation calculation, actually takes on the order of several hours per calculation. For more information on the problem setup, please refer to the following references\n", + "\n", + "- S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "---\n", + "\n", + "Let's try each step using the sample data.\n", + "\n", + "First, we will import PHYSBO." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:05.943971Z", + "start_time": "2020-12-04T06:02:05.507138Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparation of search candidate data\n", + "\n", + "First, load the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:05.950047Z", + "start_time": "2020-12-04T06:02:05.945622Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.105894Z", + "start_time": "2020-12-04T06:02:05.961463Z" + } + }, + "outputs": [], + "source": [ + "X, t = load_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following, N is defined as the number of search candidates and d is defined as the dimensionality of the input parameters.\n", + "\n", + "X is an N x d matrix, where each row represents a parameter set (a d-dimensional vector) for each candidate. \n", + "t is a vector of N dimensions, corresponding to the negative energy of each candidate (the value of the objective function to be optimized).\n", + "Normally, when we perform Bayesian optimization, we start with only X given and t does not exist. Therefore, in actual use, the value of t can only be obtained by receiving a candidate Bayesian optimization proposal and evaluating it with a simulator. Since this is a tutorial, we will skip the calculations and give t in advance.\n", + "\n", + "**PHYSBO assumes that the direction of optimization is \"maximization\".** \n", + "\n", + "Therefore, the original problem setting is \"energy minimization\", but when optimizing with PHYSBO, the objective function value is multiplied by a negative value and treated as a \"negative energy maximization\" problem." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.115603Z", + "start_time": "2020-12-04T06:02:06.107365Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0. , 1. , 0. ],\n", + " [0. , 1. , 0.1],\n", + " [0. , 1. , 0.2],\n", + " ...,\n", + " [8. , 1.5, 3.4],\n", + " [8. , 1.5, 3.5],\n", + " [8. , 1.5, 3.6]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.120704Z", + "start_time": "2020-12-04T06:02:06.116918Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01301176, -1.01487066, -1.02044168, ..., -1.11680203,\n", + " -2.48876352, -2.4971452 ])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To scale the search parameters, standardize each column of X so that the mean is 0 and the variance is 1, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.127129Z", + "start_time": "2020-12-04T06:02:06.121967Z" + } + }, + "outputs": [], + "source": [ + "X = physbo.misc.centering( X )" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.132603Z", + "start_time": "2020-12-04T06:02:06.129255Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1.71079785, -1.46385011, -1.68585446],\n", + " [-1.71079785, -1.46385011, -1.59219588],\n", + " [-1.71079785, -1.46385011, -1.4985373 ],\n", + " ...,\n", + " [ 1.71079785, 1.46385011, 1.4985373 ],\n", + " [ 1.71079785, 1.46385011, 1.59219588],\n", + " [ 1.71079785, 1.46385011, 1.68585446]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator\n", + "\n", + "Define the simulator class called in PHYSBO. \n", + "The return value of the `__call__` method is the value of the objective function when action is given. \n", + "action is the ID of the search candidate (0, 1, ..., N-1). , N-1).\n", + "\n", + "In this tutorial, we have defined a simulator that only returns the already computed value of t when action is given. \n", + "Please customize the simulator class if you want to apply it to other problems." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.136850Z", + "start_time": "2020-12-04T06:02:06.134076Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setting policy\n", + "\n", + "First, set the optimization `policy`. \n", + "\n", + "Next, set `test_X` to the matrix of search candidates (`numpy.array`)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.149593Z", + "start_time": "2020-12-04T06:02:06.143075Z" + } + }, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `policy` is set, no optimization is done yet.\n", + "Execute the following methods on `policy` to optimize it.\n", + "\n", + "- `random_search`. \n", + "- `bayes_search`.\n", + "\n", + "If you specify the `simulator` and the number of search steps in these methods, the following loop will be executed for the number of search steps.\n", + "\n", + "i) Select the next parameter to be executed from the candidate parameters.\n", + "\n", + "ii) Execute `simulator` with the selected parameters.\n", + "\n", + "The default number of parameter returned by i) is one, but it is possible to return multiple parameters in one step.\n", + "See the section \"Searching for multiple candidates at once\" for details. \n", + "\n", + "Also, instead of running the above loop inside PHYSBO, it is possible to control i) and ii) separately from the outside. In other words, it is possible to propose the next parameter to be executed from PHYSBO, evaluate its objective function value in some way outside PHYBO (e.g., by experiment rather than numerical calculation), propose it in some way outside PHYSBO, and register the evaluated value in PHYSBO. For more details, please refer to the \"Running Interactively\" section of the tutorial.\n", + "\n", + "### Random Search\n", + "\n", + "First of all, let's perform a random search.\n", + "\n", + "Since Bayesian optimization requires at least two objective function values to be obtained (the initial number of data required depends on the problem to be optimized and the dimension d of the parameters), we will first perform a random search. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:02:06.380266Z", + "start_time": "2020-12-04T06:02:06.154735Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When executed, the objective function value and its action ID for each step, and the best value up to now and its action ID will be printed as follows.\n", + "\n", + "````\n", + "0020-th step: f(x) = -1.048733 (action=1022)\n", + " current best f(x) = -0.963795 (best action=5734) \n", + "````\n", + "\n", + "\n", + "### Bayesian Optimization\n", + "\n", + "Next, we run the Bayesian optimization as follows.\n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `simulator`: The simulator of the objective function (an object of class simulator). \n", + "- `score`: The type of acquisition function. You can specify one of the following\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "The hyperparameters are trained at the specified interval. \n", + "If a negative value is specified, no hyperparameter will be learned. \n", + "0 means that hyperparameter learning will be performed only in the first step. \n", + "- `num_rand_basis`: Number of basis functions. 0 means that a normal Gaussian process without Bayesian linear model will be used. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.374318Z", + "start_time": "2020-12-04T06:02:06.382690Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=80, simulator=simulator(), score='TS', \n", + " interval=20, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking the results\n", + "\n", + "The search result ``res`` is returned as an object of the ``history`` class (`physbo.search.discrete.results.history`). \n", + "The following is a reference to the search results.\n", + "\n", + "- `res.fx` : The history of evaluated values of simulator (objective function).\n", + "- `res.chosen_actions`: The history of action IDs (parameters) when the simulator was evaluated. \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: The history of best values and their action IDs (parameters) for all timings when the simulator was evaluated.\n", + "- `res.total_num_search`: Total number of simulator evaluations.\n", + "\n", + "Let's plot the objective function value and the best value at each step. \n", + "`res.fx` and `best_fx` should range up to `res.total_num_search`, respectively." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.620065Z", + "start_time": "2020-12-04T06:03:19.375626Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.774131Z", + "start_time": "2020-12-04T06:03:19.621947Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.873280Z", + "start_time": "2020-12-04T06:03:19.775506Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Serializing the results\n", + "\n", + "The search results can be saved to an external file using the `save` method." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.880149Z", + "start_time": "2020-12-04T06:03:19.874622Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.883409Z", + "start_time": "2020-12-04T06:03:19.881419Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the saved result file as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:03:19.892245Z", + "start_time": "2020-12-04T06:03:19.884981Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_interactive_mode.html b/manual/v2.0.2/en/notebook/tutorial_interactive_mode.html new file mode 100644 index 00000000..f4e6d1e6 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_interactive_mode.html @@ -0,0 +1,353 @@ + + + + + + + + + Running PHYSBO interactively — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Running PHYSBO interactively

+

You can run PHYSBO interactively in the following way:

+
    +
  1. Get the next parameter to run from PHYSBO

  2. +
  3. Get the evaluation values outside of PHYSBO

  4. +
  5. Register the evaluation values into PHYSBO

  6. +
+

For example, it is suitable for the following cases.

+
    +
  • You want to perform an experiment manually and give the evaluation values to PHYSBO.

  • +
  • You want to control the execution flexibly, such as running the simulator in a separate process.

  • +
+
+

Preparation of search candidate data

+

As the previous tutorials, save the dataset file s5-210.csv into the subdirectory data, and load dataset from this file as the following:

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

Definition of simulator

+
+
[2]:
+
+
+
class simulator:
+    def __init__( self ):
+        _, self.t = load_data()
+
+    def __call__( self, action ):
+        return self.t[action]
+
+
+
+
+
+

Executing optimization

+
+
[3]:
+
+
+
# Set policy
+policy = physbo.search.discrete.policy(test_X=X)
+
+# Set seed
+policy.set_seed( 0 )
+
+
+
+

In each search step, the following processes are performed.

+
    +
  1. Running random_search or bayes_search with max_num_probes=1, simulator=None to get action IDs (parameters).

  2. +
  3. Getting the evaluation value (array of actions) by t = simulator(actions).

  4. +
  5. Registering the evaluation value for the action ID (parameter) with policy.write(actions, t).

  6. +
  7. Showing the history with physbo.search.utility.show_search_results.

  8. +
+

In the following, we will perform two random sampling (1st, and 2nd steps) and two Bayesian optimization proposals (3rd, and 4th steps).

+
+
[ ]:
+
+
+
simulator = simulator()
+
+''' 1st step (random sampling) '''
+actions = policy.random_search(max_num_probes=1, simulator=None)
+t  = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 2nd step (random sampling) '''
+actions = policy.random_search(max_num_probes=1, simulator=None)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 3rd step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 4-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+
+
+
+
+

Suspend and restart

+

You can suspend and restart the optimization process by saving the following predictor, training, and history to an external file.

+
    +
  • predictor: Prediction model of the objective function

  • +
  • training: Data used to train the predictor (physbo.variable object)

  • +
  • history: History of optimization runs (physbo.search.discrete.results.history object)

  • +
+
+
[5]:
+
+
+
policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')
+
+
+
+
+
[ ]:
+
+
+
# delete policy
+del policy
+
+# load policy
+policy = physbo.search.discrete.policy(test_X=X)
+policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')
+
+''' 5-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+# It is also possible to specify predictor and training separately.
+''' 6-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1,
+                                            predictor=policy.predictor, training=policy.training,
+                                            simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+
+
+
+
[ ]:
+
+
+

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_interactive_mode.ipynb b/manual/v2.0.2/en/notebook/tutorial_interactive_mode.ipynb new file mode 100644 index 00000000..8c4031a2 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_interactive_mode.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Running PHYSBO interactively\n", + "\n", + "You can run PHYSBO interactively in the following way:\n", + "\n", + "1. Get the next parameter to run from PHYSBO\n", + "2. Get the evaluation values outside of PHYSBO\n", + "3. Register the evaluation values into PHYSBO\n", + "\n", + "For example, it is suitable for the following cases.\n", + "\n", + "- You want to perform an experiment manually and give the evaluation values to PHYSBO.\n", + "- You want to control the execution flexibly, such as running the simulator in a separate process.\n", + "\n", + "## Preparation of search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.663215Z", + "start_time": "2020-12-04T06:17:28.658656Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Executing optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [], + "source": [ + "# Set policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# Set seed\n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In each search step, the following processes are performed.\n", + "\n", + "1. Running random_search or bayes_search with `max_num_probes=1, simulator=None` to get action IDs (parameters). \n", + "2. Getting the evaluation value (array of actions) by `t = simulator(actions)`. \n", + "3. Registering the evaluation value for the action ID (parameter) with `policy.write(actions, t)`. \n", + "4. Showing the history with `physbo.search.utility.show_search_results`.\n", + "\n", + "In the following, we will perform two random sampling (1st, and 2nd steps) and two Bayesian optimization proposals (3rd, and 4th steps)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:47.726433Z", + "start_time": "2020-12-04T06:17:28.677429Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "simulator = simulator()\n", + "\n", + "''' 1st step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 2nd step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 3rd step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "''' 4-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Suspend and restart\n", + "\n", + "You can suspend and restart the optimization process by saving the following predictor, training, and history to an external file.\n", + "\n", + "- predictor: Prediction model of the objective function\n", + "- training: Data used to train the predictor (`physbo.variable` object)\n", + "- history: History of optimization runs (`physbo.search.discrete.results.history` object)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:48.722691Z", + "start_time": "2020-12-04T06:17:47.728006Z" + } + }, + "outputs": [], + "source": [ + "policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:18:05.746742Z", + "start_time": "2020-12-04T06:17:48.724101Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "# delete policy \n", + "del policy\n", + "\n", + "# load policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')\n", + "\n", + "''' 5-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "# It is also possible to specify predictor and training separately.\n", + "''' 6-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, \n", + " predictor=policy.predictor, training=policy.training,\n", + " simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_multi_objective.html b/manual/v2.0.2/en/notebook/tutorial_multi_objective.html new file mode 100644 index 00000000..13301ea4 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_multi_objective.html @@ -0,0 +1,798 @@ + + + + + + + + + Multi-objective optimization — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Multi-objective optimization

+
+
When there are multiple objective functions (\(p\)) to be optimized, multi-objective optimization is used.
+
Note that in this tutorial, “solution” means the pair of objective functions \(y = (y_1(x), y_2(x), \dots, y_p(x))\).
+
Define the solution size relation \(\prec\) as follows.
+
+

\(y \prec y^{'}\Longleftrightarrow \forall \ i \le p, y_i \le y^{'}_i \land \exists \ j \le p, y_j < y^{'}_j\)

+
+
A Pareto solution (in the maximization problem) is one in which no solution is larger than itself satisfying the above relations.
+
In other words, if you try to improve the value of any objective function, one of the other objective functions will deteriorate.
+
When there is a trade-off between objective functions, there are multiple Pareto solutions, and the numerical task is to find them efficiently.
+
+

PHYSBO implements a Bayesian optimization method to find Pareto solutions efficiently.

+
+
[1]:
+
+
+
import numpy as np
+import matplotlib.pyplot as plt
+import physbo
+%matplotlib inline
+
+
+
+
+

Test functions

+
+
In this tutorial, we will use VLMOP2, which is a benchmark function for multi-objective optimization.
+
The number of objective functions is two.
+
+
+\[\begin{split}\begin{split} + y_1(\vec{x}) &= 1 - \exp\left[-\sum_{i=1}^N\left( x_i - 1/\sqrt{N}\right)^2\right] \\ + y_2(\vec{x}) &= 1 - \exp\left[-\sum_{i=1}^N\left( x_i + 1/\sqrt{N}\right)^2\right], +\end{split}\end{split}\]
+

where \(y_1\) and \(y_2\) have minimums at \(x_1 = x_2 = \cdots x_N = 1/\sqrt{N}\) and \(x_1 = x_2 = \cdots x_N = -1/\sqrt{N}\), respectively, both of which are 0. Also, the upper bound is 1.

+

Since PHYSBO solves a maximization problem, the objective function is again multiplied by -1.

+
    +
  • Refernce

    +
      +
    • Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999.

    • +
    +
  • +
+
+
[2]:
+
+
+
def vlmop2_minus(x):
+    n = x.shape[1]
+    y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))
+    y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))
+
+    return np.c_[-y1, -y2]
+
+
+
+
+
+

Preparation of search candidate data

+

Let the input space \(\vec{x}\) be two-dimensional, and generate a grid of candidate points on [-2, 2] × [-2, 2].

+
+
[3]:
+
+
+
import itertools
+a = np.linspace(-2,2,101)
+test_X = np.array(list(itertools.product(a, a)))
+
+
+
+
+
[4]:
+
+
+
test_X
+
+
+
+
+
[4]:
+
+
+
+
+array([[-2.  , -2.  ],
+       [-2.  , -1.96],
+       [-2.  , -1.92],
+       ...,
+       [ 2.  ,  1.92],
+       [ 2.  ,  1.96],
+       [ 2.  ,  2.  ]])
+
+
+
+
[5]:
+
+
+
test_X.shape
+
+
+
+
+
[5]:
+
+
+
+
+(10201, 2)
+
+
+
+
+

Definition of simulator

+
+
[6]:
+
+
+
class simulator(object):
+    def __init__(self, X):
+        self.t = vlmop2_minus(X)
+
+    def __call__( self, action):
+        return self.t[action]
+
+
+
+
+
[7]:
+
+
+
simu = simulator(test_X)
+
+
+
+
+
+

Plotting the functions

+

Let’s plot each of the two objective functions. The first objective function has a peak in the upper right corner, and the second objective function has a trade-off with a peak in the lower left corner (The star is the position of the peak.).

+
+

First objective function

+
+
[8]:
+
+
+
plt.figure()
+plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin="lower", extent=[-2.0, 2.0, -2.0, 2.0])
+plt.title("objective 1")
+plt.colorbar()
+plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')
+plt.show()
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_12_0.png +
+
+
+
+

Second objective function

+
+
[9]:
+
+
+
# plot objective 2
+plt.figure()
+plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin="lower", extent=[-2.0, 2.0, -2.0, 2.0])
+plt.title("objective 2")
+plt.colorbar()
+plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')
+plt.show()
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_14_0.png +
+
+
+
+
+

Performing optimizations.

+
+
+

Setting policy

+
+
Use physbo.search.discrete_multi.policy for multi-objective optimization.
+
Specify the number of objective functions in num_objectives.
+
+
+
[10]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+
+
+

As with the usual usage of physbo.search.discrete.policy (with one objective function), optimization is done by calling the random_search or bayes_search methods. The basic API and usage are roughly the same as discrete.policy.

+ +
+

Checking results

+

#### History of evaluation values

+
+
[ ]:
+
+
+
res_random.fx[0:res_random.num_runs]
+
+
+
+
+

Obtaining the Pareto solution

+
+
[14]:
+
+
+
front, front_num = res_random.export_pareto_front()
+front, front_num
+
+
+
+
+
[14]:
+
+
+
+
+(array([[-0.95713719, -0.09067194],
+        [-0.92633083, -0.29208351],
+        [-0.63329589, -0.63329589],
+        [-0.52191048, -0.72845916],
+        [-0.26132949, -0.87913689],
+        [-0.17190645, -0.91382463]]),
+ array([40,  3, 19, 16, 29, 41]))
+
+
+
+
+

Plotting the solution (evaluated value)

+

Note again that the space to be plotted is \(y = (y_1, y_2)\) and not \(x = (x_1, x_2)\).

+

The red plot is the Pareto solution.

+
+
[15]:
+
+
+
def plot_pareto_front(res):
+    front, front_num = res.export_pareto_front()
+    dominated = [i for i in range(res.num_runs) if i not in front_num]
+    points = res.fx[dominated, :]
+
+    plt.figure(figsize=(7, 7))
+    plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = "blue")
+    plt.scatter(front[:, 0], front[:, 1], c = "red")
+    plt.title('Pareto front')
+    plt.xlabel('Objective 1')
+    plt.ylabel('Objective 2')
+    plt.xlim([-1.0,0.0])
+    plt.ylim([-1.0,0.0])
+
+
+
+
+
[16]:
+
+
+
plot_pareto_front(res_random)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_28_0.png +
+
+
+
+

Calculate the volume of the dominated region

+

A solution that is not a Pareto solution, i.e., a solution \(y\) for which there exists a solution \(y'\) that is better than itself, is called a inferior solution (\(\exists y' y\prec y'\)). The volume of the inferior solution region, which is the space occupied by inferior solutions in the solution space (a subspace of the solution space), is one of the indicators of the results of multi-objective optimization. The larger this value is, the more good Pareto solutions are +obtained.res_random.pareto.volume_in_dominance(ref_min, ref_max) calculates the volume of the inferior solution region in the hyper-rectangle specified by ref_min and ref_max.

+
+
[17]:
+
+
+
res_random.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[17]:
+
+
+
+
+0.2376881844865093
+
+
+
+
+
+
+

Bayesian optimization

+

For bayes_search in the multi-objective case, score can be selected from the following method

+
    +
  • HVPI (HyperVolume-based Probability of Improvement)

  • +
  • EHVI (Expected Hyper-Volume Improvement)

  • +
  • TS (Thompson Sampling)

  • +
+

The following 50 evaluations (10 random searches + 40 Bayesian optimizations) will be performed with different scores.

+
+

HVPI (HyperVolume-based Probability of Improvement)

+

The improvement probability of a non-dominated region in a multi-dimensional objective function space is obtained as a score.

+
    +
  • Reference

    +
      +
    • Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. “Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.” Journal of Global Optimization 60.3 (2014): 575-594.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)
+
+
+
+
+

Plotting the Pareto solution

+

We can see that more Pareto solutions are obtained compared to random sampling.

+
+
[19]:
+
+
+
plot_pareto_front(res_HVPI)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_35_0.png +
+
+
+
+

Volume of dominated region

+
+
[20]:
+
+
+
res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[20]:
+
+
+
+
+0.32877907991633726
+
+
+
+
+
+

EHVI (Expected Hyper-Volume Improvement)

+

The expected improvement of the non-dominated region in the multi-dimensional objective function space is obtained as score.

+
    +
  • Reference

    +
      +
    • Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. “Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.” Journal of Global Optimization 60.3 (2014): 575-594.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)
+
+
+
+
+

Plotting the Pareto solution

+
+
[22]:
+
+
+
plot_pareto_front(res_EHVI)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_41_0.png +
+
+
+
+

Volume of dominated region

+
+
[23]:
+
+
+
res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[23]:
+
+
+
+
+0.3200467412741881
+
+
+
+
+
+

TS (Thompson Sampling)

+

In Thompson Sampling for the single objective case, at each candidate (test_X), sampling is performed from the posterior distribution of the objective function, and the candidate with the largest value is recommended as the next search point. In the multi-objective case, one candidate is randomly selected as the next search point from among the candidates with the maximum value based on the Pareto rule for the sampled values, i.e., the Pareto-optimal candidates.

+
    +
  • Reference

    +
      +
    • Yahyaa, Saba Q., and Bernard Manderick. “Thompson sampling for multi-objective multi-armed bandits problem.” Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)
+
+
+
+
+

Plotting the Pareto solution

+
+
[25]:
+
+
+
plot_pareto_front(res_TS)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_47_0.png +
+
+
+
+

Volume of dominated region

+
+
[26]:
+
+
+
res_TS.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[26]:
+
+
+
+
+0.16415446221006114
+
+
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_multi_objective.ipynb b/manual/v2.0.2/en/notebook/tutorial_multi_objective.ipynb new file mode 100644 index 00000000..e26b0fe8 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_multi_objective.ipynb @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-objective optimization\n", + "\n", + "When there are multiple objective functions ($p$) to be optimized, multi-objective optimization is used. \n", + "Note that in this tutorial, \"solution\" means the pair of objective functions $y = (y_1(x), y_2(x), \\dots, y_p(x))$. \n", + "Define the solution size relation $\\prec$ as follows. \n", + "\n", + "$y \\prec y^{'}\\Longleftrightarrow \\forall \\ i \\le p, y_i \\le y^{'}_i \\land \\exists \\ j \\le p, y_j < y^{'}_j$ \n", + "\n", + "A **Pareto solution** (in the maximization problem) is one in which no solution is larger than itself satisfying the above relations. \n", + "In other words, if you try to improve the value of any objective function, one of the other objective functions will deteriorate. \n", + "When there is a trade-off between objective functions, there are multiple Pareto solutions, and the numerical task is to find them efficiently.\n", + "\n", + "PHYSBO implements a Bayesian optimization method to find Pareto solutions efficiently. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.657438Z", + "start_time": "2021-01-05T06:06:13.061216Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import physbo\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test functions\n", + "\n", + "In this tutorial, we will use VLMOP2, which is a benchmark function for multi-objective optimization. \n", + "The number of objective functions is two.\n", + "\n", + "$$\n", + "\\begin{split}\n", + " y_1(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i - 1/\\sqrt{N}\\right)^2\\right] \\\\\n", + " y_2(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i + 1/\\sqrt{N}\\right)^2\\right],\n", + "\\end{split}\n", + "$$\n", + "\n", + "where $y_1$ and $y_2$ have minimums at $x_1 = x_2 = \\cdots x_N = 1/\\sqrt{N}$ and $x_1 = x_2 = \\cdots x_N = -1/\\sqrt{N}$, respectively, both of which are 0. Also, the upper bound is 1.\n", + "\n", + "Since PHYSBO solves a maximization problem, the objective function is again multiplied by -1.\n", + "\n", + "- Refernce\n", + " - Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.662277Z", + "start_time": "2021-01-05T06:06:13.658957Z" + } + }, + "outputs": [], + "source": [ + "def vlmop2_minus(x):\n", + " n = x.shape[1]\n", + " y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))\n", + " y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))\n", + "\n", + " return np.c_[-y1, -y2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparation of search candidate data\n", + "\n", + "Let the input space $\\vec{x}$ be two-dimensional, and generate a grid of candidate points on [-2, 2] × [-2, 2]." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.676772Z", + "start_time": "2021-01-05T06:06:13.664110Z" + } + }, + "outputs": [], + "source": [ + "import itertools\n", + "a = np.linspace(-2,2,101)\n", + "test_X = np.array(list(itertools.product(a, a)))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.683329Z", + "start_time": "2021-01-05T06:06:13.678152Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-2. , -2. ],\n", + " [-2. , -1.96],\n", + " [-2. , -1.92],\n", + " ...,\n", + " [ 2. , 1.92],\n", + " [ 2. , 1.96],\n", + " [ 2. , 2. ]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.688238Z", + "start_time": "2021-01-05T06:06:13.684556Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(10201, 2)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.693027Z", + "start_time": "2021-01-05T06:06:13.690029Z" + } + }, + "outputs": [], + "source": [ + "class simulator(object):\n", + " def __init__(self, X):\n", + " self.t = vlmop2_minus(X)\n", + " \n", + " def __call__( self, action):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.699166Z", + "start_time": "2021-01-05T06:06:13.694489Z" + } + }, + "outputs": [], + "source": [ + "simu = simulator(test_X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting the functions\n", + "\n", + "Let's plot each of the two objective functions. The first objective function has a peak in the upper right corner, and the second objective function has a trade-off with a peak in the lower left corner (The star is the position of the peak.).\n", + "\n", + "### First objective function" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.958020Z", + "start_time": "2021-01-05T06:06:13.701129Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 1\")\n", + "plt.colorbar()\n", + "plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Second objective function" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.158089Z", + "start_time": "2021-01-05T06:06:13.960026Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot objective 2\n", + "plt.figure()\n", + "plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 2\")\n", + "plt.colorbar()\n", + "plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimizations.\n", + "\n", + "## Setting policy\n", + "\n", + "Use `physbo.search.discrete_multi.policy` for multi-objective optimization. \n", + "Specify the number of objective functions in `num_objectives`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.163097Z", + "start_time": "2021-01-05T06:06:14.159742Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As with the usual usage of `physbo.search.discrete.policy` (with one objective function), optimization is done by calling the `random_search` or `bayes_search` methods. The basic API and usage are roughly the same as `discrete.policy`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Random search" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.316770Z", + "start_time": "2021-01-05T06:06:14.164245Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The evaluation value of the objective function (the array) and the action ID at that time are displayed. \n", + "It also displays a message when the Pareto set is updated.\n", + "\n", + "If you want to display the contents of the Pareto set when it is updated, specify `disp_pareto_set=True`. \n", + "Pareto set is sorted in ascending order of the first objective function value. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.493398Z", + "start_time": "2021-01-05T06:06:14.318132Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu, disp_pareto_set=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Checking results\n", + "\n", + " #### History of evaluation values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.498984Z", + "start_time": "2021-01-05T06:06:14.494679Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res_random.fx[0:res_random.num_runs]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Obtaining the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.504080Z", + "start_time": "2021-01-05T06:06:14.500385Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[-0.95713719, -0.09067194],\n", + " [-0.92633083, -0.29208351],\n", + " [-0.63329589, -0.63329589],\n", + " [-0.52191048, -0.72845916],\n", + " [-0.26132949, -0.87913689],\n", + " [-0.17190645, -0.91382463]]),\n", + " array([40, 3, 19, 16, 29, 41]))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "front, front_num = res_random.export_pareto_front()\n", + "front, front_num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the solution (evaluated value)\n", + "\n", + "Note again that the space to be plotted is $y = (y_1, y_2)$ and not $x = (x_1, x_2)$.\n", + "\n", + "The red plot is the Pareto solution." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.511086Z", + "start_time": "2021-01-05T06:06:14.505221Z" + } + }, + "outputs": [], + "source": [ + "def plot_pareto_front(res):\n", + " front, front_num = res.export_pareto_front()\n", + " dominated = [i for i in range(res.num_runs) if i not in front_num]\n", + " points = res.fx[dominated, :]\n", + "\n", + " plt.figure(figsize=(7, 7))\n", + " plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = \"blue\")\n", + " plt.scatter(front[:, 0], front[:, 1], c = \"red\")\n", + " plt.title('Pareto front')\n", + " plt.xlabel('Objective 1')\n", + " plt.ylabel('Objective 2')\n", + " plt.xlim([-1.0,0.0])\n", + " plt.ylim([-1.0,0.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.661288Z", + "start_time": "2021-01-05T06:06:14.512392Z" + }, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_random)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Calculate the volume of the dominated region\n", + "\n", + "A solution that is not a Pareto solution, i.e., a solution $y$ for which there exists a solution $y'$ that is better than itself, is called a inferior solution ($\\exists y' y\\prec y'$). The volume of the inferior solution region, which is the space occupied by inferior solutions in the solution space (a subspace of the solution space), is one of the indicators of the results of multi-objective optimization. The larger this value is, the more good Pareto solutions are obtained.`res_random.pareto.volume_in_dominance(ref_min, ref_max)` calculates the volume of the inferior solution region in the hyper-rectangle specified by `ref_min` and `ref_max`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.666649Z", + "start_time": "2021-01-05T06:06:14.662809Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2376881844865093" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_random.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bayesian optimization\n", + "\n", + "For `bayes_search` in the multi-objective case, `score` can be selected from the following method\n", + "\n", + "- HVPI (HyperVolume-based Probability of Improvement)\n", + "- EHVI (Expected Hyper-Volume Improvement)\n", + "- TS (Thompson Sampling)\n", + "\n", + "The following 50 evaluations (10 random searches + 40 Bayesian optimizations) will be performed with different scores." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### HVPI (HyperVolume-based Probability of Improvement)\n", + "\n", + "The improvement probability of a non-dominated region in a multi-dimensional objective function space is obtained as a score. \n", + "\n", + "- Reference\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.019463Z", + "start_time": "2021-01-05T06:06:14.668034Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution\n", + "\n", + "We can see that more Pareto solutions are obtained compared to random sampling." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.190434Z", + "start_time": "2021-01-05T06:06:29.020967Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_HVPI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.196389Z", + "start_time": "2021-01-05T06:06:29.191710Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.32877907991633726" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### EHVI (Expected Hyper-Volume Improvement)\n", + "\n", + "The expected improvement of the non-dominated region in the multi-dimensional objective function space is obtained as score. \n", + "\n", + "- Reference\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.237335Z", + "start_time": "2021-01-05T06:06:29.201353Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.386473Z", + "start_time": "2021-01-05T06:08:41.239067Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAG5CAYAAAAOKnSzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAkAklEQVR4nO3df5Rtd13f/+fr5ibBIWB+QEP4MXP5EYEgiGQEESkuTChaIcGlIh0lWbVMaaqr66sUU8dv8ateQZDWtpTWEUoCORUxIIQfGvKjYNWg3Cu/mqQaoLmXQAjhlyZONZC8v3/sPcncm5k9Z+bO+THnPB9rzdpnf84++7xnrzvndfc+n/35pKqQJEnr2zPqAiRJGmcGpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUplSS05P8UZI7krx+1PVI48qglHZYkpuT/N8kdya5LcklSU4awPtckuRXj2EXi8CXgQdX1c/tUFn3ao/DOTu9X2nYDEppMF5QVScBTwPmgV/cyovTGPTf5xxwQ20w6kiSvQN+f2lXMCilAaqqzwN/AHx7klOSvC/J7Um+1j5+5Oq2ST6UZH+SPwFWgMckeUKSq5J8NclfJvmxdttFYAF4ZXvm+t62/Yntfr6e5PokL1yvriSXABesef05SX4pyeVJLkvyN8CFSR6e5Ir2/T+d5GVr9vFLSd6R5K3t5dvrk8y3z70NmAXe2+7/lTt/dKXhMCilAUryKOAHgY/R/L29heZMbhb4v8AbjnrJT9JcEn0QcDtwFfDfgX8A/DjwxiRnVdUy0ANeW1UnVdULkhwPvBf4YLv9zwC9JI8/uq6quvCo11/dPnUecDlwcvv824FbgIcDPwL8WpLnrtnVC9ttTgauWP19quongcO0Z9ZV9dotHThpjBiU0mC8O8nXgT8GPgz8WlV9pareWVUrVXUHsB94zlGvu6Sqrq+qbwLPB26uqrdU1Ter6mPAO4Ef3eA9vxs4CXhNVd1VVdcC7wNesoW6r6uqd1fVPcBDgGcBP19Vf1dVHwfeBLx0zfZ/XFUfqKq7gbcB37GF95J2Bb+DkAbj/DVnaQAkmQH+PU0AntI2PyjJcW3QAHxuzUvmgGe0gbtqL00grefhwOfakFt1CHjEFupe+/4PB77ahvra/c2vWf/imscrwAOS7G2DXpoIBqU0PD8HPB54RlV9MclTaS7JZs02azvWfA74cFWdu8H+ju6E8wXgUUn2rAnLWeCvtlDj2n1+ATg1yYPWhOUs8Plt7Evatbz0Kg3Pg2i+l/x6klOBV22y/fuAb0vyk0mOb3++K8kT2+dvAx6zZvs/ozmre2W77fcBL6D5DnHLqupzwJ8Cr07ygCRPAX4KuKzPXRxdn7QrGZTS8Pwm8C009y5+BPjDro3bs7jn0XTi+QLNZc5fB05sN3kzcFbbw/XdVXUXTTD+QPsebwReWlX/+xhqfgmwr33/3wdedfQl5Q6vBn6xre8Vx1CDNFJx4mZJkjbmGaUkSR1GGpRJnt/eRP3pJBev8/yJSX63ff7PkuwbQZmSpCk2sqBMchzwn2m+TzkLeEmSs47a7KeAr1XV42i61f/6cKuUJE27UZ5RPh34dFV9tu2E8HaaUUHWOg+4tH18OfD9SYIkSUMyyvsoH8GRNzffAjxjo22q6ptJ/ho4jaZH373acS8XAR74wAee/YQnPAGAgwfhbA52V7FnD8zNwamnbvsXkSSNt4MHD365qh66nddOxIAD7biXywDz8/N14MABABK4nH3s49DGL77nnuanfY0kafIk6QiCbqO89Pp54FFr1h/J/Uf8uHebdsqfbwW+spU3+QX2cw+bXK09fHgru5QkTZFRBuVHgTOTPDrJCTQ3VV9x1DZX0EwFBM3MBdduNHfeek46CX6HBd7Iy7vDcnZ2S4VLkqbHyIKyHTT5p4ErgRuBd1TV9Ul+ec0cem8GTkvyaeBngfvdQtLlv/7X5ivIn+GN/ARv43ZOu//gkzMzsH//sf0ykqSJNXEj86z9jhKg14OXvxzuvLNZfwk9fo0lZjnMymmznPQf9sPCwoiqlSQNQ5KDVTW/+Zb3N/Ej8ywswB13wGWXNZ1b354Fvm/uZn7nsns46cs3G5KSpE4T0eu1HwsLZqIkaesm/oxSkqRjYVBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAo1+r1YN8+2LOnWfZ6o65IkjRie0ddwNjo9WBxEVZWmvVDh5p1gIWF0dUlSRopzyhXLS3dF5KrVlaadknS1DIoVx0+vLV2SdJUMChXzc5urV2SNBUMylX798PMzJFtMzNNuyRpahmUqxYWYHkZ5uYgaZbLy3bkkaQpZ6/XtRYWDEZJ0hE8o5QkqYNBuVUOSiBJU8VLr1vhoASSNHU8o9wKByWQpKljUG6FgxJI0tQxKLfCQQkkaeoYlFvhoASSNHUMyq1wUAJJmjr2et0qByWQpKniGaUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQbnTej3Ytw/27GmWvd6oK5IkHQPno9xJvR4sLsLKSrN+6FCzDs5hKUm7lGeUO2lp6b6QXLWy0rRLknYlg3InHT68tXZJ0tgzKHfS7OzW2iVJY8+g3En798PMzJFtMzNNuyRpVzIod9LCAiwvw9wcJM1yedmOPJK0i9nrdactLBiMkjRBPKOUJKmDQSlJUoeRBGWSU5NcleSmdnnKOts8Ncl1Sa5P8skkLx5FrZKk6TaqM8qLgWuq6kzgmnb9aCvAS6vqScDzgd9McvLwSpQkaXRBeR5wafv4UuD8ozeoqr+qqpvax18AvgQ8dFgFSpIEowvK06vq1vbxF4HTuzZO8nTgBOAzGzy/mORAkgO33377zlYqSZpqA7s9JMnVwMPWeeqIgU+rqpJUx37OAN4GXFBV96y3TVUtA8sA8/PzG+5LkqStGlhQVtU5Gz2X5LYkZ1TVrW0QfmmD7R4MvB9YqqqPDKhUSZI2NKpLr1cAF7SPLwDec/QGSU4Afh94a1VdPsTaJEm616iC8jXAuUluAs5p10kyn+RN7TY/BvxD4MIkH29/njqSaiVJUytVk/WV3vz8fB04cGDUZUiSxkiSg1U1v53XOjKPJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoByVXg/27YM9e5plrzfqiiRJ6xjYyDzq0OvB4iKsrDTrhw416wALC6OrS5J0P55RjsLS0n0huWplpWmXJI0Vg3IUDh/eWrskaWQMylGYnd1auyRpZAzKUdi/H2ZmjmybmWnaJUljxaAchYUFWF6GuTlImuXysh15JGkM2et1VBYWDEZJ2gU8o5QkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQzKcdTrwb59sGdPs+z1Rl2RJE0tg/IYDCTPej1YXIRDh6CqWS4uGpaSNCIG5TYNLM+WlmBl5ci2lZWmXZI0dAblNg0szw4f3lq7JGmgDMptGliezc5urV2SNFAG5TYNLM/274eZmSPbZmaadknS0BmU2zSwPFtYgOVlmJuDpFkuLzftkqSh2zvqAnar1dxaWmout87ONiG5I3m2sGAwStKYMCiPgXkmSZPPS6+SJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUk6TXg337YM+eZtnrjboiSdr19o66AO2QXg8WF2FlpVk/dKhZB1hYGF1dkrTLeUY5KZaW7gvJVSsrTbskadsMyklx+PDW2iVJfTEoJ8Xs7NbaJUl9MSgnxf79MDNzZNvMTNMuSdo2g3JSLCzA8jLMzUHSLJeX7cgjScfIXq+TZGHBYJSkHeYZpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdRhKUSU5NclWSm9rlKR3bPjjJLUneMMwaJUmC0Z1RXgxcU1VnAte06xv5FeCPhlLVNOn1YN8+2LOnWfZ6o65IksbSqILyPODS9vGlwPnrbZTkbOB04IPDKWtK9HqwuAiHDkFVs1xcNCwlaR2jCsrTq+rW9vEXacLwCEn2AK8HXrHZzpIsJjmQ5MDtt9++s5VOoqUlWFk5sm1lpWmXJB1hYLOHJLkaeNg6Tx3xaVxVlaTW2e4i4ANVdUuSzveqqmVgGWB+fn69fWmtw4e31i5JU2xgQVlV52z0XJLbkpxRVbcmOQP40jqbPRN4dpKLgJOAE5LcWVVd32eqH7OzzeXW9dolSUcY1aXXK4AL2scXAO85eoOqWqiq2araR3P59a2G5A7Zvx9mZo5sm5lp2iVJRxhVUL4GODfJTcA57TpJ5pO8aUQ1TY+FBVhehrk5SJrl8rKTPkvSOlI1WV/pzc/P14EDB0ZdhiRpjCQ5WFXz23mtI/NIktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR12DAo23kgX53kbUn+yVHPvXHwpUmSNHpdZ5RvAQK8E/jxJO9McmL73HcPvDJJksZAV1A+tqourqp3V9ULgb8Ark1y2pBqkyRp5LpmDzkxyZ6qugegqvYn+TzwRzSzeUiSNPG6zijfCzx3bUNVXQL8HHDXAGvSuOn1YN8+2LOnWfZ6o65IkoZmwzPKqnrlBu1/CJw5sIo0Xno9WFyElZVm/dChZh2cbUTSVPD2EHVbWrovJFetrDTtkjQFDEp1O3x4a+2SNGEMSnWbnd1auyRNmE2DMslMkv83yW+362cm+aHBl6axsH8/zMwc2TYz07RL0hTo54zyLcDfA89s1z8P/OrAKtohdtTcIQsLsLwMc3OQNMvlZTvySJoaXfdRrnpsVb04yUsAqmolSQZc1zGxo+YOW1jwwEmaWv2cUd6V5FuAAkjyWJozzLFlR01J0k7p54zyl4A/BB6VpAc8C7hwgDUdMztqSpJ2yqZBWVUfTHKQZiD0AP+qqr488MqOwexsc7l1vXZJkrain16v7wWeB3yoqt437iEJdtSUJO2cfr6j/A3g2cANSS5P8iNJHjDguo6JHTUlSTtl06Csqg9X1UXAY4DfAn4M+NKgCztWCwtw881wzz3N0pDcYd5/I2lK9NOZh7bX6wuAFwNPAy4dZFEac95/I2mK9PMd5TuAG2mm3HoDzX2VPzPowjTGvP9G0hTp54zyzcBLquruQRejXcL7byRNkQ2DMslzq+pa4IHAeUcPxlNV7xpwbRpX3n8jaYp0nVE+B7iW5rvJoxVgUE6r/fuP/I4SvP9G0sTaMCir6lXtw1+uqv+z9rkkjx5oVRpvqx12lpaay62zs01I2pFH0gTq5zvKd9L0dF3rcuDsnS9Hu4YDpUuaEl3fUT4BeBLwrUl+eM1TDwbGesABSZJ2StcZ5eOBHwJO5sjvKe8AXjbAmiRJGhtd31G+B3hPkmdW1XVDrEmSpLHRz1ivL09y8upKklOS/LfBlSRJ0vjoJyifUlVfX12pqq8B3zmwiiRJGiP9BOWeJKesriQ5lT7HiJUkabfrJyhfD1yX5FeS/Arwp8BrB1uWJpozj0jaRTY9M6yqtyY5QDMoOsAPV9UNgy1LE8uZRyTtMv2cUQKcCvxtVb0BuN2RebRtzjwiaZfpZ5qtVwE/D/ybtul44LJBFqUJ5swjknaZfs4oXwS8EPhbgKr6AvCgQRalCbbRDCPOPCJpTPUTlHdVVdHMGEKSBw62JE20/fubmUbWcuYRSWOsn6B8R5LfAk5O8jLgauC3B1uWJtbCAiwvw9wcJM1yedmOPJLGVpqTxU02Ss4FngcEuLKqrhp0Yds1Pz9fBw4cGHUZkqQxkuRgVc1v57V9DRzQBuPYhqMkSYOy4aXXJH/cLu9I8jfr/PyfJBcNr1RJkoava/aQ722X6/ZwTXIazSg9bxxMaZIkjV5fl16TPA34Xpqer39cVR+rqq8k+b4B1iZJ0sj1M+DAvwUuBU4DHgJckuQXAarq1sGWJ0nSaPVzRrkAfEdV/R1AktcAHwd+dYB1SZI0Fvq5j/ILwAPWrJ8IfH4w5UiSNF42PKNM8p9ovpP8a+D6JFe16+cCfz6c8iRJGq2uS6+rd+0fBH5/TfuHBlaNJEljpuv2kEsBkjwAeFzb/OnV7yolSZoGXQMO7E3yWuAWml6vbwU+l+S1SY4fVoGSJI1SV2ee19FM2Pzoqjq7qp4GPBY4GfiNIdQmSdLIdQXlDwEvq6o7Vhuq6m+AfwH84KALkyRpHHQFZdU6U4tU1d20c1NKkjTpuoLyhiQvPboxyU8A/3twJUmSND66bg/5l8C7kvxTmltEAOaBbwFeNOjCJEkaB123h3weeEaS5wJPaps/UFXXDKUySZLGwKZjvVbVtcC1Q6hFkqSx089Yr9L46/Vg3z7Ys6dZ9nqjrkjShOhrPkpprPV6sLgIKyvN+qFDzTrAwsLo6pI0ETyj1O63tHRfSK5aWWnaJekYGZTa/Q4f3lq7JG3BSIIyyalJrkpyU7s8ZYPtZpN8MMmNSW5Ism/IpWo3mJ3dWrskbcGozigvBq6pqjOBa9r19bwVeF1VPRF4OvClIdWn3WT/fpiZObJtZqZpl6RjNKqgPI9mRhLa5flHb5DkLGBvVV0FUFV3VtXK0dtJLCzA8jLMzUHSLJeX7cgjaUdkneFcB/+myder6uT2cYCvra6v2eZ84J8BdwGPBq4GLm7Hmj16f4vAIsDs7OzZhw4dGmT5kqRdJsnBqprfzmsHdntIkquBh63z1BFdEauqkqyX1nuBZwPfCRwGfhe4EHjz0RtW1TKwDDA/P++A7ZKkHTOwoKyqczZ6LsltSc6oqluTnMH63z3eAny8qj7bvubdwHezTlBKkjQoo/qO8grggvbxBcB71tnmo8DJSR7arj8XuGEItUmSdK9RBeVrgHOT3ASc066TZD7Jm+DeeS9fAVyT5FNAgN8eUb2SpCk1ks48g3TiifP1jW8cYHa2uTvAjo+SpLHszDMqd93VLB3uU5K0EyZ6CDuH+5QkHauJDkpwuE9J0rGZ+KB0uE/1xfksJW1g4r6jXMvhPtUX57OU1MFer9K+fU04Hm1uDm6+edjVSBoAe72u8eQnw4EDo65Cu4rzWUrqMPHfUUqbcj5LSR0MSsn5LCV1MCgl57OU1GHivqOUtmVhwWCUtC7PKKV+eJ+lNLU8o5Q2432W0lTzjFLazNLSfSG5yoGEpalhUEqb8T5LaaoZlNJmvM9SmmoGpbQZ77OUpppBKW3G+yylqWavV6kf3mcpTS3PKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSmmc9Hqwbx/s2dMse71RVyRNPYPyGPiZph3V68HiIhw6BFXNcnHRf1jSiBmU2+Rnmnbc0hKsrBzZtrLStEsaGYNym/xM0447fHhr7ZKGwqDcJj/TtONmZ7fWLmkoDMpt8jNNO27/fpiZObJtZqZplzQyBuU2+ZmmHbewAMvLMDcHSbNcXm7aJY3M3lEXsFutfnYtLTWXW2dnm5D0M03HZGHBf0TSmDEoj4GfaZI0+bz0KklSB4NSkqQOBqUkSR0MSkmSOhiU0iRyIGJpx9jrVZo0qwMRr46xuDoQMdhNW9oGzyilSeNAxNKOMiilSeNAxNKOMiilSeNAxNKOMiilSeNAxNKOMiilSePg6tKOsterNIkciFjaMZ5RSpLUwaCUJKmDQSlJUgeDUpKkDgalpG6OG6spZ69XSRtz3FjJM0pJHRw3VjIoJXVw3FjJoJTUwXFjJYNSUgfHjZUMSkkdHDdWsterpE04bqymnGeUkiR1GElQJjk1yVVJbmqXp2yw3WuTXJ/kxiT/MUmGXaskabqN6ozyYuCaqjoTuKZdP0KS7wGeBTwF+Hbgu4DnDLNISZJGFZTnAZe2jy8Fzl9nmwIeAJwAnAgcD9w2jOIkSVo1qqA8vapubR9/ETj96A2q6jrgfwC3tj9XVtWN6+0syWKSA0kO3H777YOqWZI0hQbW6zXJ1cDD1nnqiLGvqqqS1DqvfxzwROCRbdNVSZ5dVf/z6G2rahlYBpifn7/fviRJ2q6BBWVVnbPRc0luS3JGVd2a5AzgS+ts9iLgI1V1Z/uaPwCeCdwvKCVJGpRRXXq9ArigfXwB8J51tjkMPCfJ3iTH03TkWffSqyRJgzKqoHwNcG6Sm4Bz2nWSzCd5U7vN5cBngE8BnwA+UVXvHUWxkqTpNZKgrKqvVNX3V9WZVXVOVX21bT9QVf+sfXx3Vf3zqnpiVZ1VVT87ilolDZkTRWvMOISdpPHhRNEaQw5hJ2l8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpC9XiWNFyeK1pjxjFKSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUNN2crUSb8D5KSdPL2UrUB88oJU0vZytRHwxKSdPL2UrUB4NS0vRythL1waCUNL2crUR9MCglTS9nK1Ef7PUqabo5W4k24RmlJEkdDEpJkjoYlJIkdTAoJWmYHDJv17EzjyQNi0Pm7UqeUUrSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kr1dJGiaHzNt1PKOUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJI0TRyUfcu8PUSSpoWDsm+LZ5SSNC0clH1bDEpJmhYOyr4tBqUkTQsHZd8Wg1KSpoWDsm+LQSlJ08JB2bfFXq+SNE0clH3LPKOUJKmDQSlJUgeDUpKkDgalJGn4dtFQenbmkSQN1y4bSs8zSknScO2yofQMSknScO2yofQMSkkagosugr17m/v89+5t1qfWLhtKz6CUpAG76CL4L/8F7r67Wb/77mZ9asNylw2lZ1BK0oAtL2+tfeLtsqH0UlWjrmFHnXjifH3jGweYnW3+czKmx13SFEk2fm7CPoLHVpKDVTW/nddO3BnlXXc1//BWexuP8a05kqbEccdtrV3jZeKCcq0x7m0saYqs3iLYb7vGy8QPODCmvY0lTZE3vrFZLi83HXmOO64JydV2jbeJ+44ymS84cO/63BzcfPPo6pEkjUiv11xWPHyY76i66xNVJ25nNxN9RjnGvY0lSYPU6/H3Fy5y4jebEYCOhxO2u6uJ+47yhBN2RW9jSdIAfeXlS/eG5LGauDPKJz8ZDhzYfDtJ0uQ65c6d66AycWeUkqTp1uvBYXZuODyDUpI0UZaW4BfYz051VTUoJUkT5fBh+B0W+CRn7UhYTlxQfupTu2LCbGns7aIJ6KUjrE5C8lSu54N8/zGH5UiCMsmPJrk+yT1JNhx7L8nzk/xlkk8nubiffTuEXf8m4YNwXH+Hca2rX6sT0B865N+Tdp+1k5M8n6vZQ3GQs7e/w6oa+g/wRODxwIeA+Q22OQ74DPAYmvtfPgGctfm+z67mT7v5mZsrreOyy6pmZuqIYzUz07TvFuP6O4xrXVsxN3dk/f49abe57LLm32uy+u/5IZ+tbWbWSEfmSfIh4BVVdb8bOpI8E/ilqvpH7fq/AaiqV3fv88iReRK4556drHoy7NvXnCUcbTeNZDSuv8O41rUVe/asP6uFf0/arY5l9pBxvo/yEcDn1qzfAjxjvQ2TLALt8MInAvcdi6pv3JV88lODKnL3Onud6xC3c+jQQ0kOHhx+Pdux3u/QhNSQf4eHAF++b3Vs6joGT3kyHH+/kUx2+O/pqOOmPnnctufx233hwIIyydXAw9Z5aqmq3rOT71VVy8By+74Hqg5s638N0645doc8dlvUHLft/U91mnnctsfjtj1Jtj0UzcCCsqrOOcZdfB541Jr1R7ZtkiQNzTjfHvJR4Mwkj05yAvDjwBUjrkmSNGVGdXvIi5LcAjwTeH+SK9v2hyf5AEBVfRP4aeBK4EbgHVV1fR+7Xx5Q2dPAY7c9Hrft8bhtj8dte7Z93CZuPkpJknbSOF96lSRp5AxKSZI67PqgHORweJMuyalJrkpyU7s8ZYPtXtse4xuT/MckGXat42QLx202yQfb43ZDkn1DLnWs9Hvc2m0fnOSWJG8YZo3jqJ/jluSpSa5r/04/meTFo6h1HGz2WZ/kxCS/2z7/Z/38Xe76oAT+F/DDwB9ttEGS44D/DPwAcBbwkiRnDae8sXYxcE1VnQlc064fIcn3AM8CngJ8O/BdwHOGWeQY2vS4td4KvK6qngg8HfjSkOobV/0eN4BfoeNvesr0c9xWgJdW1ZOA5wO/meTk4ZU4Hvr8rP8p4GtV9Tjg3wO/vtl+d31QVtWNVfWXm2z2dODTVfXZqroLeDtw3uCrG3vnAZe2jy8Fzl9nmwIeQDPe7onA8cBtwyhujG163No/zr1VdRVAVd1ZVStDq3A89fPvjSRnA6cDHxxOWWNv0+NWVX9VVTe1j79A85+yhw6rwDHSz2f92uN5OfD9m10l2/VB2af1hsN7xIhqGSenV9Wt7eMv0nw4HaGqrgP+B3Br+3NlVd04vBLH0qbHDfg24OtJ3pXkY0le1/5vd5ptetyS7AFeD7ximIWNuX7+vd0rydNp/mP7mUEXNob6+ay/d5v2NsS/Bk7r2uk4j/V6r2EOhzdpuo7d2pWqqiT3u1coyeNoZnt5ZNt0VZJnV9X/3PFix8ixHjeav61nA98JHAZ+F7gQePPOVjpeduC4XQR8oKpumaavwnfguK3u5wzgbcAFVeXw9TtkVwSlw+FtX9exS3JbkjOq6tb2D2y979BeBHykqu5sX/MHNANFTHRQ7sBxuwX4eFV9tn3Nu4HvZsKDcgeO2zOBZye5CDgJOCHJnVU10R3wduC4keTBwPtpTiA+MqBSx10/n/Wr29ySZC/wrcBXunY6LZdeHQ5vfVcAF7SPLwDWOzs/DDwnyd4kx9N05Jn2S6/9HLePAicnWf2e6LnADUOobZxtetyqaqGqZqtqH83l17dOekj2YdPj1n6u/T7N8bp8iLWNm34+69cezx8Brq3NRt7Z7kSW4/JDc8ZzC/D3NJ1MrmzbH05zCWd1ux8E/ormuv3SqOsehx+a6/LXADcBVwOntu3zwJvax8cBv0UTjjcA/27UdY/6p5/j1q6fC3wS+BRwCXDCqGvfDcdtzfYXAm8Ydd2j/unz7/QngG8AH1/z89RR1z6i43W/z3rgl4EXto8fAPwe8Gngz4HHbLZPh7CTJKnDtFx6lSRpWwxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUhijJI5O8p50J4jNJ/kN7vxdJLtxotowkf7rN9zt/7aDQSX45ybEO4NH3rD3SJDAopSFpB15+F/DuamaC+Daa0Wf2b/baqvqebb7t+TSzKKzu599W1dXb3Ndam87aI00Kg1IanucCf1dVbwGoqruB/wf4p0lm2m0eleRD7Rnnq1ZfmOTONY//dZKPtvMO/n9r2l/atn0iydvaKdJeCLwuyceTPDbJJUl+pJ2z7/fWvPb7kryvffy8dm7Dv0jye0lOOvoXqf5m7ZEmwq4Y61WaEE8CDq5tqKq/SXIYeFzb9HSaeT9XgI8meX9VHVjdPsnzgDPb7QJckeQf0oxV+YvA91TVl5OcWlVfTXIF8L5qhzVbM9D41cBykgdW1d8CLwbenuQh7X7Oqaq/TfLzwM/SjGwiTSWDUhovV1XVVwCSvAv4XuDAmuef1/58rF0/iSY4vwP4var6MkBVfbXrTarqm0n+EHhBksuBfwy8kmYs37OAP2lD9QTgup351aTdyaCUhucGmkGY79XO+DBLM+7k02gmyl7r6PUAr66q3zpqPz+zjXreDvw08FXgQFXd0X6PelVVvWQb+5Mmkt9RSsNzDTCT5KUA7UTOrwcuqaqVdptzk5ya5FtoOuL8yVH7uJLmO82T2n08Isk/AK4FfjTJaW37qe32dwAP2qCeD9OE88toQhPgI8Cz2nlISfLAJN92DL+ztOsZlNKQVDMDwYtoAu0mmhkO/g74hTWb/TnwTppZR9655vvJavfxQeC/A9cl+RRwOfCgqrqepvfsh5N8Avh37eveDvzrJB9L8tij6rkbeB/wA+2SqrqdZtaO30nySZrLrk84+ndJ8qIkt9DMH/n+JFdu+8BIY87ZQ6Qx154l/kVVzY26FmkaeUYpjbEkD6c5q/uNUdciTSvPKCVJ6uAZpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLU4f8Hn3nY7utYbFAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_EHVI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.402348Z", + "start_time": "2021-01-05T06:08:41.394521Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3200467412741881" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TS (Thompson Sampling)\n", + "\n", + "In Thompson Sampling for the single objective case, at each candidate (test_X), sampling is performed from the posterior distribution of the objective function, and the candidate with the largest value is recommended as the next search point. In the multi-objective case, one candidate is randomly selected as the next search point from among the candidates with the maximum value based on the Pareto rule for the sampled values, i.e., the Pareto-optimal candidates.\n", + "\n", + "- Reference\n", + " - Yahyaa, Saba Q., and Bernard Manderick. \"Thompson sampling for multi-objective multi-armed bandits problem.\" Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.534284Z", + "start_time": "2021-01-05T06:08:41.405209Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.716955Z", + "start_time": "2021-01-05T06:09:52.535519Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_TS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.722260Z", + "start_time": "2021-01-05T06:09:52.718300Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.16415446221006114" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_TS.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "code_folding": [] + }, + "source": [ + "## Appendix: Full search\n", + "\n", + "In `random_search`, you can easily do a full search by passing the number of all data (`N = test_X.shape[0]`) to `max_num_probes`. \n", + "Since it takes time to evaluate all data, reduce the number of data in advance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.049904Z", + "start_time": "2021-01-05T06:09:52.723545Z" + } + }, + "outputs": [], + "source": [ + "test_X_sparse = np.array(list(itertools.product(np.linspace(-2, 2, 21), repeat=2)))\n", + "simu_sparse = simulator(test_X_sparse)\n", + "\n", + "policy = physbo.search.discrete_multi.policy(test_X=test_X_sparse, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "N = test_X_sparse.shape[0]\n", + "res_all = policy.random_search(max_num_probes=N, simulator=simu_sparse)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Plotting the Pareto solution" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.212669Z", + "start_time": "2021-01-05T06:09:53.051682Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_all)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Volume of dominated region" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.218237Z", + "start_time": "2021-01-05T06:09:53.214184Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30051687493437484" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_all.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_multi_probe.html b/manual/v2.0.2/en/notebook/tutorial_multi_probe.html new file mode 100644 index 00000000..ef714865 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_multi_probe.html @@ -0,0 +1,373 @@ + + + + + + + + + Search multiple candidates at once — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Search multiple candidates at once

+

This is a tutorial for evaluating two or more candidates at once in a single search step.

+
+

Prepare the search candidate data

+

As the previous tutorials, save the dataset file s5-210.csv into the subdirectory data, and load dataset from this file as the following:

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+import matplotlib.pyplot as plt
+%matplotlib inline
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

Definition of simulator

+
+
If num_search_each_probe (described below) is set to 2 or more, action will be input as an array of action IDs.
+
Thus, define the simulator to return a list of evaluation values for each action ID.
+
+

The definitions in the basic tutorial and simulator are the same, but keep in mind that t is a numpy.array, and when action is an array, self.t[action] will also be an array.

+
+
[2]:
+
+
+
class simulator:
+    def __init__( self ):
+        _, self.t = load_data()
+
+    def __call__( self, action ):
+        return self.t[action]
+
+
+
+

Example of running the simulator

+
+
[3]:
+
+
+
sim = simulator()
+sim([1,12,123])
+
+
+
+
+
[3]:
+
+
+
+
+array([-1.01487066, -1.22884748, -1.05572838])
+
+
+
+
+

Performing optimizations

+
+
[4]:
+
+
+
# set policy
+policy = physbo.search.discrete.policy(test_X=X)
+
+# set seed
+policy.set_seed( 0 )
+
+
+
+

num_search_each_probe allows you to specify the number of candidates to evaluate in each search step.

+

In the following example, the simulator will be evaluated 2 × 10 = 20 times by random search and 8 × 10 = 80 times by Bayesian optimization.

+

argument.

+
    +
  • max_num_probes: Number of search steps.

  • +
  • num_search_each_probe: Number of candidates to evaluate at each search step.

  • +
+
+
[ ]:
+
+
+
res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())
+
+res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI',
+                                                  interval=2, num_rand_basis=100)
+
+
+
+
+
+

Checking results

+
+
[6]:
+
+
+
plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[6]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f9950ec84f0>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_11_1.png +
+
+
+
[7]:
+
+
+
best_fx, best_action = res.export_all_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[7]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f9920ef7460>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_12_1.png +
+
+

With res.export_sequence_best_fx(), you can get the best value obtained at each step and the history of the action.

+

The difference between res.export_all_sequence_best_fx() and res.export_all_sequence_best_fx() is that the information is not for each evaluation of the simulator, but for each search step. In this case, the total number of steps is 10, and the number of evaluations is 100.

+
+
[8]:
+
+
+
best_fx, best_action = res.export_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[8]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7f9930b43f10>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_14_1.png +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_multi_probe.ipynb b/manual/v2.0.2/en/notebook/tutorial_multi_probe.ipynb new file mode 100644 index 00000000..0f5e93e4 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_multi_probe.ipynb @@ -0,0 +1,316 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Search multiple candidates at once\n", + "\n", + "This is a tutorial for evaluating two or more candidates at once in a single search step.\n", + "\n", + "## Prepare the search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.096798Z", + "start_time": "2020-12-04T06:19:54.436605Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definition of simulator \n", + "\n", + "If `num_search_each_probe` (described below) is set to 2 or more, action will be input as an array of action IDs. \n", + "Thus, define the simulator to return a list of evaluation values for each action ID.\n", + "\n", + "The definitions in the basic tutorial and simulator are the same, but keep in mind that t is a ``numpy.array``, and when action is an array, `self.t[action]` will also be an array." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.100697Z", + "start_time": "2020-12-04T06:19:55.098103Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example of running the simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.218606Z", + "start_time": "2020-12-04T06:19:55.102879Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01487066, -1.22884748, -1.05572838])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim = simulator()\n", + "sim([1,12,123])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performing optimizations" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.224761Z", + "start_time": "2020-12-04T06:19:55.220423Z" + } + }, + "outputs": [], + "source": [ + "# set policy\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# set seed\n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`num_search_each_probe` allows you to specify the number of candidates to evaluate in each search step.\n", + "\n", + "In the following example, the simulator will be evaluated 2 × 10 = 20 times by random search and 8 × 10 = 80 times by Bayesian optimization. \n", + "\n", + "**argument**. \n", + "\n", + "- `max_num_probes`: Number of search steps. \n", + "- `num_search_each_probe`: Number of candidates to evaluate at each search step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.195375Z", + "start_time": "2020-12-04T06:19:55.226486Z" + } + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())\n", + "\n", + "res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI', \n", + " interval=2, num_rand_basis=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.312635Z", + "start_time": "2020-12-04T06:20:24.196633Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.415783Z", + "start_time": "2020-12-04T06:20:24.314259Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With `res.export_sequence_best_fx()`, you can get the best value obtained at each step and the history of the action. \n", + "\n", + "The difference between `res.export_all_sequence_best_fx()` and `res.export_all_sequence_best_fx()` is that the information is not for each evaluation of the simulator, but for each search step. In this case, the total number of steps is 10, and the number of evaluations is 100." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.535770Z", + "start_time": "2020-12-04T06:20:24.418352Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/notebook/tutorial_once_mode.html b/manual/v2.0.2/en/notebook/tutorial_once_mode.html new file mode 100644 index 00000000..56c55582 --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_once_mode.html @@ -0,0 +1,304 @@ + + + + + + + + + Restart calculations by reading existing calculation results — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Restart calculations by reading existing calculation results

+

You can read existing action IDs (parameters) and their evaluation values and run PHYSBO in the following flow.

+
    +
  1. Load an external file and read the existing action IDs (parameters) and their evaluation values.

  2. +
  3. Register the action ID (parameter) and evaluation value to PHYSBO.

  4. +
  5. Get the parameters for the next execution from PHYSBO.

  6. +
+

This can be used in cases where PHYSBO cannot be left open for a long time due to time constraints, and thus cannot be executed interactively.

+
+

Prepare the search candidate data

+

As the previous tutorials, save the dataset file s5-210.csv into the subdirectory data, and load dataset from this file as the following:

+
+
[2]:
+
+
+
import physbo
+
+import numpy as np
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

Preparing the precomputed data

+

In the load_data function above, all X and t are stored. Here, as precomputed, we get a random list of 20 actoin IDs and their evaluation values.

+
+
[4]:
+
+
+
import random
+random.seed(0)
+calculated_ids = random.sample(range(t.size), 20)
+print(calculated_ids)
+t_initial = t[calculated_ids]
+
+
+
+
+
+
+
+
+[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]
+
+
+
+
+

Register action ID (parameter) and evaluation value to PHYSBO.

+

Register calculated_ids and t[calculated_ids] as a list in the initial variable initial_data of policy.

+
+
[5]:
+
+
+
# set policy
+policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])
+
+# set seed
+policy.set_seed( 0 )
+
+
+
+
+
+

Get the next parameter to be executed from PHYSBO

+

Perform Bayesian optimization to obtain the next candidate point.

+
+
[6]:
+
+
+
actions = policy.bayes_search(max_num_probes=1, simulator=None, score="TS", interval=0,  num_rand_basis = 5000)
+print(actions, X[actions])
+
+
+
+
+
+
+
+
+Start the initial hyper parameter searching ...
+Done
+
+Start the hyper parameter learning ...
+0 -th epoch marginal likelihood -20.09302189053099
+50 -th epoch marginal likelihood -23.11964735598211
+100 -th epoch marginal likelihood -24.83020118385076
+150 -th epoch marginal likelihood -25.817906570042602
+200 -th epoch marginal likelihood -26.42342027124426
+250 -th epoch marginal likelihood -26.822598600211865
+300 -th epoch marginal likelihood -27.10872736571494
+350 -th epoch marginal likelihood -27.331572599126865
+400 -th epoch marginal likelihood -27.517235815448124
+450 -th epoch marginal likelihood -27.67892333553869
+500 -th epoch marginal likelihood -27.82299469827059
+Done
+
+[73] [[-1.6680279  -1.46385011  1.68585446]]
+
+
+

Perform external calculations on the obtained candidate points, and register the actions and their scores in a file. The process of reading the file again, running the Bayesian optimization, and obtaining the next candidate point is repeated to advance the Bayesian optimization.

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/notebook/tutorial_once_mode.ipynb b/manual/v2.0.2/en/notebook/tutorial_once_mode.ipynb new file mode 100644 index 00000000..6d56f8ae --- /dev/null +++ b/manual/v2.0.2/en/notebook/tutorial_once_mode.ipynb @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Restart calculations by reading existing calculation results\n", + "\n", + "You can read existing action IDs (parameters) and their evaluation values and run PHYSBO in the following flow. \n", + "\n", + "1. Load an external file and read the existing action IDs (parameters) and their evaluation values. \n", + "2. Register the action ID (parameter) and evaluation value to PHYSBO. \n", + "3. Get the parameters for the next execution from PHYSBO.\n", + "\n", + "This can be used in cases where PHYSBO cannot be left open for a long time due to time constraints, and thus cannot be executed interactively.\n", + "\n", + "## Prepare the search candidate data\n", + "\n", + "As the previous tutorials, save the dataset file [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) into the subdirectory `data`, and load dataset from this file as the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparing the precomputed data\n", + "\n", + "In the `load_data` function above, all X and t are stored. Here, as precomputed, we get a random list of 20 actoin IDs and their evaluation values." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]\n" + ] + } + ], + "source": [ + "import random\n", + "random.seed(0)\n", + "calculated_ids = random.sample(range(t.size), 20)\n", + "print(calculated_ids)\n", + "t_initial = t[calculated_ids]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Register action ID (parameter) and evaluation value to PHYSBO.\n", + "\n", + "Register `calculated_ids` and `t[calculated_ids]` as a list in the initial variable `initial_data` of policy." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# set policy \n", + "policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])\n", + "\n", + "# set seed \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get the next parameter to be executed from PHYSBO\n", + "\n", + "Perform Bayesian optimization to obtain the next candidate point." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood -20.09302189053099\n", + "50 -th epoch marginal likelihood -23.11964735598211\n", + "100 -th epoch marginal likelihood -24.83020118385076\n", + "150 -th epoch marginal likelihood -25.817906570042602\n", + "200 -th epoch marginal likelihood -26.42342027124426\n", + "250 -th epoch marginal likelihood -26.822598600211865\n", + "300 -th epoch marginal likelihood -27.10872736571494\n", + "350 -th epoch marginal likelihood -27.331572599126865\n", + "400 -th epoch marginal likelihood -27.517235815448124\n", + "450 -th epoch marginal likelihood -27.67892333553869\n", + "500 -th epoch marginal likelihood -27.82299469827059\n", + "Done\n", + "\n", + "[73] [[-1.6680279 -1.46385011 1.68585446]]\n" + ] + } + ], + "source": [ + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score=\"TS\", interval=0, num_rand_basis = 5000)\n", + "print(actions, X[actions])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Perform external calculations on the obtained candidate points, and register the actions and their scores in a file. The process of reading the file again, running the Bayesian optimization, and obtaining the next candidate point is repeated to advance the Bayesian optimization." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/en/objects.inv b/manual/v2.0.2/en/objects.inv new file mode 100644 index 00000000..1ce39afb Binary files /dev/null and b/manual/v2.0.2/en/objects.inv differ diff --git a/manual/v2.0.2/en/py-modindex.html b/manual/v2.0.2/en/py-modindex.html new file mode 100644 index 00000000..fab51aa4 --- /dev/null +++ b/manual/v2.0.2/en/py-modindex.html @@ -0,0 +1,422 @@ + + + + + + + + Python Module Index — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ physbo +
    + physbo.blm +
    + physbo.blm.basis +
    + physbo.blm.basis.fourier +
    + physbo.blm.core +
    + physbo.blm.core.model +
    + physbo.blm.inf +
    + physbo.blm.inf.exact +
    + physbo.blm.lik +
    + physbo.blm.lik.gauss +
    + physbo.blm.lik.linear +
    + physbo.blm.predictor +
    + physbo.blm.prior +
    + physbo.blm.prior.gauss +
    + physbo.gp +
    + physbo.gp.core +
    + physbo.gp.core.learning +
    + physbo.gp.core.model +
    + physbo.gp.core.prior +
    + physbo.gp.cov +
    + physbo.gp.cov.gauss +
    + physbo.gp.inf +
    + physbo.gp.inf.exact +
    + physbo.gp.lik +
    + physbo.gp.lik.gauss +
    + physbo.gp.mean +
    + physbo.gp.mean.const +
    + physbo.gp.mean.zero +
    + physbo.gp.predictor +
    + physbo.misc +
    + physbo.misc.centering +
    + physbo.misc.gauss_elim +
    + physbo.misc.set_config +
    + physbo.opt +
    + physbo.opt.adam +
    + physbo.predictor +
    + physbo.search +
    + physbo.search.discrete +
    + physbo.search.discrete.policy +
    + physbo.search.discrete.results +
    + physbo.search.discrete_multi +
    + physbo.search.discrete_multi.policy +
    + physbo.search.discrete_multi.results +
    + physbo.search.pareto +
    + physbo.search.score +
    + physbo.search.score_multi +
    + physbo.search.utility +
    + physbo.variable +
+ + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/search.html b/manual/v2.0.2/en/search.html new file mode 100644 index 00000000..a40200cd --- /dev/null +++ b/manual/v2.0.2/en/search.html @@ -0,0 +1,187 @@ + + + + + + + + Search — PHYSBO 2.0.2 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/manual/v2.0.2/en/searchindex.js b/manual/v2.0.2/en/searchindex.js new file mode 100644 index 00000000..3459a930 --- /dev/null +++ b/manual/v2.0.2/en/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"About PHYSBO": [[54, "about-physbo"]], "Accelerating Bayesian Optimization with PHYSBO": [[1, "accelerating-bayesian-optimization-with-physbo"]], "Acknowledgement": [[0, null]], "Acquisition function": [[57, "Acquisition-function"]], "Algorithm": [[1, null]], "Appendix: Full search": [[60, "Appendix:-Full-search"]], "Basic structures": [[53, "basic-structures"]], "Basic usage": [[53, null]], "Basic usage of PHYSBO": [[57, null], [58, null]], "Bayesian Optimization": [[57, "Bayesian-Optimization"], [58, "Bayesian-Optimization"]], "Bayesian optimization": [[1, "bayesian-optimization"], [60, "Bayesian-optimization"]], "Calculate the volume of the dominated region": [[60, "Calculate-the-volume-of-the-dominated-region"]], "Calculation flow": [[53, "calculation-flow"]], "Checking results": [[60, "Checking-results"], [61, "Checking-results"]], "Checking the results": [[57, "Checking-the-results"], [58, "Checking-the-results"]], "Citation": [[54, "citation"]], "Contact": [[51, null]], "Contents:": [[52, null], [55, null]], "Defining the search space": [[57, "Defining-the-search-space"]], "Defining the simulator class": [[57, "Defining-the-simulator-class"]], "Defining training data": [[56, "Defining-training-data"]], "Definition of simulator": [[58, "Definition-of-simulator"], [59, "Definition-of-simulator"], [60, "Definition-of-simulator"], [61, "Definition-of-simulator"]], "Download and Install": [[53, "download-and-install"]], "EHVI (Expected Hyper-Volume Improvement)": [[60, "EHVI-(Expected-Hyper-Volume-Improvement)"]], "Executing optimization": [[59, "Executing-optimization"]], "First objective function": [[60, "First-objective-function"]], "Gaussian process": [[56, null]], "Get the next parameter to be executed from PHYSBO": [[62, "Get-the-next-parameter-to-be-executed-from-PHYSBO"]], "HVPI (HyperVolume-based Probability of Improvement)": [[60, "HVPI-(HyperVolume-based-Probability-of-Improvement)"]], "Install": [[53, "install"]], "Introduction": [[54, null], [57, "Introduction"], [58, "Introduction"]], "Learning and Prediction of Gaussian Processes": [[56, "Learning-and-Prediction-of-Gaussian-Processes"]], "License": [[54, "license"]], "Main Developers": [[54, "main-developers"]], "Module contents": [[3, "module-physbo"], [4, "module-physbo.blm"], [5, "module-physbo.blm.basis"], [7, "module-physbo.blm.core"], [9, "module-physbo.blm.inf"], [11, "module-physbo.blm.lik"], [15, "module-physbo.blm.prior"], [17, "module-physbo.gp"], [18, "module-physbo.gp.core"], [22, "module-physbo.gp.cov"], [24, "module-physbo.gp.inf"], [26, "module-physbo.gp.lik"], [28, "module-physbo.gp.mean"], [32, "module-physbo.misc"], [36, "module-physbo.opt"], [39, "module-physbo.search"], [40, "module-physbo.search.discrete"], [43, "module-physbo.search.discrete_multi"]], "Multi-objective optimization": [[60, null]], "Obtaining the Pareto solution": [[60, "Obtaining-the-Pareto-solution"]], "Parallelization": [[57, "Parallelization"]], "Performing optimization": [[57, "Performing-optimization"], [58, "Performing-optimization"]], "Performing optimizations": [[61, "Performing-optimizations"]], "Performing optimizations.": [[60, "Performing-optimizations."]], "Plotting the Pareto solution": [[60, "Plotting-the-Pareto-solution"], [60, "id1"], [60, "id3"]], "Plotting the functions": [[60, "Plotting-the-functions"]], "Plotting the solution (evaluated value)": [[60, "Plotting-the-solution-(evaluated-value)"]], "Prediction": [[57, "Prediction"]], "Prediction by trained models": [[56, "Prediction-by-trained-models"]], "Preparation of search candidate data": [[56, "Preparation-of-search-candidate-data"], [58, "Preparation-of-search-candidate-data"], [59, "Preparation-of-search-candidate-data"], [60, "Preparation-of-search-candidate-data"]], "Prepare the search candidate data": [[61, "Prepare-the-search-candidate-data"], [62, "Prepare-the-search-candidate-data"]], "Preparing the precomputed data": [[62, "Preparing-the-precomputed-data"]], "Random Search": [[57, "Random-Search"], [58, "Random-Search"]], "Random search": [[60, "Random-search"]], "Register action ID (parameter) and evaluation value to PHYSBO.": [[62, "Register-action-ID-(parameter)-and-evaluation-value-to-PHYSBO."]], "Required Packages": [[53, "required-packages"]], "Restart calculations by reading existing calculation results": [[62, null]], "Running PHYSBO interactively": [[59, null]], "Search multiple candidates at once": [[61, null]], "Second objective function": [[60, "Second-objective-function"]], "Serializing the results": [[57, "Serializing-the-results"], [58, "Serializing-the-results"]], "Setting policy": [[57, "Setting-policy"], [58, "Setting-policy"], [60, "Setting-policy"]], "Submodules": [[3, "submodules"], [4, "submodules"], [5, "submodules"], [7, "submodules"], [9, "submodules"], [11, "submodules"], [15, "submodules"], [17, "submodules"], [18, "submodules"], [22, "submodules"], [24, "submodules"], [26, "submodules"], [28, "submodules"], [32, "submodules"], [36, "submodules"], [39, "submodules"], [40, "submodules"], [43, "submodules"]], "Subpackages": [[3, "subpackages"], [4, "subpackages"], [17, "subpackages"], [39, "subpackages"]], "Suspend and restart": [[59, "Suspend-and-restart"]], "TS (Thompson Sampling)": [[60, "TS-(Thompson-Sampling)"]], "Test functions": [[60, "Test-functions"]], "Tutorials": [[55, null]], "Uninstall": [[53, "uninstall"]], "Volume of dominated region": [[60, "Volume-of-dominated-region"], [60, "id2"], [60, "id4"]], "Welcome to PHYSBO\u2019s documentation!": [[52, null]], "physbo": [[2, null]], "physbo package": [[3, null]], "physbo.blm package": [[4, null]], "physbo.blm.basis package": [[5, null]], "physbo.blm.basis.fourier module": [[6, null]], "physbo.blm.core package": [[7, null]], "physbo.blm.core.model module": [[8, null]], "physbo.blm.inf package": [[9, null]], "physbo.blm.inf.exact module": [[10, null]], "physbo.blm.lik package": [[11, null]], "physbo.blm.lik.gauss module": [[12, null]], "physbo.blm.lik.linear module": [[13, null]], "physbo.blm.predictor module": [[14, null]], "physbo.blm.prior package": [[15, null]], "physbo.blm.prior.gauss module": [[16, null]], "physbo.gp package": [[17, null]], "physbo.gp.core package": [[18, null]], "physbo.gp.core.learning module": [[19, null]], "physbo.gp.core.model module": [[20, null]], "physbo.gp.core.prior module": [[21, null]], "physbo.gp.cov package": [[22, null]], "physbo.gp.cov.gauss module": [[23, null]], "physbo.gp.inf package": [[24, null]], "physbo.gp.inf.exact module": [[25, null]], "physbo.gp.lik package": [[26, null]], "physbo.gp.lik.gauss module": [[27, null]], "physbo.gp.mean package": [[28, null]], "physbo.gp.mean.const module": [[29, null]], "physbo.gp.mean.zero module": [[30, null]], "physbo.gp.predictor module": [[31, null]], "physbo.misc package": [[32, null]], "physbo.misc.centering module": [[33, null]], "physbo.misc.gauss_elim module": [[34, null]], "physbo.misc.set_config module": [[35, null]], "physbo.opt package": [[36, null]], "physbo.opt.adam module": [[37, null]], "physbo.predictor module": [[38, null]], "physbo.search package": [[39, null]], "physbo.search.discrete package": [[40, null]], "physbo.search.discrete.policy module": [[41, null]], "physbo.search.discrete.results module": [[42, null]], "physbo.search.discrete_multi package": [[43, null]], "physbo.search.discrete_multi.policy module": [[44, null]], "physbo.search.discrete_multi.results module": [[45, null]], "physbo.search.pareto module": [[46, null]], "physbo.search.score module": [[47, null]], "physbo.search.score_multi module": [[48, null]], "physbo.search.utility module": [[49, null]], "physbo.variable module": [[50, null]]}, "docnames": ["acknowledgement", "algorithm", "api/modules", "api/physbo", "api/physbo.blm", "api/physbo.blm.basis", "api/physbo.blm.basis.fourier", "api/physbo.blm.core", "api/physbo.blm.core.model", "api/physbo.blm.inf", "api/physbo.blm.inf.exact", "api/physbo.blm.lik", "api/physbo.blm.lik.gauss", "api/physbo.blm.lik.linear", "api/physbo.blm.predictor", "api/physbo.blm.prior", "api/physbo.blm.prior.gauss", "api/physbo.gp", "api/physbo.gp.core", "api/physbo.gp.core.learning", "api/physbo.gp.core.model", "api/physbo.gp.core.prior", "api/physbo.gp.cov", "api/physbo.gp.cov.gauss", "api/physbo.gp.inf", "api/physbo.gp.inf.exact", "api/physbo.gp.lik", "api/physbo.gp.lik.gauss", "api/physbo.gp.mean", "api/physbo.gp.mean.const", "api/physbo.gp.mean.zero", "api/physbo.gp.predictor", "api/physbo.misc", "api/physbo.misc.centering", "api/physbo.misc.gauss_elim", "api/physbo.misc.set_config", "api/physbo.opt", "api/physbo.opt.adam", "api/physbo.predictor", "api/physbo.search", "api/physbo.search.discrete", "api/physbo.search.discrete.policy", "api/physbo.search.discrete.results", "api/physbo.search.discrete_multi", "api/physbo.search.discrete_multi.policy", "api/physbo.search.discrete_multi.results", "api/physbo.search.pareto", "api/physbo.search.score", "api/physbo.search.score_multi", "api/physbo.search.utility", "api/physbo.variable", "contact", "index", "install", "introduction", "notebook/index", "notebook/tutorial_Gaussian_process", "notebook/tutorial_basic", "notebook/tutorial_basic_org", "notebook/tutorial_interactive_mode", "notebook/tutorial_multi_objective", "notebook/tutorial_multi_probe", "notebook/tutorial_once_mode"], "envversion": {"nbsphinx": 4, "sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgement.rst", "algorithm.rst", "api/modules.rst", "api/physbo.rst", "api/physbo.blm.rst", "api/physbo.blm.basis.rst", "api/physbo.blm.basis.fourier.rst", "api/physbo.blm.core.rst", "api/physbo.blm.core.model.rst", "api/physbo.blm.inf.rst", "api/physbo.blm.inf.exact.rst", "api/physbo.blm.lik.rst", "api/physbo.blm.lik.gauss.rst", "api/physbo.blm.lik.linear.rst", "api/physbo.blm.predictor.rst", "api/physbo.blm.prior.rst", "api/physbo.blm.prior.gauss.rst", "api/physbo.gp.rst", "api/physbo.gp.core.rst", "api/physbo.gp.core.learning.rst", "api/physbo.gp.core.model.rst", "api/physbo.gp.core.prior.rst", "api/physbo.gp.cov.rst", "api/physbo.gp.cov.gauss.rst", "api/physbo.gp.inf.rst", "api/physbo.gp.inf.exact.rst", "api/physbo.gp.lik.rst", "api/physbo.gp.lik.gauss.rst", "api/physbo.gp.mean.rst", "api/physbo.gp.mean.const.rst", "api/physbo.gp.mean.zero.rst", "api/physbo.gp.predictor.rst", "api/physbo.misc.rst", "api/physbo.misc.centering.rst", "api/physbo.misc.gauss_elim.rst", "api/physbo.misc.set_config.rst", "api/physbo.opt.rst", "api/physbo.opt.adam.rst", "api/physbo.predictor.rst", "api/physbo.search.rst", "api/physbo.search.discrete.rst", "api/physbo.search.discrete.policy.rst", "api/physbo.search.discrete.results.rst", "api/physbo.search.discrete_multi.rst", "api/physbo.search.discrete_multi.policy.rst", "api/physbo.search.discrete_multi.results.rst", "api/physbo.search.pareto.rst", "api/physbo.search.score.rst", "api/physbo.search.score_multi.rst", "api/physbo.search.utility.rst", "api/physbo.variable.rst", "contact.rst", "index.rst", "install.rst", "introduction.rst", "notebook/index.rst", "notebook/tutorial_Gaussian_process.ipynb", "notebook/tutorial_basic.ipynb", "notebook/tutorial_basic_org.ipynb", "notebook/tutorial_interactive_mode.ipynb", "notebook/tutorial_multi_objective.ipynb", "notebook/tutorial_multi_probe.ipynb", "notebook/tutorial_once_mode.ipynb"], "indexentries": {"_init_params (physbo.blm.lik.linear.linear attribute)": [[13, "physbo.blm.lik.linear.linear._init_params", false]], "adam (class in physbo.gp.core.learning)": [[19, "physbo.gp.core.learning.adam", false]], "adam (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.adam", false]], "adam (class in physbo.opt.adam)": [[37, "physbo.opt.adam.adam", false]], "add() (physbo.search.pareto.rectangles method)": [[46, "physbo.search.pareto.Rectangles.add", false]], "add() (physbo.variable.variable method)": [[50, "physbo.variable.variable.add", false]], "add_t() (physbo.variable.variable method)": [[50, "physbo.variable.variable.add_t", false]], "add_x() (physbo.variable.variable method)": [[50, "physbo.variable.variable.add_X", false]], "add_z() (physbo.variable.variable method)": [[50, "physbo.variable.variable.add_Z", false]], "alpha (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.alpha", false]], "base_predictor (class in physbo.predictor)": [[38, "physbo.predictor.base_predictor", false]], "basis (physbo.blm.lik.linear.linear attribute)": [[13, "physbo.blm.lik.linear.linear.basis", false]], "batch (class in physbo.gp.core.learning)": [[19, "physbo.gp.core.learning.batch", false]], "batch (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.batch", false]], "bayes_search() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.bayes_search", false]], "bayes_search() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.bayes_search", false]], "beta (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.beta", false]], "bias (physbo.blm.lik.linear.linear attribute)": [[13, "physbo.blm.lik.linear.linear.bias", false]], "blm (physbo.blm.predictor.predictor attribute)": [[14, "physbo.blm.predictor.predictor.blm", false]], "boolean() (in module physbo.misc.set_config)": [[35, "physbo.misc.set_config.boolean", false]], "cat_params() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.cat_params", false]], "cat_params() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.cat_params", false]], "cat_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.cat_params", false]], "centering() (in module physbo.misc.centering)": [[33, "physbo.misc.centering.centering", false]], "config (physbo.blm.predictor.predictor attribute)": [[14, "physbo.blm.predictor.predictor.config", false]], "const (class in physbo.gp.mean.const)": [[29, "physbo.gp.mean.const.const", false]], "cov (physbo.blm.lik.gauss.gauss attribute)": [[12, "physbo.blm.lik.gauss.gauss.cov", false]], "cov (physbo.blm.prior.gauss.gauss attribute)": [[16, "physbo.blm.prior.gauss.gauss.cov", false]], "cov_const (class in physbo.blm.prior.gauss)": [[16, "physbo.blm.prior.gauss.cov_const", false]], "decomp_params() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.decomp_params", false]], "decomp_params() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.decomp_params", false]], "decomp_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.decomp_params", false]], "delete() (physbo.variable.variable method)": [[50, "physbo.variable.variable.delete", false]], "delete_stats() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.delete_stats", false]], "delete_stats() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.delete_stats", false]], "delete_stats() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.delete_stats", false]], "delete_t() (physbo.variable.variable method)": [[50, "physbo.variable.variable.delete_t", false]], "delete_x() (physbo.variable.variable method)": [[50, "physbo.variable.variable.delete_X", false]], "delete_z() (physbo.variable.variable method)": [[50, "physbo.variable.variable.delete_Z", false]], "disp_marlik() (physbo.gp.core.learning.online method)": [[19, "physbo.gp.core.learning.online.disp_marlik", false]], "divide_non_dominated_region() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.divide_non_dominated_region", false]], "dominate() (in module physbo.search.pareto)": [[46, "physbo.search.pareto.dominate", false]], "ehvi() (in module physbo.search.score_multi)": [[48, "physbo.search.score_multi.EHVI", false]], "ei() (in module physbo.search.score)": [[47, "physbo.search.score.EI", false]], "epoch (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.epoch", false]], "epsilon (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.epsilon", false]], "eval_marlik() (in module physbo.gp.inf.exact)": [[25, "physbo.gp.inf.exact.eval_marlik", false]], "eval_marlik() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.eval_marlik", false]], "export_all_sequence_best_fx() (physbo.search.discrete.results.history method)": [[42, "physbo.search.discrete.results.history.export_all_sequence_best_fx", false]], "export_blm() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.export_blm", false]], "export_front() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.export_front", false]], "export_history() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.export_history", false]], "export_pareto_front() (physbo.search.discrete_multi.results.history method)": [[45, "physbo.search.discrete_multi.results.history.export_pareto_front", false]], "export_predictor() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.export_predictor", false]], "export_sequence_best_fx() (physbo.search.discrete.results.history method)": [[42, "physbo.search.discrete.results.history.export_sequence_best_fx", false]], "export_training() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.export_training", false]], "fit() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.fit", false]], "fit() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.fit", false]], "fit() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.fit", false]], "fit() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.fit", false]], "fourier (class in physbo.blm.basis.fourier)": [[6, "physbo.blm.basis.fourier.fourier", false]], "gamma (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.gamma", false]], "gauss (class in physbo.blm.lik.gauss)": [[12, "physbo.blm.lik.gauss.gauss", false]], "gauss (class in physbo.blm.prior.gauss)": [[16, "physbo.blm.prior.gauss.gauss", false]], "gauss (class in physbo.gp.cov.gauss)": [[23, "physbo.gp.cov.gauss.gauss", false]], "gauss (class in physbo.gp.lik.gauss)": [[27, "physbo.gp.lik.gauss.gauss", false]], "gauss_elim() (in module physbo.misc.gauss_elim)": [[34, "physbo.misc.gauss_elim.gauss_elim", false]], "get_basis() (physbo.blm.basis.fourier.fourier method)": [[6, "physbo.blm.basis.fourier.fourier.get_basis", false]], "get_basis() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.get_basis", false]], "get_basis() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_basis", false]], "get_basis() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_basis", false]], "get_basis() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_basis", false]], "get_cand_params() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.get_cand_params", false]], "get_cand_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.get_cand_params", false]], "get_cand_params() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.get_cand_params", false]], "get_cand_params() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.get_cand_params", false]], "get_cov() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.get_cov", false]], "get_cov() (physbo.blm.prior.gauss.cov_const method)": [[16, "physbo.blm.prior.gauss.cov_const.get_cov", false]], "get_cov() (physbo.blm.prior.gauss.gauss method)": [[16, "physbo.blm.prior.gauss.gauss.get_cov", false]], "get_cov() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.get_cov", false]], "get_cov() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.get_cov", false]], "get_cov() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.get_cov", false]], "get_grad() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.get_grad", false]], "get_grad() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.get_grad", false]], "get_grad() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.get_grad", false]], "get_grad() (physbo.gp.mean.zero.zero method)": [[30, "physbo.gp.mean.zero.zero.get_grad", false]], "get_grad_cov() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.get_grad_cov", false]], "get_grad_marlik() (in module physbo.gp.inf.exact)": [[25, "physbo.gp.inf.exact.get_grad_marlik", false]], "get_grad_marlik() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.get_grad_marlik", false]], "get_grad_mean() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.get_grad_mean", false]], "get_mean() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.get_mean", false]], "get_mean() (physbo.blm.lik.linear.linear method)": [[13, "physbo.blm.lik.linear.linear.get_mean", false]], "get_mean() (physbo.blm.prior.gauss.gauss method)": [[16, "physbo.blm.prior.gauss.gauss.get_mean", false]], "get_mean() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.get_mean", false]], "get_mean() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.get_mean", false]], "get_mean() (physbo.gp.mean.zero.zero method)": [[30, "physbo.gp.mean.zero.zero.get_mean", false]], "get_one_update() (physbo.gp.core.learning.adam method)": [[19, "physbo.gp.core.learning.adam.get_one_update", false]], "get_one_update() (physbo.gp.core.learning.online method)": [[19, "physbo.gp.core.learning.online.get_one_update", false]], "get_params_bound() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.get_params_bound", false]], "get_params_bound() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.get_params_bound", false]], "get_params_bound() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.get_params_bound", false]], "get_params_bound() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.get_params_bound", false]], "get_post_fcov() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.get_post_fcov", false]], "get_post_fcov() (in module physbo.gp.inf.exact)": [[25, "physbo.gp.inf.exact.get_post_fcov", false]], "get_post_fcov() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.get_post_fcov", false]], "get_post_fcov() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_post_fcov", false]], "get_post_fcov() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.get_post_fcov", false]], "get_post_fcov() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_post_fcov", false]], "get_post_fcov() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_post_fcov", false]], "get_post_fcov() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.get_post_fcov", false]], "get_post_fcov() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.get_post_fcov", false]], "get_post_fmean() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.get_post_fmean", false]], "get_post_fmean() (in module physbo.gp.inf.exact)": [[25, "physbo.gp.inf.exact.get_post_fmean", false]], "get_post_fmean() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.get_post_fmean", false]], "get_post_fmean() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_post_fmean", false]], "get_post_fmean() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.get_post_fmean", false]], "get_post_fmean() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_post_fmean", false]], "get_post_fmean() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_post_fmean", false]], "get_post_fmean() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.get_post_fmean", false]], "get_post_fmean() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.get_post_fmean", false]], "get_post_params() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_post_params", false]], "get_post_params() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_post_params", false]], "get_post_params() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_post_params", false]], "get_post_params_mean() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.get_post_params_mean", false]], "get_post_params_mean() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.get_post_params_mean", false]], "get_post_params_samples() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_post_params_samples", false]], "get_post_samples() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_post_samples", false]], "get_post_samples() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_post_samples", false]], "get_post_samples() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_post_samples", false]], "get_prec() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.get_prec", false]], "get_prec() (physbo.blm.prior.gauss.cov_const method)": [[16, "physbo.blm.prior.gauss.cov_const.get_prec", false]], "get_prec() (physbo.blm.prior.gauss.gauss method)": [[16, "physbo.blm.prior.gauss.gauss.get_prec", false]], "get_predict_samples() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.get_predict_samples", false]], "get_predict_samples() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.get_predict_samples", false]], "get_predict_samples() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.get_predict_samples", false]], "get_score() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.get_score", false]], "get_score() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.get_score", false]], "get_subset() (physbo.variable.variable method)": [[50, "physbo.variable.variable.get_subset", false]], "grad (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.grad", false]], "history (class in physbo.search.discrete.results)": [[42, "physbo.search.discrete.results.history", false]], "history (class in physbo.search.discrete_multi.results)": [[45, "physbo.search.discrete_multi.results.history", false]], "hvpi() (in module physbo.search.score_multi)": [[48, "physbo.search.score_multi.HVPI", false]], "init_params() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.init_params", false]], "init_params_search() (physbo.gp.core.learning.batch method)": [[19, "physbo.gp.core.learning.batch.init_params_search", false]], "init_params_search() (physbo.gp.core.learning.online method)": [[19, "physbo.gp.core.learning.online.init_params_search", false]], "is_learning() (in module physbo.search.utility)": [[49, "physbo.search.utility.is_learning", false]], "learning (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.learning", false]], "length_vector() (in module physbo.search.utility)": [[49, "physbo.search.utility.length_vector", false]], "lik (physbo.blm.core.model.model attribute)": [[8, "physbo.blm.core.model.model.lik", false]], "linear (class in physbo.blm.lik.linear)": [[13, "physbo.blm.lik.linear.linear", false]], "linear (physbo.blm.lik.gauss.gauss attribute)": [[12, "physbo.blm.lik.gauss.gauss.linear", false]], "load() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.load", false]], "load() (physbo.misc.set_config.adam method)": [[35, "physbo.misc.set_config.adam.load", false]], "load() (physbo.misc.set_config.batch method)": [[35, "physbo.misc.set_config.batch.load", false]], "load() (physbo.misc.set_config.learning method)": [[35, "physbo.misc.set_config.learning.load", false]], "load() (physbo.misc.set_config.online method)": [[35, "physbo.misc.set_config.online.load", false]], "load() (physbo.misc.set_config.search method)": [[35, "physbo.misc.set_config.search.load", false]], "load() (physbo.misc.set_config.set_config method)": [[35, "physbo.misc.set_config.set_config.load", false]], "load() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.load", false]], "load() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.load", false]], "load() (physbo.search.discrete.results.history method)": [[42, "physbo.search.discrete.results.history.load", false]], "load() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.load", false]], "load() (physbo.search.discrete_multi.results.history method)": [[45, "physbo.search.discrete_multi.results.history.load", false]], "load() (physbo.variable.variable method)": [[50, "physbo.variable.variable.load", false]], "load_predictor_list() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.load_predictor_list", false]], "load_training_list() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.load_training_list", false]], "m (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.m", false]], "max_epoch (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.max_epoch", false]], "method (physbo.blm.core.model.model attribute)": [[8, "physbo.blm.core.model.model.method", false]], "model (class in physbo.blm.core.model)": [[8, "physbo.blm.core.model.model", false]], "model (class in physbo.gp.core.model)": [[20, "physbo.gp.core.model.model", false]], "module": [[3, "module-physbo", false], [4, "module-physbo.blm", false], [5, "module-physbo.blm.basis", false], [6, "module-physbo.blm.basis.fourier", false], [7, "module-physbo.blm.core", false], [8, "module-physbo.blm.core.model", false], [9, "module-physbo.blm.inf", false], [10, "module-physbo.blm.inf.exact", false], [11, "module-physbo.blm.lik", false], [12, "module-physbo.blm.lik.gauss", false], [13, "module-physbo.blm.lik.linear", false], [14, "module-physbo.blm.predictor", false], [15, "module-physbo.blm.prior", false], [16, "module-physbo.blm.prior.gauss", false], [17, "module-physbo.gp", false], [18, "module-physbo.gp.core", false], [19, "module-physbo.gp.core.learning", false], [20, "module-physbo.gp.core.model", false], [21, "module-physbo.gp.core.prior", false], [22, "module-physbo.gp.cov", false], [23, "module-physbo.gp.cov.gauss", false], [24, "module-physbo.gp.inf", false], [25, "module-physbo.gp.inf.exact", false], [26, "module-physbo.gp.lik", false], [27, "module-physbo.gp.lik.gauss", false], [28, "module-physbo.gp.mean", false], [29, "module-physbo.gp.mean.const", false], [30, "module-physbo.gp.mean.zero", false], [31, "module-physbo.gp.predictor", false], [32, "module-physbo.misc", false], [33, "module-physbo.misc.centering", false], [34, "module-physbo.misc.gauss_elim", false], [35, "module-physbo.misc.set_config", false], [36, "module-physbo.opt", false], [37, "module-physbo.opt.adam", false], [38, "module-physbo.predictor", false], [39, "module-physbo.search", false], [40, "module-physbo.search.discrete", false], [41, "module-physbo.search.discrete.policy", false], [42, "module-physbo.search.discrete.results", false], [43, "module-physbo.search.discrete_multi", false], [44, "module-physbo.search.discrete_multi.policy", false], [45, "module-physbo.search.discrete_multi.results", false], [46, "module-physbo.search.pareto", false], [47, "module-physbo.search.score", false], [48, "module-physbo.search.score_multi", false], [49, "module-physbo.search.utility", false], [50, "module-physbo.variable", false]], "nbasis (physbo.blm.basis.fourier.fourier attribute)": [[6, "physbo.blm.basis.fourier.fourier.nbasis", false]], "nbasis (physbo.blm.core.model.model attribute)": [[8, "physbo.blm.core.model.model.nbasis", false]], "nbasis (physbo.blm.lik.linear.linear attribute)": [[13, "physbo.blm.lik.linear.linear.nbasis", false]], "nbasis (physbo.blm.prior.gauss.gauss attribute)": [[16, "physbo.blm.prior.gauss.gauss.nbasis", false]], "new_data_list (physbo.search.discrete_multi.policy.policy attribute)": [[44, "physbo.search.discrete_multi.policy.policy.new_data_list", false]], "nparams (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.nparams", false]], "one_run() (physbo.gp.core.learning.batch method)": [[19, "physbo.gp.core.learning.batch.one_run", false]], "one_run() (physbo.gp.core.learning.online method)": [[19, "physbo.gp.core.learning.online.one_run", false]], "online (class in physbo.gp.core.learning)": [[19, "physbo.gp.core.learning.online", false]], "online (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.online", false]], "params (physbo.blm.basis.fourier.fourier attribute)": [[6, "physbo.blm.basis.fourier.fourier.params", false]], "params (physbo.blm.lik.linear.linear attribute)": [[13, "physbo.blm.lik.linear.linear.params", false]], "params (physbo.blm.prior.gauss.cov_const attribute)": [[16, "physbo.blm.prior.gauss.cov_const.params", false]], "params (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.params", false]], "pareto (class in physbo.search.pareto)": [[46, "physbo.search.pareto.Pareto", false]], "physbo": [[3, "module-physbo", false]], "physbo.blm": [[4, "module-physbo.blm", false]], "physbo.blm.basis": [[5, "module-physbo.blm.basis", false]], "physbo.blm.basis.fourier": [[6, "module-physbo.blm.basis.fourier", false]], "physbo.blm.core": [[7, "module-physbo.blm.core", false]], "physbo.blm.core.model": [[8, "module-physbo.blm.core.model", false]], "physbo.blm.inf": [[9, "module-physbo.blm.inf", false]], "physbo.blm.inf.exact": [[10, "module-physbo.blm.inf.exact", false]], "physbo.blm.lik": [[11, "module-physbo.blm.lik", false]], "physbo.blm.lik.gauss": [[12, "module-physbo.blm.lik.gauss", false]], "physbo.blm.lik.linear": [[13, "module-physbo.blm.lik.linear", false]], "physbo.blm.predictor": [[14, "module-physbo.blm.predictor", false]], "physbo.blm.prior": [[15, "module-physbo.blm.prior", false]], "physbo.blm.prior.gauss": [[16, "module-physbo.blm.prior.gauss", false]], "physbo.gp": [[17, "module-physbo.gp", false]], "physbo.gp.core": [[18, "module-physbo.gp.core", false]], "physbo.gp.core.learning": [[19, "module-physbo.gp.core.learning", false]], "physbo.gp.core.model": [[20, "module-physbo.gp.core.model", false]], "physbo.gp.core.prior": [[21, "module-physbo.gp.core.prior", false]], "physbo.gp.cov": [[22, "module-physbo.gp.cov", false]], "physbo.gp.cov.gauss": [[23, "module-physbo.gp.cov.gauss", false]], "physbo.gp.inf": [[24, "module-physbo.gp.inf", false]], "physbo.gp.inf.exact": [[25, "module-physbo.gp.inf.exact", false]], "physbo.gp.lik": [[26, "module-physbo.gp.lik", false]], "physbo.gp.lik.gauss": [[27, "module-physbo.gp.lik.gauss", false]], "physbo.gp.mean": [[28, "module-physbo.gp.mean", false]], "physbo.gp.mean.const": [[29, "module-physbo.gp.mean.const", false]], "physbo.gp.mean.zero": [[30, "module-physbo.gp.mean.zero", false]], "physbo.gp.predictor": [[31, "module-physbo.gp.predictor", false]], "physbo.misc": [[32, "module-physbo.misc", false]], "physbo.misc.centering": [[33, "module-physbo.misc.centering", false]], "physbo.misc.gauss_elim": [[34, "module-physbo.misc.gauss_elim", false]], "physbo.misc.set_config": [[35, "module-physbo.misc.set_config", false]], "physbo.opt": [[36, "module-physbo.opt", false]], "physbo.opt.adam": [[37, "module-physbo.opt.adam", false]], "physbo.predictor": [[38, "module-physbo.predictor", false]], "physbo.search": [[39, "module-physbo.search", false]], "physbo.search.discrete": [[40, "module-physbo.search.discrete", false]], "physbo.search.discrete.policy": [[41, "module-physbo.search.discrete.policy", false]], "physbo.search.discrete.results": [[42, "module-physbo.search.discrete.results", false]], "physbo.search.discrete_multi": [[43, "module-physbo.search.discrete_multi", false]], "physbo.search.discrete_multi.policy": [[44, "module-physbo.search.discrete_multi.policy", false]], "physbo.search.discrete_multi.results": [[45, "module-physbo.search.discrete_multi.results", false]], "physbo.search.pareto": [[46, "module-physbo.search.pareto", false]], "physbo.search.score": [[47, "module-physbo.search.score", false]], "physbo.search.score_multi": [[48, "module-physbo.search.score_multi", false]], "physbo.search.utility": [[49, "module-physbo.search.utility", false]], "physbo.variable": [[50, "module-physbo.variable", false]], "pi() (in module physbo.search.score)": [[47, "physbo.search.score.PI", false]], "policy (class in physbo.search.discrete.policy)": [[41, "physbo.search.discrete.policy.policy", false]], "policy (class in physbo.search.discrete_multi.policy)": [[44, "physbo.search.discrete_multi.policy.policy", false]], "post_sampling() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.post_sampling", false]], "post_sampling() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.post_sampling", false]], "prec (physbo.blm.prior.gauss.cov_const attribute)": [[16, "physbo.blm.prior.gauss.cov_const.prec", false]], "predict_sampling() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.predict_sampling", false]], "predict_sampling() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.predict_sampling", false]], "predictor (class in physbo.blm.predictor)": [[14, "physbo.blm.predictor.predictor", false]], "predictor (class in physbo.gp.predictor)": [[31, "physbo.gp.predictor.predictor", false]], "prepare() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.prepare", false]], "prepare() (in module physbo.gp.inf.exact)": [[25, "physbo.gp.inf.exact.prepare", false]], "prepare() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.prepare", false]], "prepare() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.prepare", false]], "prepare() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.prepare", false]], "prepare() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.prepare", false]], "prepare() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.prepare", false]], "prepare() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.prepare", false]], "print_params() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.print_params", false]], "print_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.print_params", false]], "prior (class in physbo.gp.core.prior)": [[21, "physbo.gp.core.prior.prior", false]], "prior (physbo.blm.core.model.model attribute)": [[8, "physbo.blm.core.model.model.prior", false]], "rand_expans() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.rand_expans", false]], "random_search() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.random_search", false]], "random_search() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.random_search", false]], "rectangles (class in physbo.search.pareto)": [[46, "physbo.search.pareto.Rectangles", false]], "reset() (physbo.gp.core.learning.adam method)": [[19, "physbo.gp.core.learning.adam.reset", false]], "run() (physbo.gp.core.learning.batch method)": [[19, "physbo.gp.core.learning.batch.run", false]], "run() (physbo.gp.core.learning.online method)": [[19, "physbo.gp.core.learning.online.run", false]], "run() (physbo.opt.adam.adam method)": [[37, "physbo.opt.adam.adam.run", false]], "sampling() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.sampling", false]], "sampling() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.sampling", false]], "sampling() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.sampling", false]], "sampling() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.sampling", false]], "sampling() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.sampling", false]], "save() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.save", false]], "save() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.save", false]], "save() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.save", false]], "save() (physbo.search.discrete.results.history method)": [[42, "physbo.search.discrete.results.history.save", false]], "save() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.save", false]], "save() (physbo.search.discrete_multi.results.history method)": [[45, "physbo.search.discrete_multi.results.history.save", false]], "save() (physbo.variable.variable method)": [[50, "physbo.variable.variable.save", false]], "save_predictor_list() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.save_predictor_list", false]], "save_training_list() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.save_training_list", false]], "score() (in module physbo.search.score)": [[47, "physbo.search.score.score", false]], "score() (in module physbo.search.score_multi)": [[48, "physbo.search.score_multi.score", false]], "search (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.search", false]], "set_bias() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.set_bias", false]], "set_bias() (physbo.blm.lik.linear.linear method)": [[13, "physbo.blm.lik.linear.linear.set_bias", false]], "set_config (class in physbo.misc.set_config)": [[35, "physbo.misc.set_config.set_config", false]], "set_cov_params() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.set_cov_params", false]], "set_mean_params() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.set_mean_params", false]], "set_params() (physbo.blm.basis.fourier.fourier method)": [[6, "physbo.blm.basis.fourier.fourier.set_params", false]], "set_params() (physbo.blm.lik.gauss.gauss method)": [[12, "physbo.blm.lik.gauss.gauss.set_params", false]], "set_params() (physbo.blm.lik.linear.linear method)": [[13, "physbo.blm.lik.linear.linear.set_params", false]], "set_params() (physbo.blm.prior.gauss.cov_const method)": [[16, "physbo.blm.prior.gauss.cov_const.set_params", false]], "set_params() (physbo.blm.prior.gauss.gauss method)": [[16, "physbo.blm.prior.gauss.gauss.set_params", false]], "set_params() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.set_params", false]], "set_params() (physbo.gp.core.prior.prior method)": [[21, "physbo.gp.core.prior.prior.set_params", false]], "set_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.set_params", false]], "set_params() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.set_params", false]], "set_params() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.set_params", false]], "set_params() (physbo.gp.mean.zero.zero method)": [[30, "physbo.gp.mean.zero.zero.set_params", false]], "set_params() (physbo.opt.adam.adam method)": [[37, "physbo.opt.adam.adam.set_params", false]], "set_reference_max() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.set_reference_max", false]], "set_reference_min() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.set_reference_min", false]], "set_seed() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.set_seed", false]], "show() (physbo.blm.basis.fourier.fourier method)": [[6, "physbo.blm.basis.fourier.fourier.show", false]], "show() (physbo.misc.set_config.adam method)": [[35, "physbo.misc.set_config.adam.show", false]], "show() (physbo.misc.set_config.batch method)": [[35, "physbo.misc.set_config.batch.show", false]], "show() (physbo.misc.set_config.learning method)": [[35, "physbo.misc.set_config.learning.show", false]], "show() (physbo.misc.set_config.online method)": [[35, "physbo.misc.set_config.online.show", false]], "show() (physbo.misc.set_config.search method)": [[35, "physbo.misc.set_config.search.show", false]], "show() (physbo.misc.set_config.set_config method)": [[35, "physbo.misc.set_config.set_config.show", false]], "show_interactive_mode() (in module physbo.search.utility)": [[49, "physbo.search.utility.show_interactive_mode", false]], "show_search_results() (in module physbo.search.utility)": [[49, "physbo.search.utility.show_search_results", false]], "show_search_results_mo() (in module physbo.search.utility)": [[49, "physbo.search.utility.show_search_results_mo", false]], "show_start_message_multi_search() (in module physbo.search.utility)": [[49, "physbo.search.utility.show_start_message_multi_search", false]], "sigma2 (physbo.blm.prior.gauss.cov_const attribute)": [[16, "physbo.blm.prior.gauss.cov_const.sigma2", false]], "stats (physbo.blm.core.model.model attribute)": [[8, "physbo.blm.core.model.model.stats", false]], "stats (physbo.blm.lik.gauss.gauss attribute)": [[12, "physbo.blm.lik.gauss.gauss.stats", false]], "sub_sampling() (physbo.gp.core.model.model method)": [[20, "physbo.gp.core.model.model.sub_sampling", false]], "supp_params() (physbo.gp.cov.gauss.gauss method)": [[23, "physbo.gp.cov.gauss.gauss.supp_params", false]], "supp_params() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.supp_params", false]], "supp_params() (physbo.gp.mean.const.const method)": [[29, "physbo.gp.mean.const.const.supp_params", false]], "time_get_action (physbo.search.discrete.results.history property)": [[42, "physbo.search.discrete.results.history.time_get_action", false]], "time_get_action (physbo.search.discrete_multi.results.history property)": [[45, "physbo.search.discrete_multi.results.history.time_get_action", false]], "time_run_simulator (physbo.search.discrete.results.history property)": [[42, "physbo.search.discrete.results.history.time_run_simulator", false]], "time_run_simulator (physbo.search.discrete_multi.results.history property)": [[45, "physbo.search.discrete_multi.results.history.time_run_simulator", false]], "time_total (physbo.search.discrete.results.history property)": [[42, "physbo.search.discrete.results.history.time_total", false]], "time_total (physbo.search.discrete_multi.results.history property)": [[45, "physbo.search.discrete_multi.results.history.time_total", false]], "time_update_predictor (physbo.search.discrete.results.history property)": [[42, "physbo.search.discrete.results.history.time_update_predictor", false]], "time_update_predictor (physbo.search.discrete_multi.results.history property)": [[45, "physbo.search.discrete_multi.results.history.time_update_predictor", false]], "trans_params() (physbo.gp.lik.gauss.gauss method)": [[27, "physbo.gp.lik.gauss.gauss.trans_params", false]], "ts() (in module physbo.search.score)": [[47, "physbo.search.score.TS", false]], "ts() (in module physbo.search.score_multi)": [[48, "physbo.search.score_multi.TS", false]], "update() (physbo.blm.predictor.predictor method)": [[14, "physbo.blm.predictor.predictor.update", false]], "update() (physbo.gp.predictor.predictor method)": [[31, "physbo.gp.predictor.predictor.update", false]], "update() (physbo.opt.adam.adam method)": [[37, "physbo.opt.adam.adam.update", false]], "update() (physbo.predictor.base_predictor method)": [[38, "physbo.predictor.base_predictor.update", false]], "update_front() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.update_front", false]], "update_stats() (in module physbo.blm.inf.exact)": [[10, "physbo.blm.inf.exact.update_stats", false]], "update_stats() (physbo.blm.core.model.model method)": [[8, "physbo.blm.core.model.model.update_stats", false]], "v (physbo.opt.adam.adam attribute)": [[37, "physbo.opt.adam.adam.v", false]], "variable (class in physbo.variable)": [[50, "physbo.variable.variable", false]], "volume_in_dominance() (physbo.search.pareto.pareto method)": [[46, "physbo.search.pareto.Pareto.volume_in_dominance", false]], "write() (physbo.search.discrete.policy.policy method)": [[41, "physbo.search.discrete.policy.policy.write", false]], "write() (physbo.search.discrete.results.history method)": [[42, "physbo.search.discrete.results.history.write", false]], "write() (physbo.search.discrete_multi.policy.policy method)": [[44, "physbo.search.discrete_multi.policy.policy.write", false]], "write() (physbo.search.discrete_multi.results.history method)": [[45, "physbo.search.discrete_multi.results.history.write", false]], "zero (class in physbo.gp.mean.zero)": [[30, "physbo.gp.mean.zero.zero", false]]}, "objects": {"": [[3, 0, 0, "-", "physbo"]], "physbo": [[4, 0, 0, "-", "blm"], [17, 0, 0, "-", "gp"], [32, 0, 0, "-", "misc"], [36, 0, 0, "-", "opt"], [38, 0, 0, "-", "predictor"], [39, 0, 0, "-", "search"], [50, 0, 0, "-", "variable"]], "physbo.blm": [[5, 0, 0, "-", "basis"], [7, 0, 0, "-", "core"], [9, 0, 0, "-", "inf"], [11, 0, 0, "-", "lik"], [14, 0, 0, "-", "predictor"], [15, 0, 0, "-", "prior"]], "physbo.blm.basis": [[6, 0, 0, "-", "fourier"]], "physbo.blm.basis.fourier": [[6, 1, 1, "", "fourier"]], "physbo.blm.basis.fourier.fourier": [[6, 2, 1, "", "get_basis"], [6, 3, 1, "", "nbasis"], [6, 3, 1, "", "params"], [6, 2, 1, "", "set_params"], [6, 2, 1, "", "show"]], "physbo.blm.core": [[8, 0, 0, "-", "model"]], "physbo.blm.core.model": [[8, 1, 1, "", "model"]], "physbo.blm.core.model.model": [[8, 2, 1, "", "get_post_fcov"], [8, 2, 1, "", "get_post_fmean"], [8, 2, 1, "", "get_post_params_mean"], [8, 3, 1, "", "lik"], [8, 3, 1, "", "method"], [8, 3, 1, "", "nbasis"], [8, 2, 1, "", "post_sampling"], [8, 2, 1, "", "predict_sampling"], [8, 2, 1, "", "prepare"], [8, 3, 1, "", "prior"], [8, 2, 1, "", "sampling"], [8, 3, 1, "", "stats"], [8, 2, 1, "", "update_stats"]], "physbo.blm.inf": [[10, 0, 0, "-", "exact"]], "physbo.blm.inf.exact": [[10, 4, 1, "", "get_post_fcov"], [10, 4, 1, "", "get_post_fmean"], [10, 4, 1, "", "get_post_params_mean"], [10, 4, 1, "", "prepare"], [10, 4, 1, "", "sampling"], [10, 4, 1, "", "update_stats"]], "physbo.blm.lik": [[12, 0, 0, "-", "gauss"], [13, 0, 0, "-", "linear"]], "physbo.blm.lik.gauss": [[12, 1, 1, "", "gauss"]], "physbo.blm.lik.gauss.gauss": [[12, 3, 1, "", "cov"], [12, 2, 1, "", "get_basis"], [12, 2, 1, "", "get_cov"], [12, 2, 1, "", "get_mean"], [12, 2, 1, "", "get_prec"], [12, 3, 1, "", "linear"], [12, 2, 1, "", "sampling"], [12, 2, 1, "", "set_bias"], [12, 2, 1, "", "set_params"], [12, 3, 1, "", "stats"]], "physbo.blm.lik.linear": [[13, 1, 1, "", "linear"]], "physbo.blm.lik.linear.linear": [[13, 3, 1, "", "_init_params"], [13, 3, 1, "", "basis"], [13, 3, 1, "", "bias"], [13, 2, 1, "", "get_mean"], [13, 3, 1, "", "nbasis"], [13, 3, 1, "", "params"], [13, 2, 1, "", "set_bias"], [13, 2, 1, "", "set_params"]], "physbo.blm.predictor": [[14, 1, 1, "", "predictor"]], "physbo.blm.predictor.predictor": [[14, 3, 1, "", "blm"], [14, 3, 1, "", "config"], [14, 2, 1, "", "delete_stats"], [14, 2, 1, "", "fit"], [14, 2, 1, "", "get_basis"], [14, 2, 1, "", "get_post_fcov"], [14, 2, 1, "", "get_post_fmean"], [14, 2, 1, "", "get_post_params"], [14, 2, 1, "", "get_post_samples"], [14, 2, 1, "", "get_predict_samples"], [14, 2, 1, "", "prepare"], [14, 2, 1, "", "update"]], "physbo.blm.prior": [[16, 0, 0, "-", "gauss"]], "physbo.blm.prior.gauss": [[16, 1, 1, "", "cov_const"], [16, 1, 1, "", "gauss"]], "physbo.blm.prior.gauss.cov_const": [[16, 2, 1, "", "get_cov"], [16, 2, 1, "", "get_prec"], [16, 3, 1, "", "params"], [16, 3, 1, "", "prec"], [16, 2, 1, "", "set_params"], [16, 3, 1, "", "sigma2"]], "physbo.blm.prior.gauss.gauss": [[16, 3, 1, "", "cov"], [16, 2, 1, "", "get_cov"], [16, 2, 1, "", "get_mean"], [16, 2, 1, "", "get_prec"], [16, 3, 1, "", "nbasis"], [16, 2, 1, "", "set_params"]], "physbo.gp": [[18, 0, 0, "-", "core"], [22, 0, 0, "-", "cov"], [24, 0, 0, "-", "inf"], [26, 0, 0, "-", "lik"], [28, 0, 0, "-", "mean"], [31, 0, 0, "-", "predictor"]], "physbo.gp.core": [[19, 0, 0, "-", "learning"], [20, 0, 0, "-", "model"], [21, 0, 0, "-", "prior"]], "physbo.gp.core.learning": [[19, 1, 1, "", "adam"], [19, 1, 1, "", "batch"], [19, 1, 1, "", "online"]], "physbo.gp.core.learning.adam": [[19, 2, 1, "", "get_one_update"], [19, 2, 1, "", "reset"]], "physbo.gp.core.learning.batch": [[19, 2, 1, "", "init_params_search"], [19, 2, 1, "", "one_run"], [19, 2, 1, "", "run"]], "physbo.gp.core.learning.online": [[19, 2, 1, "", "disp_marlik"], [19, 2, 1, "", "get_one_update"], [19, 2, 1, "", "init_params_search"], [19, 2, 1, "", "one_run"], [19, 2, 1, "", "run"]], "physbo.gp.core.model": [[20, 1, 1, "", "model"]], "physbo.gp.core.model.model": [[20, 2, 1, "", "cat_params"], [20, 2, 1, "", "decomp_params"], [20, 2, 1, "", "eval_marlik"], [20, 2, 1, "", "export_blm"], [20, 2, 1, "", "fit"], [20, 2, 1, "", "get_cand_params"], [20, 2, 1, "", "get_grad_marlik"], [20, 2, 1, "", "get_params_bound"], [20, 2, 1, "", "get_post_fcov"], [20, 2, 1, "", "get_post_fmean"], [20, 2, 1, "", "post_sampling"], [20, 2, 1, "", "predict_sampling"], [20, 2, 1, "", "prepare"], [20, 2, 1, "", "print_params"], [20, 2, 1, "", "set_params"], [20, 2, 1, "", "sub_sampling"]], "physbo.gp.core.prior": [[21, 1, 1, "", "prior"]], "physbo.gp.core.prior.prior": [[21, 2, 1, "", "cat_params"], [21, 2, 1, "", "decomp_params"], [21, 2, 1, "", "get_cov"], [21, 2, 1, "", "get_grad_cov"], [21, 2, 1, "", "get_grad_mean"], [21, 2, 1, "", "get_mean"], [21, 2, 1, "", "sampling"], [21, 2, 1, "", "set_cov_params"], [21, 2, 1, "", "set_mean_params"], [21, 2, 1, "", "set_params"]], "physbo.gp.cov": [[23, 0, 0, "-", "gauss"]], "physbo.gp.cov.gauss": [[23, 1, 1, "", "gauss"]], "physbo.gp.cov.gauss.gauss": [[23, 2, 1, "", "cat_params"], [23, 2, 1, "", "decomp_params"], [23, 2, 1, "", "get_cand_params"], [23, 2, 1, "", "get_cov"], [23, 2, 1, "", "get_grad"], [23, 2, 1, "", "get_params_bound"], [23, 2, 1, "", "load"], [23, 2, 1, "", "prepare"], [23, 2, 1, "", "print_params"], [23, 2, 1, "", "rand_expans"], [23, 2, 1, "", "save"], [23, 2, 1, "", "set_params"], [23, 2, 1, "", "supp_params"]], "physbo.gp.inf": [[25, 0, 0, "-", "exact"]], "physbo.gp.inf.exact": [[25, 4, 1, "", "eval_marlik"], [25, 4, 1, "", "get_grad_marlik"], [25, 4, 1, "", "get_post_fcov"], [25, 4, 1, "", "get_post_fmean"], [25, 4, 1, "", "prepare"]], "physbo.gp.lik": [[27, 0, 0, "-", "gauss"]], "physbo.gp.lik.gauss": [[27, 1, 1, "", "gauss"]], "physbo.gp.lik.gauss.gauss": [[27, 2, 1, "", "get_cand_params"], [27, 2, 1, "", "get_cov"], [27, 2, 1, "", "get_grad"], [27, 2, 1, "", "get_params_bound"], [27, 2, 1, "", "sampling"], [27, 2, 1, "", "set_params"], [27, 2, 1, "", "supp_params"], [27, 2, 1, "", "trans_params"]], "physbo.gp.mean": [[29, 0, 0, "-", "const"], [30, 0, 0, "-", "zero"]], "physbo.gp.mean.const": [[29, 1, 1, "", "const"]], "physbo.gp.mean.const.const": [[29, 2, 1, "", "get_cand_params"], [29, 2, 1, "", "get_grad"], [29, 2, 1, "", "get_mean"], [29, 2, 1, "", "get_params_bound"], [29, 2, 1, "", "init_params"], [29, 2, 1, "", "set_params"], [29, 2, 1, "", "supp_params"]], "physbo.gp.mean.zero": [[30, 1, 1, "", "zero"]], "physbo.gp.mean.zero.zero": [[30, 2, 1, "", "get_grad"], [30, 2, 1, "", "get_mean"], [30, 2, 1, "", "set_params"]], "physbo.gp.predictor": [[31, 1, 1, "", "predictor"]], "physbo.gp.predictor.predictor": [[31, 2, 1, "", "delete_stats"], [31, 2, 1, "", "fit"], [31, 2, 1, "", "get_basis"], [31, 2, 1, "", "get_post_fcov"], [31, 2, 1, "", "get_post_fmean"], [31, 2, 1, "", "get_post_params"], [31, 2, 1, "", "get_post_samples"], [31, 2, 1, "", "get_predict_samples"], [31, 2, 1, "", "prepare"], [31, 2, 1, "", "update"]], "physbo.misc": [[33, 0, 0, "-", "centering"], [34, 0, 0, "-", "gauss_elim"], [35, 0, 0, "-", "set_config"]], "physbo.misc.centering": [[33, 4, 1, "", "centering"]], "physbo.misc.gauss_elim": [[34, 4, 1, "", "gauss_elim"]], "physbo.misc.set_config": [[35, 1, 1, "", "adam"], [35, 1, 1, "", "batch"], [35, 4, 1, "", "boolean"], [35, 1, 1, "", "learning"], [35, 1, 1, "", "online"], [35, 1, 1, "", "search"], [35, 1, 1, "", "set_config"]], "physbo.misc.set_config.adam": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.batch": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.learning": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.online": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.search": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.set_config": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.opt": [[37, 0, 0, "-", "adam"]], "physbo.opt.adam": [[37, 1, 1, "", "adam"]], "physbo.opt.adam.adam": [[37, 3, 1, "", "alpha"], [37, 3, 1, "", "beta"], [37, 3, 1, "", "epoch"], [37, 3, 1, "", "epsilon"], [37, 3, 1, "", "gamma"], [37, 3, 1, "", "grad"], [37, 3, 1, "", "m"], [37, 3, 1, "", "max_epoch"], [37, 3, 1, "", "nparams"], [37, 3, 1, "", "params"], [37, 2, 1, "", "run"], [37, 2, 1, "", "set_params"], [37, 2, 1, "", "update"], [37, 3, 1, "", "v"]], "physbo.predictor": [[38, 1, 1, "", "base_predictor"]], "physbo.predictor.base_predictor": [[38, 2, 1, "", "delete_stats"], [38, 2, 1, "", "fit"], [38, 2, 1, "", "get_basis"], [38, 2, 1, "", "get_post_fcov"], [38, 2, 1, "", "get_post_fmean"], [38, 2, 1, "", "get_post_params"], [38, 2, 1, "", "get_post_params_samples"], [38, 2, 1, "", "get_post_samples"], [38, 2, 1, "", "get_predict_samples"], [38, 2, 1, "", "load"], [38, 2, 1, "", "prepare"], [38, 2, 1, "", "save"], [38, 2, 1, "", "update"]], "physbo.search": [[40, 0, 0, "-", "discrete"], [43, 0, 0, "-", "discrete_multi"], [46, 0, 0, "-", "pareto"], [47, 0, 0, "-", "score"], [48, 0, 0, "-", "score_multi"], [49, 0, 0, "-", "utility"]], "physbo.search.discrete": [[41, 0, 0, "-", "policy"], [42, 0, 0, "-", "results"]], "physbo.search.discrete.policy": [[41, 1, 1, "", "policy"]], "physbo.search.discrete.policy.policy": [[41, 2, 1, "", "bayes_search"], [41, 2, 1, "", "export_history"], [41, 2, 1, "", "export_predictor"], [41, 2, 1, "", "export_training"], [41, 2, 1, "", "get_post_fcov"], [41, 2, 1, "", "get_post_fmean"], [41, 2, 1, "", "get_score"], [41, 2, 1, "", "load"], [41, 2, 1, "", "random_search"], [41, 2, 1, "", "save"], [41, 2, 1, "", "set_seed"], [41, 2, 1, "", "write"]], "physbo.search.discrete.results": [[42, 1, 1, "", "history"]], "physbo.search.discrete.results.history": [[42, 2, 1, "", "export_all_sequence_best_fx"], [42, 2, 1, "", "export_sequence_best_fx"], [42, 2, 1, "", "load"], [42, 2, 1, "", "save"], [42, 5, 1, "", "time_get_action"], [42, 5, 1, "", "time_run_simulator"], [42, 5, 1, "", "time_total"], [42, 5, 1, "", "time_update_predictor"], [42, 2, 1, "", "write"]], "physbo.search.discrete_multi": [[44, 0, 0, "-", "policy"], [45, 0, 0, "-", "results"]], "physbo.search.discrete_multi.policy": [[44, 1, 1, "", "policy"]], "physbo.search.discrete_multi.policy.policy": [[44, 2, 1, "", "bayes_search"], [44, 2, 1, "", "get_post_fcov"], [44, 2, 1, "", "get_post_fmean"], [44, 2, 1, "", "get_score"], [44, 2, 1, "", "load"], [44, 2, 1, "", "load_predictor_list"], [44, 2, 1, "", "load_training_list"], [44, 3, 1, "", "new_data_list"], [44, 2, 1, "", "random_search"], [44, 2, 1, "", "save"], [44, 2, 1, "", "save_predictor_list"], [44, 2, 1, "", "save_training_list"], [44, 2, 1, "", "write"]], "physbo.search.discrete_multi.results": [[45, 1, 1, "", "history"]], "physbo.search.discrete_multi.results.history": [[45, 2, 1, "", "export_pareto_front"], [45, 2, 1, "", "load"], [45, 2, 1, "", "save"], [45, 5, 1, "", "time_get_action"], [45, 5, 1, "", "time_run_simulator"], [45, 5, 1, "", "time_total"], [45, 5, 1, "", "time_update_predictor"], [45, 2, 1, "", "write"]], "physbo.search.pareto": [[46, 1, 1, "", "Pareto"], [46, 1, 1, "", "Rectangles"], [46, 4, 1, "", "dominate"]], "physbo.search.pareto.Pareto": [[46, 2, 1, "", "divide_non_dominated_region"], [46, 2, 1, "", "export_front"], [46, 2, 1, "", "set_reference_max"], [46, 2, 1, "", "set_reference_min"], [46, 2, 1, "", "update_front"], [46, 2, 1, "", "volume_in_dominance"]], "physbo.search.pareto.Rectangles": [[46, 2, 1, "", "add"]], "physbo.search.score": [[47, 4, 1, "", "EI"], [47, 4, 1, "", "PI"], [47, 4, 1, "", "TS"], [47, 4, 1, "", "score"]], "physbo.search.score_multi": [[48, 4, 1, "", "EHVI"], [48, 4, 1, "", "HVPI"], [48, 4, 1, "", "TS"], [48, 4, 1, "", "score"]], "physbo.search.utility": [[49, 4, 1, "", "is_learning"], [49, 4, 1, "", "length_vector"], [49, 4, 1, "", "show_interactive_mode"], [49, 4, 1, "", "show_search_results"], [49, 4, 1, "", "show_search_results_mo"], [49, 4, 1, "", "show_start_message_multi_search"]], "physbo.variable": [[50, 1, 1, "", "variable"]], "physbo.variable.variable": [[50, 2, 1, "", "add"], [50, 2, 1, "", "add_X"], [50, 2, 1, "", "add_Z"], [50, 2, 1, "", "add_t"], [50, 2, 1, "", "delete"], [50, 2, 1, "", "delete_X"], [50, 2, 1, "", "delete_Z"], [50, 2, 1, "", "delete_t"], [50, 2, 1, "", "get_subset"], [50, 2, 1, "", "load"], [50, 2, 1, "", "save"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "property", "Python property"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "terms": {"": [53, 57, 58, 60], "0": [1, 8, 10, 14, 23, 27, 29, 33, 41, 42, 44, 47, 53, 54, 56, 57, 58, 59, 60, 61, 62], "00043006": 56, "00056069": 56, "00070103": 56, "00073499": 56, "00075529": 56, "0010": 54, "0016925": 56, "002": 57, "0020": [57, 58], "00323733": 56, "00420815": 56, "008107085662147708": 56, "01": 60, "01301176": 58, "01487066": [58, 61], "02044168": 58, "045502": [56, 58], "048733": 58, "05572838": 61, "05939674": 56, "06": [23, 27], "075990": 57, "09067194": 60, "09302189053099": 62, "0x7f8130b30f70": 57, "0x7f8130b84070": 57, "0x7f816129d820": 57, "0x7f81613d8370": 57, "0x7f9920ef7460": 61, "0x7f9930b43f10": 61, "0x7f9950ec84f0": 61, "0x7fe0d9310580": 58, "0x7fe0d93eaaf0": 58, "1": [1, 6, 8, 10, 14, 20, 21, 23, 27, 31, 33, 34, 41, 44, 47, 48, 54, 56, 57, 58, 59, 60, 61, 62], "10": [27, 54, 56, 57, 58, 59, 60, 61], "100": [56, 61, 62], "1000000": [23, 27], "1000000000000": 29, "10001": 57, "101": 60, "1016": 54, "10162": 62, "10201": 60, "1022": 58, "108405": 54, "10872736571494": 62, "10923758": 56, "11": [56, 57, 58], "11076236": 56, "1167759139516": 56, "11680203": 58, "11732": 62, "1177": 6, "1184": 6, "11964735598211": 62, "12": [56, 57, 58, 61], "123": 61, "12623": 62, "13": [56, 57, 58], "1316": 56, "1326": 62, "13268": 62, "13781": 62, "14": [56, 57, 58, 60], "15": [56, 57, 58, 60], "150": [56, 62], "150313": 57, "1546": 56, "15617": 62, "1568": 56, "15922": 62, "16": [56, 57, 58, 60], "1623851368954": 56, "16415446221006114": 60, "16537": 62, "1660": 56, "16753": 62, "17": [56, 58, 60], "1719": 56, "17190645": 60, "17312": 56, "17451": 62, "1798": 56, "18": [47, 56], "19": [53, 57, 60], "1999": 60, "1d": 56, "1e": [23, 27], "1st": 59, "2": [1, 27, 31, 41, 44, 47, 53, 54, 56, 57, 58, 59, 60, 61, 62], "20": [57, 58, 60, 61, 62], "200": [56, 62], "2007": 6, "2014": [48, 60], "2015": 60, "2016": [47, 56, 58], "2020": 54, "2022": 54, "21": [47, 60], "210": [56, 58, 59, 61, 62], "22": 60, "22884748": 61, "23": [60, 62], "2376881844865093": 60, "24": 62, "249": 56, "25": [60, 62], "250": [56, 62], "26": [60, 62], "26132949": 60, "27": 62, "278": 54, "28": 60, "28468708456558": 56, "2847129159145": 56, "29": 60, "29208351": 60, "292745798703": 56, "2949": 57, "2nd": 59, "3": [1, 23, 38, 53, 56, 57, 58, 59, 60, 61, 62], "300": [56, 62], "30051687493437484": 60, "3107": 62, "31220145003": 56, "3200467412741881": 60, "3269": 56, "32877907991633726": 60, "331572599126865": 62, "350": [56, 62], "3930580794922": 56, "3dihub": 54, "3rd": 59, "4": [47, 56, 57, 58, 59, 60, 61, 62], "40": 60, "400": [56, 62], "41": 60, "42342027124426": 62, "450": [56, 62], "45544347": 56, "4563": 62, "4579": 62, "46385011": [58, 62], "4655": 54, "4815": 62, "48876352": 58, "4971452": 58, "4985373": 58, "4th": 59, "5": [56, 58, 59, 60, 62], "50": [56, 57, 60, 62], "500": [56, 57, 62], "5000": [58, 59, 60, 62], "5056128528097": 56, "517235815448124": 62, "52191048": 60, "55": [56, 58], "5734": 58, "575": 60, "59219588": 58, "594": 60, "6": [53, 56, 58, 59, 60, 61, 62], "60": 60, "6291": 56, "63329589": 60, "664": 56, "6680279": 62, "67892333553869": 62, "6809532065581": 56, "68585446": [58, 62], "7": [56, 57, 58, 60, 61], "71079785": 58, "7157": 62, "72845916": 60, "7298135295766": 56, "73": 62, "7604930929888": 56, "8": [56, 57, 58, 60, 61], "80": [58, 61], "81666924": 56, "817906570042602": 62, "8208": 62, "822598600211865": 62, "82299469827059": 62, "8288": 57, "83020118385076": 62, "8484": 62, "869": 56, "87913689": 60, "9": [56, 57, 58, 60], "91382463": 60, "91578975": 56, "92": 60, "9235": 62, "92633083": 60, "95713719": 60, "96": 60, "963795": 58, "97015759": 56, "97840623": 56, "99": 60, "9938": 62, "A": [1, 6, 23, 27, 29, 34, 38, 50, 56, 58, 59, 60, 61, 62], "As": [1, 59, 60, 61, 62], "At": 1, "By": [1, 54, 56], "For": [1, 53, 56, 57, 58, 59, 60], "If": [1, 14, 20, 21, 23, 25, 31, 41, 42, 44, 47, 50, 51, 53, 56, 57, 58, 60, 61], "In": [1, 41, 44, 53, 54, 56, 57, 58, 59, 60, 61, 62], "It": [1, 53, 54, 59, 60], "No": 60, "Not": 30, "OF": 60, "On": 54, "The": [0, 1, 19, 20, 23, 25, 27, 38, 41, 42, 44, 50, 53, 54, 56, 57, 58, 60, 61, 62], "Then": 1, "There": 54, "These": [41, 44], "To": [51, 57, 58], "With": [1, 61], "_": [1, 58, 59, 61], "_0": 1, "_1": 1, "_2": 1, "__call__": [41, 44, 57, 58, 59, 60, 61], "__dict__": 38, "__init__": [57, 58, 59, 60, 61], "_at_": 51, "_i": [1, 60], "_init_param": [11, 13], "_j": 60, "_n": 1, "_sectoin": 35, "about": [20, 35, 41, 44, 51, 52, 53], "abov": [1, 53, 56, 57, 58, 60, 62], "abstract": 53, "ac": 51, "acceler": [52, 54, 56, 58], "access": 54, "accord": 1, "achiev": [1, 54], "acknowledg": 52, "acquisit": [1, 41, 44, 47, 53, 55, 58], "action": [41, 42, 44, 45, 50, 53, 55, 57, 58, 59, 60, 61], "action_idx": 57, "actoin": 62, "actual": [56, 58], "ad": [1, 27, 50], "adam": [3, 17, 18, 19, 32, 35, 36], "add": [1, 3, 39, 46, 50, 53], "add_t": [3, 50], "add_x": [3, 50], "add_z": [3, 50], "addit": 1, "address": 51, "advanc": [0, 1, 6, 54, 58, 60, 62], "afit": 60, "after": 56, "again": [60, 62], "air": 60, "al": 48, "algorithm": [19, 52, 53, 54, 60], "all": [1, 16, 20, 41, 42, 44, 51, 53, 54, 57, 58, 60, 62], "allow": 61, "almost": 1, "along": 33, "alpha": [6, 8, 10, 14, 20, 31, 34, 36, 37, 41, 44, 47, 48, 57], "alreadi": [14, 31, 37, 56, 58], "also": [53, 56, 57, 58, 59, 60, 61], "although": [56, 58], "among": [1, 53, 54, 60], "amount": 54, "amp": 23, "an": [1, 13, 20, 29, 35, 41, 44, 51, 53, 54, 56, 57, 58, 59, 61, 62], "analys": 60, "ani": [51, 60], "anoth": [8, 56], "answer": 57, "api": [52, 53, 60], "append": [56, 57], "appendix": 55, "appl": [56, 58], "appli": [53, 58], "approach": [56, 58], "approxim": 1, "aquis": [41, 44], "aquisit": [41, 44], "ar": [1, 16, 41, 44, 47, 50, 51, 53, 54, 56, 57, 58, 59, 60, 61, 62], "arbitari": 1, "ard": [23, 56], "arg": [31, 37, 38], "argmin": 57, "argument": [53, 57, 58, 61], "arm": 60, "arrai": [1, 19, 20, 23, 25, 27, 29, 33, 41, 42, 44, 50, 56, 57, 58, 59, 60, 61], "array_lik": [29, 34], "arriv": 57, "articl": 54, "artif": 60, "asarrai": [56, 58, 59, 61, 62], "ascend": [46, 60], "associ": [1, 53], "assum": [41, 44, 58], "attempt": 54, "author": 54, "automat": [1, 54], "auxiaiali": 10, "auxial": [8, 10], "avail": [41, 44, 47, 54], "ax": 57, "axi": 60, "b": [1, 6, 10, 19, 23], "b_1": 1, "b_l": 1, "bandit": 60, "base": [6, 8, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 35, 37, 38, 41, 42, 44, 45, 46, 47, 48, 50, 54], "base_predictor": [2, 3, 14, 31, 38], "basi": [3, 4, 8, 10, 11, 12, 13, 14, 16, 19, 20, 23, 31, 38, 41, 44, 57, 58], "basic": [52, 55, 60, 61], "batch": [3, 17, 18, 19, 32, 35], "bayes_search": [40, 41, 43, 44, 53, 57, 58, 59, 60, 61, 62], "bayesian": [4, 41, 44, 52, 53, 54, 55, 56, 59, 61, 62], "baysean": [8, 14, 20, 53], "becaus": 1, "becom": [1, 53], "been": [1, 54, 56, 58], "begin": [1, 60], "below": [1, 61], "benchmark": 60, "bernard": 60, "best": [1, 53, 57, 58, 61], "best_act": [42, 53, 57, 58, 61], "best_fx": [42, 57, 58, 61], "beta": [36, 37], "better": [1, 54, 60], "between": [1, 53, 60, 61], "bf": 1, "bfg": 19, "bia": [6, 11, 12, 13], "bibtex": 54, "blm": [2, 3, 20, 53], "blm_predictor": [41, 44], "blue": [57, 60], "boldsymbol": 1, "bool": [8, 10, 20, 21, 23, 25, 31, 41, 44], "boolean": [3, 32, 35], "both": [41, 44, 60], "bound": [20, 23, 27, 29, 46, 60], "boundari": [20, 23, 27, 29], "bug": 51, "c": [54, 60], "c_": 60, "calcualt": [41, 44], "calcul": [1, 8, 10, 12, 13, 14, 16, 20, 21, 25, 31, 34, 37, 41, 44, 47, 48, 52, 55, 56, 57, 58], "calculated_id": 62, "call": [1, 57, 58, 60], "callabl": [41, 44], "can": [1, 29, 53, 54, 57, 58, 59, 60, 61, 62], "candid": [1, 19, 20, 21, 23, 25, 27, 29, 33, 41, 42, 44, 50, 52, 53, 54, 55, 57], "cannot": 62, "capit": 54, "case": [1, 57, 59, 60, 61, 62], "cat_param": [18, 20, 21, 22, 23], "cccc": 1, "cd": 53, "cdot": [1, 60], "center": [3, 32, 53, 54, 56, 58, 59, 61, 62], "characterist": 54, "check": [53, 55], "chemistri": 54, "choic": 56, "choleski": [1, 54], "choos": [41, 44, 53, 57], "chop": 57, "chosen": 1, "chosen_act": [42, 53, 57, 58], "citat": 52, "cite": 54, "citi": 54, "class": [6, 8, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 35, 37, 38, 41, 42, 44, 45, 46, 47, 50, 53, 55, 58, 59, 60, 61], "classif": 60, "clone": 53, "co": [1, 6], "coeffici": [1, 6], "collect": 57, "color": 57, "colorbar": 60, "column": [1, 33, 58], "com": [53, 54], "combo": 54, "comm": [41, 44, 57], "comm_world": 57, "command": 53, "common": 54, "commun": [54, 57], "compani": 54, "compar": 60, "compil": 51, "complex": [1, 53, 54], "compon": 16, "composit": [1, 54], "comput": [1, 6, 16, 23, 54, 58, 60], "computation": 54, "concatin": [20, 23], "condit": 1, "config": [4, 14, 19, 20, 31, 35, 38, 41, 44, 56], "configur": [14, 35], "consid": 1, "const": [17, 28, 56], "constant": 29, "constraint": 62, "constructor": 57, "consult": 51, "contact": 52, "content": [2, 60], "control": [53, 57, 58, 59], "convert": 29, "cooper": 51, "copyright": 54, "core": [3, 4, 10, 14, 17, 25], "corner": 60, "correct": 57, "correspond": [19, 41, 44, 58], "cost": 1, "costli": [1, 53, 54], "couckuyt": [48, 60], "cov": [3, 11, 12, 15, 16, 17, 20, 21, 41, 44, 56], "cov_const": [4, 15, 16], "cov_param": 21, "covari": [8, 10, 12, 14, 16, 20, 21, 23, 25, 27, 31, 38, 41, 44, 56], "cpc": 54, "creat": [53, 57], "criteria": [48, 60], "csv": [56, 58, 59, 61, 62], "cu": [56, 58], "cumul": 1, "current": [1, 23, 37, 53, 57, 58], "custom": 58, "d": [1, 6, 13, 19, 20, 21, 23, 25, 33, 41, 44, 50, 53, 57, 58, 60], "data": [1, 6, 8, 14, 20, 21, 29, 31, 42, 47, 54, 55, 57], "dataset": [8, 14, 20, 31, 41, 44, 47, 56, 59, 61, 62], "david": 60, "ddot": 1, "declar": 57, "decomp_param": [18, 20, 21, 22, 23], "decompos": [20, 21, 23], "decomposit": 1, "def": [56, 57, 58, 59, 60, 61, 62], "default": [6, 8, 10, 12, 13, 14, 16, 19, 20, 31, 38, 41, 42, 44, 47, 53, 57, 58], "defin": [1, 23, 29, 30, 38, 41, 44, 47, 53, 55, 58, 60, 61], "definit": [55, 56], "del": [57, 58, 59], "delet": [3, 31, 38, 50, 59], "delete_stat": [3, 4, 14, 17, 31, 38], "delete_t": [3, 50], "delete_x": [3, 50], "delete_z": [3, 50], "delimit": [56, 58, 59, 61, 62], "denot": [19, 20, 21, 23, 25, 33, 41, 44, 50], "densiti": 1, "depend": [57, 58], "deschrijv": 60, "describ": [1, 53, 61], "design": [54, 57], "detail": [1, 53, 54, 57, 58], "deterior": 60, "determin": 1, "dev": 53, "dev__at__issp": 51, "develop": [0, 52, 53], "deviat": [27, 33, 56], "dhaen": 60, "diag": [8, 10, 20, 21, 23, 25, 31], "diagon": [8, 10, 20, 21, 23, 25, 27], "diagonl": 31, "differ": [1, 53, 60, 61], "difficult": [51, 54], "dimens": [1, 6, 12, 30, 37, 53, 57, 58], "dimension": [1, 19, 20, 21, 23, 25, 27, 33, 41, 42, 44, 50, 53, 57, 58, 60], "dimenst": [41, 42, 44], "direct": [53, 58], "directori": 53, "dirk": 60, "discoveri": [47, 54], "discret": [3, 39, 44, 53, 57, 58, 59, 60, 61, 62], "discrete_multi": [3, 39, 60], "disp_marlik": [18, 19], "disp_pareto_set": [44, 49, 60], "displai": [19, 57, 60], "distribut": [1, 8, 41, 44, 47, 53, 54, 57, 60], "divide_non_dominated_region": [39, 46], "divis": 57, "do": [1, 53, 60], "doe": [14, 31, 58], "doi": 54, "dom_rul": 46, "domin": [3, 39, 46], "dominance_ratio": 46, "don": 53, "done": [1, 37, 56, 57, 58, 60, 62], "dot": 60, "draw": [8, 10, 12, 14, 20, 31], "driven": 54, "dtype": 46, "due": [54, 62], "dump": [38, 59], "dure": 51, "e": [1, 41, 42, 44, 51, 53, 54, 56, 57, 58, 60], "each": [1, 16, 19, 20, 21, 23, 25, 27, 31, 33, 38, 41, 42, 44, 50, 53, 57, 58, 59, 60, 61], "earli": 51, "easili": 60, "effect": 54, "effici": 60, "ehvi": [3, 39, 48], "ei": [1, 3, 39, 41, 44, 47, 53, 57, 58, 59, 61], "elaps": [41, 42, 44], "element": [16, 19, 23, 27], "empti": 30, "enabl": 57, "end": [1, 60], "energi": [19, 20, 23, 25, 27, 41, 42, 44, 50, 58], "eng": 60, "engin": 60, "ensurepip": 53, "enter": 51, "epoch": [19, 36, 37, 56, 62], "epsilon": [36, 37], "error": 56, "estim": [1, 54], "et": 48, "eta": 1, "etc": [1, 57], "eur": 60, "eval_marlik": [17, 18, 20, 24, 25], "eval_t": 19, "eval_x": 19, "evalu": [1, 20, 25, 53, 54, 55, 56, 57, 58, 59, 61], "everi": 1, "evolutionari": 60, "exact": [4, 8, 9, 17, 20, 24, 31], "exampl": [1, 56, 57, 58, 59, 61], "exceed": [1, 53], "execut": [51, 53, 55, 57, 58], "exist": [52, 55, 58, 60], "exp": [1, 27, 60], "expans": 23, "expect": [1, 41, 44, 47, 48, 53, 57, 58], "expens": 54, "experi": [1, 53, 54, 57, 58, 59], "experiment": [1, 53, 54], "explanatori": 1, "explor": [1, 53], "export": [20, 42], "export_all_sequence_best_fx": [40, 42, 53, 57, 58, 61], "export_blm": [18, 20], "export_front": [39, 46], "export_histori": [40, 41], "export_pareto_front": [43, 45, 60], "export_predictor": [40, 41], "export_sequence_best_fx": [40, 42, 61], "export_train": [40, 41], "extent": 60, "extern": [53, 57, 58, 59, 62], "f": [37, 41, 44, 57, 58], "fals": [19, 21, 23, 35, 41, 44, 46, 49, 56], "fast": [10, 48, 54, 60], "fbest": [53, 57, 58], "fcov": 56, "featur": [1, 6, 8, 10, 12, 13, 14, 19, 20, 21, 23, 25, 33, 41, 44, 50, 54], "few": [1, 54], "field": 54, "figsiz": 60, "figur": 60, "file": [23, 35, 38, 41, 42, 44, 50, 51, 53, 56, 57, 58, 59, 61, 62], "file_histori": [41, 44, 59], "file_nam": [23, 35, 38, 44, 50], "file_predictor": [41, 44, 59], "file_predictor_list": 44, "file_train": [41, 44, 59], "file_training_list": 44, "filenam": [42, 45], "fill": [29, 41, 42, 44], "fill_between": 57, "final": 57, "find": [1, 54, 56, 57, 58, 60], "first": [1, 8, 41, 44, 46, 53, 56, 57, 58], "fit": [3, 4, 14, 17, 18, 20, 31, 38, 56], "flag": 31, "flexibli": 59, "float": [8, 10, 12, 13, 14, 16, 20, 21, 23, 25, 31, 37, 41, 44, 47], "flow": [52, 62], "fmax": 47, "fmean": [12, 27, 48, 56], "follow": [1, 51, 53, 54, 56, 57, 58, 59, 60, 61, 62], "foral": 60, "forc": 60, "force_binary_search": 46, "form": 57, "format": [56, 57], "fourier": [4, 5, 12], "frac": 1, "from": [0, 1, 8, 21, 23, 35, 38, 41, 44, 50, 53, 54, 55, 56, 57, 58, 59, 60, 61], "front": 60, "front_num": 60, "frontier": 54, "fstd": 48, "full": 55, "funciton": [41, 44], "function": [1, 8, 12, 20, 23, 25, 27, 31, 37, 38, 41, 42, 44, 47, 50, 53, 54, 55, 56, 58, 59, 62], "fx": [42, 53, 57, 58, 60, 61], "fx_list": 57, "g": [1, 23, 37, 41, 42, 44, 53, 54, 57, 58], "gamma": [36, 37], "gauss": [4, 8, 11, 15, 17, 22, 26, 56], "gauss_elim": [3, 32], "gaussian": [1, 12, 16, 21, 23, 27, 41, 44, 52, 53, 54, 55, 57, 58], "gener": [1, 54, 56, 57, 60], "get": [20, 23, 27, 29, 38, 41, 42, 44, 50, 55, 59, 61], "get_basi": [3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 17, 31, 38], "get_cand_param": [18, 20, 22, 23, 26, 27, 28, 29], "get_cov": [11, 12, 15, 16, 18, 21, 22, 23, 26, 27], "get_grad": [22, 23, 26, 27, 28, 29, 30], "get_grad_cov": [18, 21], "get_grad_marlik": [17, 18, 20, 24, 25], "get_grad_mean": [18, 21], "get_mean": [11, 12, 13, 15, 16, 18, 21, 28, 29, 30], "get_one_upd": [18, 19], "get_params_bound": [18, 20, 22, 23, 26, 27, 28, 29], "get_post_fcov": [3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 24, 25, 31, 38, 40, 41, 43, 44, 56, 57], "get_post_fmean": [3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 24, 25, 31, 38, 40, 41, 43, 44, 56, 57], "get_post_param": [3, 4, 14, 17, 31, 38], "get_post_params_mean": [4, 7, 8, 9, 10], "get_post_params_sampl": [3, 38], "get_post_sampl": [3, 4, 14, 17, 31, 38], "get_prec": [11, 12, 15, 16], "get_predict_sampl": [3, 4, 14, 17, 31, 38], "get_scor": [40, 41, 43, 44, 57], "get_subset": [3, 50], "git": 53, "github": [51, 53], "give": [1, 19, 53, 58, 59], "given": [1, 41, 44, 47, 54, 56, 58], "global": 60, "good": [1, 54, 60], "gp": [2, 3, 53, 56], "gp_param": 56, "grad": [23, 36, 37], "grad_marlik": [20, 25], "gradiant": [20, 21, 23, 25], "gradient": [27, 37], "graduat": 54, "greater": [23, 27], "grid": [57, 60], "gt": [57, 58, 61], "guess": 19, "guidelin": 51, "h": [56, 58], "ha": [53, 54, 60], "half": [12, 16], "hand": 54, "handl": 54, "have": [1, 16, 51, 53, 56, 57, 58, 60], "here": [41, 44, 55, 57, 62], "high": 54, "higher": 53, "highest": 53, "histori": [39, 40, 41, 42, 43, 44, 45, 49, 53, 57, 58, 59, 60, 61], "hold": 29, "home": 53, "hour": [56, 58], "how": [53, 57], "http": [53, 54], "hvpi": [3, 39, 44, 48], "hyper": [19, 41, 44, 48, 56, 62], "hyperparamet": [1, 54, 57, 58], "hyperparemt": [41, 42, 44], "hypervolum": 48, "i": [1, 6, 19, 20, 21, 23, 25, 27, 38, 41, 42, 44, 46, 47, 50, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62], "id": [53, 55, 57, 58, 59, 60, 61], "id_al": 56, "id_test": 56, "id_train": 56, "ignor": 14, "ii": [53, 57, 58], "immedi": 56, "implement": [54, 60], "import": [56, 57, 58, 59, 60, 61, 62], "improv": [1, 41, 44, 47, 48, 53, 57, 58], "imshow": 60, "includ": 56, "independ": [16, 19, 23, 27], "index": [41, 42, 44, 50, 57], "indic": [57, 60], "inf": [3, 4, 8, 17, 20], "inferior": 60, "inform": [6, 23, 35, 38, 41, 42, 44, 51, 53, 56, 58, 61], "infti": 1, "ini": 35, "init_param": [28, 29], "init_params_search": [18, 19], "initi": [1, 8, 10, 13, 14, 19, 29, 31, 53, 56, 57, 58, 62], "initial_data": [41, 44, 62], "inlin": [57, 58, 60, 61], "innov": 60, "input": [6, 8, 10, 12, 13, 14, 20, 29, 31, 35, 37, 41, 44, 47, 51, 53, 56, 58, 60, 61], "insid": [53, 57, 58], "inst": 60, "instal": [51, 52], "instead": [53, 57, 58], "institut": [0, 54], "int": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 37, 41, 44, 50, 56, 57], "integ": [41, 44], "intel": 60, "interact": [52, 53, 55, 57, 58, 62], "interfac": [56, 58], "intern": 54, "interv": [41, 44, 49, 57, 58, 59, 60, 61, 62], "introduc": [1, 55, 56, 57], "introduct": [52, 55], "inv": 16, "is_disp": [19, 41, 44], "is_learn": [3, 39, 49], "isotrop": 16, "issn": 54, "issp": 53, "issu": 51, "iter": [1, 19], "itertool": [57, 60], "its": [51, 53, 57, 58], "itself": [41, 44, 60], "ivo": 60, "j": [54, 56, 58, 60], "journal": [54, 60], "jp": 51, "jpn": [56, 58], "june": 47, "k": [1, 56, 58], "kawashima": 54, "kazuyoshi": 54, "keep": 61, "kei": 54, "kernel": [1, 6, 8, 23], "keyword": [54, 57], "kind": 47, "kiyohara": [56, 58], "know": 1, "known": 1, "koji": 54, "krige": [56, 58], "kwarg": [37, 47, 48], "kwd": [31, 38], "l": [1, 6, 13, 19, 34], "label": [8, 10], "land": 60, "larg": [6, 54], "larger": 60, "largest": [1, 53, 54, 60], "lb": 46, "ldot": 1, "le": 60, "learn": [1, 3, 17, 18, 32, 35, 41, 42, 44, 53, 54, 55, 57, 58, 60, 62], "learning_config": 35, "least": [57, 58], "left": [1, 60, 62], "len": [14, 31, 56], "length_vector": [3, 39, 49], "less": [23, 27], "let": [57, 58, 60], "level": 53, "librari": 54, "licens": 52, "life": 54, "lik": [3, 4, 7, 8, 10, 17, 20, 56], "lik_param": 20, "like": 0, "likelifood": 20, "likelihood": [19, 20, 25, 27, 56, 62], "limit": 1, "linalg": 34, "line": [57, 58, 61], "line2d": [57, 58, 61], "linear": [1, 4, 8, 10, 11, 12, 14, 20, 53, 57, 58], "linspac": [57, 60], "list": [1, 20, 23, 27, 29, 41, 44, 53, 54, 60, 61, 62], "load": [3, 22, 23, 32, 35, 38, 40, 41, 42, 43, 44, 45, 50, 53, 56, 57, 58, 59, 61, 62], "load_data": [56, 58, 59, 61, 62], "load_predictor_list": [43, 44], "load_training_list": [43, 44], "loadtxt": [56, 58, 59, 61, 62], "log": [12, 16, 23, 27, 53], "logarithm": 23, "long": 62, "longleftrightarrow": 60, "loop": [53, 57, 58], "lower": [46, 60], "lt": [57, 58, 61], "m": [34, 36, 37, 53], "mach": 60, "machin": [1, 6, 54], "magn": 54, "mail": 51, "main": 52, "mainli": 54, "make": [1, 20, 54, 56], "manag": 54, "manderick": 60, "mani": 54, "manner": 1, "manual": 59, "map": [1, 6, 8, 10, 12, 13, 14, 20, 54], "margin": [19, 20, 25, 56, 62], "marlik": [20, 25], "match": 34, "materi": [0, 1, 47, 53, 54], "mathbf": 1, "mathcal": 1, "matplotlib": [57, 58, 60, 61], "matrix": [1, 6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 31, 33, 34, 41, 44, 50, 57, 58], "max": [1, 47, 54], "max_epoch": [19, 36, 37], "max_it": 19, "max_num_prob": [41, 44, 57, 58, 59, 60, 61, 62], "max_param": [20, 23, 27, 29], "max_scal": 23, "max_width": 23, "maxim": [1, 46, 53, 58, 60], "maximum": [1, 19, 23, 27, 29, 37, 41, 44, 47, 53, 57, 60], "mean": [1, 3, 8, 10, 12, 13, 14, 16, 17, 20, 21, 25, 31, 33, 38, 41, 44, 47, 56, 57, 58, 60], "mean_param": 21, "median": 29, "medic": 54, "merg": [41, 44], "messag": [41, 44, 60], "method": [1, 7, 8, 37, 53, 57, 58, 60], "min": 56, "min_param": [20, 23, 27, 29], "min_scal": 23, "min_width": 23, "mind": 61, "minim": [53, 58], "minimum": [19, 23, 27, 29, 57, 60], "misc": [2, 3, 14, 20, 53, 54, 56, 58, 59, 61, 62], "mizoguchi": [56, 58], "mode": [41, 44, 47, 48, 57], "model": [1, 4, 7, 10, 14, 17, 18, 25, 31, 38, 53, 54, 55, 57, 58, 59], "modul": [2, 52, 53], "more": [1, 53, 56, 57, 58, 60, 61], "motoyama": 54, "motoyama2022108405": 54, "mozilla": 54, "mpi": [41, 44, 57], "mpi4pi": 57, "mpl": 54, "mu": 1, "mu_c": 1, "multi": [41, 44, 52, 54, 55], "multiobject": [48, 60], "multipl": [52, 53, 55, 57, 58, 60], "multipli": [31, 57, 58, 60], "multivariate_norm": [31, 41, 44], "must": [31, 38, 56, 57], "mutat": 10, "n": [1, 6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 31, 33, 34, 41, 42, 44, 49, 50, 53, 56, 58, 60], "n_dim": 46, "name": [23, 35, 38, 41, 42, 44, 50], "nanoarchitecton": 54, "naoki": 54, "nation": 54, "nbasi": [5, 6, 7, 8, 11, 13, 15, 16], "ndarrai": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 34, 37, 41, 42, 44, 47, 56, 57], "need": 1, "neg": [19, 20, 23, 25, 27, 41, 42, 44, 50, 53, 57, 58], "neither": [41, 44], "netw": 60, "neural": [6, 60], "new": [10, 29, 46, 56, 60], "new_data_list": [43, 44], "newli": 1, "next": [1, 41, 42, 44, 53, 55, 57, 58, 59, 60], "nois": [8, 10, 14, 20, 27, 47], "non": [46, 60], "none": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 35, 38, 41, 42, 44, 45, 46, 47, 48, 49, 50, 59, 62], "nor": [41, 44], "normal": [33, 53, 56, 57, 58], "note": [1, 10, 41, 44, 56, 57, 60], "notimplementederror": 47, "now": [1, 57, 58], "np": [13, 31, 41, 44, 56, 57, 58, 59, 60, 61, 62], "nparam": [36, 37], "npz": [57, 58, 59], "ntest": 56, "ntrain": 56, "num_basi": [14, 20, 23, 31], "num_data": [21, 27, 29, 30], "num_dim": 23, "num_epoch": 19, "num_object": [44, 45, 46, 60], "num_param": [23, 27, 29], "num_rand_basi": [41, 44, 57, 58, 59, 60, 61, 62], "num_row": 50, "num_run": [42, 60], "num_search_each_prob": [41, 44, 61], "number": [1, 6, 8, 10, 13, 14, 16, 19, 20, 21, 23, 27, 29, 31, 37, 41, 42, 44, 53, 54, 56, 57, 58, 60, 61], "numer": [1, 53, 57, 58, 60], "numpi": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 37, 41, 42, 44, 47, 50, 53, 56, 57, 58, 59, 60, 61, 62], "nxn": 12, "o": 1, "object": [1, 6, 8, 12, 13, 16, 19, 20, 21, 23, 25, 27, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 47, 50, 52, 53, 54, 55, 56, 57, 58, 59], "obtain": [1, 56, 57, 58, 61, 62], "occupi": 60, "occur": 51, "oda": [56, 58], "off": 60, "oh": 60, "omega": 1, "omega_1": 1, "omega_l": 1, "onc": [52, 53, 55, 57, 58], "one": [1, 23, 53, 54, 56, 57, 58, 60], "one_run": [18, 19], "ones": 29, "onli": [8, 10, 41, 44, 47, 57, 58], "onlin": [3, 17, 18, 19, 32, 35], "open": [54, 62], "oper": 51, "opt": [2, 3, 53], "optim": [19, 20, 23, 25, 27, 37, 41, 42, 44, 48, 50, 52, 53, 54, 55, 56, 62], "optimaz": 53, "optimum": 57, "option": [8, 37, 53], "order": [1, 46, 56, 58, 60], "ordinari": [41, 44], "org": 54, "origin": [58, 60], "other": [1, 10, 16, 51, 53, 54, 57, 58, 60], "otherwis": 14, "output": [41, 44, 51, 53, 56], "outsid": [53, 57, 58, 59], "overview": 1, "overwrit": 42, "overwritten": [31, 38], "p": [1, 60], "packag": [2, 54], "page": [47, 51, 54], "pair": 60, "parallel": [41, 44, 55], "param": [5, 6, 11, 12, 13, 15, 16, 19, 20, 21, 23, 25, 27, 29, 30, 36, 37, 56], "paramet": [1, 6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 38, 41, 42, 44, 46, 47, 50, 53, 54, 55, 56, 57, 58, 59], "pareto": [3, 39, 44, 48], "part": 54, "pass": [37, 53, 57, 60], "pattersonafb": 60, "peak": 60, "per": [56, 58], "perform": [1, 19, 41, 44, 53, 54, 55, 56, 59, 62], "phi": 1, "phy": [56, 58], "phybo": 58, "physbo": [0, 51, 53, 55, 56, 60, 61], "physic": [0, 54], "pi": [1, 3, 39, 41, 44, 47, 53, 57, 58], "pickl": 38, "piec": 1, "pii": 54, "pip": 53, "pip3": 53, "pleas": [1, 51, 53, 54, 56, 57, 58], "plot": [55, 57, 58, 61], "plot_pareto_front": 60, "plt": [57, 58, 60, 61], "point": [46, 53, 57, 60, 62], "polici": [39, 40, 43, 53, 55, 59, 61, 62], "polycollect": 57, "posit": 60, "possibl": [1, 53, 54, 56, 57, 58, 59], "post": [41, 44, 57], "post_sampl": [7, 8, 18, 20], "posterior": [1, 8, 10, 14, 20, 25, 31, 47, 53, 60], "pp": 6, "pre": 56, "prec": [15, 16, 60], "precis": [12, 16], "precomput": 55, "predicetd": 53, "predict": [1, 14, 31, 38, 53, 54, 55, 59], "predict_sampl": [7, 8, 18, 20], "predictor": [2, 3, 4, 17, 20, 41, 42, 44, 47, 53, 59], "predictor_list": [44, 48], "prepar": [1, 3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 22, 23, 24, 25, 31, 38, 53, 55], "preprocess": 53, "present": 57, "previou": [59, 61, 62], "print": [6, 20, 56, 57, 58, 62], "print_param": [18, 20, 22, 23, 56], "prior": [3, 4, 7, 8, 17, 18, 20, 56], "prior_param": 20, "probabl": [1, 41, 44, 47, 48, 53, 57, 58], "problem": [1, 46, 51, 53, 54, 56, 57, 58, 60], "proc": 60, "procedur": 56, "process": [1, 6, 21, 41, 44, 52, 53, 54, 55, 57, 58, 59, 62], "product": 60, "project": [0, 54], "properti": [1, 42, 45, 53, 54], "propos": [53, 57, 58, 59], "protocol": 38, "psi": [6, 8, 10, 12, 13, 14], "public": 54, "py": [41, 44, 53], "pypi": 53, "pyplot": [57, 58, 60, 61], "python": [53, 54], "python3": 53, "q": 60, "question": 51, "quick": 10, "rahimi": 6, "rais": [41, 44, 47], "rand_expan": [22, 23], "random": [1, 6, 8, 13, 31, 41, 44, 54, 56, 59, 61, 62], "random_search": [40, 41, 43, 44, 53, 57, 58, 59, 60, 61], "randomli": [53, 56, 60], "rang": [57, 58, 60, 62], "rank": [41, 44, 54], "rather": [53, 57, 58], "raw": 12, "re": [53, 57, 58, 60, 61], "read": [52, 55, 56], "real": [1, 19, 23, 27, 53, 54, 56], "receiv": [41, 44, 58], "recht": 6, "recommend": [53, 60], "recov": 23, "rectangl": [3, 39, 46, 60], "red": 60, "reduc": [1, 54, 60], "reduced_candidate_num": 48, "ref_max": [46, 60], "ref_min": [46, 60], "refer": [1, 6, 48, 52, 53, 54, 56, 57, 58, 60], "reference_max": 46, "reference_min": 46, "refernc": 60, "region": 23, "regist": [53, 55, 56, 57, 58, 59], "regress": [1, 53, 54, 56], "relat": [1, 60], "relax": [56, 58], "repeat": [1, 54, 60, 62], "replac": [51, 56], "report": 51, "repositori": 53, "repres": [1, 19, 41, 44, 58], "requir": [57, 58], "res_al": 60, "res_ehvi": 60, "res_hvpi": 60, "res_random": 60, "res_t": 60, "research": [51, 54], "reserv": 54, "reset": [14, 18, 19], "reshap": [56, 57, 60], "resolv": 51, "respect": [33, 57, 58, 60], "restart": [52, 55], "result": [1, 29, 39, 40, 41, 43, 44, 52, 53, 55, 56, 59], "retriev": 57, "return": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 41, 42, 44, 47, 50, 53, 56, 57, 58, 59, 60, 61, 62], "right": [1, 54, 60], "rotat": 53, "roughli": 60, "row": [1, 19, 20, 21, 23, 25, 33, 41, 44, 50, 58], "rule": [46, 60], "run": [18, 19, 36, 37, 41, 42, 44, 52, 53, 55, 56, 57, 58, 61, 62], "runtimeerror": [41, 44], "ryo": 54, "s0010465522001242": 54, "s5": [56, 58, 59, 61, 62], "saba": 60, "same": [16, 41, 44, 53, 56, 60, 61], "sampl": [1, 4, 7, 8, 9, 10, 11, 12, 14, 18, 20, 21, 26, 27, 31, 38, 41, 44, 47, 53, 54, 57, 58, 59, 62], "satisfi": [1, 60], "save": [3, 22, 23, 38, 40, 41, 42, 43, 44, 45, 50, 53, 56, 57, 58, 59, 61, 62], "save_predictor_list": [43, 44], "save_training_list": [43, 44], "savez_compress": 50, "scalabl": 54, "scale": [6, 23, 58], "scatter": 60, "school": [54, 60], "scienc": [0, 54], "sciencedirect": 54, "scientif": 54, "scikit": 54, "scipi": [34, 53, 57], "score": [1, 3, 38, 39, 41, 44, 48, 49, 53, 57, 58, 59, 60, 61, 62], "score_multi": [3, 39], "screen": 54, "search": [1, 2, 3, 19, 20, 21, 23, 25, 27, 32, 33, 35, 50, 52, 53, 54, 55], "search_config": 35, "search_result": [57, 58], "sec": 47, "second": 53, "section": [1, 53, 56, 57, 58], "see": [47, 53, 54, 57, 58, 60], "seed": [41, 57, 58, 59, 61, 62], "seen": 1, "select": [1, 50, 53, 54, 56, 57, 58, 60], "self": [6, 12, 13, 14, 16, 31, 37, 38, 41, 44, 50, 57, 58, 59, 60, 61], "send": 51, "separ": [53, 57, 58, 59], "septemb": 54, "sequenc": 42, "serial": 55, "serv": 57, "set": [1, 12, 13, 14, 16, 20, 21, 23, 27, 29, 31, 38, 41, 44, 46, 47, 50, 53, 55, 59, 61, 62], "set_bia": [11, 12, 13], "set_config": [3, 14, 20, 32, 56], "set_cov_param": [18, 21], "set_mean_param": [18, 21], "set_param": [5, 6, 11, 12, 13, 15, 16, 18, 20, 21, 22, 23, 26, 27, 28, 29, 30, 36, 37, 56], "set_reference_max": [39, 46], "set_reference_min": [39, 46], "set_se": [40, 41, 57, 58, 59, 60, 61, 62], "setup": [56, 58], "sever": [56, 58], "shape": [34, 56, 60], "should": [53, 56, 57, 58], "show": [5, 6, 23, 32, 35, 59, 60], "show_interactive_mod": [3, 39, 49], "show_search_result": [3, 39, 49, 59], "show_search_results_mo": [3, 39, 49], "show_start_message_multi_search": [3, 39, 49], "shown": 53, "sigma": 1, "sigma2": [15, 16], "sigma_c": 1, "sim": 61, "simeq": 1, "similar": [1, 56], "simu": 60, "simu_spars": 60, "simul": [1, 41, 42, 44, 49, 53, 54, 55, 62], "sinc": [57, 58, 60], "singl": [56, 60, 61], "situat": [1, 53], "size": [13, 19, 23, 27, 41, 44, 60, 62], "skip": 58, "skiprow": [56, 58, 59, 61, 62], "so": [1, 53, 57, 58], "softwar": [0, 54], "solid": [0, 54], "solut": [19, 34, 53, 57], "solv": [1, 54, 58, 60], "solve_triangular": 34, "some": [53, 57, 58], "sort": [46, 60], "sourc": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 38, 41, 42, 44, 45, 46, 47, 48, 49, 50, 53], "space": [1, 53, 55, 60], "specifi": [20, 50, 51, 53, 57, 58, 59, 60, 61], "split": [41, 44, 60], "sqrt": [1, 57, 60], "squar": 56, "stabl": [56, 58], "stage": [1, 53], "standard": [27, 33, 54, 56, 58], "star": 60, "start": [1, 56, 58, 62], "stat": [7, 8, 10, 11, 12, 25], "state": [0, 54], "statu": [31, 38], "std": [27, 56, 57], "step": [1, 41, 42, 44, 53, 57, 58, 59, 61], "step1": 1, "step2": 1, "step3": 1, "store": [41, 42, 44, 56, 62], "str": [8, 23, 35, 38, 41, 42, 44, 47, 50], "strictli": 1, "structur": [1, 52, 54, 56, 58], "sub_sampl": [18, 20], "subdirectori": [56, 59, 61, 62], "submodul": [2, 52], "subpackag": [2, 52], "subplot": 57, "subset": [20, 50], "subspac": 60, "subt": 20, "subx": 20, "suit": 53, "suitabl": 59, "sum": 60, "sum_": 60, "supp_param": [22, 23, 26, 27, 28, 29], "support": [0, 54], "suspend": 55, "symp": 60, "system": [6, 34, 51], "t": [1, 3, 8, 10, 19, 20, 23, 25, 27, 29, 34, 39, 41, 42, 44, 45, 46, 47, 48, 49, 50, 53, 56, 57, 58, 59, 61, 62], "t1": 46, "t2": 46, "t_initi": 62, "t_test": 56, "t_train": 56, "take": [1, 23, 56, 58, 60], "tamura": 54, "target": [8, 10, 56], "task": [1, 53, 54, 60], "tech": 60, "technic": [1, 54], "techniqu": [1, 54], "terayama": 54, "test": [1, 14, 21, 25, 31, 47, 48, 55, 56], "test_x": [41, 44, 57, 58, 59, 60, 61, 62], "test_x_spars": 60, "text": 1, "th": [56, 57, 58, 59, 62], "than": [23, 27, 53, 57, 58, 60], "thank": [0, 51], "them": [23, 53, 56, 60], "therefor": [1, 56, 58], "thi": [1, 14, 23, 27, 31, 38, 47, 53, 54, 56, 57, 58, 59, 60, 61, 62], "thompson": [1, 41, 44, 47, 53, 54, 57, 58], "those": [20, 21], "through": [54, 55], "thu": [61, 62], "time": [1, 41, 42, 44, 53, 54, 57, 58, 60, 61, 62], "time_get_act": [40, 41, 42, 43, 44, 45], "time_run_simul": [40, 41, 42, 43, 44, 45], "time_tot": [40, 41, 42, 43, 44, 45], "time_update_predictor": [40, 41, 42, 43, 44, 45], "titl": [54, 60], "tokyo": [0, 51, 54], "tom": 60, "tool": 54, "top": 1, "total": [20, 21, 23, 29, 41, 42, 44, 53, 57, 58, 61], "total_num_research": 42, "total_num_search": [53, 57, 58, 61], "trade": 60, "train": [1, 8, 14, 20, 31, 41, 44, 47, 55, 57, 58, 59], "training_list": [44, 48], "trans_param": [26, 27], "transform": [56, 57], "transpos": 6, "treat": 58, "triangular": 34, "true": [8, 10, 20, 21, 23, 25, 31, 35, 41, 44, 60], "try": [58, 60], "tsuda": [54, 56, 58], "tsuyoshi": 54, "tune": [31, 41, 44, 54], "tupl": [6, 8, 10, 20, 23, 27], "tuppl": [23, 25, 29], "tutori": [52, 53, 56, 57, 58, 59, 60, 61, 62], "two": [1, 53, 57, 58, 59, 60, 61], "type": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 35, 37, 41, 44, 47, 50, 53, 57, 58], "u": [1, 10, 34, 51, 53], "ub": 46, "ueno": 54, "uncertainti": 1, "under": [53, 54], "uniformli": 1, "univers": [0, 54], "unknown": 47, "up": [1, 53, 57, 58], "updat": [1, 3, 4, 6, 8, 10, 14, 17, 20, 31, 36, 37, 38, 41, 42, 44, 46, 53, 54, 60], "update_front": [39, 46], "update_stat": [4, 7, 8, 9, 10], "upper": [46, 60], "us": [1, 8, 14, 16, 19, 20, 29, 30, 31, 34, 38, 41, 44, 47, 50, 51, 53, 54, 56, 57, 58, 59, 60, 62], "usabl": [0, 54], "usag": [52, 55, 60], "user": 53, "usual": 60, "util": [3, 39, 59], "v": [36, 37], "v2": 54, "valid": 1, "valu": [1, 6, 8, 12, 13, 14, 16, 20, 21, 23, 25, 27, 29, 31, 38, 41, 42, 44, 47, 50, 53, 54, 55, 56, 57, 58, 59, 61], "van": 60, "var": 57, "variabl": [1, 2, 3, 14, 19, 23, 27, 31, 38, 41, 44, 47, 53, 57, 59, 62], "varianc": [1, 8, 10, 12, 14, 16, 21, 31, 56, 57, 58], "variat": [41, 44], "vdot": 1, "vec": 60, "vector": [1, 13, 19, 20, 21, 23, 25, 33, 41, 44, 50, 53, 58], "veldhuizen": 60, "ver": 54, "veri": [1, 53, 54], "version": [38, 51, 54], "via": [54, 57], "vlmop2": 60, "vlmop2_minu": 60, "vmax": 60, "vmin": 60, "volum": [47, 48, 54], "volume_in_domin": [39, 46, 60], "w": [1, 6, 8, 10, 23], "w_mu": [8, 10], "wa": [57, 58], "wai": [53, 57, 58, 59], "want": [41, 44, 53, 56, 58, 59, 60], "we": [0, 1, 53, 54, 56, 57, 58, 59, 60, 62], "weight": [6, 8, 10, 12, 13, 14], "well": 53, "when": [1, 23, 27, 41, 44, 51, 53, 54, 57, 58, 60, 61], "where": [1, 6, 19, 23, 27, 53, 54, 58, 60, 62], "which": [1, 19, 41, 42, 44, 60], "while": [10, 56], "whose": 50, "width": 23, "window_num": 57, "without": [57, 58], "word": [1, 53, 54, 57, 58, 60], "world": [1, 53, 54], "would": 0, "wright": 60, "write": [40, 41, 42, 43, 44, 45, 59], "wt": 6, "www": 54, "x": [1, 6, 8, 10, 12, 13, 14, 19, 20, 21, 23, 25, 31, 33, 37, 41, 44, 50, 56, 57, 58, 59, 60, 61, 62], "x_": 56, "x_1": 60, "x_2": 60, "x_i": 60, "x_list": 57, "x_max": 57, "x_min": 57, "x_n": 60, "x_new": 56, "x_normal": 33, "x_opt": 57, "x_test": 56, "x_train": 56, "xlabel": 60, "xlim": 60, "xtest": 8, "y": [1, 60], "y1": 60, "y2": 60, "y_": 1, "y_1": 60, "y_2": 60, "y_i": [1, 60], "y_j": 60, "y_p": 60, "yahyaa": 60, "year": 54, "yet": [1, 14, 41, 44, 57, 58], "ylabel": 60, "ylim": 60, "yokohama": 54, "yoshimi": 54, "you": [41, 44, 51, 53, 56, 57, 58, 59, 60, 61, 62], "your": 51, "yourself": [41, 44], "yuichi": 54, "z": [1, 20, 21, 23, 25, 50], "z_": 1, "zero": [17, 28, 41, 44]}, "titles": ["Acknowledgement", "Algorithm", "physbo", "physbo package", "physbo.blm package", "physbo.blm.basis package", "physbo.blm.basis.fourier module", "physbo.blm.core package", "physbo.blm.core.model module", "physbo.blm.inf package", "physbo.blm.inf.exact module", "physbo.blm.lik package", "physbo.blm.lik.gauss module", "physbo.blm.lik.linear module", "physbo.blm.predictor module", "physbo.blm.prior package", "physbo.blm.prior.gauss module", "physbo.gp package", "physbo.gp.core package", "physbo.gp.core.learning module", "physbo.gp.core.model module", "physbo.gp.core.prior module", "physbo.gp.cov package", "physbo.gp.cov.gauss module", "physbo.gp.inf package", "physbo.gp.inf.exact module", "physbo.gp.lik package", "physbo.gp.lik.gauss module", "physbo.gp.mean package", "physbo.gp.mean.const module", "physbo.gp.mean.zero module", "physbo.gp.predictor module", "physbo.misc package", "physbo.misc.centering module", "physbo.misc.gauss_elim module", "physbo.misc.set_config module", "physbo.opt package", "physbo.opt.adam module", "physbo.predictor module", "physbo.search package", "physbo.search.discrete package", "physbo.search.discrete.policy module", "physbo.search.discrete.results module", "physbo.search.discrete_multi package", "physbo.search.discrete_multi.policy module", "physbo.search.discrete_multi.results module", "physbo.search.pareto module", "physbo.search.score module", "physbo.search.score_multi module", "physbo.search.utility module", "physbo.variable module", "Contact", "Welcome to PHYSBO\u2019s documentation!", "Basic usage", "Introduction", "Tutorials", "Gaussian process", "Basic usage of PHYSBO", "Basic usage of PHYSBO", "Running PHYSBO interactively", "Multi-objective optimization", "Search multiple candidates at once", "Restart calculations by reading existing calculation results"], "titleterms": {"": 52, "about": 54, "acceler": 1, "acknowledg": 0, "acquisit": 57, "action": 62, "adam": 37, "algorithm": 1, "appendix": 60, "base": 60, "basi": [5, 6], "basic": [53, 57, 58], "bayesian": [1, 57, 58, 60], "blm": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "calcul": [53, 60, 62], "candid": [56, 58, 59, 60, 61, 62], "center": 33, "check": [57, 58, 60, 61], "citat": 54, "class": 57, "const": 29, "contact": 51, "content": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43, 52, 55], "core": [7, 8, 18, 19, 20, 21], "cov": [22, 23], "data": [56, 58, 59, 60, 61, 62], "defin": [56, 57], "definit": [58, 59, 60, 61], "develop": 54, "discret": [40, 41, 42], "discrete_multi": [43, 44, 45], "document": 52, "domin": 60, "download": 53, "ehvi": 60, "evalu": [60, 62], "exact": [10, 25], "execut": [59, 62], "exist": 62, "expect": 60, "first": 60, "flow": 53, "fourier": 6, "from": 62, "full": 60, "function": [57, 60], "gauss": [12, 16, 23, 27], "gauss_elim": 34, "gaussian": 56, "get": 62, "gp": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "hvpi": 60, "hyper": 60, "hypervolum": 60, "id": 62, "improv": 60, "inf": [9, 10, 24, 25], "instal": 53, "interact": 59, "introduct": [54, 57, 58], "learn": [19, 56], "licens": 54, "lik": [11, 12, 13, 26, 27], "linear": 13, "main": 54, "mean": [28, 29, 30], "misc": [32, 33, 34, 35], "model": [8, 20, 56], "modul": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "multi": 60, "multipl": 61, "next": 62, "object": 60, "obtain": 60, "onc": 61, "opt": [36, 37], "optim": [1, 57, 58, 59, 60, 61], "packag": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43, 53], "parallel": 57, "paramet": 62, "pareto": [46, 60], "perform": [57, 58, 60, 61], "physbo": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 54, 57, 58, 59, 62], "plot": 60, "polici": [41, 44, 57, 58, 60], "precomput": 62, "predict": [56, 57], "predictor": [14, 31, 38], "prepar": [56, 58, 59, 60, 61, 62], "prior": [15, 16, 21], "probabl": 60, "process": 56, "random": [57, 58, 60], "read": 62, "region": 60, "regist": 62, "requir": 53, "restart": [59, 62], "result": [42, 45, 57, 58, 60, 61, 62], "run": 59, "sampl": 60, "score": 47, "score_multi": 48, "search": [39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 56, 57, 58, 59, 60, 61, 62], "second": 60, "serial": [57, 58], "set": [57, 58, 60], "set_config": 35, "simul": [57, 58, 59, 60, 61], "solut": 60, "space": 57, "structur": 53, "submodul": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43], "subpackag": [3, 4, 17, 39], "suspend": 59, "t": 60, "test": 60, "thompson": 60, "train": 56, "tutori": 55, "uninstal": 53, "usag": [53, 57, 58], "util": 49, "valu": [60, 62], "variabl": 50, "volum": 60, "welcom": 52, "zero": 30}}) \ No newline at end of file diff --git a/manual/v2.0.2/ja/.buildinfo b/manual/v2.0.2/ja/.buildinfo new file mode 100644 index 00000000..e1e00368 --- /dev/null +++ b/manual/v2.0.2/ja/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e087a1f9ab948315b2ebffe312abfb6f +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_basic_15_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_15_1.png new file mode 100644 index 00000000..2f357d0e Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_15_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_basic_16_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_16_1.png new file mode 100644 index 00000000..4f591a9d Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_16_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_basic_25_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_25_1.png new file mode 100644 index 00000000..a6a80bcb Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_25_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_basic_27_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_27_1.png new file mode 100644 index 00000000..8487778a Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_basic_27_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_12_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_12_0.png new file mode 100644 index 00000000..a13db00e Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_12_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_14_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_14_0.png new file mode 100644 index 00000000..071ddc70 Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_14_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_28_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_28_0.png new file mode 100644 index 00000000..08be0187 Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_28_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_35_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_35_0.png new file mode 100644 index 00000000..520a8baa Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_35_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_41_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_41_0.png new file mode 100644 index 00000000..5ac1f3b1 Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_41_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_47_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_47_0.png new file mode 100644 index 00000000..a9be02f0 Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_47_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_53_0.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_53_0.png new file mode 100644 index 00000000..4ce45ecd Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_objective_53_0.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_11_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_11_1.png new file mode 100644 index 00000000..abf8f9ac Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_11_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_12_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_12_1.png new file mode 100644 index 00000000..35208da7 Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_12_1.png differ diff --git a/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_14_1.png b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_14_1.png new file mode 100644 index 00000000..d1da680b Binary files /dev/null and b/manual/v2.0.2/ja/_images/notebook_tutorial_multi_probe_14_1.png differ diff --git a/manual/v2.0.2/ja/_modules/index.html b/manual/v2.0.2/ja/_modules/index.html new file mode 100644 index 00000000..6fc92590 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/index.html @@ -0,0 +1,198 @@ + + + + + + + + 概要: モジュールコード — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/basis/fourier.html b/manual/v2.0.2/ja/_modules/physbo/blm/basis/fourier.html new file mode 100644 index 00000000..feadff21 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/basis/fourier.html @@ -0,0 +1,329 @@ + + + + + + + + physbo.blm.basis.fourier — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.basis.fourier のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# -*- coding:utf-8 -*-
+import numpy as np
+
+
+
+[ドキュメント] +class fourier: + """ + random feature maps + ``Psi(X; W,b) = cos[X * Wt + b] * alpha`` + where + + - X: input, N-by-d matrix + - W: weight, l-by-d matrix + - Wt: transpose of W + - b: bias, 1-by-l matrix + - alpha: coefficient + + and + + - N: number of data + - d: dimension of input + - l: number of basis + + Attributes + ========== + params: Tuple + W, b, alpha + nbasis: int + number of basis + + References + ========== + A. Rahimi and B. Recht, "Random features for large-scale kernel machines," + in "Advances in neural information processing systems," 2007, pp. 1177-1184. + """ + + def __init__(self, params): + """ + Parameters + ---------- + params: Tuple + W, b, alpha + """ + self._check_params(params) + self._check_len_params(params) + self.params = params + self.nbasis = self.params[1].shape[0] + +
+[ドキュメント] + def get_basis(self, X, params=None): + """ + compute the value of basis + + Parameters + ========== + X: numpy.ndarray + input + params: Tuple + W, b, alpha + (default: self.params) + + Returns + ======= + Psi(X; W,b): numpy.ndarray + N-by-l matrix + + ``cos[X * Wt + b] * alpha`` + + where ``Wt`` is the transpose of ``W``. + """ + if params is None: + params = self.params + + self._check_params(params) + self._check_len_params(params) + + return np.cos(np.dot(X, params[0].transpose()) + params[1]) * params[2]
+ + +
+[ドキュメント] + def set_params(self, params): + """ + update basis parameters + + Parameters + ========== + params: tuple + W, b, alpha + + """ + self._check_params(params) + self._check_len_params(params) + self.params = params
+ + +
+[ドキュメント] + def show(self): + """ + print parameters + """ + print("W = ", self.params[0]) + print("b = ", self.params[1]) + print("alpha = ", self.params[2])
+ + + def _check_params(self, params): + """ + Parameters + ========== + params: tuple + W, b, alpha + + Raises + ====== + ValueError + if ``params`` is not a 3-dimensional tuple + """ + if not isinstance(params, tuple): + raise ValueError("The variable < params > must be a tuple.") + + if len(params) != 3: + raise ValueError("The variable < params > must be 3-dimensional tuple.") + + def _check_len_params(self, params): + """ + Parameters + ========== + params: tuple + W, b, alpha + + + Raises + ====== + ValueError + when dim of W and b are mismatch + or alpha is not a scalar + """ + if params[0].shape[0] != params[1].shape[0]: + raise ValueError( + "The length of 0-axis of W must be same as the length of b." + ) + + if hasattr(params[2], "__len__"): + if len(params[2]) != 1: + raise ValueError("The third entry of <params> must be a scalar.") + else: + if isinstance(params[2], str): + raise ValueError("The third entry of <params> must be a scalar.")
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/core/model.html b/manual/v2.0.2/ja/_modules/physbo/blm/core/model.html new file mode 100644 index 00000000..1c3449a5 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/core/model.html @@ -0,0 +1,453 @@ + + + + + + + + physbo.blm.core.model — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.core.model のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+from .. import inf
+
+
+
+[ドキュメント] +class model: + """ + Baysean Linear Model + + Attributes + ========== + prior: physbo.blm.prior.gauss + prior distribution of weights + lik: physbo.blm.lik.gauss + kernel + nbasis: int + number of features in random feature map + stats: Tuple + auxially parameters for sampling + method: str + sampling method + """ + + def __init__(self, lik, prior, options={}): + self.prior = prior + self.lik = lik + self.nbasis = self.lik.linear.basis.nbasis + self._init_prior(prior) + self._set_options(options) + self.stats = () + +
+[ドキュメント] + def prepare(self, X, t, Psi=None): + """ + initializes model by using the first training dataset + + Parameters + ========== + X: numpy.ndarray + inputs + t: numpy.ndarray + target (label) + Psi: numpy.ndarray + feature maps + + See also + ======== + physbo.blm.inf.exact.prepare + """ + if self.method == "exact": + inf.exact.prepare(blm=self, X=X, t=t, Psi=Psi) + else: + pass
+ + +
+[ドキュメント] + def update_stats(self, x, t, psi=None): + """ + updates model by using another training data + + Parameters + ========== + x: numpy.ndarray + input + t: float + target (label) + psi: numpy.ndarray + feature map + + See also + ======== + physbo.blm.inf.exact.update_stats + """ + if self.method == "exact": + self.stats = inf.exact.update_stats(self, x, t, psi) + else: + pass
+ + +
+[ドキュメント] + def get_post_params_mean(self): + """ + calculates posterior mean of weights + + Returns + ======= + numpy.ndarray + + See also + ======== + physbo.blm.inf.exact.get_post_params_mean + """ + if self.method == "exact": + self.lik.linear.params = inf.exact.get_post_params_mean(blm=self)
+ + +
+[ドキュメント] + def get_post_fmean(self, X, Psi=None, w=None): + """ + calculates posterior mean of model (function) + + Parameters + ========== + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + w: numpy.ndarray + weight + + See also + ======== + physbo.blm.inf.exact.get_post_fmean + """ + if self.method == "exact": + fmu = inf.exact.get_post_fmean(self, X, Psi, w) + else: + pass + return fmu
+ + +
+[ドキュメント] + def sampling(self, w_mu=None, N=1, alpha=1.0): + """ + draws samples of weights + + Parameters + ========== + blm: physbo.blm.core.model + model + w_mu: numpy.ndarray + mean of weight + N: int + the number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + samples of weights + + See also + ======== + physbo.blm.inf.exact.sampling + """ + if self.method == "exact": + w_hat = inf.exact.sampling(self, w_mu, N, alpha=alpha) + else: + pass + return w_hat
+ + +
+[ドキュメント] + def post_sampling(self, Xtest, Psi=None, N=1, alpha=1.0): + """ + draws samples of mean value of model + + Parameters + ========== + Xtest: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: ``blm.lik.get_basis(Xtest)``) + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = self.lik.get_basis(Xtest) + w_hat = self.sampling(N=N, alpha=alpha) + return Psi.dot(w_hat) + self.lik.linear.bias
+ + +
+[ドキュメント] + def predict_sampling(self, Xtest, Psi=None, N=1): + """ + draws samples from model + + Parameters + ========== + Xtest: numpy.ndarray + inputs + Psi: numpy.ndarray + feature map + (default: ``blm.lik.get_basis(Xtest)``) + N: int + number of samples + (default: 1) + + Returns + ======= + numpy.ndarray + """ + if Xtest.shape[0] == 0: + return np.zeros((0, N)) + fmean = self.post_sampling(Xtest, Psi, N=N) + A = np.random.randn(Xtest.shape[0], N) + return fmean + np.sqrt(self.lik.cov.sigma2) * A
+ + +
+[ドキュメント] + def get_post_fcov(self, X, Psi=None, diag=True): + """ + calculates posterior covariance of model + + Parameters + ========== + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + diag: bool + if True, returns only variances as a diagonal matrix + (default: True) + + Returns + ======= + numpy.ndarray + + See also + ======== + physbo.blm.inf.exact.get_post_fcov + """ + if self.method == "exact": + fcov = inf.exact.get_post_fcov(self, X, Psi, diag=True) + else: + pass + return fcov
+ + + def _set_options(self, options): + """ + read options + + Parameters + ========== + options: dict + + - 'method' : sampling method + + - 'exact' (default) + """ + self.method = options.get("method", "exact") + + def _init_prior(self, prior): + """ + sets the prior distribution + + Parameters + ========== + prior: physbo.blm.prior.gauss + if None, prior.gauss(self.nbasis) + """ + if prior is None: + prior = prior.gauss(self.nbasis) + self.prior = prior
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/inf/exact.html b/manual/v2.0.2/ja/_modules/physbo/blm/inf/exact.html new file mode 100644 index 00000000..afc2d03e --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/inf/exact.html @@ -0,0 +1,379 @@ + + + + + + + + physbo.blm.inf.exact — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.inf.exact のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+import physbo.misc as misc
+
+
+
+[ドキュメント] +def prepare(blm, X, t, Psi=None): + """ + initializes auxiaialy parameters for quick sampling + + ``blm.stats`` will be updated. + + Parameters + ========== + blm: physbo.blm.core.model + model + X: numpy.ndarray + inputs + t: numpy.ndarray + target (label) + Psi: + feature maps (default: blm.lik.get_basis(X)) + """ + if Psi is None: + Psi = blm.lik.get_basis(X) + PsiT = Psi.transpose() + G = np.dot(PsiT, Psi) * blm.lik.cov.prec + A = G + blm.prior.get_prec() + U = scipy.linalg.cholesky(A, check_finite=False) + b = PsiT.dot(t - blm.lik.linear.bias) + alpha = misc.gauss_elim(U, b) + blm.stats = (U, b, alpha)
+ + + +
+[ドキュメント] +def update_stats(blm, x, t, psi=None): + """ + calculates new auxiaialy parameters for quick sampling by fast-update + + Parameters + ========== + blm: physbo.blm.core.model + model + x: numpy.ndarray + input + t: numpy.ndarray + target (label) + psi: + feature map (default: blm.lik.get_basis(X)) + + Returns + ======= + (U, b, alpha): Tuple + new auxially parameters + + Notes + ===== + ``blm.stats[0]`` (U) will be mutated while the others not. + """ + if psi is None: + psi = blm.lik.get_basis(x) + U = blm.stats[0] + b = blm.stats[1] + (t - blm.lik.linear.bias) * psi + misc.cholupdate(U, psi * np.sqrt(blm.lik.cov.prec)) + alpha = misc.gauss_elim(U, b) + return (U, b, alpha)
+ + + +
+[ドキュメント] +def sampling(blm, w_mu=None, N=1, alpha=1.0): + """ + draws samples of weights + + Parameters + ========== + blm: physbo.blm.core.model + model + w_mu: numpy.ndarray + mean of weight + N: int + the number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + samples of weights + """ + if w_mu is None: + w_mu = get_post_params_mean(blm) + if N == 1: + z = np.random.randn(blm.nbasis) * alpha + else: + z = np.random.randn(blm.nbasis, N) * alpha + + U = blm.stats[0] + invUz = scipy.linalg.solve_triangular( + U, z, lower=False, overwrite_b=False, check_finite=False + ) + return (invUz.transpose() + w_mu).transpose()
+ + + +
+[ドキュメント] +def get_post_params_mean(blm): + """ + calculates mean of weight + + Parameters + ========== + blm: physbo.blm.core.model + + Returns + ======= + numpy.ndarray + """ + return blm.stats[2] * blm.lik.cov.prec
+ + + +
+[ドキュメント] +def get_post_fmean(blm, X, Psi=None, w=None): + """ + calculates posterior mean of model + + Parameters + ========== + blm: physbo.blm.core.model + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + w: numpy.ndarray + weights + (default: get_post_params_mean(blm)) + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = blm.lik.linear.basis.get_basis(X) + + if w is None: + w = get_post_params_mean(blm) + return Psi.dot(w) + blm.lik.linear.bias
+ + + +
+[ドキュメント] +def get_post_fcov(blm, X, Psi=None, diag=True): + """ + calculates posterior covariance of model + + Parameters + ========== + blm: physbo.blm.core.model + X: numpy.ndarray + inputs + Psi: numpy.ndarray + feature maps + (default: blm.lik.linear.basis.get_basis(X)) + diag: bool + if True, returns only variances as a diagonal matrix + (default: True) + + Returns + ======= + numpy.ndarray + """ + if Psi is None: + Psi = blm.lik.linear.basis.get_basis(X) + + U = blm.stats[0] + R = scipy.linalg.solve_triangular( + U.transpose(), + Psi.transpose(), + lower=True, + overwrite_b=False, + check_finite=False, + ) + RT = R.transpose() + + if diag is True: + fcov = misc.diagAB(RT, R) + else: + fcov = np.dot(RT, R) + + return fcov
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/lik/gauss.html b/manual/v2.0.2/ja/_modules/physbo/blm/lik/gauss.html new file mode 100644 index 00000000..8803d610 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/lik/gauss.html @@ -0,0 +1,329 @@ + + + + + + + + physbo.blm.lik.gauss — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.lik.gauss のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class gauss: + """ + Gaussian + + Attributes + ========== + linear + cov: blm.lik.cov + covariance + stats + """ + + def __init__(self, linear, cov): + self.linear = linear + self.cov = cov + self.stats = () + +
+[ドキュメント] + def get_cov(self, N, params=None): + """ + Returns covariance matrix + + Parameters + ========== + N: int + dimension + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + NxN covariance matrix + """ + if params is None: + params = np.copy(self.cov.params) + + return self.cov.get_cov(N, params)
+ + +
+[ドキュメント] + def get_prec(self, N, params=None): + """ + Returns precision matrix + + Parameters + ========== + N: int + dimension + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + NxN precision matrix + """ + + if params is None: + params = np.copy(self.cov.params) + + return self.cov.get_cov(N, params)
+ + +
+[ドキュメント] + def get_basis(self, X): + """ + calculates value of basis function at input + + Parameters + ========== + X: numpy.ndarray + input + + See also + ======== + blm.basis.fourier.get_basis + """ + return self.linear.basis.get_basis(X)
+ + +
+[ドキュメント] + def get_mean(self, X, Psi=None, params=None, bias=None): + """ + calculates mean value + + Parameters + ========== + X: numpy.ndarray + raw input + Psi: numpy.ndarray + value of feature maps + params: numpy.ndarray + weight + bias: float + bias + + See also + ======== + blm.basis.fourier.get_mean + """ + return self.linear.get_mean(X, Psi, params, bias)
+ + +
+[ドキュメント] + def set_params(self, params): + """ + sets parameters + """ + self.linear.set_params(params)
+ + +
+[ドキュメント] + def set_bias(self, bias): + """ + sets bias + """ + self.linear.set_bias(bias)
+ + +
+[ドキュメント] + def sampling(self, fmean): + """ + draws samples + + Parameters + ========== + fmean: numpy.ndarray + means of samples + + Returns + ======= + samples: numpy.ndarray + """ + num_data = fmean.shape[0] + eps = np.sqrt(self.cov.sigma2) * np.random.randn(num_data) + return fmean + eps
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/lik/linear.html b/manual/v2.0.2/ja/_modules/physbo/blm/lik/linear.html new file mode 100644 index 00000000..e44b068f --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/lik/linear.html @@ -0,0 +1,301 @@ + + + + + + + + physbo.blm.lik.linear — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.lik.linear のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class linear: + """ + + Attributes + ========== + basis: + basis for random feature map + nbasis: int + number of basis + bias: + params: + _init_params: + initial value of the parameter + """ + + def __init__(self, basis, params=None, bias=None): + self.basis = basis + self.nbasis = basis.nbasis + self._init_params = params + self.bias = bias + self.params = params + + if params is None: + self.params = np.zeros(self.nbasis) + self.nparams = self.nbasis + +
+[ドキュメント] + def get_mean(self, X, Psi=None, params=None, bias=None): + """ + calculate mean values + + Parameters + ========== + X: numpy.ndarray + input as an N-by-d matrix + Psi: numpy.ndarray + feature maps ``Psi(X)`` as an N-by-l matrix + (default: self.get_basis(X)) + params: numpy.ndarray + weight as a vector with size l + (default: self.params) + bias: float + (default: self.bias) + + Returns + ======= + numpy.ndarray + Psi * params + bias + + """ + if params is None: + params = np.copy(self.params) + + if bias is None: + bias = np.copy(self.bias) + + if Psi is None: + Psi = self.get_basis(X) + + return Psi.dot(params) + bias
+ + +
+[ドキュメント] + def set_params(self, params): + """ + set parameters + + Parameters + ========== + params: np.ndarray + """ + self.params = params
+ + +
+[ドキュメント] + def set_bias(self, bias): + """ + set bias + + Parameters + ========== + bias: float + """ + self.bias = bias
+ + +
+[ドキュメント] + def _init_params(self, params): + """ + initialize parameters + + Parameters + ========== + params: np.ndarray + (default: numpy.zeros(self.nbasis)) + """ + if params is None: + self.params = np.zeros(self.nbasis) + + self.params = params
+ + + def _init_bias(self, bias): + """ + initialize bias + + Parameters + ========== + bias: float + (default: 0) + """ + if bias is None: + self.bias = 0 + + self.bias = bias
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/predictor.html b/manual/v2.0.2/ja/_modules/physbo/blm/predictor.html new file mode 100644 index 00000000..cae09bb5 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/predictor.html @@ -0,0 +1,440 @@ + + + + + + + + physbo.blm.predictor — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.predictor のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import physbo.predictor
+
+
+
+[ドキュメント] +class predictor(physbo.predictor.base_predictor): + """Predictor using Baysean linear model + + Attributes + ========== + blm: physbo.blm.core.model + config: physbo.misc.set_config + configuration + """ + + def __init__(self, config, model=None): + """ + + Parameters + ========== + config: physbo.misc.set_config + configuration + model: physbo.gp.core.model + + See also + ======== + physbo.base_predictor + """ + super(predictor, self).__init__(config, model) + self.blm = None + +
+[ドキュメント] + def fit(self, training, num_basis=None): + """ + fit model to training dataset + + Parameters + ========== + training: physbo.variable + dataset for training + num_basis: int + the number of basis (default: self.config.predict.num_basis) + """ + if num_basis is None: + num_basis = self.config.predict.num_basis + + if self.model.prior.cov.num_dim is None: + self.model.prior.cov.num_dim = training.X.shape[1] + self.model.fit(training.X, training.t, self.config) + self.blm = self.model.export_blm(num_basis) + self.delete_stats()
+ + +
+[ドキュメント] + def prepare(self, training): + """ + initializes model by using training data set + + Parameters + ========== + training: physbo.variable + dataset for training + """ + self.blm.prepare(training.X, training.t, training.Z)
+ + +
+[ドキュメント] + def delete_stats(self): + """ + resets model + """ + self.blm.stats = None
+ + +
+[ドキュメント] + def get_basis(self, X): + """ + calculates feature maps Psi(X) + + Parameters + ========== + X: numpy.ndarray + inputs + + Returns + ======= + Psi: numpy.ndarray + feature maps + """ + return self.blm.lik.get_basis(X)
+ + +
+[ドキュメント] + def get_post_fmean(self, training, test): + """ + calculates posterior mean value of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_fmean(test.X, test.Z)
+ + +
+[ドキュメント] + def get_post_fcov(self, training, test): + """ + calculates posterior variance-covariance matrix of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_fcov(test.X, test.Z)
+ + +
+[ドキュメント] + def get_post_params(self, training, test): + """ + calculates posterior weights + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs (not used) + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.get_post_params_mean()
+ + +
+[ドキュメント] + def get_post_samples(self, training, test, N=1, alpha=1.0): + """ + draws samples of mean values of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.post_sampling(test.X, Psi=test.Z, N=N, alpha=alpha)
+ + +
+[ドキュメント] + def get_predict_samples(self, training, test, N=1): + """ + draws samples of values of model + + Parameters + ========== + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + (default: 1.0) + + Returns + ======= + numpy.ndarray (N x len(test)) + """ + if self.blm.stats is None: + self.prepare(training) + return self.blm.predict_sampling(test.X, Psi=test.Z, N=N).transpose()
+ + +
+[ドキュメント] + def update(self, training, test): + """ + updates the model. + + If not yet initialized (prepared), the model will be prepared by ``training``. + Otherwise, the model will be updated by ``test``. + + Parameters + ========== + training: physbo.variable + training dataset for initialization (preparation). + If already prepared, the model ignore this. + test: physbo.variable + training data for update. + If not prepared, the model ignore this. + """ + if self.model.stats is None: + self.prepare(training) + return None + + if hasattr(test.t, "__len__"): + N = len(test.t) + else: + N = 1 + + if N == 1: + if test.Z is None: + if test.X.ndim == 1: + self.blm.update_stats(test.X, test.t) + else: + self.blm.update_stats(test.X[0, :], test.t) + else: + if test.Z.ndim == 1: + self.blm.update_stats(test.X, test.t, psi=test.Z) + else: + self.blm.update_stats(test.X[0, :], test.t, psi=test.Z[0, :]) + else: + for n in range(N): + if test.Z is None: + self.blm.update_stats(test.X[n, :], test.t[n]) + else: + self.blm.update_stats(test.X[n, :], test.t[n], psi=test.Z[n, :])
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/blm/prior/gauss.html b/manual/v2.0.2/ja/_modules/physbo/blm/prior/gauss.html new file mode 100644 index 00000000..48ecb696 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/blm/prior/gauss.html @@ -0,0 +1,411 @@ + + + + + + + + physbo.blm.prior.gauss — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.blm.prior.gauss のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class cov_const: + """ + isotropic variance-covariance + + All elements have the same variance and are independent with each other + + Attributes + ========== + params: float + half of log of covariance + sigma2: float + covariance + prec: float + precision (= inv. of covariance) + """ + + def __init__(self, params=None): + """ + Parameters + ========== + params: float + half of log of covariance + (default: numpy.log(1)) + """ + if params is None: + self.params = np.log(1) + self.sigma2, self.prec = self._trans_params(params) + +
+[ドキュメント] + def get_cov(self, nbasis, params=None): + """ + computes the covariance + + Parameters + ========== + nbasis: int + the number of components + params: float + half of log of variance + (default: self.params) + + Returns + ======= + numpy.ndarray + nbasis-by-n-basis covariance matrix + """ + if params is None: + params = self.params + sigma2, prec = self._trans_params(params) + return np.identity(nbasis) * sigma2
+ + +
+[ドキュメント] + def get_prec(self, nbasis, params=None): + """ + computes the precision + + Parameters + ========== + nbasis: int + the number of components + params: float + half of log of variance + (default: self.params) + + Returns + ======= + numpy.ndarray + nbasis-by-n-basis precision matrix + """ + if params is None: + params = self.params + sigma2, prec = self._trans_params(params) + return np.identity(nbasis) * prec
+ + +
+[ドキュメント] + def set_params(self, params): + """ + sets params + + Parameters + ========== + params: float + half of log of variance + """ + self.params = params + self.sigma2, self.prec = self._trans_params(params)
+ + + def _trans_params(self, params=None): + """ + calculates variance and precise from params + + Parameters + ========== + params: float + half of log of variance + (default: self.params) + + Returns + ======= + sigma2: float + variance + prec: float + precise (= inv. of variance) + """ + if params is None: + params = self.params + + sigma2 = np.exp(2 * params) + prec = 1 / sigma2 + + return sigma2, prec
+ + + +
+[ドキュメント] +class gauss: + """ + Gaussian prior + + Attributes + ========== + nbasis: int + number of components + cov: cov_const + covariance + """ + + def __init__(self, nbasis, cov=None): + """ + Parameters + ========== + nbasis: int + number of components + cov: cov_const + (default: cov_const()) + """ + self._init_cov(cov) + self.nbasis = nbasis + +
+[ドキュメント] + def get_mean(self, params=None): + """ + calculates the mean value of priors + + Parameters + ========== + params: float + half of log of variance + (not used) + + Returns + ======= + numpy.ndarray + """ + return np.zeros(self.nbasis)
+ + +
+[ドキュメント] + def get_cov(self, params=None): + """ + calculates the variance-covariance matrix of priors + + Parameters + ========== + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + """ + return self.cov.get_cov(self.nbasis, params)
+ + +
+[ドキュメント] + def get_prec(self, params=None): + """ + calculates the precise matrix of priors + + Parameters + ========== + params: float + half of log of variance + (default: self.cov.params) + + Returns + ======= + numpy.ndarray + """ + return self.cov.get_prec(self.nbasis, params)
+ + +
+[ドキュメント] + def set_params(self, params): + """ + sets params + + Parameters + ========== + params: float + half of log of variance + """ + self.cov.set_params(params)
+ + + def _init_cov(self, cov): + """ + initialize covariance + + Parameters + ========== + cov: cov_const + default: ``cov_const()`` + """ + self.cov = cov + if cov is None: + self.cov = cov_const()
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/core/learning.html b/manual/v2.0.2/ja/_modules/physbo/gp/core/learning.html new file mode 100644 index 00000000..f19b90ef --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/core/learning.html @@ -0,0 +1,572 @@ + + + + + + + + physbo.gp.core.learning — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.core.learning のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# coding=utf-8
+import numpy as np
+import scipy.optimize
+
+
+
+[ドキュメント] +class batch(object): + """ + basis class for batch learning + """ + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : physbo.gp.core.model object + config: physbo.misc.set_config object + """ + + self.gp = gp + self.config = config + +
+[ドキュメント] + def run(self, X, t): + """ + Performing optimization using the L-BFGS-B algorithm + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + Returns + ------- + numpy.ndarray + The solution of the optimization. + """ + batch_size = self.config.learning.batch_size + sub_X, sub_t = self.gp.sub_sampling(X, t, batch_size) + + if self.config.learning.num_init_params_search != 0: + is_init_params_search = True + else: + is_init_params_search = False + + if is_init_params_search: + params = self.init_params_search(sub_X, sub_t) + else: + params = np.copy(self.gp.params) + + params = self.one_run(params, sub_X, sub_t) + return params
+ + +
+[ドキュメント] + def one_run(self, params, X, t, max_iter=None): + """ + + Parameters + ---------- + params: numpy.ndarray + Initial guess for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + max_iter: int + Maximum number of iterations to perform. + Returns + ------- + numpy.ndarray + The solution of the optimization. + """ + + # is_disp: Set to True to print convergence messages. + is_disp = True + + if max_iter is None: + is_disp = self.config.learning.is_disp + max_iter = int(self.config.learning.max_iter) + + args = (X, t) + bound = self.gp.get_params_bound() + res = scipy.optimize.minimize( + fun=self.gp.eval_marlik, + args=args, + x0=params, + method="L-BFGS-B", + jac=self.gp.get_grad_marlik, + bounds=bound, + options={"disp": is_disp, "maxiter": max_iter}, + ) + + return res.x
+ + + +
+ + + +
+[ドキュメント] +class online(object): + """ + base class for online learning + """ + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : model (gp.core.model) + config: set_config (misc.set_config) + """ + self.gp = gp + self.config = config + self.num_iter = 0 + +
+[ドキュメント] + def run(self, X, t): + """ + Run initial search and hyper parameter running. + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + + Returns + ------- + numpy.ndarray + The solution of the optimization. + + """ + if self.config.learning.num_init_params_search != 0: + is_init_params_search = True + else: + is_init_params_search = False + + is_disp = self.config.learning.is_disp + if is_init_params_search: + if is_disp: + print("Start the initial hyper parameter searching ...") + params = self.init_params_search(X, t) + if is_disp: + print("Done\n") + else: + params = np.copy(self.params) + + if is_disp: + print("Start the hyper parameter learning ...") + params = self.one_run(params, X, t) + if is_disp: + print("Done\n") + + return params
+ + +
+[ドキュメント] + def one_run(self, params, X, t, max_epoch=None, is_disp=False): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + max_epoch: int + Maximum candidate epochs + Returns + ------- + numpy.ndarray + The solution of the optimization. + + """ + num_data = X.shape[0] + batch_size = self.config.learning.batch_size + + if batch_size > num_data: + batch_size = num_data + + if max_epoch is None: + max_epoch = self.config.learning.max_epoch + is_disp = self.config.learning.is_disp + + num_disp = self.config.learning.num_disp + eval_size = self.config.learning.eval_size + eval_X, eval_t = self.gp.sub_sampling(X, t, eval_size) + timing = range(0, max_epoch, int(np.floor(max_epoch / num_disp))) + temp = 0 + + for num_epoch in range(0, max_epoch): + perm = np.random.permutation(num_data) + + if is_disp and temp < num_disp and num_epoch == timing[temp]: + self.disp_marlik(params, eval_X, eval_t, num_epoch) + temp += 1 + + for n in range(0, num_data, batch_size): + tmp_index = perm[n : n + batch_size] + if len(tmp_index) == batch_size: + self.num_iter += 1 + subX = X[tmp_index, :] + subt = t[tmp_index] + params += self.get_one_update(params, subX, subt) + + if is_disp: + self.disp_marlik(params, eval_X, eval_t, num_epoch + 1) + + self.reset() + return params
+ + +
+[ドキュメント] + def disp_marlik(self, params, eval_X, eval_t, num_epoch=None): + """ + Displaying marginal likelihood + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + eval_X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + eval_t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + num_epoch: int + Number of epochs + + Returns + ------- + + """ + marlik = self.gp.eval_marlik(params, eval_X, eval_t) + if num_epoch is not None: + print(num_epoch, end=" ") + print("-th epoch", end=" ") + + print("marginal likelihood", marlik)
+ + + + + +
+[ドキュメント] + def get_one_update(self, params, X, t): + raise NotImplementedError
+
+ + + +
+[ドキュメント] +class adam(online): + """default""" + + def __init__(self, gp, config): + """ + + Parameters + ---------- + gp : physbo.gp.core.model object + config: physbo.misc.set_config object + """ + super(adam, self).__init__(gp, config) + + self.alpha = self.config.learning.alpha + self.beta = self.config.learning.beta + self.gamma = self.config.learning.gamma + self.epsilon = self.config.learning.epsilon + self.m = np.zeros(self.gp.num_params) + self.v = np.zeros(self.gp.num_params) + +
+[ドキュメント] + def reset(self): + self.m = np.zeros(self.gp.num_params) + self.v = np.zeros(self.gp.num_params) + self.num_iter = 0
+ + +
+[ドキュメント] + def get_one_update(self, params, X, t): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N-dimensional vector that represents the corresponding negative energy of search candidates. + Returns + ------- + + """ + grad = self.gp.get_grad_marlik(params, X, t) + self.m = self.m * self.beta + grad * (1 - self.beta) + self.v = self.v * self.gamma + grad**2 * (1 - self.gamma) + hat_m = self.m / (1 - self.beta ** (self.num_iter)) + hat_v = self.v / (1 - self.gamma ** (self.num_iter)) + return -self.alpha * hat_m / (np.sqrt(hat_v) + self.epsilon)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/core/model.html b/manual/v2.0.2/ja/_modules/physbo/gp/core/model.html new file mode 100644 index 00000000..7ae10604 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/core/model.html @@ -0,0 +1,640 @@ + + + + + + + + physbo.gp.core.model — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.core.model のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+from physbo import blm
+from physbo.gp import inf
+from physbo.gp.core import learning
+from physbo.gp.core.prior import prior
+
+
+
+[ドキュメント] +class model: + def __init__(self, lik, mean, cov, inf="exact"): + """ + + Parameters + ---------- + lik + mean + cov + inf + """ + self.lik = lik + self.prior = prior(mean=mean, cov=cov) + self.inf = inf + self.num_params = self.lik.num_params + self.prior.num_params + self.params = self.cat_params(self.lik.params, self.prior.params) + self.stats = () + +
+[ドキュメント] + def cat_params(self, lik_params, prior_params): + """ + Concatinate the likelihood and prior parameters + + Parameters + ---------- + lik_params: numpy.ndarray + Parameters for likelihood + prior_params: numpy.ndarray + Parameters for prior + Returns + ------- + params: numpy.ndarray + parameters about likelihood and prior + """ + params = np.append(lik_params, prior_params) + return params
+ + +
+[ドキュメント] + def decomp_params(self, params=None): + """ + decomposing the parameters to those of likelifood and priors + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + lik_params: numpy.ndarray + prior_params: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + lik_params = params[0 : self.lik.num_params] + prior_params = params[self.lik.num_params :] + return lik_params, prior_params
+ + +
+[ドキュメント] + def set_params(self, params): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters. + """ + self.params = params + lik_params, prior_params = self.decomp_params(params) + self.lik.set_params(lik_params) + self.prior.set_params(prior_params)
+ + +
+[ドキュメント] + def sub_sampling(self, X, t, N): + """ + Make subset for sampling + + Parameters + ---------- + X: numpy.ndarray + Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of data in subset + Returns + ------- + subX: numpy.ndarray + subt: numpy.ndarray + """ + num_data = X.shape[0] + + if N is not None and N < num_data: + index = np.random.permutation(num_data) + subX = X[index[0:N], :] + subt = t[index[0:N]] + else: + subX = X + subt = t + return subX, subt
+ + +
+[ドキュメント] + def export_blm(self, num_basis): + """ + Exporting the blm(Baysean linear model) predictor + + Parameters + ---------- + num_basis: int + Total number of basis + Returns + ------- + physbo.blm.core.model + """ + if not hasattr(self.prior.cov, "rand_expans"): + raise ValueError("The kernel must be.") + + basis_params = self.prior.cov.rand_expans(num_basis) + basis = blm.basis.fourier(basis_params) + prior = blm.prior.gauss(num_basis) + lik = blm.lik.gauss( + blm.lik.linear(basis, bias=self.prior.get_mean(1)), + blm.lik.cov(self.lik.params), + ) + blr = blm.model(lik, prior) + + return blr
+ + +
+[ドキュメント] + def eval_marlik(self, params, X, t, N=None): + """ + Evaluating marginal likelihood. + + Parameters + ---------- + params: numpy.ndarray + Parameters. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of subset data (if not specified, all dataset is used) + Returns + ------- + marlik: float + Marginal likelihood. + """ + subX, subt = self.sub_sampling(X, t, N) + if self.inf == "exact": + marlik = inf.exact.eval_marlik(self, subX, subt, params=params) + else: + pass + + return marlik
+ + +
+[ドキュメント] + def get_grad_marlik(self, params, X, t, N=None): + """ + Evaluating gradiant of marginal likelihood. + + Parameters + ---------- + params: numpy.ndarray + Parameters. + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + N: int + Total number of subset data (if not specified, all dataset is used) + + Returns + ------- + grad_marlik: numpy.ndarray + Gradiant of marginal likelihood. + """ + subX, subt = self.sub_sampling(X, t, N) + if self.inf == "exact": + grad_marlik = inf.exact.get_grad_marlik(self, subX, subt, params=params) + return grad_marlik
+ + +
+[ドキュメント] + def get_params_bound(self): + """ + Getting boundary of the parameters. + + Returns + ------- + bound: list + An array with the tuple (min_params, max_params). + """ + if self.lik.num_params != 0: + bound = self.lik.get_params_bound() + + if self.prior.mean.num_params != 0: + bound.extend(self.prior.mean.get_params_bound()) + + if self.prior.cov.num_params != 0: + bound.extend(self.prior.cov.get_params_bound()) + return bound
+ + +
+[ドキュメント] + def prepare(self, X, t, params=None): + """ + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + """ + if params is None: + params = np.copy(self.params) + if self.inf == "exact": + self.stats = inf.exact.prepare(self, X, t, params) + else: + pass
+ + +
+[ドキュメント] + def get_post_fmean(self, X, Z, params=None): + """ + Calculating posterior mean of model (function) + + Parameters + ========== + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + params: numpy.ndarray + Parameters + See also + ======== + physbo.gp.inf.exact.get_post_fmean + """ + if params is None: + params = np.copy(self.params) + + if self.inf == "exact": + post_fmu = inf.exact.get_post_fmean(self, X, Z, params) + + return post_fmu
+ + +
+[ドキュメント] + def get_post_fcov(self, X, Z, params=None, diag=True): + """ + Calculating posterior covariance matrix of model (function) + + Parameters + ---------- + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + params: numpy.ndarray + Parameters + diag: bool + If X is the diagonalization matrix, true. + + Returns + ------- + physbo.gp.inf.exact.get_post_fcov + + """ + if params is None: + params = np.copy(self.params) + + if self.inf == "exact": + post_fcov = inf.exact.get_post_fcov(self, X, Z, params, diag) + + return post_fcov
+ + +
+[ドキュメント] + def post_sampling(self, X, Z, params=None, N=1, alpha=1): + """ + draws samples of mean value of model + + Parameters + ========== + X: numpy.ndarray + inputs + Z: numpy.ndarray + feature maps + N: int + number of samples + (default: 1) + alpha: float + noise for sampling source + Returns + ======= + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + fmean = self.get_post_fmean(X, Z, params=None) + fcov = self.get_post_fcov(X, Z, params=None, diag=False) + return np.random.multivariate_normal(fmean, fcov * alpha**2, N)
+ + +
+[ドキュメント] + def predict_sampling(self, X, Z, params=None, N=1): + """ + + Parameters + ---------- + X: numpy.ndarray + training datasets + Z: numpy.ndarray + input for sampling objective values + params: numpy.ndarray + Parameters + N: int + number of samples + (default: 1) + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + + ndata = Z.shape[0] + if ndata == 0: + return np.zeros((N, 0)) + fmean = self.get_post_fmean(X, Z, params=None) + fcov = self.get_post_fcov(X, Z, params=None, diag=False) + self.lik.get_cov( + ndata + ) + + return np.random.multivariate_normal(fmean, fcov, N)
+ + +
+[ドキュメント] + def print_params(self): + """ + Printing parameters + """ + print("\n") + if self.lik.num_params != 0: + print("likelihood parameter = ", self.lik.params) + + if self.prior.mean.num_params != 0: + print("mean parameter in GP prior: ", self.prior.mean.params) + + print("covariance parameter in GP prior: ", self.prior.cov.params) + print("\n")
+ + +
+[ドキュメント] + def get_cand_params(self, X, t): + """ + Getting candidate for parameters + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + Returns + ------- + params: numpy.ndarray + Parameters + """ + params = np.zeros(self.num_params) + if self.lik.num_params != 0: + params[0 : self.lik.num_params] = self.lik.get_cand_params(t) + + temp = self.lik.num_params + + if self.prior.mean.num_params != 0: + params[ + temp : temp + self.prior.mean.num_params + ] = self.prior.mean.get_cand_params(t) + + temp += self.prior.mean.num_params + + if self.prior.cov.num_params != 0: + params[temp:] = self.prior.cov.get_cand_params(X, t) + + return params
+ + +
+[ドキュメント] + def fit(self, X, t, config): + """ + Fitting function (update parameters) + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + config: physbo.misc.set_config object + + """ + method = config.learning.method + + if method == "adam": + adam = learning.adam(self, config) + params = adam.run(X, t) + + if method in ("bfgs", "batch"): + bfgs = learning.batch(self, config) + params = bfgs.run(X, t) + + self.set_params(params)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/core/prior.html b/manual/v2.0.2/ja/_modules/physbo/gp/core/prior.html new file mode 100644 index 00000000..6ac6e223 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/core/prior.html @@ -0,0 +1,409 @@ + + + + + + + + physbo.gp.core.prior — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.core.prior のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+
+
+[ドキュメント] +class prior: + """prior of gaussian process""" + + def __init__(self, mean, cov): + """ + + Parameters + ---------- + mean: numpy.ndarray + mean values of prior + cov: numpy.ndarray + covariance matrix of priors + """ + self.mean = mean + self.cov = cov + self.num_params = self.cov.num_params + self.mean.num_params + self.params = self.cat_params(self.mean.params, self.cov.params) + +
+[ドキュメント] + def cat_params(self, mean_params, cov_params): + """ + + Parameters + ---------- + mean_params: numpy.ndarray + Mean values of parameters + cov_params: numpy.ndarray + Covariance matrix of parameters + Returns + ------- + numpy.ndarray + """ + return np.append(mean_params, cov_params)
+ + +
+[ドキュメント] + def decomp_params(self, params): + """ + decomposing the parameters to those of mean values and covariance matrix for priors + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + mean_params: numpy.ndarray + cov_params: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + mean_params = params[0 : self.mean.num_params] + cov_params = params[self.mean.num_params :] + return mean_params, cov_params
+ + +
+[ドキュメント] + def get_mean(self, num_data, params=None): + """ + Calculating the mean value of priors + + Parameters + ---------- + num_data: int + Total number of data + params: numpy.ndarray + Parameters + Returns + ------- + float + """ + if params is None: + params = np.copy(self.params) + return self.mean.get_mean(num_data, params[0 : self.mean.num_params])
+ + +
+[ドキュメント] + def get_cov(self, X, Z=None, params=None, diag=False): + """ + Calculating the variance-covariance matrix of priors + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + diag: bool + If X is the diagonalization matrix, true. + Returns + ------- + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + return self.cov.get_cov(X, Z, params=params[self.mean.num_params :], diag=diag)
+ + +
+[ドキュメント] + def get_grad_mean(self, num_data, params=None): + """ + Calculating the gradiant of mean values of priors + + Parameters + ---------- + num_data: int + Total number of data + params: numpy.ndarray + Parameters + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + + mean_params, cov_params = self.decomp_params(params) + return self.mean.get_grad(num_data, params=mean_params)
+ + +
+[ドキュメント] + def get_grad_cov(self, X, params=None): + """ + Calculating the covariance matrix priors + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + params: numpy.ndarray + Parameters. + + Returns + ------- + numpy.ndarray + + """ + if params is None: + params = np.copy(self.params) + mean_params, cov_params = self.decomp_params(params) + return self.cov.get_grad(X, params=cov_params)
+ + +
+[ドキュメント] + def set_params(self, params): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters. + """ + mean_params, cov_params = self.decomp_params(params) + self.set_mean_params(mean_params) + self.set_cov_params(cov_params)
+ + +
+[ドキュメント] + def set_mean_params(self, params): + """ + Setting parameters for mean values of priors + + Parameters + ---------- + params: numpy.ndarray + Parameters + """ + if self.mean.num_params != 0: + self.params[0 : self.mean.num_params] = params + self.mean.set_params(params)
+ + +
+[ドキュメント] + def set_cov_params(self, params): + """ + Setting parameters for covariance matrix of priors + + Parameters + ---------- + params: numpy.ndarray + Parameters + """ + self.params[self.mean.num_params :] = params + self.cov.set_params(params)
+ + +
+[ドキュメント] + def sampling(self, X, N=1): + """ + Sampling from GP prior + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + N: int + + Returns + ------- + float + + """ + num_data = X.shape[0] + G = self.get_cov(X) + 1e-8 * np.identity(num_data) + U = scipy.linalg.cholesky(G, check_finite=False) + Z = np.random.randn(N, num_data) + return np.dot(Z, U) + self.get_mean(num_data)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/cov/gauss.html b/manual/v2.0.2/ja/_modules/physbo/gp/cov/gauss.html new file mode 100644 index 00000000..b652832c --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/cov/gauss.html @@ -0,0 +1,604 @@ + + + + + + + + physbo.gp.cov.gauss — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.cov.gauss のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+# -*- coding:utf-8 -*-
+import numpy as np
+from scipy import spatial
+from ._src.enhance_gauss import grad_width64
+
+
+
+[ドキュメント] +class gauss: + """gaussian kernel""" + + def __init__( + self, + num_dim, + width=3, + scale=1, + ard=False, + max_width=1e6, + min_width=1e-6, + max_scale=1e6, + min_scale=1e-6, + ): + """ + + Parameters + ---------- + num_dim: int + width: float + scale: float + ard: bool + flag to use Automatic Relevance Determination (ARD). + max_width: float + Maximum value of width + min_width: float + Minimum value of width + max_scale: float + Maximum value of scale + min_scale: float + Minimum value of scale + """ + self.ard = ard + self.num_dim = num_dim + self.scale = scale + self.max_ln_width = np.log(max_width) + self.min_ln_width = np.log(min_width) + self.max_ln_scale = np.log(max_scale) + self.min_ln_scale = np.log(min_scale) + + if self.ard: + # with ARD + self.num_params = num_dim + 1 + if isinstance(width, np.ndarray) and len(width) == self.num_dim: + self.width = width + else: + self.width = width * np.ones(self.num_dim) + else: + # without ARD + self.width = width + self.num_params = 2 + + params = self.cat_params(self.width, self.scale) + self.set_params(params) + +
+[ドキュメント] + def print_params(self): + """ + show the current kernel parameters + + """ + + print(" Parameters of Gaussian kernel \n ") + print(" width = ", +self.width) + print(" scale = ", +self.scale) + print(" scale2 = ", +self.scale**2) + print(" \n")
+ + +
+[ドキュメント] + def prepare(self, params=None): + """ + Setting parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + params: numpy.ndarray + width: int + scale: int + + """ + if params is None: + params = self.params + width = self.width + scale = self.scale + else: + params = self.supp_params(params) + width, scale = self.decomp_params(params) + + return params, width, scale
+ + +
+[ドキュメント] + def get_grad(self, X, params=None): + """ + Getting gradiant values of X + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + params: numpy.ndarray + + Returns + ------- + grad: numpy.ndarray + + """ + num_data = X.shape[0] + params, width, scale = self.prepare(params) + G = self.get_cov(X, params=params) + + grad = np.zeros((self.num_params, num_data, num_data)) + if self.ard: + grad[0 : self.num_params - 1, :, :] = grad_width64(X, width, G) + else: + pairwise_dists = spatial.distance.pdist(X / width, "euclidean") + grad[0, :, :] = G * spatial.distance.squareform(pairwise_dists**2) + + grad[-1, :, :] = 2 * G + return grad
+ + +
+[ドキュメント] + def get_cov(self, X, Z=None, params=None, diag=False): + """ + compute the covariant matrix + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of search candidate. + + params: numpy.ndarray + Parameters + + diag: bool + If X is the diagonalization matrix, true. + + Returns + ------- + G: numpy.ndarray + covariant matrix + """ + params, width, scale = self.prepare(params) + scale2 = scale**2 + + if Z is None: + if diag: + G = scale2 * np.ones(X.shape[0]) + else: + pairwise_dists = spatial.distance.squareform( + spatial.distance.pdist(X / width, "euclidean") ** 2 + ) + G = np.exp(-0.5 * pairwise_dists) * scale2 + else: + pairwise_dists = ( + spatial.distance.cdist(X / width, Z / width, "euclidean") ** 2 + ) + G = np.exp(-0.5 * pairwise_dists) * scale2 + + return G
+ + +
+[ドキュメント] + def set_params(self, params): + """ + set kernel parameters + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + + """ + params = self.supp_params(params) + self.params = params + self.width, self.scale = self.decomp_params(params)
+ + +
+[ドキュメント] + def supp_params(self, params): + """ + Set maximum (minimum) values for parameters when the parameter is greater(less) than this value. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + params: numpy.ndarray + + """ + index = np.where(params[0:-1] > self.max_ln_width) + params[index[0]] = self.max_ln_width + + index = np.where(params[0:-1] < self.min_ln_width) + params[index[0]] = self.min_ln_width + + if params[-1] > self.max_ln_scale: + params[-1] = self.max_ln_scale + + if params[-1] < self.min_ln_scale: + params[-1] = self.min_ln_scale + + return params
+ + +
+[ドキュメント] + def decomp_params(self, params): + """ + decompose the parameters defined on the log region + into width and scale parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + width: float + scale: float + """ + + width = np.exp(params[0:-1]) + scale = np.exp(params[-1]) + return width, scale
+ + +
+[ドキュメント] + def save(self, file_name): + """ + save the gaussian kernel + + Parameters + ---------- + file_name: str + file name to save the information of the kernel + + """ + kwarg = { + "name": "gauss", + "params": self.params, + "ard": self.ard, + "num_dim": self.num_dim, + "max_ln_scale": self.max_ln_scale, + "min_ln_scale": self.min_ln_scale, + "max_ln_width": self.max_ln_width, + "min_ln_width": self.min_ln_width, + "num_params": self.num_params, + } + with open(file_name, "wb") as f: + np.savez(f, **kwarg)
+ + +
+[ドキュメント] + def load(self, file_name): + """ + Recovering the Gaussian kernel from file + Parameters + ---------- + file_name: str + file name to load the information of the kernel + + """ + temp = np.load(file_name) + + self.num_dim = temp["num_dim"] + self.ard = temp["ard"] + self.max_ln_scale = temp["max_ln_scale"] + self.min_ln_scale = temp["min_ln_scale"] + self.max_ln_width = temp["max_ln_width"] + self.min_ln_width = temp["min_ln_width"] + params = temp["params"] + self.set_params(params)
+ + +
+[ドキュメント] + def get_params_bound(self): + """ + Getting boundary array. + + Returns + ------- + bound: list + A num_params-dimensional array with the tuple (min_params, max_params). + + """ + + if self.ard: + bound = [ + (self.min_ln_width, self.max_ln_width) for i in range(0, self.num_dim) + ] + else: + bound = [(self.min_ln_width, self.max_ln_width)] + + bound.append((self.min_ln_scale, self.max_ln_scale)) + return bound
+ + +
+[ドキュメント] + def cat_params(self, width, scale): + """ + Taking the logarithm of width and scale parameters + and concatinate them into one ndarray + + Parameters + ---------- + width: int + scale: int + + Returns + ------- + params: numpy.ndarray + Parameters + """ + params = np.zeros(self.num_params) + params[0:-1] = np.log(width) + params[-1] = np.log(scale) + return params
+ + +
+[ドキュメント] + def rand_expans(self, num_basis, params=None): + """ + Kernel Expansion + + Parameters + ---------- + num_basis: int + total number of basis + params: numpy.ndarray + Parameters + + Returns + ------- + tupple (W, b, amp) + """ + params, width, scale = self.prepare(params) + scale2 = scale**2 + amp = np.sqrt((2 * scale2) / num_basis) + W = np.random.randn(num_basis, self.num_dim) / width + b = np.random.rand(num_basis) * 2 * np.pi + return (W, b, amp)
+ + +
+[ドキュメント] + def get_cand_params(self, X, t): + """ + Getting candidate parameters. + + Parameters + ---------- + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + params: numpy.ndarray + + """ + if self.ard: + # with ARD + width = np.zeros(self.num_dim) + scale = np.std(t) + u = np.random.uniform(0.4, 0.8) + width = u * (np.max(X, 0) - np.min(X, 0)) * np.sqrt(self.num_dim) + + index = np.where(np.abs(width) < 1e-6) + width[index[0]] = 1e-6 + params = np.append(np.log(width), np.log(scale)) + else: + # without ARD + num_data = X.shape[0] + M = max(2000, int(np.floor(num_data / 5))) + + dist = np.zeros(M) + + for m in range(M): + a = np.random.randint(0, X.shape[0], 2) + dist[m] = np.linalg.norm(X[a[0], :] - X[a[1], :]) + + dist = np.sort(dist) + tmp = int(np.floor(M / 10)) + n = np.random.randint(0, 5) + width = dist[(2 * n + 1) * tmp] + scale = np.std(t) + params = np.append(np.log(width + 1e-8), np.log(scale)) + return params
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/inf/exact.html b/manual/v2.0.2/ja/_modules/physbo/gp/inf/exact.html new file mode 100644 index 00000000..99f2e45c --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/inf/exact.html @@ -0,0 +1,415 @@ + + + + + + + + physbo.gp.inf.exact — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.inf.exact のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+from ... import misc
+from copy import deepcopy
+
+
+
+[ドキュメント] +def eval_marlik(gp, X, t, params=None): + """ + Evaluating marginal likelihood. + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + marlik: float + Marginal likelihood. + """ + ndata, ndims = X.shape + lik_params, prior_params = gp.decomp_params(params) + + fmu = gp.prior.get_mean(ndata, params=prior_params) + G = gp.prior.get_cov(X, params=prior_params) + B = gp.lik.get_cov(ndata, params=lik_params) + + A = G + B + 1e-8 * np.identity(ndata) + res = t - fmu + U = scipy.linalg.cholesky(A, check_finite=False) + alpha = scipy.linalg.solve_triangular( + U.transpose(), res, lower=True, overwrite_b=False, check_finite=False + ) + marlik = ( + 0.5 * ndata * np.log(2 * np.pi) + + np.sum(np.log(np.diag(U))) + + 0.5 * np.inner(alpha, alpha) + ) + return marlik
+ + + +
+[ドキュメント] +def get_grad_marlik(gp, X, t, params=None): + """ + Evaluating gradiant of marginal likelihood. + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + grad_marlik: numpy.ndarray + Gradiant of marginal likelihood. + """ + ndata, ndims = X.shape + lik_params, prior_params = gp.decomp_params(params) + + fmu = gp.prior.get_mean(ndata, prior_params) + G = gp.prior.get_cov(X, params=prior_params) + B = gp.lik.get_cov(ndata, lik_params) + + A = G + B + 1e-8 * np.identity(ndata) + U = scipy.linalg.cholesky(A, check_finite=False) + res = t - fmu + alpha = misc.gauss_elim(U, res) + invA = scipy.linalg.inv(A, check_finite=False) + + grad_marlik = np.zeros(gp.num_params) + + """ lik """ + if gp.lik.num_params != 0: + lik_grad = gp.lik.get_grad(ndata, lik_params) + temp = lik_grad.dot(alpha) + grad_marlik[0 : gp.lik.num_params] = -0.5 * temp.dot( + alpha + ) + 0.5 * misc.traceAB2(invA, lik_grad) + + ntemp = gp.lik.num_params + """ prior """ + if gp.prior.mean.num_params != 0: + mean_grad = gp.prior.get_grad_mean(ndata, prior_params) + grad_marlik[ntemp : ntemp + gp.prior.mean.num_params] = -np.inner( + alpha, mean_grad + ) + + ntemp += gp.prior.mean.num_params + + if gp.prior.cov.num_params != 0: + cov_grad = gp.prior.get_grad_cov(X, prior_params) + temp = cov_grad.dot(alpha) + grad_marlik[ntemp:] = -0.5 * temp.dot(alpha) + 0.5 * misc.traceAB3( + invA, cov_grad + ) + + return grad_marlik
+ + + +
+[ドキュメント] +def prepare(gp, X, t, params=None): + """ + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + t: numpy.ndarray + N dimensional array. + The negative energy of each search candidate (value of the objective function to be optimized). + params: numpy.ndarray + Parameters. + + Returns + ------- + stats: tupple + """ + ndata = X.shape[0] + ndims = X.shape[1] + + if params is None: + params = np.copy(gp.params) + + lik_params, prior_params = gp.decomp_params(params) + + G = gp.prior.get_cov(X, params=prior_params) + fmu = gp.prior.get_mean(ndata, params=prior_params) + B = gp.lik.get_cov(ndata, params=lik_params) + A = G + B + 1e-8 * np.identity(ndata) + U = scipy.linalg.cholesky(A, check_finite=False) + residual = t - fmu + alpha = misc.gauss_elim(U, residual) + stats = (U, alpha) + + return stats
+ + + +
+[ドキュメント] +def get_post_fmean(gp, X, Z, params=None): + """ + Calculating the mean of posterior + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + + Returns + ------- + numpy.ndarray + """ + + ndata = X.shape[0] + ndims = X.shape[1] + ntest = Z.shape[0] + + lik_params, prior_params = gp.decomp_params(params) + + alpha = gp.stats[1] + + fmu = gp.prior.get_mean(ntest) + G = gp.prior.get_cov(X=Z, Z=X, params=prior_params) + + return G.dot(alpha) + fmu
+ + + +
+[ドキュメント] +def get_post_fcov(gp, X, Z, params=None, diag=True): + """ + Calculating the covariance of posterior + + Parameters + ---------- + gp: physbo.gp.core.model + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + Z: numpy.ndarray + N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests. + params: numpy.ndarray + Parameters. + diag: bool + If X is the diagonalization matrix, true. + Returns + ------- + numpy.ndarray + """ + + lik_params, prior_params = gp.decomp_params(params) + + U = gp.stats[0] + alpha = gp.stats[1] + + G = gp.prior.get_cov(X=X, Z=Z, params=prior_params) + + invUG = scipy.linalg.solve_triangular( + U.transpose(), G, lower=True, overwrite_b=False, check_finite=False + ) + + if diag: + diagK = gp.prior.get_cov(X=Z, params=prior_params, diag=True) + diag_invUG2 = misc.diagAB(invUG.transpose(), invUG) + post_cov = diagK - diag_invUG2 + else: + K = gp.prior.get_cov(X=Z, params=prior_params) + post_cov = K - np.dot(invUG.transpose(), invUG) + + return post_cov
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/lik/gauss.html b/manual/v2.0.2/ja/_modules/physbo/gp/lik/gauss.html new file mode 100644 index 00000000..696aeb86 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/lik/gauss.html @@ -0,0 +1,375 @@ + + + + + + + + physbo.gp.lik.gauss — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.lik.gauss のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class gauss: + """Gaussian likelihood function""" + + def __init__(self, std=1, max_params=1e6, min_params=1e-6): + """ + + Parameters + ---------- + std: numpy.ndarray or float + standard deviation. + max_params: float + The maximum value of the parameter. + If the parameter is greater than this value, it will be replaced by this value. + min_params: float + The minimum value of the parameter. + If the parameter is less than this value, it will be replaced by this value. + """ + self.min_params = np.log(min_params) + self.max_params = np.log(max_params) + self.num_params = 1 + self.std = std + self.params = np.log(std) + self.set_params(self.params) + +
+[ドキュメント] + def supp_params(self, params=None): + """ + Set maximum (minimum) values for parameters when the parameter is greater(less) than this value. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + Returns + ------- + + """ + if params is None: + params = np.copy(params) + + if params > self.max_params: + params = self.max_params + + if params < self.min_params: + params = self.min_params + + return params
+ + +
+[ドキュメント] + def trans_params(self, params=None): + """ + Get exp[params]. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + std: numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + + std = np.exp(params) + return std
+ + +
+[ドキュメント] + def get_params_bound(self): + """ + Get boundary array. + + Returns + ------- + bound: list + A num_params-dimensional array with the tuple (min_params, max_params). + """ + bound = [(self.min_params, self.max_params) for i in range(0, self.num_params)] + return bound
+ + +
+[ドキュメント] + def get_cov(self, num_data, params=None): + """ + Get a covariance matrix + + Parameters + ---------- + num_data: int + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + numpy.ndarray + Diagonal element matrix of exp(2.0*params) + """ + std = self.trans_params(params) + var = std**2 + return var * np.identity(num_data)
+ + +
+[ドキュメント] + def get_grad(self, num_data, params=None): + """ + Get a gradient matrix + + Parameters + ---------- + num_data: int + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + numpy.ndarray + Diagonal element matrix of 2.0 * exp(2.0*params) + """ + std = self.trans_params(params) + var = std**2 + return var * np.identity(num_data) * 2
+ + +
+[ドキュメント] + def set_params(self, params): + """ + Set parameters. + + Parameters + ---------- + params: numpy.ndarray + Parameters for optimization. + Array of real elements of size (n,), where ‘n’ is the number of independent variables. + + Returns + ------- + + """ + self.params = self.supp_params(params) + self.std = self.trans_params(params)
+ + +
+[ドキュメント] + def get_cand_params(self, t): + """ + Getting candidate parameters. + + Parameters + ---------- + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + numpy.ndarray + log[ standard deviation of t] - log 10.0 + """ + return np.log(np.std(t) / 10)
+ + + # [TODO] Check: This function seems not to be used. +
+[ドキュメント] + def sampling(self, fmean): + """ + Sampling by adding noise + + Parameters + ---------- + fmean: numpy.ndarray + + Returns + ------- + + """ + num_data = fmean.shape[0] + eps = self.std * np.random.randn(num_data) + return fmean + eps
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/mean/const.html b/manual/v2.0.2/ja/_modules/physbo/gp/mean/const.html new file mode 100644 index 00000000..b0b59b81 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/mean/const.html @@ -0,0 +1,343 @@ + + + + + + + + physbo.gp.mean.const — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.mean.const のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class const: + """constant""" + + def __init__(self, params=None, max_params=1e12, min_params=-1e12): + """ + + Parameters + ---------- + params: numpy.ndarray + Parameters + max_params: float + Threshold value for specifying the maximum value of the parameter + min_params: float + Threshold value for specifying the minimum value of the parameter + + """ + self.max_params = max_params + self.min_params = min_params + self.init_params(params) + self.num_params = 1 + +
+[ドキュメント] + def supp_params(self, params): + """ + Setting maximum and minimum value of parameters. + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + if params > self.max_params: + params = self.max_params + + if params < self.min_params: + params = self.min_params + + return params
+ + +
+[ドキュメント] + def get_params_bound(self): + """ + Getting the boundary list for parameters + + Returns + ------- + bound: list + num_params array with the tupple (min_param, max_params) + + """ + bound = [(self.min_params, self.max_params) for i in range(0, self.num_params)] + return bound
+ + +
+[ドキュメント] + def get_mean(self, num_data, params=None): + """ + + Parameters + ---------- + num_data: int + total number of data + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + if params is None: + params = np.copy(self.params) + return params * np.ones(num_data)
+ + +
+[ドキュメント] + def get_grad(self, num_data, params=None): + """ + Returning a new array of (num_data), filled with ones. + + Parameters + ---------- + num_data: int + total number of data + params: object + not used + + Returns + ------- + numpy.ndarray + """ + return np.ones(num_data)
+ + +
+[ドキュメント] + def set_params(self, params): + """ + Setting parameters defined in const class. + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + numpy.ndarray + """ + self.params = params
+ + +
+[ドキュメント] + def init_params(self, params): + """ + Initializing parameters + + Parameters + ---------- + params: numpy.ndarray + parameters + + Returns + ------- + params: numpy.ndarray + initialized parameters + """ + if params is None: + self.params = 0 + else: + self.params = self.supp_params(params)
+ + +
+[ドキュメント] + def get_cand_params(self, t): + """ + Getting the median array of candidates. + + Parameters + ---------- + t: array_like + Input array or object that can be converted to an array + + Returns + ------- + median: numpy.ndarray + A new array holding the result. + + """ + return np.median(t)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/mean/zero.html b/manual/v2.0.2/ja/_modules/physbo/gp/mean/zero.html new file mode 100644 index 00000000..803500d2 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/mean/zero.html @@ -0,0 +1,247 @@ + + + + + + + + physbo.gp.mean.zero — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.mean.zero のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class zero: + """zero""" + + def __init__(self): + self.num_params = 0 + self.params = np.array([]) + +
+[ドキュメント] + def get_mean(self, num_data, params=None): + """ + Returning numpy.zeros(num_data) + + Parameters + ---------- + num_data: int + dimension of numpy.zeros + params: object + not used + + Returns + ------- + numpy.ndarray + + """ + return np.zeros(num_data)
+ + +
+[ドキュメント] + def get_grad(self, num_data, params=None): + """ + Returning empty numpy.ndarray + + Parameters + ---------- + num_data: int + not used + params: object + not used + + Returns + ------- + numpy.ndarray + + """ + return np.array([])
+ + +
+[ドキュメント] + def set_params(self, params): + """ + Not defined + + Parameters + ---------- + params + + Returns + ------- + + """ + pass
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/gp/predictor.html b/manual/v2.0.2/ja/_modules/physbo/gp/predictor.html new file mode 100644 index 00000000..d9b5a4a2 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/gp/predictor.html @@ -0,0 +1,372 @@ + + + + + + + + physbo.gp.predictor — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.gp.predictor のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import physbo.predictor
+
+
+
+[ドキュメント] +class predictor(physbo.predictor.base_predictor): + """predictor""" + + def __init__(self, config, model=None): + """ + + Parameters + ---------- + config: physbo.misc.set_config + configuration + model: physbo.gp.core.model + """ + super(predictor, self).__init__(config, model) + +
+[ドキュメント] + def fit(self, training, num_basis=None): + """ + Fitting model to training dataset + + Parameters + ---------- + training: physbo.variable + dataset for training + num_basis: int + the number of basis (default: self.config.predict.num_basis) + """ + if self.model.prior.cov.num_dim is None: + self.model.prior.cov.num_dim = training.X.shape[1] + self.model.fit(training.X, training.t, self.config) + self.delete_stats()
+ + +
+[ドキュメント] + def get_basis(self, *args, **kwds): + """ + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + pass
+ + +
+[ドキュメント] + def get_post_params(self, *args, **kwds): + """ + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + pass
+ + +
+[ドキュメント] + def update(self, training, test): + self.prepare(training)
+ + +
+[ドキュメント] + def prepare(self, training): + """ + Initializing model by using training data set + + Parameters + ---------- + training: physbo.variable + dataset for training + + """ + self.model.prepare(training.X, training.t)
+ + +
+[ドキュメント] + def delete_stats(self): + self.model.stats = None
+ + +
+[ドキュメント] + def get_post_fmean(self, training, test): + """ + Calculating posterior mean value of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.get_post_fmean(training.X, test.X)
+ + +
+[ドキュメント] + def get_post_fcov(self, training, test, diag=True): + """ + Calculating posterior variance-covariance matrix of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + diag: bool + Diagonlization flag in physbo.exact.get_post_fcov function. + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.get_post_fcov(training.X, test.X, diag=diag)
+ + +
+[ドキュメント] + def get_post_samples(self, training, test, alpha=1): + """ + Drawing samples of mean values of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs (not used) + alpha: float + tuning parameter of the covariance by multiplying alpha**2 for np.random.multivariate_normal. + Returns + ------- + numpy.ndarray + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.post_sampling(training.X, test.X, alpha=alpha)
+ + +
+[ドキュメント] + def get_predict_samples(self, training, test, N=1): + """ + Drawing samples of values of model + + Parameters + ---------- + training: physbo.variable + training dataset. If already trained, the model does not use this. + test: physbo.variable + inputs + N: int + number of samples + (default: 1) + + Returns + ------- + numpy.ndarray (N x len(test)) + + """ + if self.model.stats is None: + self.prepare(training) + return self.model.predict_sampling(training.X, test.X, N=N)
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/misc/centering.html b/manual/v2.0.2/ja/_modules/physbo/misc/centering.html new file mode 100644 index 00000000..e8d74170 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/misc/centering.html @@ -0,0 +1,200 @@ + + + + + + + + physbo.misc.centering — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.misc.centering のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +def centering(X): + """ + Normalize the mean and standard deviation along the each column of X to 0 and 1, respectively + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. + + Returns + ------- + X_normalized: numpy array + normalized N x d dimensional matrix. + """ + stdX = np.std(X, 0) + index = np.where(stdX != 0) + X_normalized = (X[:, index[0]] - np.mean(X[:, index[0]], 0)) / stdX[index[0]] + return X_normalized
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/misc/gauss_elim.html b/manual/v2.0.2/ja/_modules/physbo/misc/gauss_elim.html new file mode 100644 index 00000000..41cc8ffb --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/misc/gauss_elim.html @@ -0,0 +1,207 @@ + + + + + + + + physbo.misc.gauss_elim — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.misc.gauss_elim のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy
+
+
+
+[ドキュメント] +def gauss_elim(U, t): + """ + Calculate alpha using scipy.linalg.solve_triangular. + alpha = (U^T U)^-1 t = U^-1 [(U^T)-1 t] + + Parameters + ---------- + U: (M, M) array_like + A triangular matrix + t: (M,) or (M, N) array_like + + Returns + ------- + alpha: numpy.ndarray + Solution to the system L^T alpha = t. Shape of return matches t. + """ + alpha = scipy.linalg.solve_triangular( + U.transpose(), t, lower=True, overwrite_b=False, check_finite=False + ) + + alpha = scipy.linalg.solve_triangular( + U, alpha, lower=False, overwrite_b=False, check_finite=False + ) + return alpha
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/misc/set_config.html b/manual/v2.0.2/ja/_modules/physbo/misc/set_config.html new file mode 100644 index 00000000..a5ff36ca --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/misc/set_config.html @@ -0,0 +1,525 @@ + + + + + + + + physbo.misc.set_config — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.misc.set_config のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import configparser
+
+
+
+[ドキュメント] +class set_config: + def __init__(self, search_config=None, learning_config=None): + """ + Setting configuration for search and learning. + + Parameters + ---------- + search_config: physbo.misc.search object + learning_config: physbo.misc.learning object + + """ + if search_config is None: + search_config = search() + self.search = search_config + + if learning_config is None: + learning_config = adam() + self.learning = learning_config + +
+[ドキュメント] + def show(self): + """ + Showing information of search and learning objects. + + Returns + ------- + + """ + self.search.show() + self.learning.show()
+ + +
+[ドキュメント] + def load(self, file_name="config.ini"): + """ + Loading information of configuration. + + Parameters + ---------- + file_name: str + An input file name of configuration. + Returns + ------- + + """ + config = configparser.SafeConfigParser() + config.read(file_name) + + search_config = search() + self.search = search_config + self.search.load(config) + + temp_dict = config._sections["learning"] + method = temp_dict.get("method", "adam") + + if method == "adam": + learning_config = adam() + self.learning = learning_config + self.learning.load(config) + + if method in ("bfgs", "batch"): + learning_config = batch() + self.learning = learning_config + self.learning.load(config)
+
+ + + + + + + +
+[ドキュメント] +class learning(object): + def __init__(self): + self.is_disp = True + self.num_disp = 10 + self.num_init_params_search = 20 + self.method = "adam" + +
+[ドキュメント] + def show(self): + """ + Showing information about learning object. + + Returns + ------- + + """ + print("( learning )") + print("method : ", self.method) + print("is_disp: ", self.is_disp) + print("num_disp: ", self.num_disp) + print("num_init_params_search: ", self.num_init_params_search)
+ + +
+[ドキュメント] + def load(self, config): + """ + Loading information of configuration from config._sectoins['learning']. + + Parameters + ---------- + config: physbo.misc.set_config object + + + Returns + ------- + + """ + temp_dict = config._sections["learning"] + self.method = temp_dict.get("method", "adam") + self.is_disp = boolean(temp_dict.get("is_disp", True)) + self.num_disp = int(temp_dict.get("num_disp", 10)) + self.num_init_params_search = int(temp_dict.get("num_init_params_search", 20))
+
+ + + +
+[ドキュメント] +class batch(learning): + def __init__(self): + super(batch, self).__init__() + self.method = "bfgs" + self.max_iter = 200 + self.max_iter_init_params_search = 20 + self.batch_size = 5000 + +
+[ドキュメント] + def show(self): + """ + Showing information about configuration about batch object. + + Returns + ------- + + """ + super(batch, self).show() + print("max_iter: ", self.max_iter) + print("max_iter_init_params_search: ", self.max_iter_init_params_search) + print("batch_size: ", self.batch_size)
+ + +
+[ドキュメント] + def load(self, config): + """ + Loading information of configuration from config._sectoins['batch']. + + Parameters + ---------- + config: physbo.misc.set_config object + + Returns + ------- + + """ + super(batch, self).load(config) + temp_dict = config._sections["batch"] + self.max_iter = int(temp_dict.get("max_iter", 200)) + self.max_iter_init_params_search = int( + temp_dict.get("max_iter_init_params_search", 20) + ) + self.batch_size = int(temp_dict.get("batch_size", 5000))
+
+ + + +
+[ドキュメント] +class online(learning): + def __init__(self): + super(online, self).__init__() + self.max_epoch = 500 + self.max_epoch_init_params_search = 50 + self.batch_size = 64 + self.eval_size = 5000 + +
+[ドキュメント] + def show(self): + """ + Showing information about configuration about online object. + + Returns + ------- + + """ + super(online, self).show() + print("max_epoch: ", self.max_epoch) + print("max_epoch_init_params_search: ", self.max_epoch_init_params_search) + print("batch_size: ", self.batch_size) + print("eval_size: ", self.eval_size)
+ + +
+[ドキュメント] + def load(self, config): + """ + Loading information of configuration from config._sectoins['online']. + + Parameters + ---------- + config: physbo.misc.set_config object + + + Returns + ------- + + """ + super(online, self).load(config) + temp_dict = config._sections["online"] + self.max_epoch = int(temp_dict.get("max_epoch", 1000)) + self.max_epoch_init_params_search = int( + temp_dict.get("max_epoch_init_params_search", 50) + ) + self.batch_size = int(temp_dict.get("batch_size", 64)) + self.eval_size = int(temp_dict.get("eval_size", 5000))
+
+ + + +
+[ドキュメント] +class adam(online): + def __init__(self): + super(adam, self).__init__() + self.method = "adam" + self.alpha = 0.001 + self.beta = 0.9 + self.gamma = 0.999 + self.epsilon = 1e-6 + +
+[ドキュメント] + def show(self): + """ + Showing information about configuration about adam object. + + Returns + ------- + + """ + super(adam, self).show() + print("alpha = ", self.alpha) + print("beta = ", self.beta) + print("gamma = ", self.gamma) + print("epsilon = ", self.epsilon) + print("\n")
+ + +
+[ドキュメント] + def load(self, config): + """ + Loading information of configuration from config._sectoins['adam']. + + Parameters + ---------- + config: physbo.misc.set_config object + + Returns + ------- + + """ + super(adam, self).load(config) + temp_dict = config._sections["adam"] + self.alpha = np.float64(temp_dict.get("alpha", 0.001)) + self.beta = np.float64(temp_dict.get("beta", 0.9)) + self.gamma = np.float64(temp_dict.get("gamma", 0.9999)) + self.epsilon = np.float64(temp_dict.get("epsilon", 1e-6))
+
+ + + +
+[ドキュメント] +def boolean(str): + """ + Return boolean. + + Parameters + ---------- + str: str or boolean + + Returns + ------- + True or False + """ + if str == "True" or str is True: + return True + else: + return False
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/opt/adam.html b/manual/v2.0.2/ja/_modules/physbo/opt/adam.html new file mode 100644 index 00000000..0127ef41 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/opt/adam.html @@ -0,0 +1,288 @@ + + + + + + + + physbo.opt.adam — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.opt.adam のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class adam: + """ + Optimizer of f(x) with the adam method + + Attributes + ========== + params: numpy.ndarray + current input, x + nparams: int + dimension + grad: function + gradient function, g(x) = f'(x) + m: numpy.ndarray + v: numpy.ndarray + epoch: int + the number of update already done + max_epoch: int + the maximum number of update + alpha: float + beta: float + gamma: float + epsilon: float + """ + + def __init__(self, params, grad, options={}): + """ + + Parameters + ========== + params: + grad: + options: dict + Hyperparameters for the adam method + + - "alpha" (default: 0.001) + - "beta" (default: 0.9) + - "gamma" (default: 0.9999) + - "epsilon" (default: 1e-8) + - "max_epoch" (default: 4000) + """ + self.grad = grad + self.params = params + self.nparams = params.shape[0] + self._set_options(options) + self.m = np.zeros(self.nparams) + self.v = np.zeros(self.nparams) + self.epoch = 0 + +
+[ドキュメント] + def set_params(self, params): + self.params = params
+ + +
+[ドキュメント] + def update(self, params, *args, **kwargs): + """ + calculates the updates of params + + Parameters + ========== + params: numpy.ndarray + input + args: + will be passed to self.grad + kwargs: + will be passed to self.grad + + Returns + ======= + numpy.ndarray + update of params + """ + g = self.grad(params, *args, **kwargs) + self.m = self.m * self.beta + g * (1 - self.beta) + self.v = self.v * self.gamma + g**2 * (1 - self.gamma) + hat_m = self.m / (1 - self.beta ** (self.epoch + 1)) + hat_v = self.v / (1 - self.gamma ** (self.epoch + 1)) + self.epoch += 1 + return -self.alpha * hat_m / (np.sqrt(hat_v) + self.epsilon)
+ + +
+[ドキュメント] + def run(self, *args, **kwargs): + params = self.params + for epoch in range(self.max_epoch): + update = self.update(params, *args, **kwargs) + params += update
+ + + def _set_options(self, options): + """ + set hyperparameters for the method + + Parameters + ========== + options: dict + + """ + self.alpha = options.get("alpha", 0.001) + self.beta = options.get("beta", 0.9) + self.gamma = options.get("gamma", 0.9999) + self.epsilon = options.get("epsilon", 1e-8) + self.max_epoch = options.get("max_epoch", 4000)
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/predictor.html b/manual/v2.0.2/ja/_modules/physbo/predictor.html new file mode 100644 index 00000000..730d86f6 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/predictor.html @@ -0,0 +1,472 @@ + + + + + + + + physbo.predictor — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.predictor のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import pickle as pickle
+import numpy as np
+from physbo import gp
+
+
+
+[ドキュメント] +class base_predictor(object): + """ + Base predictor is defined in this class. + + """ + + def __init__(self, config, model=None): + """ + + Parameters + ---------- + config: set_config object (physbo.misc.set_config) + model: model object + A default model is set as gp.core.model + """ + + self.config = config + self.model = model + if self.model is None: + self.model = gp.core.model( + cov=gp.cov.gauss(num_dim=None, ard=False), + mean=gp.mean.const(), + lik=gp.lik.gauss(), + ) + +
+[ドキュメント] + def fit(self, *args, **kwds): + """ + + Default fit function. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def prepare(self, *args, **kwds): + """ + + Default prepare function. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def delete_stats(self, *args, **kwds): + """ + + Default function to delete status. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_basis(self, *args, **kwds): + """ + + Default function to get basis + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_post_fmean(self, *args, **kwds): + """ + + Default function to get a mean value of the score. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_post_fcov(self, *args, **kwds): + """ + + Default function to get a covariance of the score. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_post_params(self, *args, **kwds): + """ + + Default function to get parameters. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_post_samples(self, *args, **kwds): + """ + + Default function to get samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_predict_samples(self, *args, **kwds): + """ + + Default function to get prediction variables of samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def get_post_params_samples(self, *args, **kwds): + """ + + Default function to get parameters of samples. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def update(self, *args, **kwds): + """ + + Default function to update variables. + This function must be overwritten in each model. + + Parameters + ---------- + args + kwds + + Returns + ------- + + """ + raise NotImplementedError
+ + +
+[ドキュメント] + def save(self, file_name): + """ + + Default function to save information by using pickle.dump function. + The protocol version is set as 3. + + Parameters + ---------- + file_name: str + A file name to save self.__dict__ object. + + Returns + ------- + + """ + with open(file_name, "wb") as f: + pickle.dump(self.__dict__, f, 4)
+ + +
+[ドキュメント] + def load(self, file_name): + """ + + Default function to load variables. + The information is updated using self.update function. + + Parameters + ---------- + file_name: str + A file name to load variables from the file. + + Returns + ------- + + """ + with open(file_name, "rb") as f: + tmp_dict = pickle.load(f) + self.config = tmp_dict["config"] + self.model = tmp_dict["model"]
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/discrete/policy.html b/manual/v2.0.2/ja/_modules/physbo/search/discrete/policy.html new file mode 100644 index 00000000..a8ccf3da --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/discrete/policy.html @@ -0,0 +1,1022 @@ + + + + + + + + physbo.search.discrete.policy — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.discrete.policy のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle as pickle
+import itertools
+import time
+
+from .results import history
+from .. import utility
+from .. import score as search_score
+from ...gp import predictor as gp_predictor
+from ...blm import predictor as blm_predictor
+from ...misc import set_config
+
+from physbo.variable import variable
+
+
+
+[ドキュメント] +class policy: + def __init__(self, test_X, config=None, initial_data=None, comm=None): + """ + + Parameters + ---------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + config: set_config object (physbo.misc.set_config) + initial_data: tuple[np.ndarray, np.ndarray] + The initial training datasets. + The first elements is the array of actions and the second is the array of value of objective functions + comm: MPI.Comm, optional + MPI Communicator + """ + self.predictor = None + self.training = variable() + self.new_data = None + self.test = self._make_variable_X(test_X) + self.actions = np.arange(0, self.test.X.shape[0]) + self.history = history() + if config is None: + self.config = set_config() + else: + self.config = config + + if initial_data is not None: + if len(initial_data) != 2: + msg = "ERROR: initial_data should be 2-elements tuple or list (actions and objectives)" + raise RuntimeError(msg) + actions, fs = initial_data + if len(actions) != len(fs): + msg = "ERROR: len(initial_data[0]) != len(initial_data[1])" + raise RuntimeError(msg) + self.write(actions, fs) + self.actions = np.array(sorted(list(set(self.actions) - set(actions)))) + + if comm is None: + self.mpicomm = None + self.mpisize = 1 + self.mpirank = 0 + else: + self.mpicomm = comm + self.mpisize = comm.size + self.mpirank = comm.rank + self.actions = np.array_split(self.actions, self.mpisize)[self.mpirank] + self.config.learning.is_disp = ( + self.config.learning.is_disp and self.mpirank == 0 + ) + +
+[ドキュメント] + def set_seed(self, seed): + """ + Setting a seed parameter for np.random. + + Parameters + ---------- + seed: int + seed number + ------- + + """ + self.seed = seed + np.random.seed(self.seed)
+ + +
+[ドキュメント] + def write( + self, + action, + t, + X=None, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + """ + Writing history (update history, not output to a file). + + Parameters + ---------- + action: numpy.ndarray + Indexes of actions. + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + X: numpy.ndarray + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + time_total: numpy.ndarray + N dimenstional array. The total elapsed time in each step. + If None (default), filled by 0.0. + time_update_predictor: numpy.ndarray + N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. + If None (default), filled by 0.0. + time_get_action: numpy.ndarray + N dimenstional array. The elapsed time for getting next action in each step. + If None (default), filled by 0.0. + time_run_simulator: numpy.ndarray + N dimenstional array. The elapsed time for running the simulator in each step. + If None (default), filled by 0.0. + + Returns + ------- + + """ + if X is None: + X = self.test.X[action, :] + Z = self.test.Z[action, :] if self.test.Z is not None else None + else: + Z = self.predictor.get_basis(X) if self.predictor is not None else None + + self.history.write( + t, + action, + time_total=time_total, + time_update_predictor=time_update_predictor, + time_get_action=time_get_action, + time_run_simulator=time_run_simulator, + ) + self.training.add(X=X, t=t, Z=Z) + + # remove the selected actions from the list of candidates if exists + if len(self.actions) > 0: + local_index = np.searchsorted(self.actions, action) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == action + ] + self.actions = self._delete_actions(local_index) + + if self.new_data is None: + self.new_data = variable(X=X, t=t, Z=Z) + else: + self.new_data.add(X=X, t=t, Z=Z)
+ + + + + + + + + @staticmethod + def _warn_no_predictor(method_name): + print("Warning: Since policy.predictor is not yet set,") + print(" a GP predictor (num_rand_basis=0) is used for predicting") + print(" If you want to use a BLM predictor (num_rand_basis>0),") + print(" call bayes_search(max_num_probes=0, num_rand_basis=nrb)") + print(" before calling {}.".format(method_name)) + +
+[ドキュメント] + def get_post_fmean(self, xs): + """Calculate mean value of predictor (post distribution)""" + X = self._make_variable_X(xs) + if self.predictor is None: + self._warn_no_predictor("get_post_fmean()") + predictor = gp_predictor(self.config) + predictor.fit(self.training, 0) + predictor.prepare(self.training) + return predictor.get_post_fmean(self.training, X) + else: + self._update_predictor() + return self.predictor.get_post_fmean(self.training, X)
+ + +
+[ドキュメント] + def get_post_fcov(self, xs): + """Calculate covariance of predictor (post distribution)""" + X = self._make_variable_X(xs) + if self.predictor is None: + self._warn_no_predictor("get_post_fcov()") + predictor = gp_predictor(self.config) + predictor.fit(self.training, 0) + predictor.prepare(self.training) + return predictor.get_post_fcov(self.training, X) + else: + self._update_predictor() + return self.predictor.get_post_fcov(self.training, X)
+ + +
+[ドキュメント] + def get_score( + self, + mode, + *, + actions=None, + xs=None, + predictor=None, + training=None, + parallel=True, + alpha=1 + ): + """ + Calcualte score (acquisition function) + + Parameters + ---------- + mode: str + The type of aquisition funciton. TS, EI and PI are available. + These functions are defined in score.py. + actions: array of int + actions to calculate score + xs: physbo.variable or np.ndarray + input parameters to calculate score + predictor: predictor object + predictor used to calculate score. + If not given, self.predictor will be used. + training:physbo.variable + Training dataset. + If not given, self.training will be used. + parallel: bool + Calculate scores in parallel by MPI (default: True) + alpha: float + Tuning parameter which is used if mode = TS. + In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size). + + Returns + ------- + f: float or list of float + Score defined in each mode. + + Raises + ------ + RuntimeError + If both *actions* and *xs* are given + + Notes + ----- + When neither *actions* nor *xs* are given, scores for actions not yet searched will be calculated. + + When *parallel* is True, it is assumed that the function receives the same input (*actions* or *xs*) for all the ranks. + If you want to split the input array itself, set *parallel* be False and merge results by yourself. + """ + if training is None: + training = self.training + + if training.X is None or training.X.shape[0] == 0: + msg = "ERROR: No training data is registered." + raise RuntimeError(msg) + + if predictor is None: + if self.predictor is None: + self._warn_no_predictor("get_score()") + predictor = gp_predictor(self.config) + predictor.fit(training, 0) + predictor.prepare(training) + else: + self._update_predictor() + predictor = self.predictor + + if xs is not None: + if actions is not None: + raise RuntimeError("ERROR: both actions and xs are given") + test = self._make_variable_X(xs) + if parallel and self.mpisize > 1: + actions = np.array_split(np.arange(test.X.shape[0]), self.mpisize) + test = test.get_subset(actions[self.mpirank]) + else: + if actions is None: + actions = self.actions + else: + if isinstance(actions, int): + actions = [actions] + if parallel and self.mpisize > 1: + actions = np.array_split(actions, self.mpisize)[self.mpirank] + test = self.test.get_subset(actions) + + f = search_score.score( + mode, predictor=predictor, training=training, test=test, alpha=alpha + ) + if parallel and self.mpisize > 1: + fs = self.mpicomm.allgather(f) + f = np.hstack(fs) + return f
+ + + def _get_marginal_score(self, mode, chosen_actions, K, alpha): + """ + Getting marginal scores. + + Parameters + ---------- + mode: str + The type of aquision funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + chosen_actions: numpy.ndarray + Array of selected actions. + K: int + The number of samples for evaluating score. + alpha: float + not used. + + Returns + ------- + f: list + N dimensional scores (score is defined in each mode) + """ + f = np.zeros((K, len(self.actions)), dtype=float) + + # draw K samples of the values of objective function of chosen actions + new_test_local = self.test.get_subset(chosen_actions) + virtual_t_local = self.predictor.get_predict_samples( + self.training, new_test_local, K + ) + if self.mpisize == 1: + new_test = new_test_local + virtual_t = virtual_t_local + else: + new_test = variable() + for nt in self.mpicomm.allgather(new_test_local): + new_test.add(X=nt.X, t=nt.t, Z=nt.Z) + virtual_t = np.concatenate(self.mpicomm.allgather(virtual_t_local), axis=1) + # virtual_t = self.predictor.get_predict_samples(self.training, new_test, K) + + for k in range(K): + predictor = copy.deepcopy(self.predictor) + train = copy.deepcopy(self.training) + virtual_train = new_test + virtual_train.t = virtual_t[k, :] + + if virtual_train.Z is None: + train.add(virtual_train.X, virtual_train.t) + else: + train.add(virtual_train.X, virtual_train.t, virtual_train.Z) + + predictor.update(train, virtual_train) + + f[k, :] = self.get_score( + mode, predictor=predictor, training=train, parallel=False + ) + return np.mean(f, axis=0) + + def _get_actions(self, mode, N, K, alpha): + """ + Getting next candidates + + Parameters + ---------- + mode: str + The type of aquisition funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + N: int + The total number of actions to return. + K: int + The total number of samples to evaluate marginal score + alpha: float + Tuning parameter which is used if mode = TS. + In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size). + + Returns + ------- + chosen_actions: numpy.ndarray + An N-dimensional array of actions selected in each search process. + """ + f = self.get_score( + mode, + predictor=self.predictor, + training=self.training, + alpha=alpha, + parallel=False, + ) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + return np.zeros(0, dtype=int) + if champion == local_champion: + self.actions = self._delete_actions(local_index) + + chosen_actions = [champion] + for n in range(1, N): + f = self._get_marginal_score(mode, chosen_actions[0:n], K, alpha) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + break + if champion == local_champion: + self.actions = self._delete_actions(local_index) + chosen_actions.append(champion) + return np.array(chosen_actions) + + def _find_champion(self, f): + if len(f) == 0: + local_fmax = -float("inf") + local_index = -1 + local_champion = -1 + else: + local_fmax = np.max(f) + local_index = np.argmax(f) + local_champion = self.actions[local_index] + if self.mpisize == 1: + champion = local_champion + else: + local_champions = self.mpicomm.allgather(local_champion) + local_fs = self.mpicomm.allgather(local_fmax) + champion_rank = np.argmax(local_fs) + champion = local_champions[champion_rank] + return champion, local_champion, local_index + + def _get_random_action(self, N): + """ + Getting indexes of actions randomly. + + Parameters + ---------- + N: int + Total number of search candidates. + Returns + ------- + action: numpy.ndarray + Indexes of actions selected randomly from search candidates. + """ + if self.mpisize == 1: + n = len(self.actions) + if n <= N: + index = np.arange(0, n) + else: + index = np.random.choice(len(self.actions), N, replace=False) + action = self.actions[index] + self.actions = self._delete_actions(index) + else: + nactions = self.mpicomm.gather(len(self.actions), root=0) + local_indices = [[] for _ in range(self.mpisize)] + if self.mpirank == 0: + hi = np.add.accumulate(nactions) + lo = np.roll(hi, 1) + lo[0] = 0 + if hi[-1] <= N: + index = np.arange(0, hi[-1]) + else: + index = np.random.choice(hi[-1], N, replace=False) + ranks = np.searchsorted(hi, index, side="right") + for r, i in zip(ranks, index): + local_indices[r].append(i - lo[r]) + local_indices = self.mpicomm.scatter(local_indices, root=0) + local_actions = self.actions[local_indices] + self.actions = self._delete_actions(local_indices) + action = self.mpicomm.allgather(local_actions) + action = itertools.chain.from_iterable(action) + action = np.array(list(action)) + return action + +
+[ドキュメント] + def save(self, file_history, file_training=None, file_predictor=None): + """ + + Saving history, training and predictor into the corresponding files. + + Parameters + ---------- + file_history: str + The name of the file that stores the information of the history. + file_training: str + The name of the file that stores the training dataset. + file_predictor: str + The name of the file that stores the predictor dataset. + + Returns + ------- + + """ + if self.mpirank == 0: + self.history.save(file_history) + + if file_training is not None: + self.training.save(file_training) + + if file_predictor is not None: + with open(file_predictor, "wb") as f: + pickle.dump(self.predictor, f)
+ + +
+[ドキュメント] + def load(self, file_history, file_training=None, file_predictor=None): + """ + + Loading files about history, training and predictor. + + Parameters + ---------- + file_history: str + The name of the file that stores the information of the history. + file_training: str + The name of the file that stores the training dataset. + file_predictor: str + The name of the file that stores the predictor dataset. + + Returns + ------- + + """ + self.history.load(file_history) + + if file_training is None: + N = self.history.total_num_search + X = self.test.X[self.history.chosen_actions[0:N], :] + t = self.history.fx[0:N] + self.training = variable(X=X, t=t) + else: + self.training = variable() + self.training.load(file_training) + + if file_predictor is not None: + with open(file_predictor, "rb") as f: + self.predictor = pickle.load(f) + + N = self.history.total_num_search + + visited = self.history.chosen_actions[:N] + local_index = np.searchsorted(self.actions, visited) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == visited + ] + self.actions = self._delete_actions(local_index)
+ + +
+[ドキュメント] + def export_predictor(self): + """ + Returning the predictor dataset + + Returns + ------- + + """ + return self.predictor
+ + +
+[ドキュメント] + def export_training(self): + """ + Returning the training dataset + + Returns + ------- + + """ + return self.training
+ + +
+[ドキュメント] + def export_history(self): + """ + Returning the information of the history. + + Returns + ------- + + """ + return self.history
+ + + def _init_predictor(self, is_rand_expans): + """ + Initialize predictor. + + Parameters + ---------- + is_rand_expans: bool + If true, physbo.blm.predictor is selected. + If false, physbo.gp.predictor is selected. + """ + if is_rand_expans: + self.predictor = blm_predictor(self.config) + else: + self.predictor = gp_predictor(self.config) + + def _learn_hyperparameter(self, num_rand_basis): + self.predictor.fit(self.training, num_rand_basis) + self.test.Z = self.predictor.get_basis(self.test.X) + self.training.Z = self.predictor.get_basis(self.training.X) + self.predictor.prepare(self.training) + self.new_data = None + + def _update_predictor(self): + if self.new_data is not None: + self.predictor.update(self.training, self.new_data) + self.new_data = None + + def _make_variable_X(self, test_X): + """ + Make a new *variable* with X=test_X + + Parameters + ---------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + Returns + ------- + test_X: numpy.ndarray or physbo.variable + The set of candidates. Each row vector represents the feature vector of each search candidate. + """ + if isinstance(test_X, np.ndarray): + test = variable(X=test_X) + elif isinstance(test_X, variable): + test = test_X + else: + raise TypeError("The type of test_X must be ndarray or physbo.variable") + return test + + def _delete_actions(self, index, actions=None): + """ + Returns remaining actions + + Notes + ----- + This method itself does not modify *self* + + Parameters + ---------- + index: int + Index of an action to be deleted. + actions: numpy.ndarray + Array of actions. + Returns + ------- + actions: numpy.ndarray + Array of actions which does not include action specified by index. + """ + if actions is None: + actions = self.actions + return np.delete(actions, index)
+ + + +def _run_simulator(simulator, action, comm=None): + if comm is None: + return simulator(action) + if comm.rank == 0: + t = simulator(action) + else: + t = 0.0 + return comm.bcast(t, root=0) +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/discrete/results.html b/manual/v2.0.2/ja/_modules/physbo/search/discrete/results.html new file mode 100644 index 00000000..c572af51 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/discrete/results.html @@ -0,0 +1,379 @@ + + + + + + + + physbo.search.discrete.results — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.discrete.results のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle
+
+from .. import utility
+
+MAX_SEARCH = int(30000)
+
+
+
+[ドキュメント] +class history: + def __init__(self): + self.num_runs = int(0) + self.total_num_search = int(0) + self.fx = np.zeros(MAX_SEARCH, dtype=float) + self.chosen_actions = np.zeros(MAX_SEARCH, dtype=int) + self.terminal_num_run = np.zeros(MAX_SEARCH, dtype=int) + + self.time_total_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_update_predictor_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_get_action_ = np.zeros(MAX_SEARCH, dtype=float) + self.time_run_simulator_ = np.zeros(MAX_SEARCH, dtype=float) + + @property + def time_total(self): + return copy.copy(self.time_total_[0 : self.num_runs]) + + @property + def time_update_predictor(self): + return copy.copy(self.time_update_predictor_[0 : self.num_runs]) + + @property + def time_get_action(self): + return copy.copy(self.time_get_action_[0 : self.num_runs]) + + @property + def time_run_simulator(self): + return copy.copy(self.time_run_simulator_[0 : self.num_runs]) + +
+[ドキュメント] + def write( + self, + t, + action, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + """ + Overwrite fx and chosen_actions by t and action. + + Parameters + ---------- + t: numpy.ndarray + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + action: numpy.ndarray + N dimensional array. The indexes of actions of each search candidate. + time_total: numpy.ndarray + N dimenstional array. The total elapsed time in each step. + If None (default), filled by 0.0. + time_update_predictor: numpy.ndarray + N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. + If None (default), filled by 0.0. + time_get_action: numpy.ndarray + N dimenstional array. The elapsed time for getting next action in each step. + If None (default), filled by 0.0. + time_run_simulator: numpy.ndarray + N dimenstional array. The elapsed time for running the simulator in each step. + If None (default), filled by 0.0. + Returns + ------- + + """ + N = utility.length_vector(t) + st = self.total_num_search + en = st + N + + self.terminal_num_run[self.num_runs] = en + self.fx[st:en] = t + self.chosen_actions[st:en] = action + self.num_runs += 1 + self.total_num_search += N + + if time_total is None: + time_total = np.zeros(N, dtype=float) + self.time_total_[st:en] = time_total + + if time_update_predictor is None: + time_update_predictor = np.zeros(N, dtype=float) + self.time_update_predictor_[st:en] = time_update_predictor + + if time_get_action is None: + time_get_action = np.zeros(N, dtype=float) + self.time_get_action_[st:en] = time_get_action + + if time_run_simulator is None: + time_run_simulator = np.zeros(N, dtype=float) + self.time_run_simulator_[st:en] = time_run_simulator
+ + +
+[ドキュメント] + def export_sequence_best_fx(self): + """ + Export fx and actions at each sequence. + (The total number of data is num_runs.) + + Returns + ------- + best_fx: numpy.ndarray + best_actions: numpy.ndarray + """ + best_fx = np.zeros(self.num_runs, dtype=float) + best_actions = np.zeros(self.num_runs, dtype=int) + for n in range(self.num_runs): + index = np.argmax(self.fx[0 : self.terminal_num_run[n]]) + best_actions[n] = self.chosen_actions[index] + best_fx[n] = self.fx[index] + + return best_fx, best_actions
+ + +
+[ドキュメント] + def export_all_sequence_best_fx(self): + """ + Export all fx and actions at each sequence. + (The total number of data is total_num_research.) + + Returns + ------- + best_fx: numpy.ndarray + best_actions: numpy.ndarray + """ + best_fx = np.zeros(self.total_num_search, dtype=float) + best_actions = np.zeros(self.total_num_search, dtype=int) + best_fx[0] = self.fx[0] + best_actions[0] = self.chosen_actions[0] + + for n in range(1, self.total_num_search): + if best_fx[n - 1] < self.fx[n]: + best_fx[n] = self.fx[n] + best_actions[n] = self.chosen_actions[n] + else: + best_fx[n] = best_fx[n - 1] + best_actions[n] = best_actions[n - 1] + + return best_fx, best_actions
+ + +
+[ドキュメント] + def save(self, filename): + """ + Save the information of the history. + + Parameters + ---------- + filename: str + The name of the file which stores the information of the history + Returns + ------- + + """ + N = self.total_num_search + M = self.num_runs + np.savez_compressed( + filename, + num_runs=M, + total_num_search=N, + fx=self.fx[0:N], + chosen_actions=self.chosen_actions[0:N], + terminal_num_run=self.terminal_num_run[0:M], + )
+ + +
+[ドキュメント] + def load(self, filename): + """ + Load the information of the history. + + Parameters + ---------- + filename: str + The name of the file which stores the information of the history + Returns + ------- + + """ + data = np.load(filename) + M = int(data["num_runs"]) + N = int(data["total_num_search"]) + self.num_runs = M + self.total_num_search = N + self.fx[0:N] = data["fx"] + self.chosen_actions[0:N] = data["chosen_actions"] + self.terminal_num_run[0:M] = data["terminal_num_run"]
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/policy.html b/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/policy.html new file mode 100644 index 00000000..f52dd56f --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/policy.html @@ -0,0 +1,769 @@ + + + + + + + + physbo.search.discrete_multi.policy — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.discrete_multi.policy のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import copy
+import pickle as pickle
+import time
+
+from .results import history
+from .. import discrete
+from .. import utility
+from .. import score_multi as search_score
+from ...gp import predictor as gp_predictor
+from ...blm import predictor as blm_predictor
+from ...misc import set_config
+from ...variable import variable
+
+from typing import List, Optional
+
+
+
+[ドキュメント] +class policy(discrete.policy): + new_data_list: List[Optional[variable]] + + def __init__( + self, test_X, num_objectives, comm=None, config=None, initial_data=None + ): + self.num_objectives = num_objectives + self.history = history(num_objectives=self.num_objectives) + + self.training_list = [variable() for _ in range(self.num_objectives)] + self.predictor_list = [None for _ in range(self.num_objectives)] + self.test_list = [ + self._make_variable_X(test_X) for _ in range(self.num_objectives) + ] + self.new_data_list = [None for _ in range(self.num_objectives)] + + self.actions = np.arange(0, test_X.shape[0]) + if config is None: + self.config = set_config() + else: + self.config = config + + self.TS_candidate_num = None + + if initial_data is not None: + if len(initial_data) != 2: + msg = "ERROR: initial_data should be 2-elements tuple or list (actions and objectives)" + raise RuntimeError(msg) + actions, fs = initial_data + if fs.shape[1] != self.num_objectives: + msg = "ERROR: initial_data[1].shape[1] != num_objectives" + raise RuntimeError(msg) + if len(actions) != fs.shape[0]: + msg = "ERROR: len(initial_data[0]) != initial_data[1].shape[0]" + raise RuntimeError(msg) + self.write(actions, fs) + self.actions = np.array(sorted(list(set(self.actions) - set(actions)))) + + if comm is None: + self.mpicomm = None + self.mpisize = 1 + self.mpirank = 0 + else: + self.mpicomm = comm + self.mpisize = comm.size + self.mpirank = comm.rank + self.actions = np.array_split(self.actions, self.mpisize)[self.mpirank] + +
+[ドキュメント] + def write( + self, + action, + t, + X=None, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + self.history.write( + t, + action, + time_total=time_total, + time_update_predictor=time_update_predictor, + time_get_action=time_get_action, + time_run_simulator=time_run_simulator, + ) + action = np.array(action) + t = np.array(t) + + for i in range(self.num_objectives): + test = self.test_list[i] + predictor = self.predictor_list[i] + + if X is None: + X = test.X[action, :] + Z = test.Z[action, :] if test.Z is not None else None + else: + Z = predictor.get_basis(X) if predictor is not None else None + + if self.new_data_list[i] is None: + self.new_data_list[i] = variable(X, t[:, i], Z) + else: + self.new_data_list[i].add(X=X, t=t[:, i], Z=Z) + self.training_list[i].add(X=X, t=t[:, i], Z=Z) + + # remove action from candidates if exists + if len(self.actions) > 0: + local_index = np.searchsorted(self.actions, action) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == action + ] + self.actions = self._delete_actions(local_index)
+ + + def _model(self, i): + training = self.training_list[i] + predictor = self.predictor_list[i] + test = self.test_list[i] + new_data = self.new_data_list[i] + return { + "training": training, + "predictor": predictor, + "test": test, + "new_data": new_data, + } + + + + + + + + def _get_actions(self, mode, N, K, alpha): + f = self.get_score(mode=mode, alpha=alpha, parallel=False) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + return np.zeros(0, dtype=int) + if champion == local_champion: + self.actions = self._delete_actions(local_index) + + chosen_actions = [champion] + for n in range(1, N): + f = self._get_marginal_score(mode, chosen_actions[0:n], K, alpha) + champion, local_champion, local_index = self._find_champion(f) + if champion == -1: + break + if champion == local_champion: + self.actions = self._delete_actions(local_index) + chosen_actions.append(champion) + return np.array(chosen_actions) + +
+[ドキュメント] + def get_post_fmean(self, xs): + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_post_fmean()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(self.training_list[i], 0) + predictor.prepare(self.training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list[:] + X = self._make_variable_X(xs) + fmean = [ + predictor.get_post_fmean(training, X) + for predictor, training in zip(predictor_list, self.training_list) + ] + return np.array(fmean).T
+ + +
+[ドキュメント] + def get_post_fcov(self, xs): + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_post_fcov()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(self.training_list[i], 0) + predictor.prepare(self.training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list[:] + X = self._make_variable_X(xs) + fcov = [ + predictor.get_post_fcov(training, X) + for predictor, training in zip(predictor_list, self.training_list) + ] + return np.array(fcov).T
+ + +
+[ドキュメント] + def get_score( + self, + mode, + actions=None, + xs=None, + predictor_list=None, + training_list=None, + pareto=None, + parallel=True, + alpha=1, + ): + if training_list is None: + training_list = self.training_list + if pareto is None: + pareto = self.history.pareto + + if training_list[0].X is None or training_list[0].X.shape[0] == 0: + msg = "ERROR: No training data is registered." + raise RuntimeError(msg) + + if predictor_list is None: + if self.predictor_list == [None] * self.num_objectives: + self._warn_no_predictor("get_score()") + predictor_list = [] + for i in range(self.num_objectives): + predictor = gp_predictor(self.config) + predictor.fit(training_list[i], 0) + predictor.prepare(training_list[i]) + predictor_list.append(predictor) + else: + self._update_predictor() + predictor_list = self.predictor_list + + if xs is not None: + if actions is not None: + raise RuntimeError("ERROR: both actions and xs are given") + if isinstance(xs, variable): + test = xs + else: + test = variable(X=xs) + if parallel and self.mpisize > 1: + actions = np.array_split(np.arange(test.X.shape[0]), self.mpisize) + test = test.get_subset(actions[self.mpirank]) + else: + if actions is None: + actions = self.actions + else: + if isinstance(actions, int): + actions = [actions] + if parallel and self.mpisize > 1: + actions = np.array_split(actions, self.mpisize)[self.mpirank] + test = self.test_list[0].get_subset(actions) + + f = search_score.score( + mode, + predictor_list=predictor_list, + training_list=training_list, + test=test, + pareto=pareto, + reduced_candidate_num=self.TS_candidate_num, + alpha=alpha, + ) + if parallel and self.mpisize > 1: + fs = self.mpicomm.allgather(f) + f = np.hstack(fs) + return f
+ + + def _get_marginal_score(self, mode, chosen_actions, K, alpha): + """ + Getting marginal scores. + + Parameters + ---------- + mode: str + The type of aquision funciton. + TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available. + These functions are defined in score.py. + chosen_actions: numpy.ndarray + Array of selected actions. + K: int + The total number of search candidates. + alpha: float + not used. + + Returns + ------- + f: list + N dimensional scores (score is defined in each mode) + """ + f = np.zeros((K, len(self.actions)), dtype=float) + + # draw K samples of the values of objective function of chosen actions + new_test_list = [variable() for _ in range(self.num_objectives)] + virtual_t_list = [np.zeros((K, 0)) for _ in range(self.num_objectives)] + for i in range(self.num_objectives): + new_test_local = self.test_list[i].get_subset(chosen_actions) + virtual_t_local = self.predictor_list[i].get_predict_samples( + self.training_list[i], new_test_local, K + ) + if self.mpisize == 1: + new_test_list[i] = new_test_local + virtual_t_list[i] = virtual_t_local + else: + for nt in self.mpicomm.allgather(new_test_local): + new_test_list[i].add(X=nt.X, t=nt.t, Z=nt.Z) + virtual_t_list[i] = np.concatenate( + self.mpicomm.allgather(virtual_t_local), axis=1 + ) + + for k in range(K): + predictor_list = [copy.deepcopy(p) for p in self.predictor_list] + training_list = [copy.deepcopy(t) for t in self.training_list] + + for i in range(self.num_objectives): + virtual_train = new_test_list[i] + virtual_train.t = virtual_t_list[i][k, :] + + if virtual_train.Z is None: + training_list[i].add(virtual_train.X, virtual_train.t) + else: + training_list[i].add( + virtual_train.X, virtual_train.t, virtual_train.Z + ) + + predictor_list[i].update(training_list[i], virtual_train) + + f[k, :] = self.get_score( + mode, + predictor_list=predictor_list, + training_list=training_list, + parallel=False, + ) + return np.mean(f, axis=0) + +
+[ドキュメント] + def save(self, file_history, file_training_list=None, file_predictor_list=None): + if self.mpirank == 0: + self.history.save(file_history) + if file_training_list is not None: + self.save_training_list(file_training_list) + if file_predictor_list is not None: + self.save_predictor_list(file_predictor_list)
+ + +
+[ドキュメント] + def load(self, file_history, file_training_list=None, file_predictor_list=None): + self.history.load(file_history) + + if file_training_list is None: + N = self.history.total_num_search + X = self.test_list[0].X[self.history.chosen_actions[0:N], :] + t = self.history.fx[0:N] + self.training_list = [ + variable(X=X, t=t[:, i]) for i in range(self.num_objectives) + ] + else: + self.load_training_list(file_training_list) + + if file_predictor_list is not None: + self.load_predictor_list(file_predictor_list) + + N = self.history.total_num_search + + visited = self.history.chosen_actions[:N] + local_index = np.searchsorted(self.actions, visited) + local_index = local_index[ + np.take(self.actions, local_index, mode="clip") == visited + ] + self.actions = self._delete_actions(local_index)
+ + +
+[ドキュメント] + def save_predictor_list(self, file_name): + with open(file_name, "wb") as f: + pickle.dump(self.predictor_list, f, 2)
+ + +
+[ドキュメント] + def save_training_list(self, file_name): + obj = [ + {"X": training.X, "t": training.t, "Z": training.Z} + for training in self.training_list + ] + with open(file_name, "wb") as f: + pickle.dump(obj, f, 2)
+ + +
+[ドキュメント] + def load_predictor_list(self, file_name): + with open(file_name, "rb") as f: + self.predictor_list = pickle.load(f)
+ + +
+[ドキュメント] + def load_training_list(self, file_name): + with open(file_name, "rb") as f: + data_list = pickle.load(f) + + self.training_list = [variable() for i in range(self.num_objectives)] + for data, training in zip(data_list, self.training_list): + training.X = data["X"] + training.t = data["t"] + training.Z = data["Z"]
+ + + def _learn_hyperparameter(self, num_rand_basis): + for i in range(self.num_objectives): + m = self._model(i) + predictor = m["predictor"] + training = m["training"] + test = m["test"] + + predictor.fit(training, num_rand_basis) + test.Z = predictor.get_basis(test.X) + training.Z = predictor.get_basis(training.X) + predictor.prepare(training) + self.new_data_list[i] = None + # self.predictor_list[i].fit(self.training_list[i], num_rand_basis) + # self.test_list[i].Z = self.predictor_list[i].get_basis(self.test_list[i].X) + # self.training_list[i].Z = self.predictor_list[i].get_basis(self.training_list[i].X) + # self.predictor_list[i].prepare(self.training_list[i]) + # self.new_data_list[i] = None + + def _update_predictor(self): + for i in range(self.num_objectives): + if self.new_data_list[i] is not None: + self.predictor_list[i].update( + self.training_list[i], self.new_data_list[i] + ) + self.new_data_list[i] = None
+ + + +def _run_simulator(simulator, action, comm=None): + if comm is None: + return simulator(action) + if comm.rank == 0: + t = simulator(action) + else: + t = 0.0 + return comm.bcast(t, root=0) +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/results.html b/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/results.html new file mode 100644 index 00000000..25039011 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/discrete_multi/results.html @@ -0,0 +1,312 @@ + + + + + + + + physbo.search.discrete_multi.results — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.discrete_multi.results のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import pickle
+import copy
+
+from .. import pareto
+
+MAX_SEARCH = int(30000)
+
+
+
+[ドキュメント] +class history(object): + def __init__(self, num_objectives): + self.num_objectives = num_objectives + self.pareto = pareto.Pareto(num_objectives=self.num_objectives) + + self.num_runs = int(0) + self.total_num_search = int(0) + self.fx = np.zeros((MAX_SEARCH, self.num_objectives), dtype=float) + self.chosen_actions = np.zeros(MAX_SEARCH, dtype=int) + self.terminal_num_run = np.zeros(MAX_SEARCH, dtype=int) + + self._time_total = np.zeros(MAX_SEARCH, dtype=float) + self._time_update_predictor = np.zeros(MAX_SEARCH, dtype=float) + self._time_get_action = np.zeros(MAX_SEARCH, dtype=float) + self._time_run_simulator = np.zeros(MAX_SEARCH, dtype=float) + + @property + def time_total(self): + return copy.copy(self._time_total[0 : self.num_runs]) + + @property + def time_update_predictor(self): + return copy.copy(self._time_update_predictor[0 : self.num_runs]) + + @property + def time_get_action(self): + return copy.copy(self._time_get_action[0 : self.num_runs]) + + @property + def time_run_simulator(self): + return copy.copy(self._time_run_simulator[0 : self.num_runs]) + +
+[ドキュメント] + def write( + self, + t, + action, + time_total=None, + time_update_predictor=None, + time_get_action=None, + time_run_simulator=None, + ): + t = np.array(t) + action = np.array(action) + + if t.ndim == 1: + N = 1 + if len(t) != self.num_objectives: + raise ValueError("t does not match the number of objectives") + else: + N = t.shape[0] + if t.shape[1] != self.num_objectives: + raise ValueError("t does not match the number of objectives") + + st = self.total_num_search + en = st + N + + self.terminal_num_run[self.num_runs] = en + self.fx[st:en] = t + self.chosen_actions[st:en] = action + self.num_runs += 1 + self.total_num_search += N + + # update Pareto set + self.pareto.update_front(t) + + if time_total is None: + time_total = np.zeros(N, dtype=float) + self._time_total[st:en] = time_total + + if time_update_predictor is None: + time_update_predictor = np.zeros(N, dtype=float) + self._time_update_predictor[st:en] = time_update_predictor + + if time_get_action is None: + time_get_action = np.zeros(N, dtype=float) + self._time_get_action[st:en] = time_get_action + + if time_run_simulator is None: + time_run_simulator = np.zeros(N, dtype=float) + self._time_run_simulator[st:en] = time_run_simulator
+ + +
+[ドキュメント] + def export_pareto_front(self): + return self.pareto.export_front()
+ + +
+[ドキュメント] + def save(self, filename): + N = self.total_num_search + M = self.num_runs + + obj = { + "num_runs": M, + "total_num_search": N, + "fx": self.fx[0:N], + "chosen_actions": self.chosen_actions[0:N], + "terminal_num_run": self.terminal_num_run[0:M], + "pareto": self.pareto, + } + + with open(filename, "wb") as f: + pickle.dump(obj, f)
+ + +
+[ドキュメント] + def load(self, filename): + with open(filename, "rb") as f: + data = pickle.load(f) + + M = int(data["num_runs"]) + N = int(data["total_num_search"]) + self.num_runs = M + self.total_num_search = N + self.fx[0:N] = data["fx"] + self.chosen_actions[0:N] = data["chosen_actions"] + self.terminal_num_run[0:M] = data["terminal_num_run"] + self.pareto = data["pareto"]
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/pareto.html b/manual/v2.0.2/ja/_modules/physbo/search/pareto.html new file mode 100644 index 00000000..c66fb383 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/pareto.html @@ -0,0 +1,405 @@ + + + + + + + + physbo.search.pareto — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.pareto のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class Rectangles(object): + def __init__(self, n_dim, dtype): + """ + Initilize a set of hyper-rectangle. + + :param n_dim: dimension of rectangles + """ + self.n_dim = n_dim + self.lb = np.zeros((0, self.n_dim), dtype=dtype) + self.ub = np.zeros((0, self.n_dim), dtype=dtype) + +
+[ドキュメント] + def add(self, lb, ub): + """ + Add new rectangles. + + :param lb: lower bounds of rectangles + :param ub: upper bounds of rectangles + """ + self.lb = np.r_[self.lb, lb] + self.ub = np.r_[self.ub, ub]
+
+ + + +
+[ドキュメント] +def dominate(t1, t2): + """domination rule for maximization problem""" + return np.all(t1 >= t2) and np.any(t1 > t2)
+ + + +
+[ドキュメント] +class Pareto(object): + def __init__(self, num_objectives, dom_rule=None): + self.num_objectives = num_objectives + self.front = np.zeros((0, self.num_objectives)) + self.front_num = np.zeros(0, dtype=int) + self.num_compared = 0 + self.dom_rule = dom_rule + self.front_updated = False + + if self.dom_rule is None: + self.dom_rule = dominate + + self.cells = Rectangles(num_objectives, int) + self.reference_min = None + self.reference_max = None + +
+[ドキュメント] + def update_front(self, t): + """ + Update the non-dominated set of points. + + Pareto set is sorted on the first objective in ascending order. + """ + t = np.array(t) + if t.ndim == 1: + tt = [t] + else: + tt = t + + front_updated = False + + for k in range(len(tt)): + point = tt[k] + is_front = True + for i in range(len(self.front)): + if self.dom_rule(self.front[i], point): + is_front = False + break + + if is_front: + front_updated = True + dom_filter = np.full(len(self.front), True, dtype=bool) + for i in range(len(self.front)): + if self.dom_rule(point, self.front[i]): + dom_filter[i] = False + + self.front = np.r_[self.front[dom_filter], point[np.newaxis, :]] + self.front_num = np.r_[self.front_num[dom_filter], self.num_compared] + + self.num_compared += 1 + + if front_updated: + sorted_idx = self.front[:, 0].argsort() + self.front = self.front[sorted_idx, :] + self.front_num = self.front_num[sorted_idx] + self.divide_non_dominated_region() + + self.front_updated = front_updated
+ + +
+[ドキュメント] + def export_front(self): + return self.front, self.front_num
+ + +
+[ドキュメント] + def set_reference_min(self, reference_min=None): + if reference_min is None: + # estimate reference min point + front_min = np.min(self.front, axis=0, keepdims=True) + w = np.max(self.front, axis=0, keepdims=True) - front_min + reference_min = front_min - w * 2 / self.front.shape[0] + + self.reference_min = reference_min
+ + +
+[ドキュメント] + def set_reference_max(self, reference_max=None): + if reference_max is None: + # estimate reference max point + front_max = np.max(self.front, axis=0, keepdims=True) + w = front_max - np.min(self.front, axis=0, keepdims=True) + reference_max = front_max + w * 100 + + self.reference_max = reference_max
+ + +
+[ドキュメント] + def volume_in_dominance(self, ref_min, ref_max, dominance_ratio=False): + ref_min = np.array(ref_min) + ref_max = np.array(ref_max) + v_all = np.prod(ref_max - ref_min) + + front = np.r_[[ref_min], self.front, [ref_max]] + ax = np.arange(self.num_objectives) + lb = front[self.cells.lb, ax] + ub = front[self.cells.ub, ax] + + v_non_dom = np.sum(np.prod(ub - lb, axis=1)) + + if dominance_ratio: + return (v_all - v_non_dom) / v_all + else: + return v_all - v_non_dom
+ + +
+[ドキュメント] + def divide_non_dominated_region(self, force_binary_search=False): + # clear rectangles + self.cells = Rectangles(self.num_objectives, int) + + if self.num_objectives == 2 and not force_binary_search: + self.__divide_2d() + else: + self.__divide_using_binary_search()
+ + + def __divide_2d(self): + """ + Divide non-dominated region into vertical rectangles for the case of 2-objectives. + + Assumes that Pareto set has been sorted on the first objective in ascending order. + + Notes: + In 2-dimensional cases, the second objective has be sorted in decending order. + """ + n_cells = self.front.shape[0] + 1 + lb_idx = [[i, (i + 1) % n_cells] for i in range(n_cells)] + ub_idx = [[i + 1, n_cells] for i in range(n_cells)] + + self.cells.add(lb_idx, ub_idx) + + def __included_in_non_dom_region(self, p): + return np.all([np.any(pf <= p) for pf in self.front]) + + def __divide_using_binary_search(self): + front = np.r_[ + np.full((1, self.num_objectives), -np.inf), + self.front, + np.full((1, self.num_objectives), np.inf), + ] + + # Pareto front indices when sorted on each dimension's front value in ascending order. + # (indices start from 1) + # Index 0 means anti-ideal value, index `self.front.shape[0] + 1` means ideal point. + front_idx = np.r_[ + np.zeros((1, self.num_objectives), dtype=int), + np.argsort(self.front, axis=0) + 1, + np.full((1, self.num_objectives), self.front.shape[0] + 1, dtype=int), + ] + + rect_candidates = [[np.copy(front_idx[0]), np.copy(front_idx[-1])]] + + while rect_candidates: + rect = rect_candidates.pop() + + lb_idx = [front_idx[rect[0][d], d] for d in range(self.num_objectives)] + ub_idx = [front_idx[rect[1][d], d] for d in range(self.num_objectives)] + lb = [front[lb_idx[d], d] for d in range(self.num_objectives)] + ub = [front[ub_idx[d], d] for d in range(self.num_objectives)] + + if self.__included_in_non_dom_region(lb): + self.cells.add([lb_idx], [ub_idx]) + + elif self.__included_in_non_dom_region(ub): + rect_sizes = rect[1] - rect[0] + + # divide rectangle by the dimension with largest size + if np.any(rect_sizes > 1): + div_dim = np.argmax(rect_sizes) + div_point = rect[0][div_dim] + int(round(rect_sizes[div_dim] / 2.0)) + + # add divided left rectangle + left_ub_idx = np.copy(rect[1]) + left_ub_idx[div_dim] = div_point + rect_candidates.append([np.copy(rect[0]), left_ub_idx]) + + # add divided right rectangle + right_lb_idx = np.copy(rect[0]) + right_lb_idx[div_dim] = div_point + rect_candidates.append([right_lb_idx, np.copy(rect[1])])
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/score.html b/manual/v2.0.2/ja/_modules/physbo/search/score.html new file mode 100644 index 00000000..7f0dd15f --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/score.html @@ -0,0 +1,336 @@ + + + + + + + + physbo.search.score — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.score のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy.stats
+
+
+
+[ドキュメント] +def score(mode, predictor, test, training=None, **kwargs): + """ + Calculate scores (acquisition function) for test data. + + Parameters + ---------- + mode: str + Kind of score. + + "EI", "PI", and "TS" are available. + + predictor: predictor object + Base class is defined in physbo.predictor. + + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + + test: physbo.variable + Inputs + + Other Parameters + ---------------- + fmax: float + Max value of mean of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Used only for mode == "EI" and "PI" + + alpha: float + noise for sampling source (default: 1.0) + Used only for mode == "TS" + + Returns + ------- + score: numpy.ndarray + + Raises + ------ + NotImplementedError + If unknown mode is given + """ + + if test.X.shape[0] == 0: + return np.zeros(0) + + if mode == "EI": + fmax = kwargs.get("fmax", None) + return EI(predictor, training, test, fmax) + elif mode == "PI": + fmax = kwargs.get("fmax", None) + return PI(predictor, training, test, fmax) + elif mode == "TS": + alpha = kwargs.get("alpha", 1.0) + return TS(predictor, training, test, alpha) + else: + raise NotImplementedError("ERROR: mode must be EI, PI or TS.")
+ + + +
+[ドキュメント] +def EI(predictor, training, test, fmax=None): + """ + Maximum expected improvement. + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + fmax: float + Max value of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Returns + ------- + score: numpy.ndarray + """ + fmean = predictor.get_post_fmean(training, test) + fcov = predictor.get_post_fcov(training, test) + fstd = np.sqrt(fcov) + + if fmax is None: + fmax = np.max(predictor.get_post_fmean(training, training)) + + temp1 = fmean - fmax + temp2 = temp1 / fstd + score = temp1 * scipy.stats.norm.cdf(temp2) + fstd * scipy.stats.norm.pdf(temp2) + return score
+ + + +
+[ドキュメント] +def PI(predictor, training, test, fmax=None): + """ + Maximum probability of improvement. + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + fmax: float + Max value of posterior probability distribution. + If not set, the maximum value of posterior mean for training is used. + Returns + ------- + score: numpy.ndarray + """ + fmean = predictor.get_post_fmean(training, test) + fcov = predictor.get_post_fcov(training, test) + fstd = np.sqrt(fcov) + + if fmax is None: + fmax = np.max(predictor.get_post_fmean(training, training)) + + temp = (fmean - fmax) / fstd + score = scipy.stats.norm.cdf(temp) + return score
+ + + +
+[ドキュメント] +def TS(predictor, training, test, alpha=1): + """ + Thompson sampling (See Sec. 2.1 in Materials Discovery Volume 4, June 2016, Pages 18-21) + + Parameters + ---------- + predictor: predictor object + Base class is defined in physbo.predictor. + training: physbo.variable + Training dataset. + If the predictor is not trained, use this for training. + test: physbo.variable + Inputs + alpha: float + noise for sampling source + (default: 1.0) + Returns + ------- + score: numpy.ndarray + """ + return (predictor.get_post_samples(training, test, alpha=alpha)).flatten()
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/score_multi.html b/manual/v2.0.2/ja/_modules/physbo/search/score_multi.html new file mode 100644 index 00000000..6af59a1f --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/score_multi.html @@ -0,0 +1,378 @@ + + + + + + + + physbo.search.score_multi — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.score_multi のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+import scipy.stats
+
+from .pareto import Pareto
+
+
+
+[ドキュメント] +def score(mode, predictor_list, test, training_list, **kwargs): + if test.X.shape[0] == 0: + return np.zeros(0) + + if mode == "EHVI": + pareto = kwargs["pareto"] + fmean, fstd = _get_fmean_fstd(predictor_list, training_list, test) + f = EHVI(fmean, fstd, pareto) + elif mode == "HVPI": + pareto = kwargs["pareto"] + fmean, fstd = _get_fmean_fstd(predictor_list, training_list, test) + f = HVPI(fmean, fstd, pareto) + elif mode == "TS": + alpha = kwargs.get("alpha", 1.0) + reduced_candidate_num = kwargs["reduced_candidate_num"] + f = TS( + predictor_list, + training_list, + test, + alpha, + reduced_candidate_num=reduced_candidate_num, + ) + else: + raise NotImplementedError("mode must be EHVI, HVPI or TS.") + return f
+ + + +
+[ドキュメント] +def HVPI(fmean, fstd, pareto): + """ + Calculate Hypervolume-based Probability of Improvement (HVPI). + + Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization + """ + + N = fmean.shape[0] + n_obj = pareto.num_objectives + + if pareto.reference_min is None: + pareto.set_reference_min() + reference_min = pareto.reference_min + + # Pareto front with reference points + # shape: (front_size, n_obj) + front = np.r_[ + np.array(reference_min).reshape((1, n_obj)), + pareto.front, + np.full((1, n_obj), np.inf), + ] + + ax = np.arange(n_obj) + n_cell = pareto.cells.lb.shape[0] + + # convert to minimization problem + l = front[pareto.cells.ub, ax].reshape((1, n_cell, n_obj)) * -1 + u = front[pareto.cells.lb, ax].reshape((1, n_cell, n_obj)) * -1 + + # convert to minimization problem + fmean = fmean.reshape((N, 1, n_obj)) * -1 + fstd = fstd.reshape((N, 1, n_obj)) + + # calculate cdf + Phi_l = scipy.stats.norm.cdf((l - fmean) / fstd) + Phi_u = scipy.stats.norm.cdf((u - fmean) / fstd) + + # calculate PoI + poi = np.sum(np.prod(Phi_u - Phi_l, axis=2), axis=1) # shape: (N, 1) + + # calculate hypervolume contribution of fmean point + hv_valid = np.all(fmean < u, axis=2) # shape: (N, n_cell) + hv = np.prod(u - np.maximum(l, fmean), axis=2) # shape: (N, n_cell) + hv = np.sum(hv * hv_valid, axis=1) # shape: (N, 1) + + # HVPoI + score = hv * poi + return score
+ + + +
+[ドキュメント] +def EHVI(fmean, fstd, pareto): + """ + Calculate Expected Hyper-Volume Improvement (EHVI). + + Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization + """ + + N = fmean.shape[0] + n_obj = pareto.num_objectives + + if pareto.reference_min is None: + pareto.set_reference_min() + if pareto.reference_max is None: + pareto.set_reference_max() + reference_min = pareto.reference_min + reference_max = pareto.reference_max + + # Pareto front with reference points + # shape: (front_size, n_obj) + front = np.r_[ + np.array(reference_min).reshape((1, n_obj)), + pareto.front, + np.array(reference_max).reshape((1, n_obj)), + ] + + ax = np.arange(n_obj) + + # convert to minimization problem + l = front[pareto.cells.ub, ax] * -1 + u = front[pareto.cells.lb, ax] * -1 + + n_cell = pareto.cells.lb.shape[0] + + # shape: (n_cell, 1, n_cell, n_obj) + l = np.tile(l, (n_cell, 1, 1, 1)) + u = np.tile(u, (n_cell, 1, 1, 1)) + a = l.transpose((2, 1, 0, 3)) + b = u.transpose((2, 1, 0, 3)) + + # convert to minimization problem + fmean = fmean.reshape((1, N, 1, n_obj)) * -1 + fstd = fstd.reshape((1, N, 1, n_obj)) + + # calculate pdf, cdf + phi_min_bu = scipy.stats.norm.pdf((np.minimum(b, u) - fmean) / fstd) + phi_max_al = scipy.stats.norm.pdf((np.maximum(a, l) - fmean) / fstd) + Phi_l = scipy.stats.norm.cdf((l - fmean) / fstd) + Phi_u = scipy.stats.norm.cdf((u - fmean) / fstd) + Phi_a = scipy.stats.norm.cdf((a - fmean) / fstd) + Phi_b = scipy.stats.norm.cdf((b - fmean) / fstd) + + ## calculate G + is_type_A = np.logical_and(a < u, l < b) + is_type_B = u <= a + + # note: Phi[max_or_min(x,y)] = max_or_min(Phi[x], Phi[y]) + EI_A = ( + (b - a) * (np.maximum(Phi_a, Phi_l) - Phi_l) + + (b - fmean) * (np.minimum(Phi_b, Phi_u) - np.maximum(Phi_a, Phi_l)) + + fstd * (phi_min_bu - phi_max_al) + ) + EI_B = (b - a) * (Phi_u - Phi_l) + + G = EI_A * is_type_A + EI_B * is_type_B + score = np.sum(np.sum(np.prod(G, axis=3), axis=0), axis=1) # shape: (N, 1) + return score
+ + + +
+[ドキュメント] +def TS(predictor_list, training_list, test, alpha=1, reduced_candidate_num=None): + score = [ + predictor.get_post_samples(training, test, alpha=alpha) + for predictor, training in zip(predictor_list, training_list) + ] + score = np.array(score).reshape((len(predictor_list), test.X.shape[0])).T + pareto = Pareto(num_objectives=len(predictor_list)) + + if reduced_candidate_num is None or score.shape[0] <= reduced_candidate_num: + use_idx = np.arange(score.shape[0]) + else: + use_idx = np.arange(reduced_candidate_num) + use_idx = np.random.choice(use_idx, reduced_candidate_num, replace=False) + + # pareto.update_front(score) + pareto.update_front(score[use_idx, :]) + + # randomly choose candidate from pareto frontiers + chosen_idx = np.random.choice(pareto.front_num) + score_res = np.zeros(score.shape[0]) + score_res[use_idx[chosen_idx]] = 1 # only chosen_idx th value is one. + + return score_res
+ + + +def _get_fmean_fstd(predictor_list, training_list, test): + fmean = [ + predictor.get_post_fmean(training, test) + for predictor, training in zip(predictor_list, training_list) + ] + fcov = [ + predictor.get_post_fcov(training, test) + for predictor, training in zip(predictor_list, training_list) + ] + + # shape: (N, n_obj) + fmean = np.array(fmean).T + fstd = np.sqrt(np.array(fcov)).T + return fmean, fstd +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/search/utility.html b/manual/v2.0.2/ja/_modules/physbo/search/utility.html new file mode 100644 index 00000000..d9e90594 --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/search/utility.html @@ -0,0 +1,288 @@ + + + + + + + + physbo.search.utility — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.search.utility のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +def show_search_results(history, N): + n = history.total_num_search + index = np.argmax(history.fx[0:n]) + + if N == 1: + print( + "%04d-th step: f(x) = %f (action=%d)" + % (n, history.fx[n - 1], history.chosen_actions[n - 1]) + ) + print( + " current best f(x) = %f (best action=%d) \n" + % (history.fx[index], history.chosen_actions[index]) + ) + else: + print( + "current best f(x) = %f (best action = %d) " + % (history.fx[index], history.chosen_actions[index]) + ) + + print("list of simulation results") + st = history.total_num_search - N + en = history.total_num_search + for n in range(st, en): + print("f(x)=%f (action = %d)" % (history.fx[n], history.chosen_actions[n])) + print("\n")
+ + + +
+[ドキュメント] +def show_search_results_mo(history, N, disp_pareto_set=False): + n = history.total_num_search + pset, step = history.pareto.export_front() + + def msg_pareto_set_updated(indent=False): + prefix = " " if indent else "" + if history.pareto.front_updated: + print(prefix + "Pareto set updated.") + if disp_pareto_set: + print( + prefix + + "current Pareto set = %s (steps = %s) \n" + % (str(pset), str(step + 1)) + ) + else: + print( + prefix + "the number of Pareto frontiers = %s \n" % str(len(step)) + ) + + if N == 1: + print( + "%04d-th step: f(x) = %s (action = %d)" + % (n, str(history.fx[n - 1]), history.chosen_actions[n - 1]) + ) + + msg_pareto_set_updated(indent=True) + + else: + msg_pareto_set_updated() + + print("list of simulation results") + st = history.total_num_search - N + en = history.total_num_search + for n in range(st, en): + print( + "f(x) = %s (action = %d)" + % (str(history.fx[n]), history.chosen_actions[n]) + ) + print("\n")
+ + + + + + + +
+[ドキュメント] +def show_interactive_mode(simulator, history): + if simulator is None and history.total_num_search == 0: + print("interactive mode starts ... \n ")
+ + + +
+[ドキュメント] +def length_vector(t): + N = len(t) if hasattr(t, "__len__") else 1 + return N
+ + + +
+[ドキュメント] +def is_learning(n, interval): + if interval == 0: + return n == 0 + elif interval > 0: + return np.mod(n, interval) == 0 + else: + return False
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_modules/physbo/variable.html b/manual/v2.0.2/ja/_modules/physbo/variable.html new file mode 100644 index 00000000..5dae12db --- /dev/null +++ b/manual/v2.0.2/ja/_modules/physbo/variable.html @@ -0,0 +1,427 @@ + + + + + + + + physbo.variable — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

physbo.variable のソースコード

+# SPDX-License-Identifier: MPL-2.0
+# Copyright (C) 2020- The University of Tokyo
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import numpy as np
+
+
+
+[ドキュメント] +class variable(object): + def __init__(self, X=None, t=None, Z=None): + """ + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + Z: + + """ + self.X = X + self.Z = Z + self.t = t + +
+[ドキュメント] + def get_subset(self, index): + """ + Getting subset of variables. + + Parameters + ---------- + index: int or array of int + Index of selected action. + Returns + ------- + variable: physbo.variable + """ + temp_X = self.X[index, :] if self.X is not None else None + temp_t = self.t[index] if self.t is not None else None + temp_Z = self.Z[index, :] if self.Z is not None else None + + return variable(X=temp_X, t=temp_t, Z=temp_Z)
+ + +
+[ドキュメント] + def delete(self, num_row): + """ + Deleting variables of X, t, Z whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + self.delete_X(num_row) + self.delete_t(num_row) + self.delete_Z(num_row)
+ + +
+[ドキュメント] + def add(self, X=None, t=None, Z=None): + """ + Adding variables of X, t, Z. + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + Z + + Returns + ------- + + """ + self.add_X(X) + self.add_t(t) + self.add_Z(Z)
+ + +
+[ドキュメント] + def delete_X(self, num_row): + """ + Deleting variables of X whose indexes are specified by num_row. + + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.X is not None: + self.X = np.delete(self.X, num_row, 0)
+ + +
+[ドキュメント] + def delete_t(self, num_row): + """ + Deleting variables of t whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.t is not None: + self.t = np.delete(self.t, num_row)
+ + +
+[ドキュメント] + def delete_Z(self, num_row): + """ + Deleting variables of Z whose indexes are specified by num_row. + + Parameters + ---------- + num_row: numpy array + Index array to be deleted. + + Returns + ------- + + """ + if self.Z is not None: + self.Z = np.delete(self.Z, num_row, 0)
+ + +
+[ドキュメント] + def add_X(self, X=None): + """ + Adding variable X. If self.X is None, self.X is set as X. + + Parameters + ---------- + X: numpy array + N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate. + + Returns + ------- + + """ + if X is not None: + if self.X is not None: + self.X = np.vstack((self.X, X)) + else: + self.X = X
+ + +
+[ドキュメント] + def add_t(self, t=None): + """ + Adding variable t. If self.t is None, self.t is set as t. + + Parameters + ---------- + t: numpy array + N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized). + + Returns + ------- + + """ + if not isinstance(t, np.ndarray): + t = np.array([t]) + + if t is not None: + if self.t is not None: + self.t = np.hstack((self.t, t)) + else: + self.t = t
+ + +
+[ドキュメント] + def add_Z(self, Z=None): + """ + Adding variable Z. If self.Z is None, self.Z is set as Z. + + Parameters + ---------- + Z + + Returns + ------- + + """ + if Z is not None: + if self.Z is None: + self.Z = Z + else: + self.Z = np.vstack((self.Z, Z))
+ + +
+[ドキュメント] + def save(self, file_name): + """ + Saving variables X, t, Z to the file. + + Parameters + ---------- + file_name: str + A file name for saving variables X, t, Z using numpy.savez_compressed. + + Returns + ------- + + """ + np.savez_compressed(file_name, X=self.X, t=self.t, Z=self.Z)
+ + +
+[ドキュメント] + def load(self, file_name): + """ + Loading variables X, t, Z from the file. + + Parameters + ---------- + file_name: str + A file name for loading variables X, t, Z using numpy.load. + + Returns + ------- + + """ + data = np.load(file_name, allow_pickle=True) + self.X = data["X"] + self.t = data["t"] + self.Z = data["Z"]
+
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/_sources/acknowledgement.rst.txt b/manual/v2.0.2/ja/_sources/acknowledgement.rst.txt new file mode 100644 index 00000000..e147d353 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/acknowledgement.rst.txt @@ -0,0 +1,5 @@ +*************************** +謝辞 +*************************** +PHYSBOは東京大学物性研究所 ソフトウェア高度化プロジェクト (2020 年度) の支援を受け開発されました。この場を借りて感謝します。 + diff --git a/manual/v2.0.2/ja/_sources/algorithm.rst.txt b/manual/v2.0.2/ja/_sources/algorithm.rst.txt new file mode 100644 index 00000000..e65a52c6 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/algorithm.rst.txt @@ -0,0 +1,187 @@ +.. _chap_algorithm: + +アルゴリズム +===================== +ここでは、ベイズ最適化に関する説明を行います。技術的な詳細については、`こちらの文献 `_ を参照してください。 + +ベイズ最適化 +--------------------- +ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数(特性値など)の評価に大きなコストがかかるような場合に利用できる手法です。つまり、「できるだけ少ない実験・シミュレーション回数でより良い目的関数(材料特性など)を持つ説明変数(材料の組成、構造、プロセスやシミュレーションパラメータなど)を見つけ出す」ことが、ベイズ最適化によって解かれる問題です。ベイズ最適化では、探索する説明変数(ベクトル :math:`{\bf x}` で表す)の候補をあらかじめリストアップした状況からスタートします。そして、候補の中から目的関数 :math:`y` が良くなると考えられる候補を、機械学習(ガウス過程回帰を利用)による予測をうまく利用することで選定します。その候補に対して実験・シミュレーションを行い目的関数の値を評価します。機械学習による選定・実験シミュレーションによる評価を繰り返すことにより、できるだけ少ない回数で最適化が可能となります。 + +ベイズ最適化のアルゴリズムの詳細を以下に示します。 + +- ステップ1:初期化 + +探索したい空間をあらかじめ用意します。つまり、候補となる材料の組成・構造・プロセスやシミュレーションパラメータ等を、ベクトル :math:`{\bf x}` で表現しリストアップします。この段階では、目的関数の値はわかっていません。このうち初期状態としていくつかの候補を選び、実験またはシミュレーションによって目的関数の値 :math:`y` を見積もります。これにより、説明変数 :math:`{\bf x}` と目的関数 :math:`y` が揃った学習データ :math:`D = \{ {\bf x}_i, y_i \}_{(i=1, \cdots, N)}` が得られます。 + +- ステップ2:候補選定 + +学習データを用いて、ガウス過程を学習します。ガウス過程によれば、任意の :math:`{\bf x}` における予測値の平均を :math:`\mu_c ({\bf x})` 、分散を :math:`\sigma_c ({\bf x})` とすると、 + +.. math:: + + \mu_c ({\bf x}) &= {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf y} + + \sigma_c({\bf x}) &= k({\bf x}, {\bf x}) + \sigma^2 - {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf k}({\bf x}) + +となります。ただし、 :math:`k({\bf x}, {\bf x}')` はカーネルと呼ばれる関数であり、2つのベクトルの類似度を表します。一般に、以下のガウスカーネルが使われます。 + +.. math:: + + k({\bf x}, {\bf x}') = \exp \left[ -\frac{1}{2\eta^2}||{\bf x} - {\bf x}'||^2 \right] + +また、このカーネル関数を利用し、 :math:`{\bf k}({\bf x})` および :math:`K` は以下のように計算されます。 + +.. math:: + + {\bf k}({\bf x}) = \left( k({\bf x}_1, {\bf x}), k({\bf x}_2, {\bf x}), \cdots, k({\bf x}_N, {\bf x}) \right)^\top + +.. math:: + :nowrap: + + \[ + K = \left( + \begin{array}{cccc} + k({\bf x}_1, {\bf x}_1) & k({\bf x}_1, {\bf x}_2) & \ldots & k({\bf x}_1, {\bf x}_N) \\ + k({\bf x}_2, {\bf x}_1) & k({\bf x}_2, {\bf x}_2) & \ldots & k({\bf x}_2, {\bf x}_N) \\ + \vdots & \vdots & \ddots & \vdots \\ + k({\bf x}_N, {\bf x}_1) & k({\bf x}_N, {\bf x}_2) & \ldots & k({\bf x}_N, {\bf x}_N) + \end{array} + \right) + \] + +まだ実験やシミュレーションを行っていない候補全てに対して、予測値 :math:`\mu_c ({\bf x})` および予測の不確かさに関連する分散 :math:`\sigma_c ({\bf x})` を見積もります。これを用いて獲得関数を計算し、目的関数の値がまだわかっていない候補の中から、獲得関数を最大化する候補 :math:`{\bf x}^*` を選定します。このとき、 :math:`\sigma` および :math:`\eta` はハイパーパラメタと呼ばれ、PHYSBOでは最適な値が自動で設定されます。 + +獲得関数として、例えば、最大改善確率(PI : Probability of Improvement)、最大期待改善率(EI : Expected Improvement)が有用です。 +PIによるスコアは次のように定義される。 + +.. math:: + + \text{PI} (\mathbf{x}) = \Phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})} + + +ここで :math:`\Phi(\cdot)` は累積分布関数です。 +PIスコアは、現在得られている :math:`y` の最大値 :math:`y_{\max}` を超える確率を表します。 +さらに、EIによるスコアは、予測値と現在の最大値 :math:`y_{\max}` との差の期待値であり、次式で与えられます。 + +.. math:: + + \text{EI} (\mathbf{x}) = [\mu_c (\mathbf{x})-y_{\max}] \Phi (z (\mathbf{x})) + \sigma_c (\mathbf{x}) \phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})} + +ここで :math:`\phi(\cdot)` は確率密度関数です。 + + +- ステップ3:実験 + +ステップ2で選定された獲得関数が最大となる候補 :math:`{\bf x}^*` に対して実験またはシミュレーションを行い、目的関数値 :math:`y` を見積もります。これにより学習データが一つ追加されます。このステップ2、3を繰り返すことで、スコアのよい候補を探索します。 + + +PHYSBOによるベイズ最適化の高速化 +--------------------------------------- + +PHYSBOでは、random feature map、トンプソンサンプリング、コレスキー分解を利用することで、 +ベイズ最適化の高速化を実現しています。 +まず、random feature mapについて説明します。 +random feature map :math:`\phi (\mathbf{x})` を導入することで +ガウスカーネル :math:`k(\mathbf{x},\mathbf{x}')` を以下のように近似しています。 + +.. math:: + + k(\mathbf{x},\mathbf{x}') = \exp \left[ - \frac{1}{2 \eta^2} \| \mathbf{x} -\mathbf{x}' \| \right]^2 \simeq \phi (\mathbf{x})^\top \phi(\mathbf{x}') \\ + \phi (\mathbf{x}) = \left( z_{\omega_1, b_1} (\mathbf{x}/\eta),..., z_{\omega_l, b_l} (\mathbf{x}/\eta) \right)^\top + +ただし、 :math:`z_{\omega, b} (\mathbf{x}) = \sqrt{2} \cos (\boldsymbol{\omega}^\top \mathbf{x}+b)` としています。 +このとき、 :math:`\boldsymbol{\omega}` は :math:`p(\boldsymbol{\omega}) = (2\pi)^{-d/2} \exp (-\|\boldsymbol{\omega}\|^2/2)` より生成され、 :math:`b` は :math:`[0, 2 \pi]` から一様に選ばれます。 +この近似は、 :math:`l \to \infty` の極限で厳密に成立し、 :math:`l` の値がrandom feature mapの次元となります。 + +このとき :math:`\Phi` を、以下のように学習データのベクトル :math:`\mathbf{x}` による :math:`\phi(\mathbf{x}_i)` を各列に持つ :math:`l` 行 :math:`n` 列行列とします。 + +.. math:: + + \Phi = ( \phi(\mathbf{x}_1),..., \phi(\mathbf{x}_n) ) + +すると、 + +.. math:: + + \mathbf{k} (\mathbf{x}) = \Phi^\top \phi(\mathbf{x}) \\ + K= \Phi^\top \Phi + +という関係が成立することがわかります。 + +次に、トンプソンサンプリングを利用することで、候補の予測にかかる計算時間を :math:`O(l)` にする手法について紹介します。 +EIやPIを利用すると、分散を評価する必要があるため :math:`O(l^2)` になってしまうことに注意が必要です。 +トンプソンサンプリングを行うために、 +以下で定義されるベイズ線形モデルを利用します。 + +.. math:: + + y = \mathbf{w}^\top \phi (\mathbf{x}) + +ただし、この :math:`\phi(\mathbf{x})` は前述したrandom feature mapであり、 :math:`\mathbf{w}` は係数ベクトルです。 +ガウス過程では、学習データ :math:`D` があたえられたとき、この :math:`\mathbf{w}` が以下のガウス分布に従うように決まります。 + +.. math:: + + p(\mathbf{w}|D) = \mathcal{N} (\boldsymbol{\mu}, \Sigma) \\ + \boldsymbol{\mu} = (\Phi \Phi^\top + \sigma^2 I)^{-1} \Phi \mathbf{y} \\ + \Sigma = \sigma^2 (\Phi \Phi^\top + \sigma^2 I)^{-1} + +トンプソンサンプリングでは、この事後確率分布にしたがって係数ベクトルを一つサンプリングし、 +それを :math:`\mathbf{w}^*` とすることで、 +獲得関数を + +.. math:: + + \text{TS} (\mathbf{x}) = {\mathbf{w}^*}^\top \phi (\mathbf{x}) + +と表す。 +これを最大とする :math:`\mathbf{x}^*` が次の候補として選出されます。 +このとき、 :math:`\phi (\mathbf{x})` は :math:`l` 次元ベクトルなため、 +獲得関数の計算は :math:`O(l)` で実行できます。 + +次に :math:`\mathbf{w}` のサンプリングの高速化について紹介します。 +行列 :math:`A` を以下のように定義します。 + +.. math:: + + A = \frac{1}{\sigma^2} \Phi \Phi^\top +I + +すると、事後確率分布は、 + +.. math:: + + p(\mathbf{w}|D) = \mathcal{N} \left( \frac{1}{\sigma^2} A^{-1} \Phi \mathbf{y}, A^{-1} \right) + +と表すことができます。 +そのため、 :math:`\mathbf{w}` をサンプリングするためには、 :math:`A^{-1}` の計算が必要となります。 +ここで、ベイズ最適化のイテレーションにおいて、 +新しく :math:`(\mathbf{x}', y')` が加わった場合について考えます。 +このデータの追加により、行列 :math:`A` は、 + +.. math:: + + A' = A + \frac{1}{\sigma^2} \phi (\mathbf{x}') \phi (\mathbf{x}')^\top + +と更新されます。 +この更新は、コレスキー分解( :math:`A= L^\top L` )を用いることで、 :math:`A^{-1}` の計算にかかる時間を :math:`O(l^2)` にすることができます。 +もし、 :math:`A^{-1}` をイテレーションごとに毎回計算すると :math:`O(l^3)` の計算が必要になります。 +実際、 :math:`\mathbf{w}` をサンプリングする際は、 + +.. math:: + + \mathbf{w}^* = \boldsymbol{\mu} + \mathbf{w}_0 + +とし、 :math:`\mathbf{w}_0` を :math:`\mathcal{N} (0,A^{-1})` からサンプリングします。 +また、 :math:`\boldsymbol{\mu}` は、 + +.. math:: + + L^\top L \boldsymbol{\mu} = \frac{1}{\sigma^2} \Phi \mathbf{y} + +を解くことで得られます。 +これらの技術を利用することで、学習データ数に対してほぼ線形の計算時間を実現しています。 + + + + diff --git a/manual/v2.0.2/ja/_sources/api/modules.rst.txt b/manual/v2.0.2/ja/_sources/api/modules.rst.txt new file mode 100644 index 00000000..0f96bbd4 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/modules.rst.txt @@ -0,0 +1,7 @@ +physbo +====== + +.. toctree:: + :maxdepth: 4 + + physbo diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.fourier.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.fourier.rst.txt new file mode 100644 index 00000000..f64d2599 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.fourier.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.basis.fourier module +=============================== + +.. automodule:: physbo.blm.basis.fourier + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.rst.txt new file mode 100644 index 00000000..6b5d7474 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.basis.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.basis package +======================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.basis.fourier + +Module contents +--------------- + +.. automodule:: physbo.blm.basis + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.core.model.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.core.model.rst.txt new file mode 100644 index 00000000..0412df90 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.core.model.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.core.model module +============================ + +.. automodule:: physbo.blm.core.model + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.core.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.core.rst.txt new file mode 100644 index 00000000..1e5aabbd --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.core.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.core package +======================= + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.core.model + +Module contents +--------------- + +.. automodule:: physbo.blm.core + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.exact.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.exact.rst.txt new file mode 100644 index 00000000..ac801c82 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.exact.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.inf.exact module +=========================== + +.. automodule:: physbo.blm.inf.exact + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.rst.txt new file mode 100644 index 00000000..f63622cc --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.inf.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.inf package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.inf.exact + +Module contents +--------------- + +.. automodule:: physbo.blm.inf + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.gauss.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.gauss.rst.txt new file mode 100644 index 00000000..6e8fda6b --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.lik.gauss module +=========================== + +.. automodule:: physbo.blm.lik.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.linear.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.linear.rst.txt new file mode 100644 index 00000000..5d8ae3c1 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.linear.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.lik.linear module +============================ + +.. automodule:: physbo.blm.lik.linear + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.rst.txt new file mode 100644 index 00000000..e1f64bfb --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.lik.rst.txt @@ -0,0 +1,19 @@ +physbo.blm.lik package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.lik.gauss + physbo.blm.lik.linear + +Module contents +--------------- + +.. automodule:: physbo.blm.lik + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.predictor.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.predictor.rst.txt new file mode 100644 index 00000000..e625b7f6 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.predictor module +=========================== + +.. automodule:: physbo.blm.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.gauss.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.gauss.rst.txt new file mode 100644 index 00000000..84d97f99 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.blm.prior.gauss module +============================= + +.. automodule:: physbo.blm.prior.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.rst.txt new file mode 100644 index 00000000..d9a90114 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.prior.rst.txt @@ -0,0 +1,18 @@ +physbo.blm.prior package +======================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.prior.gauss + +Module contents +--------------- + +.. automodule:: physbo.blm.prior + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.blm.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.blm.rst.txt new file mode 100644 index 00000000..d3e4a37f --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.blm.rst.txt @@ -0,0 +1,30 @@ +physbo.blm package +================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.basis + physbo.blm.core + physbo.blm.inf + physbo.blm.lik + physbo.blm.prior + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm.predictor + +Module contents +--------------- + +.. automodule:: physbo.blm + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.core.learning.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.learning.rst.txt new file mode 100644 index 00000000..5985e210 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.learning.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.learning module +============================== + +.. automodule:: physbo.gp.core.learning + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.core.model.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.model.rst.txt new file mode 100644 index 00000000..36a7b16a --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.model.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.model module +=========================== + +.. automodule:: physbo.gp.core.model + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.core.prior.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.prior.rst.txt new file mode 100644 index 00000000..594dd681 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.prior.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.core.prior module +=========================== + +.. automodule:: physbo.gp.core.prior + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.core.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.rst.txt new file mode 100644 index 00000000..46499eb8 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.core.rst.txt @@ -0,0 +1,20 @@ +physbo.gp.core package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.core.learning + physbo.gp.core.model + physbo.gp.core.prior + +Module contents +--------------- + +.. automodule:: physbo.gp.core + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.gauss.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.gauss.rst.txt new file mode 100644 index 00000000..4dd7a21c --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.cov.gauss module +========================== + +.. automodule:: physbo.gp.cov.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.rst.txt new file mode 100644 index 00000000..61369a91 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.cov.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.cov package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.cov.gauss + +Module contents +--------------- + +.. automodule:: physbo.gp.cov + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.exact.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.exact.rst.txt new file mode 100644 index 00000000..34bce35f --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.exact.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.inf.exact module +========================== + +.. automodule:: physbo.gp.inf.exact + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.rst.txt new file mode 100644 index 00000000..77b4176f --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.inf.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.inf package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.inf.exact + +Module contents +--------------- + +.. automodule:: physbo.gp.inf + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.gauss.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.gauss.rst.txt new file mode 100644 index 00000000..19064760 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.gauss.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.lik.gauss module +========================== + +.. automodule:: physbo.gp.lik.gauss + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.rst.txt new file mode 100644 index 00000000..566be484 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.lik.rst.txt @@ -0,0 +1,18 @@ +physbo.gp.lik package +===================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.lik.gauss + +Module contents +--------------- + +.. automodule:: physbo.gp.lik + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.const.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.const.rst.txt new file mode 100644 index 00000000..f934da4a --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.const.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.mean.const module +=========================== + +.. automodule:: physbo.gp.mean.const + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.rst.txt new file mode 100644 index 00000000..83cb1b7e --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.rst.txt @@ -0,0 +1,19 @@ +physbo.gp.mean package +====================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.mean.const + physbo.gp.mean.zero + +Module contents +--------------- + +.. automodule:: physbo.gp.mean + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.zero.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.zero.rst.txt new file mode 100644 index 00000000..34fef4f9 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.mean.zero.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.mean.zero module +========================== + +.. automodule:: physbo.gp.mean.zero + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.predictor.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.predictor.rst.txt new file mode 100644 index 00000000..d036e0bb --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.gp.predictor module +========================== + +.. automodule:: physbo.gp.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.gp.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.gp.rst.txt new file mode 100644 index 00000000..f1aca6c3 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.gp.rst.txt @@ -0,0 +1,30 @@ +physbo.gp package +================= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.core + physbo.gp.cov + physbo.gp.inf + physbo.gp.lik + physbo.gp.mean + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.gp.predictor + +Module contents +--------------- + +.. automodule:: physbo.gp + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.misc.centering.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.misc.centering.rst.txt new file mode 100644 index 00000000..5e143933 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.misc.centering.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.centering module +============================ + +.. automodule:: physbo.misc.centering + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.misc.gauss_elim.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.misc.gauss_elim.rst.txt new file mode 100644 index 00000000..9594c9aa --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.misc.gauss_elim.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.gauss\_elim module +============================== + +.. automodule:: physbo.misc.gauss_elim + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.misc.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.misc.rst.txt new file mode 100644 index 00000000..0d5cc640 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.misc.rst.txt @@ -0,0 +1,20 @@ +physbo.misc package +=================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.misc.centering + physbo.misc.gauss_elim + physbo.misc.set_config + +Module contents +--------------- + +.. automodule:: physbo.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.misc.set_config.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.misc.set_config.rst.txt new file mode 100644 index 00000000..4d11fc85 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.misc.set_config.rst.txt @@ -0,0 +1,7 @@ +physbo.misc.set\_config module +============================== + +.. automodule:: physbo.misc.set_config + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.opt.adam.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.opt.adam.rst.txt new file mode 100644 index 00000000..f7e248f1 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.opt.adam.rst.txt @@ -0,0 +1,7 @@ +physbo.opt.adam module +====================== + +.. automodule:: physbo.opt.adam + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.opt.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.opt.rst.txt new file mode 100644 index 00000000..aa7c9063 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.opt.rst.txt @@ -0,0 +1,18 @@ +physbo.opt package +================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.opt.adam + +Module contents +--------------- + +.. automodule:: physbo.opt + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.predictor.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.predictor.rst.txt new file mode 100644 index 00000000..ed9354f3 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.predictor.rst.txt @@ -0,0 +1,7 @@ +physbo.predictor module +======================= + +.. automodule:: physbo.predictor + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.rst.txt new file mode 100644 index 00000000..114bf93a --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.rst.txt @@ -0,0 +1,31 @@ +physbo package +============== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.blm + physbo.gp + physbo.misc + physbo.opt + physbo.search + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.predictor + physbo.variable + +Module contents +--------------- + +.. automodule:: physbo + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.policy.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.policy.rst.txt new file mode 100644 index 00000000..f7940641 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.policy.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete.policy module +==================================== + +.. automodule:: physbo.search.discrete.policy + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.results.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.results.rst.txt new file mode 100644 index 00000000..c85dbd53 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.results.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete.results module +===================================== + +.. automodule:: physbo.search.discrete.results + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.rst.txt new file mode 100644 index 00000000..97585687 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete.rst.txt @@ -0,0 +1,19 @@ +physbo.search.discrete package +============================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete.policy + physbo.search.discrete.results + +Module contents +--------------- + +.. automodule:: physbo.search.discrete + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.policy.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.policy.rst.txt new file mode 100644 index 00000000..65202559 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.policy.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete\_multi.policy module +=========================================== + +.. automodule:: physbo.search.discrete_multi.policy + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.results.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.results.rst.txt new file mode 100644 index 00000000..d12c38b5 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.results.rst.txt @@ -0,0 +1,7 @@ +physbo.search.discrete\_multi.results module +============================================ + +.. automodule:: physbo.search.discrete_multi.results + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.rst.txt new file mode 100644 index 00000000..09a57ac1 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.discrete_multi.rst.txt @@ -0,0 +1,19 @@ +physbo.search.discrete\_multi package +===================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete_multi.policy + physbo.search.discrete_multi.results + +Module contents +--------------- + +.. automodule:: physbo.search.discrete_multi + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.pareto.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.pareto.rst.txt new file mode 100644 index 00000000..9a24fb2a --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.pareto.rst.txt @@ -0,0 +1,7 @@ +physbo.search.pareto module +=========================== + +.. automodule:: physbo.search.pareto + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.rst.txt new file mode 100644 index 00000000..a998ed95 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.rst.txt @@ -0,0 +1,30 @@ +physbo.search package +===================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.discrete + physbo.search.discrete_multi + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + physbo.search.pareto + physbo.search.score + physbo.search.score_multi + physbo.search.utility + +Module contents +--------------- + +.. automodule:: physbo.search + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.score.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.score.rst.txt new file mode 100644 index 00000000..1a6b6809 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.score.rst.txt @@ -0,0 +1,7 @@ +physbo.search.score module +========================== + +.. automodule:: physbo.search.score + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.score_multi.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.score_multi.rst.txt new file mode 100644 index 00000000..59f01d6b --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.score_multi.rst.txt @@ -0,0 +1,7 @@ +physbo.search.score\_multi module +================================= + +.. automodule:: physbo.search.score_multi + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.search.utility.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.search.utility.rst.txt new file mode 100644 index 00000000..14ea05b6 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.search.utility.rst.txt @@ -0,0 +1,7 @@ +physbo.search.utility module +============================ + +.. automodule:: physbo.search.utility + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/api/physbo.variable.rst.txt b/manual/v2.0.2/ja/_sources/api/physbo.variable.rst.txt new file mode 100644 index 00000000..66393924 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/api/physbo.variable.rst.txt @@ -0,0 +1,7 @@ +physbo.variable module +====================== + +.. automodule:: physbo.variable + :members: + :undoc-members: + :show-inheritance: diff --git a/manual/v2.0.2/ja/_sources/contact.rst.txt b/manual/v2.0.2/ja/_sources/contact.rst.txt new file mode 100644 index 00000000..8a56021b --- /dev/null +++ b/manual/v2.0.2/ja/_sources/contact.rst.txt @@ -0,0 +1,22 @@ +お問い合わせ +========================================= + +PHYSBO に関するお問い合わせはこちらにお寄せください。 + +- バグ報告 + + PHYSBO のバグ関連の報告は `GitHubのIssues `_ で受け付けています。 + + バグを早期に解決するため、報告時には次のガイドラインに従ってください。 + + - 使用している PHYSBO のバージョンを指定してください。 + + - インストールに問題がある場合には、使用しているオペレーティングシステムとコンパイラの情報についてお知らせください。 + + - 実行に問題が生じた場合は、実行に使用した入力ファイルとその出力を記載してください。 + +- その他 + + 研究に関連するトピックなどGitHubのIssuesで相談しづらいことを問い合わせる際には、以下の連絡先にコンタクトをしてください。 + + E-mail: ``physbo-dev__at__issp.u-tokyo.ac.jp`` (_at_を@に変更してください) diff --git a/manual/v2.0.2/ja/_sources/index.rst.txt b/manual/v2.0.2/ja/_sources/index.rst.txt new file mode 100644 index 00000000..62ccc38c --- /dev/null +++ b/manual/v2.0.2/ja/_sources/index.rst.txt @@ -0,0 +1,19 @@ +.. PHYSBO documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PHYSBO's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + introduction + install + notebook/index + algorithm + API Reference + acknowledgement + contact diff --git a/manual/v2.0.2/ja/_sources/install.rst.txt b/manual/v2.0.2/ja/_sources/install.rst.txt new file mode 100644 index 00000000..294cc07a --- /dev/null +++ b/manual/v2.0.2/ja/_sources/install.rst.txt @@ -0,0 +1,161 @@ +基本的な使用方法 +===================== + +インストール +--------------------- + +実行環境・必要なパッケージ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +PHYSBOの実行環境・必要なパッケージは以下の通りです。 + +* Python >= 3.6 +* numpy < 2.0.0 +* scipy + + +.. `Anaconda `_ 環境を利用すると、numpy, scipy, Cython がデフォルトでインストールされているため、COMBO をすぐに実行することが可能です。 + 依存パッケージを手動でインストールする場合は、以下の手順によりまとめてインストールすることができます。 + + #. 以下をコピーして、'requirements.txt' というファイル名で保存します (setup.py と同じディレクトリ内に保存します) :: + + ## To install these requirements, run + ## pip install -U -r requirements.txt + ## (the -U option also upgrades packages; from the second time on, + ## just run + ## pip install -r requirements.txt + ## + ## NOTE: before running the command above, you need to install a recent version + ## of pip from the website, and then possibly install/upgrade setuptools using + ## sudo pip install --upgrade setuptools + ## numpy + numpy >=1.10 + + ## scipy + scipy >= 0.16 + + ## + Cython >= 0.22.1 + + ## mpi4py + mpi4py >= 2.0 (optional) + + #. 以下のコマンドを実行します。 :: + + > pip install -U -r requirements.txt + +ダウンロード・インストール +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- ``PyPI`` からのインストール(推奨) :: + + $ pip3 install physbo + + - NumPy などの依存パッケージも同時にインストールされます。 + + - ``--user`` オプションを追加するとユーザのホームディレクトリ以下にインストールされます。 :: + + $ pip3 install --user physbo + + +- ソースコードからのインストール(開発者向け) + + #. 本体のダウンロード + + ソースファイルをダウンロードするか、以下のように github レポジトリをクローンしてください。 :: + + $ git clone https://github.com/issp-center-dev/PHYSBO + + #. pip を 19.0 以上に更新 :: + + $ pip3 install -U pip + + - ここで ``pip3`` が入っていない場合には ``python3 -m ensurepip`` でインストール可能です + + #. インストール :: + + $ cd PHYSBO + $ pip3 install --user ./ + +アンインストール +~~~~~~~~~~~~~~~~~~~~~~~~ + +#. 以下のコマンドを実行します。 :: + + $ pip uninstall physbo + + +PHYSBOの基本構造 +-------------------------- + +PHYSBOは以下のような構成になっています(第2階層まで表示)。 + +.. + |--physbo + | |--blm + | |--gp + | |--misc + | |--opt + | |--search + | |--predictor.py + | |--variable.py + +各モジュールは以下のような構成で作成されています。 + +- ``blm`` :Baysean linear modelに関するモジュール +- ``gp`` :Gaussian Processに関するモジュール +- ``opt`` :最適化に関するモジュール +- ``search`` :最適解を探索するためのモジュール +- ``predictor.py`` :predictorの抽象クラス +- ``variable.py`` :physboで用いる変数関連について定義されたクラス +- ``misc`` : その他(探索空間を正規化するためのモジュールなど) + +各モジュールの詳細についてはAPIリファレンスを参考にしてください。 + +計算の流れ +-------------------------- + +ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数の評価に大きなコストがかかるような最適化問題に適しています。 +PHYSBO では以下の手順により最適化を実行します(それぞれの詳細はチュートリアルおよびAPIリファレンスを参考にしてください)。 + +1. 探索空間の定義 + + N: 探索候補の数 , d: 入力パラメータの次元数 とした時、探索候補である各パラメータセット (d 次元のベクトル) を定義します。パラメータセットは全ての候補をリストアップしておく必要があります。 + +2. simulator の定義 + + 上で定義した探索候補に対して、各探索候補の目的関数値(材料特性値など最適化したい値)を与えるsimulatorを定義します。PHYSBOでは、最適化の方向は「目的関数の最大化」になります。そのため,目的関数を最小化したい場合、simulatorから返す値にマイナスをかけることで実行できます。 + +3. 最適化の実行 + + 最初に、最適化の policy をセットします(探索空間はこの段階で引数としてpolicyに渡されます)。最適化方法は、以下の2種類から選択します。 + + - ``random_search`` + - ``bayes_search`` + + ``random_search`` では、探索空間からランダムにパラメータを選び、その中で最大となる目的関数を探します。ベイズ最適化を行うための前処理として初期パラメータ群を用意するために使用します。 ``bayes_search`` は、ベイズ最適化を行います。ベイズ最適化でのscore: 獲得関数(acquisition function) の種類は、以下のいずれかから指定します。 + + - TS (Thompson Sampling): 学習されたガウス過程の事後確率分布から回帰関数を1つサンプリングし、それを用いた予測が最大となる点を候補として選択します。 + - EI (Expected Improvement): ガウス過程による予測値と現状での最大値との差の期待値が最大となる点を候補として選択します。 + - PI (Probability of Improvement): 現状での最大値を超える確率が最大となる点を候補として選択します。 + + ガウス過程に関する詳細については :ref:`chap_algorithm` に記載してあります。その他、各手法の詳細については、`こちらの文献 `_ およびその参考文献を参照して下さい。 + + これらのメソッドに先ほど定義した simulator と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。 + + i). パラメータ候補の中から次に実行するパラメータを選択 + + ii). 選択されたパラメータで simulator を実行 + + i)で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。詳しくはチュートリアルの「複数候補を一度に探索する」の項目を参照してください。また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。 + + +4. 結果の確認 + + 探索結果 res は history クラスのオブジェクト (physbo.search.discrete.results.history) として返されます。以下より探索結果を参照します。 + + - res.fx : simulator (目的関数) の評価値の履歴。 + - res.chosen_actions: simulator を評価したときのaction ID(パラメータ)の履歴。 + - fbest, best_action= res.export_all_sequence_best_fx(): simulator を評価した全タイミングにおけるベスト値とそのaction ID(パラメータ)の履歴。 + - res.total_num_search: simulator のトータル評価数。 + + また、探索結果は save メソッドにより外部ファイルに保存でき、load メソッドを用いて出力した結果をロードすることができます。使用方法の詳細はチュートリアルをご覧ください。 diff --git a/manual/v2.0.2/ja/_sources/introduction.rst.txt b/manual/v2.0.2/ja/_sources/introduction.rst.txt new file mode 100644 index 00000000..137c5ee8 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/introduction.rst.txt @@ -0,0 +1,76 @@ +はじめに +===================== + +PHYSBO とは +---------------------- + +PHYSBO(optimization tool for PHYSics based on Bayesian Optimization)は、高速でスケーラブルなベイズ最適化 (Bayesian optimization) のためのPythonライブラリです。 +COMBO(COMmon Baysian Optimization)をもとに、主に物性分野の研究者をターゲットに開発されました。 +物理、化学、材料分野において、データ駆動的な実験計画アルゴリズムによって科学的発見を加速する、という試みが多く行われています。 +ベイズ最適化は、このような科学的発見を加速するために有効なツールです。 +ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数値(特性値など)の評価に大きなコストがかかるような場合に利用できる手法です。つまり、「できるだけ少ない実験・シミュレーション回数でより良い目的関数値(材料特性など)を持つパラメータ(材料の組成、構造、プロセスやシミュレーションパラメータなど)を見つけ出す」ことが、ベイズ最適化によって解かれる問題です。ベイズ最適化では、探索するパラメータの候補をあらかじめリストアップし、候補の中から目的関数値が最大と考えられる候補を機械学習(ガウス過程回帰を利用)による予測をうまく利用することで選定します。その候補に対して実験・シミュレーションを行い目的関数値を評価します。機械学習による選定・実験シミュレーションによる評価を繰り返すことにより、少ない回数での最適化が可能となります。 +一方で、一般的にベイズ最適化は計算コストが高く、scikit-learn 等のスタンダードな実装では、多くのデータを扱うことが困難です。 +PHYSBOでは以下の特徴により、高いスケーラビリティを実現しています。 + +* Thompson Sampling +* random feature map +* one-rank Cholesky update +* automatic hyperparameter tuning + +技術的な詳細については、`こちらの文献 `_ を参照して下さい。 + + +PHYSBO の引用 +---------------------- + +PHYSBOを引用する際には、以下の文献を引用してください、 + + +Yuichi Motoyama, Ryo Tamura, Kazuyoshi Yoshimi, Kei Terayama, Tsuyoshi Ueno, Koji Tsuda, +Bayesian optimization package: PHYSBO, +Computer Physics Communications Volume 278, September 2022, 108405. Available from https://www.sciencedirect.com/science/article/pii/S0010465522001242?via%3Dihub (open access). + +Bibtexは以下の通りです。 :: + + @misc{@article{MOTOYAMA2022108405, + title = {Bayesian optimization package: PHYSBO}, + journal = {Computer Physics Communications}, + volume = {278}, + pages = {108405}, + year = {2022}, + issn = {0010-4655}, + doi = {https://doi.org/10.1016/j.cpc.2022.108405}, + author = {Yuichi Motoyama and Ryo Tamura and Kazuyoshi Yoshimi and Kei Terayama and Tsuyoshi Ueno and Koji Tsuda}, + keywords = {Bayesian optimization, Multi-objective optimization, Materials screening, Effective model estimation} + } + +主な開発者 +---------------------- +- ver. 1.0- + + - 田村 亮 (物質・材料研究機構 国際ナノアーキテクトニクス研究拠点) + - 寺山 慧 (横浜市立大学大学院 生命医科学研究科) + - 津田 宏治 (東京大学大学院 新領域創成科学研究科) + - 植野 剛 (株式会社 Magne-Max Capital Management) + - 本山 裕一 (東京大学 物性研究所) + - 吉見 一慶 (東京大学 物性研究所) + - 川島 直輝 (東京大学 物性研究所) + + +- ver. 0.1-0.3 + + - 田村 亮 (物質・材料研究機構 国際ナノアーキテクトニクス研究拠点) + - 寺山 慧 (横浜市立大学大学院 生命医科学研究科) + - 津田 宏治 (東京大学大学院 新領域創成科学研究科) + - 本山 裕一 (東京大学 物性研究所) + - 吉見 一慶 (東京大学 物性研究所) + - 川島 直輝 (東京大学 物性研究所) + +ライセンス +---------------------- + +PHYSBO v2 のソースコードは `Mozilla Public License version 2.0(MPL v2) `_ (`日本語訳 `_) のもとで公開・頒布されています。 + +Copyright (c) <2020-> The University of Tokyo. All rights reserved. + +本ソフトウェアは2020年度 東京大学物性研究所 ソフトウェア高度化プロジェクトの支援を受け開発されました。 diff --git a/manual/v2.0.2/ja/_sources/notebook/index.rst.txt b/manual/v2.0.2/ja/_sources/notebook/index.rst.txt new file mode 100644 index 00000000..1d784ff9 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/index.rst.txt @@ -0,0 +1,16 @@ +チュートリアル +================================== +ここでは、PHYSBOのチュートリアルを通してその使用方法を紹介します。 + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + tutorial_basic + tutorial_Gaussian_process + tutorial_interactive_mode + tutorial_once_mode + tutorial_multi_probe + tutorial_multi_objective + diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_Gaussian_process.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_Gaussian_process.ipynb.txt new file mode 100644 index 00000000..491da648 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_Gaussian_process.ipynb.txt @@ -0,0 +1,768 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# ガウス過程\n", + "\n", + "PHYSBOではガウス過程回帰を実行しながらベイズ最適化を行なっています。\n", + "\n", + "そのため、学習データが与えられた際にガウス過程回帰を実行することもでき、学習済みモデルを利用したテストデータの予測も行うことができます。\n", + "\n", + "ここでは、その手順について紹介します。\n", + "\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "本チュートリアルでは例として、Cuの安定した界面構造の探索問題を扱います。 目的関数の評価にあたる構造緩和計算には、実際には1回あたり数時間といったオーダーの時間を要しますが、本チュートリアルでは既に評価済みの値を使用します。問題設定については、以下の文献を参照してください。\n", + "S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:41.987250Z", + "start_time": "2020-12-04T06:11:41.537168Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering( X )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 学習データの定義\n", + "\n", + "対象データのうち、ランダムに選んだ1割をトレーニングデータとして利用し、別のランダムに選んだ1割をテストデータとして利用します。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:51.077070Z", + "start_time": "2020-12-04T06:11:51.072211Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ntrain = 1798\n", + "Ntest = 1798\n" + ] + } + ], + "source": [ + "N = len(t)\n", + "Ntrain = int(N*0.1)\n", + "Ntest = min(int(N*0.1), N-Ntrain)\n", + "\n", + "id_all = np.random.choice(N, N, replace=False)\n", + "id_train = id_all[0:Ntrain]\n", + "id_test = id_all[Ntrain:Ntrain+Ntest]\n", + "\n", + "X_train = X[id_train]\n", + "X_test = X[id_test]\n", + "\n", + "t_train = t[id_train]\n", + "t_test = t[id_test]\n", + "\n", + "print(\"Ntrain =\", Ntrain)\n", + "print(\"Ntest =\", Ntest)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## ガウス過程の学習と予測\n", + "\n", + "以下のプロセスでガウス過程を学習し、テストデータの予測を行います。\n", + "\n", + "1. ガウス過程のモデルを生成します。\n", + "\n", + "2. X_train(学習データのパラメータ), t_train(学習データの目的関数値)を用いてモデルを学習します。\n", + "\n", + "3. 学習されたモデルを用いてテストデータ(X_test)に対する予測を実行します。\n", + "\n", + "共分散の定義(ガウシアン)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:55.403677Z", + "start_time": "2020-12-04T06:11:55.399915Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "平均の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:56.279543Z", + "start_time": "2020-12-04T06:11:56.277082Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "mean = physbo.gp.mean.const()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "尤度関数の定義(ガウシアン)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.077507Z", + "start_time": "2020-12-04T06:11:57.075581Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "lik = physbo.gp.lik.gauss()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "ガウス過程モデルの生成" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.832602Z", + "start_time": "2020-12-04T06:11:57.828902Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n", + "config = physbo.misc.set_config()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "ガウス過程モデルを学習" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.218792Z", + "start_time": "2020-12-04T06:11:58.261609Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood 16051.69452976001\n", + "50 -th epoch marginal likelihood 4551.39626443153\n", + "100 -th epoch marginal likelihood 2141.377872729846\n", + "150 -th epoch marginal likelihood 595.8361411907399\n", + "200 -th epoch marginal likelihood -373.23922309413774\n", + "250 -th epoch marginal likelihood -929.2472009209496\n", + "300 -th epoch marginal likelihood -1273.8727959019732\n", + "350 -th epoch marginal likelihood -1413.2553901394206\n", + "400 -th epoch marginal likelihood -1477.3889625983586\n", + "450 -th epoch marginal likelihood -1525.339082571432\n", + "500 -th epoch marginal likelihood -1539.787541261617\n", + "Done\n", + "\n" + ] + } + ], + "source": [ + "gp.fit(X_train, t_train, config)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習されたガウス過程におけるパラメタを出力" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.227479Z", + "start_time": "2020-12-04T06:12:58.221821Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "likelihood parameter = [-2.57036368]\n", + "mean parameter in GP prior: [-1.0654197]\n", + "covariance parameter in GP prior: [-0.59460765 -2.4232173 ]\n", + "\n", + "\n" + ] + } + ], + "source": [ + "gp.print_params()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "テストデータの平均値(予測値)および分散を計算" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.605713Z", + "start_time": "2020-12-04T06:12:58.244883Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.618218Z", + "start_time": "2020-12-04T06:12:58.607794Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,\n", + " -0.98145533, -0.9956255 ])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "分散の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.628483Z", + "start_time": "2020-12-04T06:12:58.622345Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,\n", + " 0.00053435])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測値の平均二乗誤差の出力" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.636081Z", + "start_time": "2020-12-04T06:12:58.631461Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.004179032574484333" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 訓練済みモデルによる予測\n", + "\n", + "学習済みモデルのパラメタをgp_paramsとして読み出し、これを用いた予測を行います。\n", + "\n", + "gp_paramsおよび学習データ(X_train, t_train)を記憶しておくことで、訓練済みモデルによる予測が可能となります。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習されたパラメタを準備(学習の直後に行う必要あり)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.645968Z", + "start_time": "2020-12-04T06:12:58.639012Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.57036368, -1.0654197 , -0.59460765, -2.4232173 ])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#学習したパラメタを1次元配列として準備\n", + "gp_params = np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)\n", + "\n", + "gp_params" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習に利用したモデルと同様のモデルをgpとして準備" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.666019Z", + "start_time": "2020-12-04T06:12:58.653259Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#共分散の定義 (ガウシアン)\n", + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )\n", + "\n", + "#平均の定義\n", + "mean = physbo.gp.mean.const()\n", + "\n", + "#尤度関数の定義 (ガウシアン)\n", + "lik = physbo.gp.lik.gauss()\n", + "\n", + "#ガウス過程モデルの生成\n", + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習済みのパラメタをモデルに入力し予測を実行" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.016429Z", + "start_time": "2020-12-04T06:12:58.673034Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#学習済みのパラメタをガウス過程に入力\n", + "gp.set_params(gp_params)\n", + "\n", + "\n", + "#テストデータの平均値(予測値)および分散を計算\n", + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.020795Z", + "start_time": "2020-12-04T06:12:59.017606Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,\n", + " -0.98145533, -0.9956255 ])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "分散の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.026523Z", + "start_time": "2020-12-04T06:12:59.023035Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,\n", + " 0.00053435])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測値の平均二乗誤差の出力" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.033497Z", + "start_time": "2020-12-04T06:12:59.027871Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.004179032574484333" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "(注) 上の例では事前に登録されているXと同じものを利用して予測を行いました。\n", + "学習済みのモデルを利用してXに含まれていないパラメータ X_new に対して予測をしたい場合には、\n", + "学習モデルで使用したデータXの平均(X_{mean})と標準偏差(X_{std})を求めていただいたうえで、\n", + "X_{new} = (X_{new} - X_{mean}) / X_{std}\n", + "の変形を行うことで予測を行うことができます。\n", + "また、渡す際のデータ形式はndarray形式になっています。\n", + "そのため、X_{new}が一つのデータの場合には事前に変換する必要があります。\n", + "例えば、X_{new}が実数である場合には、\n", + "X_new = np.array(X_new).reshape(1)\n", + "などとして変換する必要があります。" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} \ No newline at end of file diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_basic.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_basic.ipynb.txt new file mode 100644 index 00000000..bcfd6e24 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_basic.ipynb.txt @@ -0,0 +1,592 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PHYSBO の基本\n", + "\n", + "## はじめに\n", + "\n", + "\n", + "本チュートリアルでは例として、一次元の関数の最小値を求める例題を解きます。\n", + "はじめに、PHYSBOをインポートします。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.642474Z", + "start_time": "2021-03-05T04:45:04.225565Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 探索候補データの準備\n", + "\n", + "最初に関数を探索する空間を定義します。\n", + "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", + "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は1次元)。そのため、reshapeを行って変形しています。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.654902Z", + "start_time": "2021-03-05T04:45:04.645777Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulatorクラスの定義\n", + "\n", + "目的関数を定義するためのsimulatorクラスをここで定義します。\n", + "\n", + "今回は$f(x) = 3 x^4 + 4 x ^3 + 1.0$ が最小となるxを探索するという問題設定にしています(答えは$x=-1.0$)。\n", + "\n", + "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", + "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", + "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", + "**PHYSBOでは目的関数値が最大となる**ものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.663622Z", + "start_time": "2021-03-05T04:45:04.657375Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### policy のセット\n", + "\n", + "まず、最適化の `policy` をセットします。 \n", + "\n", + "`test_X` に探索候補の行列 (`numpy.array`) を指定します。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.675725Z", + "start_time": "2021-03-05T04:45:04.669564Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`policy` をセットした段階では、まだ最適化は行われません。\n", + "`policy` に対して以下のメソッドを実行することで、最適化を行います。\n", + "\n", + "- `random_search` \n", + "- `bayes_search`\n", + "\n", + "これらのメソッドに先ほど定義した `simulator` と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。\n", + "\n", + "i) パラメータ候補の中から次に実行するパラメータを選択\n", + "\n", + "ii) 選択されたパラメータで `simulator` を実行\n", + "\n", + "i) で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。\n", + "詳しくは「複数候補を一度に探索する」の項目を参照してください。 \n", + "\n", + "また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。\n", + "\n", + "### ランダムサーチ\n", + "\n", + "まず初めに、ランダムサーチを行ってみましょう。\n", + "\n", + "ベイズ最適化の実行には、目的関数値が2つ以上求まっている必要があるため(初期に必要なデータ数は、最適化したい問題、パラメータの次元dに依存して変わります)、まずランダムサーチを実行します。 \n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.705741Z", + "start_time": "2021-03-05T04:45:04.677024Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "実行すると、各ステップの目的関数値とその action ID、現在までのベスト値とその action ID に関する情報が以下のように出力されます。\n", + "\n", + "```\n", + "0020-th step: f(x) = -19.075990 (action=8288)\n", + " current best f(x) = -0.150313 (best action=2949) \n", + "```\n", + "\n", + "\n", + "### ベイズ最適化\n", + "\n", + "続いて、ベイズ最適化を以下のように実行します。\n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) \n", + "- `score`: 獲得関数(acquisition function) のタイプ。以下のいずれかを指定します。\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "指定したインターバルごとに、ハイパーパラメータを学習します。 \n", + "負の値を指定すると、ハイパーパラメータの学習は行われません。 \n", + "0 を指定すると、ハイパーパラメータの学習は最初のステップでのみ行われます。 \n", + "- `num_rand_basis`: 基底関数の数。0を指定すると、Bayesian linear modelを利用しない通常のガウス過程が使用されます。 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.142492Z", + "start_time": "2021-03-05T04:45:04.707345Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS', \n", + " interval=0, num_rand_basis=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果の確認\n", + "\n", + "探索結果 res は history クラスのオブジェクト (`physbo.search.discrete.results.history`) として返されます。 \n", + "以下より探索結果を参照します。\n", + "\n", + "- `res.fx` : simulator (目的関数) の評価値の履歴。\n", + "- `res.chosen_actions`: simulator を評価したときの action ID (パラメータ) の履歴。 \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: simulator を評価した全タイミングにおけるベスト値とその action ID (パラメータ)の履歴。\n", + "- `res.total_num_search`: simulator のトータル評価数。\n", + "\n", + "各ステップでの目的関数値と、ベスト値の推移をプロットしてみましょう。 \n", + "`res.fx`, `best_fx` はそれぞれ `res.total_num_search` までの範囲を指定します。" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.561032Z", + "start_time": "2021-03-05T04:45:07.144324Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.721097Z", + "start_time": "2021-03-05T04:45:07.563374Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.875556Z", + "start_time": "2021-03-05T04:45:07.722679Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果のシリアライズ\n", + "\n", + "探索結果は `save` メソッドにより外部ファイルに保存できます。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.887135Z", + "start_time": "2021-03-05T04:45:07.878666Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.890553Z", + "start_time": "2021-03-05T04:45:07.888487Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "保存した結果ファイルは以下のようにロードすることができます。" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.920747Z", + "start_time": "2021-03-05T04:45:07.900980Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.929301Z", + "start_time": "2021-03-05T04:45:07.922695Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.002]\n" + ] + } + ], + "source": [ + "print(X[int(best_action[-1])])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 回帰\n", + "\n", + "`get_post_fmean`, `get_post_fcov` メソッドでガウス過程(事後分布)の期待値と分散を計算可能です。" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.490337Z", + "start_time": "2021-03-05T04:45:07.930904Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean = policy.get_post_fmean(X)\n", + "var = policy.get_post_fcov(X)\n", + "std = np.sqrt(var)\n", + "\n", + "x = X[:,0]\n", + "fig, ax = plt.subplots()\n", + "ax.plot(x, mean)\n", + "ax.fill_between(x, (mean-std), (mean+std), color='b', alpha=.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 獲得関数\n", + "\n", + "`get_score` メソッドで獲得関数を計算可能です。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.992517Z", + "start_time": "2021-03-05T04:45:08.491722Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "score = policy.get_score(mode=\"EI\", xs=X)\n", + "plt.plot(score)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 並列化\n", + "\n", + "PHYSBO は全候補点に対する獲得関数の計算をMPI を用いて並列化出来ます。\n", + "MPI 並列には `mpi4py` を用います。\n", + "\n", + "並列化を有効化するには、 `policy` のコンストラクタのキーワード引数 `comm` に MPI コミュニケータ、たとえば `MPI.COMM_WORLD` を渡してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.996775Z", + "start_time": "2021-03-05T04:45:08.993794Z" + } + }, + "outputs": [], + "source": [ + "# from mpi4py import MPI\n", + "# policy = physbo.search.discrete.policy(X=test_X, comm=MPI.COMM_WORLD)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_interactive_mode.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_interactive_mode.ipynb.txt new file mode 100644 index 00000000..dba7708e --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_interactive_mode.ipynb.txt @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# インタラクティブに実行する\n", + "\n", + "以下の流れで、PHYSBO をインタラクティブに実行することができます。\n", + "\n", + "1. PHYSBO から次に実行するパラメータを得ます。\n", + "2. PHYSBO の外部で評価値を得ます。\n", + "3. 評価値をPHYSBOに登録します。\n", + "\n", + "例えば、以下の様な場合に適しています。\n", + "\n", + "- 人手による実験を行い、その評価値をPHYSBOに与えたい。\n", + "- simulator の実行を別プロセスで行うなど、柔軟に実行制御を行いたい。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.663215Z", + "start_time": "2020-12-04T06:17:28.658656Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "各探索ステップでは以下の処理を行っています。\n", + "\n", + "1. `max_num_probes=1, simulator=None` として random_search または bayes_search を実行して action ID (パラメータ)を得る。\n", + "2. `t = simulator(actions)` により評価値(の array) を得る。\n", + "3. `policy.write(actions, t)`により action ID (パラメータ) に対する評価値を登録する。\n", + "4. `physbo.search.utility.show_search_results` により履歴を表示する。\n", + "\n", + "以下では、ランダムサンプリングを2回(1st, and 2nd steps)、ベイズ最適化による提案を2回(3rd, and 4th steps)を行います。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:47.726433Z", + "start_time": "2020-12-04T06:17:28.677429Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "simulator = simulator()\n", + "\n", + "''' 1st step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 2nd step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 3rd step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "''' 4-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 中断と再開\n", + "\n", + "以下の predictor, training, history を外部ファイルに保存することで、最適化プロセスを中断し、途中から再開することができます。\n", + "\n", + "- predictor: 目的関数の予測モデル\n", + "- training: predictor の学習に用いるデータ (`physbo.variable` オブジェクト)\n", + "- history: 最適化実行の履歴 (`physbo.search.discrete.results.history` オブジェクト)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:48.722691Z", + "start_time": "2020-12-04T06:17:47.728006Z" + } + }, + "outputs": [], + "source": [ + "policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:18:05.746742Z", + "start_time": "2020-12-04T06:17:48.724101Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "# policy を削除\n", + "del policy\n", + "\n", + "# 保存した policy をロード \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')\n", + "\n", + "''' 5-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "# predictor と training を個別に指定することも可\n", + "''' 6-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, \n", + " predictor=policy.predictor, training=policy.training,\n", + " simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_objective.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_objective.ipynb.txt new file mode 100644 index 00000000..2f0d6ed7 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_objective.ipynb.txt @@ -0,0 +1,975 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 多目的最適化\n", + "\n", + "最適化したい目的関数が複数 ($p$ 個) ある場合は、多目的最適化をおこないます。 \n", + "本チュートリアルでは、「解」は目的関数の組 $y = (y_1(x), y_2(x), \\dots, y_p(x))$ を意味することに注意してください。 \n", + "解の大小関係 $\\prec$ を以下のように定義します。 \n", + "\n", + "$y \\prec y^{'}\\Longleftrightarrow \\forall \\ i \\le p, y_i \\le y^{'}_i \\land \\exists \\ j \\le p, y_j < y^{'}_j$ \n", + "\n", + "(最大化問題における) **パレート解** とは、上記の大小関係の上で、自身よりも大きな解がないような解を指します。 \n", + "すなわち、任意の目的関数の値を改善しようとした場合、他の目的関数のうちどれかひとつは悪化するような解です。 \n", + "目的関数間にトレードオフが存在する場合は、パレート解は複数存在するため、それらを効率的に求めることが課題となります。\n", + "\n", + "PHYSBOでは、パレート解を効率的に求めるためのベイズ最適化手法を実装しています。 " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.657438Z", + "start_time": "2021-01-05T06:06:13.061216Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import physbo\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## テスト関数\n", + "\n", + "本チュートリアルでは、多目的最適化のベンチマーク関数である VLMOP2 を利用します。 \n", + "目的関数の数は2つです。\n", + "\n", + "$$\n", + "\\begin{split}\n", + " y_1(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i - 1/\\sqrt{N}\\right)^2\\right] \\\\\n", + " y_2(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i + 1/\\sqrt{N}\\right)^2\\right]\n", + "\\end{split}\n", + "$$\n", + "\n", + "$y_1$ と $y_2$ はそれぞれ $x_1 = x_2 = \\cdots x_N = 1/\\sqrt{N}$ と $x_1 = x_2 = \\cdots x_N = -1/\\sqrt{N}$ に最小値があり、その値はともに0です。また、上界は1 です。\n", + "\n", + "PHYSBO は最大化問題を仮定するため、-1を掛けたものをあらためて目的関数とします。\n", + "\n", + "- 参考文献\n", + " - Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.662277Z", + "start_time": "2021-01-05T06:06:13.658957Z" + } + }, + "outputs": [], + "source": [ + "def vlmop2_minus(x):\n", + " n = x.shape[1]\n", + " y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))\n", + " y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))\n", + "\n", + " return np.c_[-y1, -y2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 探索候補データの準備\n", + "\n", + "入力空間 $\\vec{x}$ は 2次元とし、[-2, 2] × [-2, 2] の上で候補点をグリッド状に生成します。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.676772Z", + "start_time": "2021-01-05T06:06:13.664110Z" + } + }, + "outputs": [], + "source": [ + "import itertools\n", + "a = np.linspace(-2,2,101)\n", + "test_X = np.array(list(itertools.product(a, a)))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.683329Z", + "start_time": "2021-01-05T06:06:13.678152Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-2. , -2. ],\n", + " [-2. , -1.96],\n", + " [-2. , -1.92],\n", + " ...,\n", + " [ 2. , 1.92],\n", + " [ 2. , 1.96],\n", + " [ 2. , 2. ]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.688238Z", + "start_time": "2021-01-05T06:06:13.684556Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(10201, 2)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.693027Z", + "start_time": "2021-01-05T06:06:13.690029Z" + } + }, + "outputs": [], + "source": [ + "class simulator(object):\n", + " def __init__(self, X):\n", + " self.t = vlmop2_minus(X)\n", + " \n", + " def __call__( self, action):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.699166Z", + "start_time": "2021-01-05T06:06:13.694489Z" + } + }, + "outputs": [], + "source": [ + "simu = simulator(test_X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 関数のプロット\n", + "\n", + "2つの目的関数をそれぞれプロットしてみましょう。 \n", + "1つ目の目的関数は右上にピークがあり、2つ目の目的関数は左下にピークがあるようなトレードオフがある状態となっています。\n", + "(星はピークの位置です)\n", + "\n", + "### 1つ目の目的関数" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.958020Z", + "start_time": "2021-01-05T06:06:13.701129Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 1\")\n", + "plt.colorbar()\n", + "plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2つ目の目的関数" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.158089Z", + "start_time": "2021-01-05T06:06:13.960026Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot objective 2\n", + "plt.figure()\n", + "plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 2\")\n", + "plt.colorbar()\n", + "plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行\n", + "\n", + "### policy のセット\n", + "\n", + "多目的最適化用の `physbo.search.discrete_multi.policy` を利用します。 \n", + "`num_objectives` に目的関数の数を指定してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.163097Z", + "start_time": "2021-01-05T06:06:14.159742Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "通常の `physbo.search.discrete.policy` (目的関数が1つの場合)と同じく、`random_search` または `bayes_search` メソッドを呼ぶことで最適化を行います。 \n", + "基本的なAPIや利用方法は `discrete.policy` とおおよそ共通しています。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ランダムサーチ" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.316770Z", + "start_time": "2021-01-05T06:06:14.164245Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "目的関数の評価値(の array) とそのときの action ID が表示されます。 \n", + "また、パレート解集合 (Pareto set) が更新されたときにメッセージを表示します。\n", + "\n", + "Pareto set が更新された際に中身を表示したい場合は、`disp_pareto_set=True` と指定します。 \n", + "Pareto set は1つ目の目的関数値の昇順でソートされています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.493398Z", + "start_time": "2021-01-05T06:06:14.318132Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu, disp_pareto_set=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 結果の確認\n", + "\n", + " #### 評価値の履歴" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.498984Z", + "start_time": "2021-01-05T06:06:14.494679Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res_random.fx[0:res_random.num_runs]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解の取得" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.504080Z", + "start_time": "2021-01-05T06:06:14.500385Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[-0.95713719, -0.09067194],\n", + " [-0.92633083, -0.29208351],\n", + " [-0.63329589, -0.63329589],\n", + " [-0.52191048, -0.72845916],\n", + " [-0.26132949, -0.87913689],\n", + " [-0.17190645, -0.91382463]]),\n", + " array([40, 3, 19, 16, 29, 41]))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "front, front_num = res_random.export_pareto_front()\n", + "front, front_num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 解(評価値)のプロット\n", + "\n", + "これ以降、図示する空間が $y = (y_1, y_2)$ であり $x = (x_1, x_2)$ ではないことにあらためて注意してください。\n", + "\n", + "赤のプロットがパレート解です。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.511086Z", + "start_time": "2021-01-05T06:06:14.505221Z" + } + }, + "outputs": [], + "source": [ + "def plot_pareto_front(res):\n", + " front, front_num = res.export_pareto_front()\n", + " dominated = [i for i in range(res.num_runs) if i not in front_num]\n", + " points = res.fx[dominated, :]\n", + "\n", + " plt.figure(figsize=(7, 7))\n", + " plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = \"blue\")\n", + " plt.scatter(front[:, 0], front[:, 1], c = \"red\")\n", + " plt.title('Pareto front')\n", + " plt.xlabel('Objective 1')\n", + " plt.ylabel('Objective 2')\n", + " plt.xlim([-1.0,0.0])\n", + " plt.ylim([-1.0,0.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.661288Z", + "start_time": "2021-01-05T06:06:14.512392Z" + }, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_random)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域 (dominated region) の体積を計算\n", + "\n", + "パレート解ではない解、すなわち、「自らよりも優れた解 $y'$ が存在する解 $y$ 」 を劣解と呼びます ($\\exists y' y \\prec y'$)。 \n", + "解空間(の部分空間)のうち、劣解の占める空間である劣解領域の体積は、多目的最適化の結果を示す指標のひとつです。 \n", + "この値が大きいほど、より良いパレート解が多く求まっていることになります。\n", + "\n", + "`res_random.pareto.volume_in_dominance(ref_min, ref_max)` は、\n", + "`ref_min`, `ref_max` で指定された矩形(hyper-rectangle) 中の劣解領域体積を計算します。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.666649Z", + "start_time": "2021-01-05T06:06:14.662809Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2376881844865093" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_random.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ベイズ最適化\n", + "\n", + "多目的の場合の `bayes_search` では、`score` には以下のいずれかを指定します。\n", + "\n", + "- HVPI (HyperVolume-based Probability of Improvement)\n", + "- EHVI (Expected Hyper-Volume Improvement)\n", + "- TS (Thompson Sampling)\n", + "\n", + "以下、score を変えてそれぞれ 50回 (ランダムサーチ10回 + ベイズ最適化 40回) 評価を行います。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### HVPI (HyperVolume-based Probability of Improvement)\n", + "\n", + "多次元の目的関数空間における非劣解領域 (non-dominated region) の改善確率を score として求めます。 \n", + "\n", + "- 参考文献\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.019463Z", + "start_time": "2021-01-05T06:06:14.668034Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット\n", + "\n", + "ランダムサンプリングと比較して、パレート解が多く求まっていることが分かります。" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.190434Z", + "start_time": "2021-01-05T06:06:29.020967Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_HVPI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.196389Z", + "start_time": "2021-01-05T06:06:29.191710Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.32877907991633726" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### EHVI (Expected Hyper-Volume Improvement)\n", + "\n", + "多次元の目的関数空間における非劣解領域 (non-dominated region) の改善期待値を score として求めます。 \n", + "\n", + "- 参考文献\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.237335Z", + "start_time": "2021-01-05T06:06:29.201353Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.386473Z", + "start_time": "2021-01-05T06:08:41.239067Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_EHVI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.402348Z", + "start_time": "2021-01-05T06:08:41.394521Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3200467412741881" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TS (Thompson Sampling)\n", + "\n", + "単目的の場合の Thompson Sampling では、各候補(test_X)について、目的関数の事後分布からサンプリングを行い、値が最大となる候補を次の探索点として推薦します。 \n", + "多目的の場合は、サンプリングした値についてパレートルールの上で最大となる候補、つまりパレート最適な候補の中からランダムに1つ選択して次の探索点とします。\n", + "\n", + "- 参考文献\n", + " - Yahyaa, Saba Q., and Bernard Manderick. \"Thompson sampling for multi-objective multi-armed bandits problem.\" Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.534284Z", + "start_time": "2021-01-05T06:08:41.405209Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.716955Z", + "start_time": "2021-01-05T06:09:52.535519Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_TS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.722260Z", + "start_time": "2021-01-05T06:09:52.718300Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.16415446221006114" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_TS.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "code_folding": [] + }, + "source": [ + "## 付録:全探索\n", + "\n", + "`random_search` で `max_num_probes` に全データ数 (`N = test_X.shape[0]`) を渡すと手軽に全探索できます。 \n", + "全データの評価には時間がかかるため、あらかじめデータ数を減らしておきます。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.049904Z", + "start_time": "2021-01-05T06:09:52.723545Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "test_X_sparse = np.array(list(itertools.product(np.linspace(-2, 2, 21), repeat=2)))\n", + "simu_sparse = simulator(test_X_sparse)\n", + "\n", + "policy = physbo.search.discrete_multi.policy(test_X=test_X_sparse, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "N = test_X_sparse.shape[0]\n", + "res_all = policy.random_search(max_num_probes=N, simulator=simu_sparse)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.212669Z", + "start_time": "2021-01-05T06:09:53.051682Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_all)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.218237Z", + "start_time": "2021-01-05T06:09:53.214184Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30051687493437484" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_all.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_probe.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_probe.ipynb.txt new file mode 100644 index 00000000..ff94f5ef --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_multi_probe.ipynb.txt @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 複数候補を一度に探索する\n", + "\n", + "1回の探索ステップで、2つ以上の候補を一度に評価する場合のチュートリアルです。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.096798Z", + "start_time": "2020-12-04T06:19:54.436605Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義\n", + "\n", + "後述の `num_search_each_probe` を2以上にした場合、action には action ID の array が入力されます。 \n", + "各 action ID に対応した評価値のリストを返すように定義してください。\n", + "\n", + "基本チュートリアルと simulator の定義は同じですが、\n", + "t は numpy.array であり、action に array が入力されると `self.t[action]` も array になる点に留意してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.100697Z", + "start_time": "2020-12-04T06:19:55.098103Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "simulator の実行例" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.218606Z", + "start_time": "2020-12-04T06:19:55.102879Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01487066, -1.22884748, -1.05572838])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim = simulator()\n", + "sim([1,12,123])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.224761Z", + "start_time": "2020-12-04T06:19:55.220423Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`num_search_each_probe` によって、各探索ステップにおいて評価する候補数を指定することができます。\n", + "\n", + "下記の実行例だと、ランダムサーチにより 2 ×10 = 20回、ベイズ最適化により 8 ×10 = 80回 simulator を評価することになります。 \n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `num_search_each_probe`: 各探索ステップにおいて評価する候補数" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.195375Z", + "start_time": "2020-12-04T06:19:55.226486Z" + } + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())\n", + "\n", + "res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI', \n", + " interval=2, num_rand_basis=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果の確認" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.312635Z", + "start_time": "2020-12-04T06:20:24.196633Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.415783Z", + "start_time": "2020-12-04T06:20:24.314259Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`res.export_sequence_best_fx()` により、各ステップまでに得られたベスト値とその action の履歴 を得られます。 \n", + "\n", + "`res.export_all_sequence_best_fx()` との違いは、simulator の評価毎ではなく、探索ステップ毎の情報になるという点です。 \n", + "(今回の場合は合計ステップ数は 10, 評価数は 100 です)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.535770Z", + "start_time": "2020-12-04T06:20:24.418352Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_once_mode.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_once_mode.ipynb.txt new file mode 100644 index 00000000..754390c2 --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_once_mode.ipynb.txt @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 既存の計算結果を読み込んで実行する\n", + "\n", + "以下の流れで、既存のaction ID(パラメータ)とその評価値を読み込み、PHYSBO を実行することができます。\n", + "\n", + "1. 外部ファイルを読み込み、既存のaction ID(パラメータ)と評価値を読み込む。\n", + "2. action ID(パラメータ)と評価値をPHYSBOに登録する。\n", + "3. PHYSBO から次に実行するパラメータを得る。\n", + "\n", + "時間制限の関係上、PHYSBO をずっと開いたままにできないため、インタラクティブに実行できないといった場合に、利用することができます。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 事前に計算したデータの用意\n", + "\n", + "上述の `load_data` 関数では全てのXとtが格納されています。ここでは事前に計算したとして、actoin IDのリストをランダムに20個取得し、その評価値を得ます。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]\n" + ] + } + ], + "source": [ + "import random\n", + "random.seed(0)\n", + "calculated_ids = random.sample(range(t.size), 20)\n", + "print(calculated_ids)\n", + "t_initial = t[calculated_ids]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## action ID(パラメータ)と評価値をPHYSBOに登録\n", + "\n", + "policyの初期変数 `initial_data` に `calculated_ids` と `t[calculated_ids]` をリストとして登録します。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PHYSBO から次に実行するパラメータを取得\n", + "\n", + "ベイズ最適化を行い、次の候補点を得ます。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood -20.09302189053099\n", + "50 -th epoch marginal likelihood -23.11964735598211\n", + "100 -th epoch marginal likelihood -24.83020118385076\n", + "150 -th epoch marginal likelihood -25.817906570042602\n", + "200 -th epoch marginal likelihood -26.42342027124426\n", + "250 -th epoch marginal likelihood -26.822598600211865\n", + "300 -th epoch marginal likelihood -27.10872736571494\n", + "350 -th epoch marginal likelihood -27.331572599126865\n", + "400 -th epoch marginal likelihood -27.517235815448124\n", + "450 -th epoch marginal likelihood -27.67892333553869\n", + "500 -th epoch marginal likelihood -27.82299469827059\n", + "Done\n", + "\n", + "[73] [[-1.6680279 -1.46385011 1.68585446]]\n" + ] + } + ], + "source": [ + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score=\"TS\", interval=0, num_rand_basis = 5000)\n", + "print(actions, X[actions])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "得られた候補点について外部で計算を行い、ファイルにactionsとそのスコアを登録する。再びファイルを読み込み、ベイズ最適化を実行し次の候補点を得るというプロセスを繰り返すことで、ベイズ最適化を進めることができます。" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/_sources/notebook/tutorial_simulator.ipynb.txt b/manual/v2.0.2/ja/_sources/notebook/tutorial_simulator.ipynb.txt new file mode 100644 index 00000000..06275c8d --- /dev/null +++ b/manual/v2.0.2/ja/_sources/notebook/tutorial_simulator.ipynb.txt @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# simulatorクラスの定義\n", + "\n", + "\n", + "PHYSBOではSimulator関数を使用して目的関数を定義します。\n", + "ここでは、一次元の関数の最小値を求める例題をもとに、simulatorクラスの定義方法について紹介します。\n", + "\n", + "## 探索空間の定義\n", + "\n", + "その他のチュートリアルと同じように、最初に関数を探索する空間を定義します。\n", + "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", + "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は2次元)。そのため、reshapeを行って変形しています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.552947Z", + "start_time": "2020-12-04T06:21:37.242727Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulatorクラスの定義\n", + "\n", + "目的関数を定義するためのsimulatorクラスをここで定義します。\n", + "\n", + "今回はf(x) = 3 x^4 + 4 x ^3 + 1.0 が最小となるxを探索するという問題設定にしています(答えはx=-1.0)。\n", + "\n", + "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", + "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", + "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", + "PHYSBOでは目的関数値が最大となるものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.558852Z", + "start_time": "2020-12-04T06:21:37.554788Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action ):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx, x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ランダムサーチ\n", + "\n", + "ベイズ最適化を行う前に、探索空間からランダムに候補点を選び目的関数値を評価することで、事前にトレーニングデータを用意します(飛ばすことも可能です)。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.717038Z", + "start_time": "2020-12-04T06:21:37.563144Z" + } + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "#In\n", + "# Design of policy\n", + "# Declaring the policy by\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "# test_X is the set of candidates which is represented by numpy.array.\n", + "# Each row vector represents the feature vector of the corresponding candidate\n", + "\n", + "# set the seed parameter\n", + "policy.set_seed( 1 )\n", + "\n", + "\n", + "# If you want to perform the initial random search before starting the Bayesian optimization,\n", + "# the random sampling is performed by\n", + "\n", + "res = policy.random_search(max_num_probes=50, simulator=simulator())\n", + "# Input:\n", + "# max_num_probes: number of random search\n", + "# simulator = simulator\n", + "# output: combo.search.discreate.results (class)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ベイズ最適化\n", + "\n", + "定義したsimulatorに対してベイズ最適化を実施します。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:30.554566Z", + "start_time": "2020-12-04T06:21:37.718406Z" + } + }, + "outputs": [], + "source": [ + "# single query Bayesian search\n", + "# The single query version of COMBO is performed by\n", + "res = policy.bayes_search(max_num_probes= 150, simulator=simulator(), score='TS',\n", + " interval=20, num_rand_basis=5000)\n", + "\n", + "# Input\n", + "# max_num_probes: number of searching by Bayesian optimization\n", + "# simulator: the class of simulator which is defined above\n", + "# score: the type of aquision funciton. TS, EI and PI are available\n", + "# interval: the timing for learning the hyper parameter.\n", + "# In this case, the hyper parameter is learned at each 20 steps\n", + "# If you set the negative value to interval, the hyper parameter learning is not performed\n", + "# If you set zero to interval, the hyper parameter learning is performed only at the first step\n", + "# num_rand_basis: the number of basis function. If you choose 0, ordinary Gaussian process runs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果表示\n", + "\n", + "得られた結果のうち、一番よいスコアを持つものは``export_all_sequence_best_fx()``を用いることで取り出すことができます。\n", + "また、これまでの全ての履歴をみたい場合には、``chosen_actions``を呼び出すことで表示することができます。以下、結果を表示するサンプルスクリプトを記載します。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:30.932451Z", + "start_time": "2020-12-04T06:24:30.555830Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "\n", + "import matplotlib.pyplot as plt\n", + "# The result of searching is summarized in the class combo.search.discrete.results.history()\n", + "# res.fx: observed negative energy at each step\n", + "# res.chosen_actions: history of choosed actions\n", + "# fbest, best_action= res.export_all_sequence_best_fx(): current best fx and current best action\n", + "# that has been observed until each step\n", + "# res.total_num_search: total number of search\n", + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.066401Z", + "start_time": "2020-12-04T06:24:30.934178Z" + } + }, + "outputs": [], + "source": [ + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.200565Z", + "start_time": "2020-12-04T06:24:31.068515Z" + } + }, + "outputs": [], + "source": [ + "plt.plot(best_action)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.204953Z", + "start_time": "2020-12-04T06:24:31.201964Z" + } + }, + "outputs": [], + "source": [ + "print(X[int(best_action[-1])])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/manual/v2.0.2/ja/_static/_sphinx_javascript_frameworks_compat.js b/manual/v2.0.2/ja/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/manual/v2.0.2/ja/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/manual/v2.0.2/ja/_static/basic.css b/manual/v2.0.2/ja/_static/basic.css new file mode 100644 index 00000000..7ebbd6d0 --- /dev/null +++ b/manual/v2.0.2/ja/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/css/badge_only.css b/manual/v2.0.2/ja/_static/css/badge_only.css new file mode 100644 index 00000000..88ba55b9 --- /dev/null +++ b/manual/v2.0.2/ja/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff2 b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff2 b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.eot b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.svg b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.ttf b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff2 b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff b/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff2 b/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff b/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff2 b/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-bold.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff b/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff2 b/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff b/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff differ diff --git a/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff2 b/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/manual/v2.0.2/ja/_static/css/fonts/lato-normal.woff2 differ diff --git a/manual/v2.0.2/ja/_static/css/theme.css b/manual/v2.0.2/ja/_static/css/theme.css new file mode 100644 index 00000000..0f14f106 --- /dev/null +++ b/manual/v2.0.2/ja/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/doctools.js b/manual/v2.0.2/ja/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/manual/v2.0.2/ja/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/manual/v2.0.2/ja/_static/documentation_options.js b/manual/v2.0.2/ja/_static/documentation_options.js new file mode 100644 index 00000000..17e71fad --- /dev/null +++ b/manual/v2.0.2/ja/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '2.0.2', + LANGUAGE: 'ja', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/file.png b/manual/v2.0.2/ja/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/manual/v2.0.2/ja/_static/file.png differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.eot b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.ttf b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff2 b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.eot b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.ttf b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff2 b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.eot b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.ttf b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff2 b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.eot b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.ttf b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff2 b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/manual/v2.0.2/ja/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/manual/v2.0.2/ja/_static/jquery.js b/manual/v2.0.2/ja/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/manual/v2.0.2/ja/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t a.language.name.localeCompare(b.language.name)); + + const languagesHTML = ` +
+
Languages
+ ${languages + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} +
+ `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
検索
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/language_data.js b/manual/v2.0.2/ja/_static/language_data.js new file mode 100644 index 00000000..15e4a844 --- /dev/null +++ b/manual/v2.0.2/ja/_static/language_data.js @@ -0,0 +1,19 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = []; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Dummy stemmer for languages without stemming rules. + */ +var Stemmer = function() { + this.stemWord = function(w) { + return w; + } +} + diff --git a/manual/v2.0.2/ja/_static/logo.png b/manual/v2.0.2/ja/_static/logo.png new file mode 100644 index 00000000..b773f891 Binary files /dev/null and b/manual/v2.0.2/ja/_static/logo.png differ diff --git a/manual/v2.0.2/ja/_static/minus.png b/manual/v2.0.2/ja/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/manual/v2.0.2/ja/_static/minus.png differ diff --git a/manual/v2.0.2/ja/_static/nbsphinx-broken-thumbnail.svg b/manual/v2.0.2/ja/_static/nbsphinx-broken-thumbnail.svg new file mode 100644 index 00000000..4919ca88 --- /dev/null +++ b/manual/v2.0.2/ja/_static/nbsphinx-broken-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/manual/v2.0.2/ja/_static/nbsphinx-code-cells.css b/manual/v2.0.2/ja/_static/nbsphinx-code-cells.css new file mode 100644 index 00000000..a3fb27c3 --- /dev/null +++ b/manual/v2.0.2/ja/_static/nbsphinx-code-cells.css @@ -0,0 +1,259 @@ +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nbinput.container div.prompt pre > code { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nboutput.container div.prompt pre > code { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars and line breaks on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; + white-space: pre; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copy button on prompts for 'sphinx_copybutton' extension ... */ +.prompt .copybtn, +/* ... and 'sphinx_immaterial' theme */ +.prompt .md-clipboard.md-icon { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +.jp-RenderedHTMLCommon table, +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +.jp-RenderedHTMLCommon thead, +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +.jp-RenderedHTMLCommon tr, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon td, +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.jp-RenderedHTMLCommon th, +div.rendered_html th { + font-weight: bold; +} +.jp-RenderedHTMLCommon tbody tr:nth-child(odd), +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +.jp-RenderedHTMLCommon tbody tr:hover, +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + diff --git a/manual/v2.0.2/ja/_static/nbsphinx-gallery.css b/manual/v2.0.2/ja/_static/nbsphinx-gallery.css new file mode 100644 index 00000000..365c27a9 --- /dev/null +++ b/manual/v2.0.2/ja/_static/nbsphinx-gallery.css @@ -0,0 +1,31 @@ +.nbsphinx-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 5px; + margin-top: 1em; + margin-bottom: 1em; +} + +.nbsphinx-gallery > a { + padding: 5px; + border: 1px dotted currentColor; + border-radius: 2px; + text-align: center; +} + +.nbsphinx-gallery > a:hover { + border-style: solid; +} + +.nbsphinx-gallery img { + max-width: 100%; + max-height: 100%; +} + +.nbsphinx-gallery > a > div:first-child { + display: flex; + align-items: start; + justify-content: center; + height: 120px; + margin-bottom: 5px; +} diff --git a/manual/v2.0.2/ja/_static/nbsphinx-no-thumbnail.svg b/manual/v2.0.2/ja/_static/nbsphinx-no-thumbnail.svg new file mode 100644 index 00000000..9dca7588 --- /dev/null +++ b/manual/v2.0.2/ja/_static/nbsphinx-no-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/manual/v2.0.2/ja/_static/plus.png b/manual/v2.0.2/ja/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/manual/v2.0.2/ja/_static/plus.png differ diff --git a/manual/v2.0.2/ja/_static/pygments.css b/manual/v2.0.2/ja/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/manual/v2.0.2/ja/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/manual/v2.0.2/ja/_static/searchtools.js b/manual/v2.0.2/ja/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/manual/v2.0.2/ja/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/manual/v2.0.2/ja/_static/sphinx_highlight.js b/manual/v2.0.2/ja/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/manual/v2.0.2/ja/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/manual/v2.0.2/ja/_static/translations.js b/manual/v2.0.2/ja/_static/translations.js new file mode 100644 index 00000000..635b0818 --- /dev/null +++ b/manual/v2.0.2/ja/_static/translations.js @@ -0,0 +1,62 @@ +Documentation.addTranslations({ + "locale": "ja", + "messages": { + "%(filename)s — %(docstitle)s": "%(filename)s — %(docstitle)s", + "© %(copyright_prefix)s %(copyright)s.": "", + ", in ": ", in ", + "About these documents": "\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u3064\u3044\u3066", + "Automatically generated list of changes in version %(version)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9\uff08\u3053\u306e\u30ea\u30b9\u30c8\u306f\u81ea\u52d5\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\uff09", + "C API changes": "C API \u306b\u95a2\u3059\u308b\u5909\u66f4", + "Changes in Version %(version)s — %(docstitle)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9 — %(docstitle)s", + "Collapse sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u305f\u305f\u3080", + "Complete Table of Contents": "\u7dcf\u5408\u76ee\u6b21", + "Contents": "\u30b3\u30f3\u30c6\u30f3\u30c4", + "Copyright": "\u8457\u4f5c\u6a29", + "Created using Sphinx %(sphinx_version)s.": "", + "Expand sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u5c55\u958b", + "Full index on one page": "\u7dcf\u7d22\u5f15", + "General Index": "\u7dcf\u5408\u7d22\u5f15", + "Global Module Index": "\u30e2\u30b8\u30e5\u30fc\u30eb\u7dcf\u7d22\u5f15", + "Go": "\u691c\u7d22", + "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059", + "Index": "\u7d22\u5f15", + "Index – %(key)s": "", + "Index pages by letter": "\u982d\u6587\u5b57\u5225\u7d22\u5f15", + "Indices and tables:": "\u7d22\u5f15\u3068\u8868\u4e00\u89a7:", + "Last updated on %(last_updated)s.": "\u6700\u7d42\u66f4\u65b0: %(last_updated)s", + "Library changes": "\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u95a2\u3059\u308b\u5909\u66f4", + "Navigation": "\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3", + "Next topic": "\u6b21\u306e\u30c8\u30d4\u30c3\u30af\u3078", + "Other changes": "\u305d\u306e\u4ed6\u306e\u5909\u66f4", + "Overview": "\u6982\u8981", + "Please activate JavaScript to enable the search\n functionality.": "\u691c\u7d22\u6a5f\u80fd\u3092\u4f7f\u3046\u306b\u306f JavaScript \u3092\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "Preparing search...": "\u691c\u7d22\u3092\u6e96\u5099\u3057\u3066\u3044\u307e\u3059...", + "Previous topic": "\u524d\u306e\u30c8\u30d4\u30c3\u30af\u3078", + "Quick search": "\u30af\u30a4\u30c3\u30af\u691c\u7d22", + "Search": "\u691c\u7d22", + "Search Page": "\u691c\u7d22\u30da\u30fc\u30b8", + "Search Results": "\u691c\u7d22\u7d50\u679c", + "Search finished, found one page matching the search query.": [ + "" + ], + "Search within %(docstitle)s": "%(docstitle)s \u5185\u3092\u691c\u7d22", + "Searching": "\u691c\u7d22\u4e2d", + "Searching for multiple words only shows matches that contain\n all words.": "\u8907\u6570\u306e\u5358\u8a9e\u3092\u691c\u7d22\u3059\u308b\u3068\u3001\u6b21\u3092\u542b\u3080\u4e00\u81f4\u306e\u307f\u304c\u8868\u793a\u3055\u308c\u307e\u3059\n \u00a0\u00a0\u00a0 \u3059\u3079\u3066\u306e\u7528\u8a9e\u3002", + "Show Source": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8868\u793a", + "Table of Contents": "\u76ee\u6b21", + "This Page": "\u3053\u306e\u30da\u30fc\u30b8", + "Welcome! This is": "Welcome! This is", + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u691c\u7d22\u3057\u305f\u6587\u5b57\u5217\u306f\u3069\u306e\u6587\u66f8\u306b\u3082\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3059\u3079\u3066\u306e\u5358\u8a9e\u304c\u6b63\u78ba\u306b\u8a18\u8ff0\u3055\u308c\u3066\u3044\u308b\u304b\u3001\u3042\u308b\u3044\u306f\u3001\u5341\u5206\u306a\u30ab\u30c6\u30b4\u30ea\u30fc\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002", + "all functions, classes, terms": "\u95a2\u6570\u3001\u30af\u30e9\u30b9\u304a\u3088\u3073\u7528\u8a9e\u7dcf\u89a7", + "can be huge": "\u5927\u304d\u3044\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u6ce8\u610f", + "last updated": "\u6700\u7d42\u66f4\u65b0", + "lists all sections and subsections": "\u7ae0\uff0f\u7bc0\u4e00\u89a7", + "next chapter": "\u6b21\u306e\u7ae0\u3078", + "previous chapter": "\u524d\u306e\u7ae0\u3078", + "quick access to all modules": "\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u65e9\u898b\u8868", + "search": "\u691c\u7d22", + "search this documentation": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u691c\u7d22", + "the documentation for": "the documentation for" + }, + "plural_expr": "0" +}); \ No newline at end of file diff --git a/manual/v2.0.2/ja/acknowledgement.html b/manual/v2.0.2/ja/acknowledgement.html new file mode 100644 index 00000000..be2700da --- /dev/null +++ b/manual/v2.0.2/ja/acknowledgement.html @@ -0,0 +1,178 @@ + + + + + + + + + 謝辞 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

謝辞

+

PHYSBOは東京大学物性研究所 ソフトウェア高度化プロジェクト (2020 年度) の支援を受け開発されました。この場を借りて感謝します。

+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/algorithm.html b/manual/v2.0.2/ja/algorithm.html new file mode 100644 index 00000000..2d40fd6c --- /dev/null +++ b/manual/v2.0.2/ja/algorithm.html @@ -0,0 +1,299 @@ + + + + + + + + + アルゴリズム — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

アルゴリズム

+

ここでは、ベイズ最適化に関する説明を行います。技術的な詳細については、こちらの文献 を参照してください。

+
+

ベイズ最適化

+

ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数(特性値など)の評価に大きなコストがかかるような場合に利用できる手法です。つまり、「できるだけ少ない実験・シミュレーション回数でより良い目的関数(材料特性など)を持つ説明変数(材料の組成、構造、プロセスやシミュレーションパラメータなど)を見つけ出す」ことが、ベイズ最適化によって解かれる問題です。ベイズ最適化では、探索する説明変数(ベクトル \({\bf x}\) で表す)の候補をあらかじめリストアップした状況からスタートします。そして、候補の中から目的関数 \(y\) が良くなると考えられる候補を、機械学習(ガウス過程回帰を利用)による予測をうまく利用することで選定します。その候補に対して実験・シミュレーションを行い目的関数の値を評価します。機械学習による選定・実験シミュレーションによる評価を繰り返すことにより、できるだけ少ない回数で最適化が可能となります。

+

ベイズ最適化のアルゴリズムの詳細を以下に示します。

+
    +
  • ステップ1:初期化

  • +
+

探索したい空間をあらかじめ用意します。つまり、候補となる材料の組成・構造・プロセスやシミュレーションパラメータ等を、ベクトル \({\bf x}\) で表現しリストアップします。この段階では、目的関数の値はわかっていません。このうち初期状態としていくつかの候補を選び、実験またはシミュレーションによって目的関数の値 \(y\) を見積もります。これにより、説明変数 \({\bf x}\) と目的関数 \(y\) が揃った学習データ \(D = \{ {\bf x}_i, y_i \}_{(i=1, \cdots, N)}\) が得られます。

+
    +
  • ステップ2:候補選定

  • +
+

学習データを用いて、ガウス過程を学習します。ガウス過程によれば、任意の \({\bf x}\) における予測値の平均を \(\mu_c ({\bf x})\) 、分散を \(\sigma_c ({\bf x})\) とすると、

+
+\[ \begin{align}\begin{aligned}\mu_c ({\bf x}) &= {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf y}\\\sigma_c({\bf x}) &= k({\bf x}, {\bf x}) + \sigma^2 - {\bf k}({\bf x})^T (K+\sigma^2 I)^{-1}{\bf k}({\bf x})\end{aligned}\end{align} \]
+

となります。ただし、 \(k({\bf x}, {\bf x}')\) はカーネルと呼ばれる関数であり、2つのベクトルの類似度を表します。一般に、以下のガウスカーネルが使われます。

+
+\[k({\bf x}, {\bf x}') = \exp \left[ -\frac{1}{2\eta^2}||{\bf x} - {\bf x}'||^2 \right]\]
+

また、このカーネル関数を利用し、 \({\bf k}({\bf x})\) および \(K\) は以下のように計算されます。

+
+\[{\bf k}({\bf x}) = \left( k({\bf x}_1, {\bf x}), k({\bf x}_2, {\bf x}), \cdots, k({\bf x}_N, {\bf x}) \right)^\top\]
+
+ \[ + K = \left( + \begin{array}{cccc} + k({\bf x}_1, {\bf x}_1) & k({\bf x}_1, {\bf x}_2) & \ldots & k({\bf x}_1, {\bf x}_N) \\ + k({\bf x}_2, {\bf x}_1) & k({\bf x}_2, {\bf x}_2) & \ldots & k({\bf x}_2, {\bf x}_N) \\ + \vdots & \vdots & \ddots & \vdots \\ + k({\bf x}_N, {\bf x}_1) & k({\bf x}_N, {\bf x}_2) & \ldots & k({\bf x}_N, {\bf x}_N) + \end{array} + \right) + \]

まだ実験やシミュレーションを行っていない候補全てに対して、予測値 \(\mu_c ({\bf x})\) および予測の不確かさに関連する分散 \(\sigma_c ({\bf x})\) を見積もります。これを用いて獲得関数を計算し、目的関数の値がまだわかっていない候補の中から、獲得関数を最大化する候補 \({\bf x}^*\) を選定します。このとき、 \(\sigma\) および \(\eta\) はハイパーパラメタと呼ばれ、PHYSBOでは最適な値が自動で設定されます。

+

獲得関数として、例えば、最大改善確率(PI : Probability of Improvement)、最大期待改善率(EI : Expected Improvement)が有用です。 +PIによるスコアは次のように定義される。

+
+\[\text{PI} (\mathbf{x}) = \Phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})}\]
+

ここで \(\Phi(\cdot)\) は累積分布関数です。 +PIスコアは、現在得られている \(y\) の最大値 \(y_{\max}\) を超える確率を表します。 +さらに、EIによるスコアは、予測値と現在の最大値 \(y_{\max}\) との差の期待値であり、次式で与えられます。

+
+\[\text{EI} (\mathbf{x}) = [\mu_c (\mathbf{x})-y_{\max}] \Phi (z (\mathbf{x})) + \sigma_c (\mathbf{x}) \phi (z (\mathbf{x})), \ \ \ z(\mathbf{x}) = \frac{\mu_c (\mathbf{x}) - y_{\max}}{\sigma_c (\mathbf{x})}\]
+

ここで \(\phi(\cdot)\) は確率密度関数です。

+
    +
  • ステップ3:実験

  • +
+

ステップ2で選定された獲得関数が最大となる候補 \({\bf x}^*\) に対して実験またはシミュレーションを行い、目的関数値 \(y\) を見積もります。これにより学習データが一つ追加されます。このステップ2、3を繰り返すことで、スコアのよい候補を探索します。

+
+
+

PHYSBOによるベイズ最適化の高速化

+

PHYSBOでは、random feature map、トンプソンサンプリング、コレスキー分解を利用することで、 +ベイズ最適化の高速化を実現しています。 +まず、random feature mapについて説明します。 +random feature map \(\phi (\mathbf{x})\) を導入することで +ガウスカーネル \(k(\mathbf{x},\mathbf{x}')\) を以下のように近似しています。

+
+\[\begin{split}k(\mathbf{x},\mathbf{x}') = \exp \left[ - \frac{1}{2 \eta^2} \| \mathbf{x} -\mathbf{x}' \| \right]^2 \simeq \phi (\mathbf{x})^\top \phi(\mathbf{x}') \\ +\phi (\mathbf{x}) = \left( z_{\omega_1, b_1} (\mathbf{x}/\eta),..., z_{\omega_l, b_l} (\mathbf{x}/\eta) \right)^\top\end{split}\]
+

ただし、 \(z_{\omega, b} (\mathbf{x}) = \sqrt{2} \cos (\boldsymbol{\omega}^\top \mathbf{x}+b)\) としています。 +このとき、 \(\boldsymbol{\omega}\)\(p(\boldsymbol{\omega}) = (2\pi)^{-d/2} \exp (-\|\boldsymbol{\omega}\|^2/2)\) より生成され、 \(b\)\([0, 2 \pi]\) から一様に選ばれます。 +この近似は、 \(l \to \infty\) の極限で厳密に成立し、 \(l\) の値がrandom feature mapの次元となります。

+

このとき \(\Phi\) を、以下のように学習データのベクトル \(\mathbf{x}\) による \(\phi(\mathbf{x}_i)\) を各列に持つ \(l\)\(n\) 列行列とします。

+
+\[\Phi = ( \phi(\mathbf{x}_1),..., \phi(\mathbf{x}_n) )\]
+

すると、

+
+\[\begin{split}\mathbf{k} (\mathbf{x}) = \Phi^\top \phi(\mathbf{x}) \\ +K= \Phi^\top \Phi\end{split}\]
+

という関係が成立することがわかります。

+

次に、トンプソンサンプリングを利用することで、候補の予測にかかる計算時間を \(O(l)\) にする手法について紹介します。 +EIやPIを利用すると、分散を評価する必要があるため \(O(l^2)\) になってしまうことに注意が必要です。 +トンプソンサンプリングを行うために、 +以下で定義されるベイズ線形モデルを利用します。

+
+\[y = \mathbf{w}^\top \phi (\mathbf{x})\]
+

ただし、この \(\phi(\mathbf{x})\) は前述したrandom feature mapであり、 \(\mathbf{w}\) は係数ベクトルです。 +ガウス過程では、学習データ \(D\) があたえられたとき、この \(\mathbf{w}\) が以下のガウス分布に従うように決まります。

+
+\[\begin{split}p(\mathbf{w}|D) = \mathcal{N} (\boldsymbol{\mu}, \Sigma) \\ +\boldsymbol{\mu} = (\Phi \Phi^\top + \sigma^2 I)^{-1} \Phi \mathbf{y} \\ +\Sigma = \sigma^2 (\Phi \Phi^\top + \sigma^2 I)^{-1}\end{split}\]
+

トンプソンサンプリングでは、この事後確率分布にしたがって係数ベクトルを一つサンプリングし、 +それを \(\mathbf{w}^*\) とすることで、 +獲得関数を

+
+\[\text{TS} (\mathbf{x}) = {\mathbf{w}^*}^\top \phi (\mathbf{x})\]
+

と表す。 +これを最大とする \(\mathbf{x}^*\) が次の候補として選出されます。 +このとき、 \(\phi (\mathbf{x})\)\(l\) 次元ベクトルなため、 +獲得関数の計算は \(O(l)\) で実行できます。

+

次に \(\mathbf{w}\) のサンプリングの高速化について紹介します。 +行列 \(A\) を以下のように定義します。

+
+\[A = \frac{1}{\sigma^2} \Phi \Phi^\top +I\]
+

すると、事後確率分布は、

+
+\[p(\mathbf{w}|D) = \mathcal{N} \left( \frac{1}{\sigma^2} A^{-1} \Phi \mathbf{y}, A^{-1} \right)\]
+

と表すことができます。 +そのため、 \(\mathbf{w}\) をサンプリングするためには、 \(A^{-1}\) の計算が必要となります。 +ここで、ベイズ最適化のイテレーションにおいて、 +新しく \((\mathbf{x}', y')\) が加わった場合について考えます。 +このデータの追加により、行列 \(A\) は、

+
+\[A' = A + \frac{1}{\sigma^2} \phi (\mathbf{x}') \phi (\mathbf{x}')^\top\]
+

と更新されます。 +この更新は、コレスキー分解( \(A= L^\top L\) )を用いることで、 \(A^{-1}\) の計算にかかる時間を \(O(l^2)\) にすることができます。 +もし、 \(A^{-1}\) をイテレーションごとに毎回計算すると \(O(l^3)\) の計算が必要になります。 +実際、 \(\mathbf{w}\) をサンプリングする際は、

+
+\[\mathbf{w}^* = \boldsymbol{\mu} + \mathbf{w}_0\]
+

とし、 \(\mathbf{w}_0\)\(\mathcal{N} (0,A^{-1})\) からサンプリングします。 +また、 \(\boldsymbol{\mu}\) は、

+
+\[L^\top L \boldsymbol{\mu} = \frac{1}{\sigma^2} \Phi \mathbf{y}\]
+

を解くことで得られます。 +これらの技術を利用することで、学習データ数に対してほぼ線形の計算時間を実現しています。

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/modules.html b/manual/v2.0.2/ja/api/modules.html new file mode 100644 index 00000000..d4bdc925 --- /dev/null +++ b/manual/v2.0.2/ja/api/modules.html @@ -0,0 +1,222 @@ + + + + + + + + + physbo — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.basis.fourier.html b/manual/v2.0.2/ja/api/physbo.blm.basis.fourier.html new file mode 100644 index 00000000..764cb617 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.basis.fourier.html @@ -0,0 +1,289 @@ + + + + + + + + + physbo.blm.basis.fourier module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.basis.fourier module

+
+
+class physbo.blm.basis.fourier.fourier(params)[ソース]
+

ベースクラス: object

+

random feature maps +Psi(X; W,b) = cos[X * Wt + b] * alpha +where

+
+
    +
  • X: input, N-by-d matrix

  • +
  • W: weight, l-by-d matrix

  • +
  • Wt: transpose of W

  • +
  • b: bias, 1-by-l matrix

  • +
  • alpha: coefficient

  • +
+
+

and

+
+
    +
  • N: number of data

  • +
  • d: dimension of input

  • +
  • l: number of basis

  • +
+
+
+
+params
+

W, b, alpha

+
+
Type:
+

Tuple

+
+
+
+ +
+
+nbasis
+

number of basis

+
+
Type:
+

int

+
+
+
+ +

参照

+

A. Rahimi and B. Recht, "Random features for large-scale kernel machines," +in "Advances in neural information processing systems," 2007, pp. 1177-1184.

+
+
+get_basis(X, params=None)[ソース]
+

compute the value of basis

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- input

  • +
  • params (Tuple) -- W, b, alpha +(default: self.params)

  • +
+
+
戻り値:
+

Psi(X; W,b) -- N-by-l matrix

+

cos[X * Wt + b] * alpha

+

where Wt is the transpose of W.

+

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[ソース]
+

update basis parameters

+
+
パラメータ:
+

params (tuple) -- W, b, alpha

+
+
+
+ +
+
+show()[ソース]
+

print parameters

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.basis.html b/manual/v2.0.2/ja/api/physbo.blm.basis.html new file mode 100644 index 00000000..00081b34 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.basis.html @@ -0,0 +1,217 @@ + + + + + + + + + physbo.blm.basis package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.basis package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.core.html b/manual/v2.0.2/ja/api/physbo.blm.core.html new file mode 100644 index 00000000..949c9b3d --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.core.html @@ -0,0 +1,225 @@ + + + + + + + + + physbo.blm.core package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.core.model.html b/manual/v2.0.2/ja/api/physbo.blm.core.model.html new file mode 100644 index 00000000..2d83eb50 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.core.model.html @@ -0,0 +1,424 @@ + + + + + + + + + physbo.blm.core.model module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.core.model module

+
+
+class physbo.blm.core.model.model(lik, prior, options={})[ソース]
+

ベースクラス: object

+

Baysean Linear Model

+
+
+prior
+

prior distribution of weights

+
+
Type:
+

physbo.blm.prior.gauss

+
+
+
+ +
+
+lik
+

kernel

+
+
Type:
+

physbo.blm.lik.gauss

+
+
+
+ +
+
+nbasis
+

number of features in random feature map

+
+
Type:
+

int

+
+
+
+ +
+
+stats
+

auxially parameters for sampling

+
+
Type:
+

Tuple

+
+
+
+ +
+
+method
+

sampling method

+
+
Type:
+

str

+
+
+
+ +
+
+get_post_fcov(X, Psi=None, diag=True)[ソース]
+

calculates posterior covariance of model

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • diag (bool) -- if True, returns only variances as a diagonal matrix +(default: True)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+ +
+ +
+
+get_post_fmean(X, Psi=None, w=None)[ソース]
+

calculates posterior mean of model (function)

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature maps

  • +
  • w (numpy.ndarray) -- weight

  • +
+
+
+ +
+ +
+
+get_post_params_mean()[ソース]
+

calculates posterior mean of weights

+
+
戻り値の型:
+

numpy.ndarray

+
+
+ +
+ +
+
+post_sampling(Xtest, Psi=None, N=1, alpha=1.0)[ソース]
+

draws samples of mean value of model

+
+
パラメータ:
+
    +
  • Xtest (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature maps +(default: blm.lik.get_basis(Xtest))

  • +
  • N (int) -- number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+predict_sampling(Xtest, Psi=None, N=1)[ソース]
+

draws samples from model

+
+
パラメータ:
+
    +
  • Xtest (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature map +(default: blm.lik.get_basis(Xtest))

  • +
  • N (int) -- number of samples +(default: 1)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+prepare(X, t, Psi=None)[ソース]
+

initializes model by using the first training dataset

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • t (numpy.ndarray) -- target (label)

  • +
  • Psi (numpy.ndarray) -- feature maps

  • +
+
+
+ +
+ +
+
+sampling(w_mu=None, N=1, alpha=1.0)[ソース]
+

draws samples of weights

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model) -- model

  • +
  • w_mu (numpy.ndarray) -- mean of weight

  • +
  • N (int) -- the number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source +(default: 1.0)

  • +
+
+
戻り値:
+

samples of weights

+
+
戻り値の型:
+

numpy.ndarray

+
+
+ +
+ +
+
+update_stats(x, t, psi=None)[ソース]
+

updates model by using another training data

+
+
パラメータ:
+
    +
  • x (numpy.ndarray) -- input

  • +
  • t (float) -- target (label)

  • +
  • psi (numpy.ndarray) -- feature map

  • +
+
+
+ +
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.html b/manual/v2.0.2/ja/api/physbo.blm.html new file mode 100644 index 00000000..5ee82495 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.html @@ -0,0 +1,296 @@ + + + + + + + + + physbo.blm package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.inf.exact.html b/manual/v2.0.2/ja/api/physbo.blm.inf.exact.html new file mode 100644 index 00000000..f3993d97 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.inf.exact.html @@ -0,0 +1,318 @@ + + + + + + + + + physbo.blm.inf.exact module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.inf.exact module

+
+
+physbo.blm.inf.exact.get_post_fcov(blm, X, Psi=None, diag=True)[ソース]
+

calculates posterior covariance of model

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model)

  • +
  • X (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • diag (bool) -- if True, returns only variances as a diagonal matrix +(default: True)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.get_post_fmean(blm, X, Psi=None, w=None)[ソース]
+

calculates posterior mean of model

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model)

  • +
  • X (numpy.ndarray) -- inputs

  • +
  • Psi (numpy.ndarray) -- feature maps +(default: blm.lik.linear.basis.get_basis(X))

  • +
  • w (numpy.ndarray) -- weights +(default: get_post_params_mean(blm))

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.get_post_params_mean(blm)[ソース]
+

calculates mean of weight

+
+
パラメータ:
+

blm (physbo.blm.core.model)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.prepare(blm, X, t, Psi=None)[ソース]
+

initializes auxiaialy parameters for quick sampling

+

blm.stats will be updated.

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model) -- model

  • +
  • X (numpy.ndarray) -- inputs

  • +
  • t (numpy.ndarray) -- target (label)

  • +
  • Psi -- feature maps (default: blm.lik.get_basis(X))

  • +
+
+
+
+ +
+
+physbo.blm.inf.exact.sampling(blm, w_mu=None, N=1, alpha=1.0)[ソース]
+

draws samples of weights

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model) -- model

  • +
  • w_mu (numpy.ndarray) -- mean of weight

  • +
  • N (int) -- the number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source +(default: 1.0)

  • +
+
+
戻り値:
+

samples of weights

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.blm.inf.exact.update_stats(blm, x, t, psi=None)[ソース]
+

calculates new auxiaialy parameters for quick sampling by fast-update

+
+
パラメータ:
+
    +
  • blm (physbo.blm.core.model) -- model

  • +
  • x (numpy.ndarray) -- input

  • +
  • t (numpy.ndarray) -- target (label)

  • +
  • psi -- feature map (default: blm.lik.get_basis(X))

  • +
+
+
戻り値:
+

(U, b, alpha) -- new auxially parameters

+
+
戻り値の型:
+

Tuple

+
+
+

メモ

+

blm.stats[0] (U) will be mutated while the others not.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.inf.html b/manual/v2.0.2/ja/api/physbo.blm.inf.html new file mode 100644 index 00000000..dfe37aea --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.inf.html @@ -0,0 +1,215 @@ + + + + + + + + + physbo.blm.inf package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.inf package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.lik.gauss.html b/manual/v2.0.2/ja/api/physbo.blm.lik.gauss.html new file mode 100644 index 00000000..1322f050 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.lik.gauss.html @@ -0,0 +1,331 @@ + + + + + + + + + physbo.blm.lik.gauss module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.lik.gauss module

+
+
+class physbo.blm.lik.gauss.gauss(linear, cov)[ソース]
+

ベースクラス: object

+

Gaussian

+
+
+linear
+
+ +
+
+cov
+

covariance

+
+
Type:
+

blm.lik.cov

+
+
+
+ +
+
+stats
+
+ +
+
+get_basis(X)[ソース]
+

calculates value of basis function at input

+
+
パラメータ:
+

X (numpy.ndarray) -- input

+
+
+
+

参考

+

blm.basis.fourier.get_basis

+
+
+ +
+
+get_cov(N, params=None)[ソース]
+

Returns covariance matrix

+
+
パラメータ:
+
    +
  • N (int) -- dimension

  • +
  • params (float) -- half of log of variance +(default: self.cov.params)

  • +
+
+
戻り値:
+

NxN covariance matrix

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(X, Psi=None, params=None, bias=None)[ソース]
+

calculates mean value

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- raw input

  • +
  • Psi (numpy.ndarray) -- value of feature maps

  • +
  • params (numpy.ndarray) -- weight

  • +
  • bias (float) -- bias

  • +
+
+
+
+

参考

+

blm.basis.fourier.get_mean

+
+
+ +
+
+get_prec(N, params=None)[ソース]
+

Returns precision matrix

+
+
パラメータ:
+
    +
  • N (int) -- dimension

  • +
  • params (float) -- half of log of variance +(default: self.cov.params)

  • +
+
+
戻り値:
+

NxN precision matrix

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+sampling(fmean)[ソース]
+

draws samples

+
+
パラメータ:
+

fmean (numpy.ndarray) -- means of samples

+
+
戻り値:
+

samples

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_bias(bias)[ソース]
+

sets bias

+
+ +
+
+set_params(params)[ソース]
+

sets parameters

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.lik.html b/manual/v2.0.2/ja/api/physbo.blm.lik.html new file mode 100644 index 00000000..b942e6f0 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.lik.html @@ -0,0 +1,236 @@ + + + + + + + + + physbo.blm.lik package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.lik.linear.html b/manual/v2.0.2/ja/api/physbo.blm.lik.linear.html new file mode 100644 index 00000000..c360ba4a --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.lik.linear.html @@ -0,0 +1,282 @@ + + + + + + + + + physbo.blm.lik.linear module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.lik.linear module

+
+
+class physbo.blm.lik.linear.linear(basis, params=None, bias=None)[ソース]
+

ベースクラス: object

+
+
+basis
+

basis for random feature map

+
+ +
+
+nbasis
+

number of basis

+
+
Type:
+

int

+
+
+
+ +
+
+bias
+
+ +
+
+params
+
+ +
+
+_init_params[ソース]
+

initial value of the parameter

+
+ +
+
+get_mean(X, Psi=None, params=None, bias=None)[ソース]
+

calculate mean values

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- input as an N-by-d matrix

  • +
  • Psi (numpy.ndarray) -- feature maps Psi(X) as an N-by-l matrix +(default: self.get_basis(X))

  • +
  • params (numpy.ndarray) -- weight as a vector with size l +(default: self.params)

  • +
  • bias (float) -- (default: self.bias)

  • +
+
+
戻り値:
+

Psi * params + bias

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_bias(bias)[ソース]
+

set bias

+
+
パラメータ:
+

bias (float)

+
+
+
+ +
+
+set_params(params)[ソース]
+

set parameters

+
+
パラメータ:
+

params (np.ndarray)

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.predictor.html b/manual/v2.0.2/ja/api/physbo.blm.predictor.html new file mode 100644 index 00000000..af5233f4 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.predictor.html @@ -0,0 +1,383 @@ + + + + + + + + + physbo.blm.predictor module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.predictor module

+
+
+class physbo.blm.predictor.predictor(config, model=None)[ソース]
+

ベースクラス: base_predictor

+

Predictor using Baysean linear model

+
+
+blm
+
+
Type:
+

physbo.blm.core.model

+
+
+
+ +
+
+config
+

configuration

+
+
Type:
+

physbo.misc.set_config

+
+
+
+ +
+
+delete_stats()[ソース]
+

resets model

+
+ +
+
+fit(training, num_basis=None)[ソース]
+

fit model to training dataset

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- dataset for training

  • +
  • num_basis (int) -- the number of basis (default: self.config.predict.num_basis)

  • +
+
+
+
+ +
+
+get_basis(X)[ソース]
+

calculates feature maps Psi(X)

+
+
パラメータ:
+

X (numpy.ndarray) -- inputs

+
+
戻り値:
+

Psi -- feature maps

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fcov(training, test)[ソース]
+

calculates posterior variance-covariance matrix of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fmean(training, test)[ソース]
+

calculates posterior mean value of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_params(training, test)[ソース]
+

calculates posterior weights

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs (not used)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_samples(training, test, N=1, alpha=1.0)[ソース]
+

draws samples of mean values of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
  • N (int) -- number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source +(default: 1.0)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_predict_samples(training, test, N=1)[ソース]
+

draws samples of values of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
  • N (int) -- number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source +(default: 1.0)

  • +
+
+
戻り値の型:
+

numpy.ndarray (N x len(test))

+
+
+
+ +
+
+prepare(training)[ソース]
+

initializes model by using training data set

+
+
パラメータ:
+

training (physbo.variable) -- dataset for training

+
+
+
+ +
+
+update(training, test)[ソース]
+

updates the model.

+

If not yet initialized (prepared), the model will be prepared by training. +Otherwise, the model will be updated by test.

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset for initialization (preparation). +If already prepared, the model ignore this.

  • +
  • test (physbo.variable) -- training data for update. +If not prepared, the model ignore this.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.prior.gauss.html b/manual/v2.0.2/ja/api/physbo.blm.prior.gauss.html new file mode 100644 index 00000000..23251e86 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.prior.gauss.html @@ -0,0 +1,376 @@ + + + + + + + + + physbo.blm.prior.gauss module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.blm.prior.gauss module

+
+
+class physbo.blm.prior.gauss.cov_const(params=None)[ソース]
+

ベースクラス: object

+

isotropic variance-covariance

+

All elements have the same variance and are independent with each other

+
+
+params
+

half of log of covariance

+
+
Type:
+

float

+
+
+
+ +
+
+sigma2
+

covariance

+
+
Type:
+

float

+
+
+
+ +
+
+prec
+

precision (= inv. of covariance)

+
+
Type:
+

float

+
+
+
+ +
+
+get_cov(nbasis, params=None)[ソース]
+

computes the covariance

+
+
パラメータ:
+
    +
  • nbasis (int) -- the number of components

  • +
  • params (float) -- half of log of variance +(default: self.params)

  • +
+
+
戻り値:
+

nbasis-by-n-basis covariance matrix

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_prec(nbasis, params=None)[ソース]
+

computes the precision

+
+
パラメータ:
+
    +
  • nbasis (int) -- the number of components

  • +
  • params (float) -- half of log of variance +(default: self.params)

  • +
+
+
戻り値:
+

nbasis-by-n-basis precision matrix

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[ソース]
+

sets params

+
+
パラメータ:
+

params (float) -- half of log of variance

+
+
+
+ +
+ +
+
+class physbo.blm.prior.gauss.gauss(nbasis, cov=None)[ソース]
+

ベースクラス: object

+

Gaussian prior

+
+
+nbasis
+

number of components

+
+
Type:
+

int

+
+
+
+ +
+
+cov
+

covariance

+
+
Type:
+

cov_const

+
+
+
+ +
+
+get_cov(params=None)[ソース]
+

calculates the variance-covariance matrix of priors

+
+
パラメータ:
+

params (float) -- half of log of variance +(default: self.cov.params)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(params=None)[ソース]
+

calculates the mean value of priors

+
+
パラメータ:
+

params (float) -- half of log of variance +(not used)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_prec(params=None)[ソース]
+

calculates the precise matrix of priors

+
+
パラメータ:
+

params (float) -- half of log of variance +(default: self.cov.params)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[ソース]
+

sets params

+
+
パラメータ:
+

params (float) -- half of log of variance

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.blm.prior.html b/manual/v2.0.2/ja/api/physbo.blm.prior.html new file mode 100644 index 00000000..77955830 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.blm.prior.html @@ -0,0 +1,227 @@ + + + + + + + + + physbo.blm.prior package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.core.html b/manual/v2.0.2/ja/api/physbo.gp.core.html new file mode 100644 index 00000000..0566f1f6 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.core.html @@ -0,0 +1,266 @@ + + + + + + + + + physbo.gp.core package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.core.learning.html b/manual/v2.0.2/ja/api/physbo.gp.core.learning.html new file mode 100644 index 00000000..6ad11bc4 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.core.learning.html @@ -0,0 +1,383 @@ + + + + + + + + + physbo.gp.core.learning module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.learning module

+
+
+class physbo.gp.core.learning.adam(gp, config)[ソース]
+

ベースクラス: online

+

default

+
+
+get_one_update(params, X, t)[ソース]
+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
+
+ +
+
+reset()[ソース]
+
+ +
+ +
+
+class physbo.gp.core.learning.batch(gp, config)[ソース]
+

ベースクラス: object

+

basis class for batch learning

+
+ +
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
戻り値:
+

The parameters which give the minimum marginal likelihood.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+one_run(params, X, t, max_iter=None)[ソース]
+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Initial guess for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • max_iter (int) -- Maximum number of iterations to perform.

  • +
+
+
戻り値:
+

The solution of the optimization.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+run(X, t)[ソース]
+

Performing optimization using the L-BFGS-B algorithm

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
戻り値:
+

The solution of the optimization.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+
+class physbo.gp.core.learning.online(gp, config)[ソース]
+

ベースクラス: object

+

base class for online learning

+
+
+disp_marlik(params, eval_X, eval_t, num_epoch=None)[ソース]
+

Displaying marginal likelihood

+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • eval_X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • eval_t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • num_epoch (int) -- Number of epochs

  • +
+
+
+
+ +
+
+get_one_update(params, X, t)[ソース]
+
+ +
+ +

Initial parameter searchs

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
戻り値:
+

The parameter which gives the minimum likelihood.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+one_run(params, X, t, max_epoch=None, is_disp=False)[ソース]
+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
  • max_epoch (int) -- Maximum candidate epochs

  • +
+
+
戻り値:
+

The solution of the optimization.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+run(X, t)[ソース]
+

Run initial search and hyper parameter running.

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N-dimensional vector that represents the corresponding negative energy of search candidates.

  • +
+
+
戻り値:
+

The solution of the optimization.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.core.model.html b/manual/v2.0.2/ja/api/physbo.gp.core.model.html new file mode 100644 index 00000000..33e17ee9 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.core.model.html @@ -0,0 +1,484 @@ + + + + + + + + + physbo.gp.core.model module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.model module

+
+
+class physbo.gp.core.model.model(lik, mean, cov, inf='exact')[ソース]
+

ベースクラス: object

+
+
+cat_params(lik_params, prior_params)[ソース]
+

Concatinate the likelihood and prior parameters

+
+
パラメータ:
+
    +
  • lik_params (numpy.ndarray) -- Parameters for likelihood

  • +
  • prior_params (numpy.ndarray) -- Parameters for prior

  • +
+
+
戻り値:
+

params -- parameters about likelihood and prior

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params=None)[ソース]
+

decomposing the parameters to those of likelifood and priors

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値:
+

    +
  • lik_params (numpy.ndarray)

  • +
  • prior_params (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+eval_marlik(params, X, t, N=None)[ソース]
+

Evaluating marginal likelihood.

+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Parameters.

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) -- Total number of subset data (if not specified, all dataset is used)

  • +
+
+
戻り値:
+

    +
  • marlik (float)

  • +
  • Marginal likelihood.

  • +
+

+
+
+
+ +
+
+export_blm(num_basis)[ソース]
+

Exporting the blm(Baysean linear model) predictor

+
+
パラメータ:
+

num_basis (int) -- Total number of basis

+
+
戻り値の型:
+

physbo.blm.core.model

+
+
+
+ +
+
+fit(X, t, config)[ソース]
+

Fitting function (update parameters)

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • config (physbo.misc.set_config object)

  • +
+
+
+
+ +
+
+get_cand_params(X, t)[ソース]
+

Getting candidate for parameters

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
+
+
戻り値:
+

params -- Parameters

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_marlik(params, X, t, N=None)[ソース]
+

Evaluating gradiant of marginal likelihood.

+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- Parameters.

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) -- Total number of subset data (if not specified, all dataset is used)

  • +
+
+
戻り値:
+

grad_marlik -- Gradiant of marginal likelihood.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[ソース]
+

Getting boundary of the parameters.

+
+
戻り値:
+

bound -- An array with the tuple (min_params, max_params).

+
+
戻り値の型:
+

list

+
+
+
+ +
+
+get_post_fcov(X, Z, params=None, diag=True)[ソース]
+

Calculating posterior covariance matrix of model (function)

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • Z (numpy.ndarray) -- feature maps

  • +
  • params (numpy.ndarray) -- Parameters

  • +
  • diag (bool) -- If X is the diagonalization matrix, true.

  • +
+
+
戻り値の型:
+

physbo.gp.inf.exact.get_post_fcov

+
+
+
+ +
+
+get_post_fmean(X, Z, params=None)[ソース]
+

Calculating posterior mean of model (function)

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • Z (numpy.ndarray) -- feature maps

  • +
  • params (numpy.ndarray) -- Parameters

  • +
+
+
+ +
+ +
+
+post_sampling(X, Z, params=None, N=1, alpha=1)[ソース]
+

draws samples of mean value of model

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- inputs

  • +
  • Z (numpy.ndarray) -- feature maps

  • +
  • N (int) -- number of samples +(default: 1)

  • +
  • alpha (float) -- noise for sampling source

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+predict_sampling(X, Z, params=None, N=1)[ソース]
+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- training datasets

  • +
  • Z (numpy.ndarray) -- input for sampling objective values

  • +
  • params (numpy.ndarray) -- Parameters

  • +
  • N (int) -- number of samples +(default: 1)

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+prepare(X, t, params=None)[ソース]
+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
+
+ +
+
+print_params()[ソース]
+

Printing parameters

+
+ +
+
+set_params(params)[ソース]
+

Setting parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters.

+
+
+
+ +
+
+sub_sampling(X, t, N)[ソース]
+

Make subset for sampling

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • N (int) -- Total number of data in subset

  • +
+
+
戻り値:
+

    +
  • subX (numpy.ndarray)

  • +
  • subt (numpy.ndarray)

  • +
+

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.core.prior.html b/manual/v2.0.2/ja/api/physbo.gp.core.prior.html new file mode 100644 index 00000000..174cf506 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.core.prior.html @@ -0,0 +1,358 @@ + + + + + + + + + physbo.gp.core.prior module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.core.prior module

+
+
+class physbo.gp.core.prior.prior(mean, cov)[ソース]
+

ベースクラス: object

+

prior of gaussian process

+
+
+cat_params(mean_params, cov_params)[ソース]
+
+
パラメータ:
+
    +
  • mean_params (numpy.ndarray) -- Mean values of parameters

  • +
  • cov_params (numpy.ndarray) -- Covariance matrix of parameters

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params)[ソース]
+

decomposing the parameters to those of mean values and covariance matrix for priors

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値:
+

    +
  • mean_params (numpy.ndarray)

  • +
  • cov_params (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+get_cov(X, Z=None, params=None, diag=False)[ソース]
+

Calculating the variance-covariance matrix of priors

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) -- N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
  • diag (bool) -- If X is the diagonalization matrix, true.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_cov(X, params=None)[ソース]
+

Calculating the covariance matrix priors

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad_mean(num_data, params=None)[ソース]
+

Calculating the gradiant of mean values of priors

+
+
パラメータ:
+
    +
  • num_data (int) -- Total number of data

  • +
  • params (numpy.ndarray) -- Parameters

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[ソース]
+

Calculating the mean value of priors

+
+
パラメータ:
+
    +
  • num_data (int) -- Total number of data

  • +
  • params (numpy.ndarray) -- Parameters

  • +
+
+
戻り値の型:
+

float

+
+
+
+ +
+
+sampling(X, N=1)[ソース]
+

Sampling from GP prior

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • N (int)

  • +
+
+
戻り値の型:
+

float

+
+
+
+ +
+
+set_cov_params(params)[ソース]
+

Setting parameters for covariance matrix of priors

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters

+
+
+
+ +
+
+set_mean_params(params)[ソース]
+

Setting parameters for mean values of priors

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters

+
+
+
+ +
+
+set_params(params)[ソース]
+

Setting parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.cov.gauss.html b/manual/v2.0.2/ja/api/physbo.gp.cov.gauss.html new file mode 100644 index 00000000..39cc9c77 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.cov.gauss.html @@ -0,0 +1,411 @@ + + + + + + + + + physbo.gp.cov.gauss module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.cov.gauss module

+
+
+class physbo.gp.cov.gauss.gauss(num_dim, width=3, scale=1, ard=False, max_width=1000000.0, min_width=1e-06, max_scale=1000000.0, min_scale=1e-06)[ソース]
+

ベースクラス: object

+

gaussian kernel

+
+
+cat_params(width, scale)[ソース]
+

Taking the logarithm of width and scale parameters +and concatinate them into one ndarray

+
+
パラメータ:
+
    +
  • width (int)

  • +
  • scale (int)

  • +
+
+
戻り値:
+

params -- Parameters

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+decomp_params(params)[ソース]
+

decompose the parameters defined on the log region +into width and scale parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値:
+

    +
  • width (float)

  • +
  • scale (float)

  • +
+

+
+
+
+ +
+
+get_cand_params(X, t)[ソース]
+

Getting candidate parameters.

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
+
+
戻り値:
+

params

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_cov(X, Z=None, params=None, diag=False)[ソース]
+

compute the covariant matrix +:param X: N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate. +:type X: numpy.ndarray +:param Z: N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of search candidate. +:type Z: numpy.ndarray +:param params: Parameters +:type params: numpy.ndarray +:param diag: If X is the diagonalization matrix, true. +:type diag: bool

+
+
戻り値:
+

G -- covariant matrix

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(X, params=None)[ソース]
+

Getting gradiant values of X

+
+
パラメータ:
+
    +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • params (numpy.ndarray)

  • +
+
+
戻り値:
+

grad

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[ソース]
+

Getting boundary array.

+
+
戻り値:
+

bound -- A num_params-dimensional array with the tuple (min_params, max_params).

+
+
戻り値の型:
+

list

+
+
+
+ +
+
+load(file_name)[ソース]
+

Recovering the Gaussian kernel from file +:param file_name: file name to load the information of the kernel +:type file_name: str

+
+ +
+
+prepare(params=None)[ソース]
+

Setting parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値:
+

    +
  • params (numpy.ndarray)

  • +
  • width (int)

  • +
  • scale (int)

  • +
+

+
+
+
+ +
+
+print_params()[ソース]
+

show the current kernel parameters

+
+ +
+
+rand_expans(num_basis, params=None)[ソース]
+

Kernel Expansion

+
+
パラメータ:
+
    +
  • num_basis (int) -- total number of basis

  • +
  • params (numpy.ndarray) -- Parameters

  • +
+
+
戻り値の型:
+

tupple (W, b, amp)

+
+
+
+ +
+
+save(file_name)[ソース]
+

save the gaussian kernel

+
+
パラメータ:
+

file_name (str) -- file name to save the information of the kernel

+
+
+
+ +
+
+set_params(params)[ソース]
+

set kernel parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters for optimization.

+
+
+
+ +
+
+supp_params(params)[ソース]
+

Set maximum (minimum) values for parameters when the parameter is greater(less) than this value.

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
戻り値:
+

params

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.cov.html b/manual/v2.0.2/ja/api/physbo.gp.cov.html new file mode 100644 index 00000000..8c33058c --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.cov.html @@ -0,0 +1,225 @@ + + + + + + + + + physbo.gp.cov package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.html b/manual/v2.0.2/ja/api/physbo.gp.html new file mode 100644 index 00000000..7b671db5 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.html @@ -0,0 +1,301 @@ + + + + + + + + + physbo.gp package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.inf.exact.html b/manual/v2.0.2/ja/api/physbo.gp.inf.exact.html new file mode 100644 index 00000000..b9f327ec --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.inf.exact.html @@ -0,0 +1,304 @@ + + + + + + + + + physbo.gp.inf.exact module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.inf.exact module

+
+
+physbo.gp.inf.exact.eval_marlik(gp, X, t, params=None)[ソース]
+

Evaluating marginal likelihood.

+
+
パラメータ:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
戻り値:
+

marlik -- Marginal likelihood.

+
+
戻り値の型:
+

float

+
+
+
+ +
+
+physbo.gp.inf.exact.get_grad_marlik(gp, X, t, params=None)[ソース]
+

Evaluating gradiant of marginal likelihood.

+
+
パラメータ:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
戻り値:
+

grad_marlik -- Gradiant of marginal likelihood.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.get_post_fcov(gp, X, Z, params=None, diag=True)[ソース]
+

Calculating the covariance of posterior

+
+
パラメータ:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) -- N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
  • diag (bool) -- If X is the diagonalization matrix, true.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.get_post_fmean(gp, X, Z, params=None)[ソース]
+

Calculating the mean of posterior

+
+
パラメータ:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • Z (numpy.ndarray) -- N x d dimensional matrix. Each row of Z denotes the d-dimensional feature vector of tests.

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.gp.inf.exact.prepare(gp, X, t, params=None)[ソース]
+
+
パラメータ:
+
    +
  • gp (physbo.gp.core.model)

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

  • +
  • t (numpy.ndarray) -- N dimensional array. +The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • params (numpy.ndarray) -- Parameters.

  • +
+
+
戻り値:
+

stats

+
+
戻り値の型:
+

tupple

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.inf.html b/manual/v2.0.2/ja/api/physbo.gp.inf.html new file mode 100644 index 00000000..6360aa72 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.inf.html @@ -0,0 +1,214 @@ + + + + + + + + + physbo.gp.inf package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.inf package

+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.lik.gauss.html b/manual/v2.0.2/ja/api/physbo.gp.lik.gauss.html new file mode 100644 index 00000000..500709a1 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.lik.gauss.html @@ -0,0 +1,330 @@ + + + + + + + + + physbo.gp.lik.gauss module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.lik.gauss module

+
+
+class physbo.gp.lik.gauss.gauss(std=1, max_params=1000000.0, min_params=1e-06)[ソース]
+

ベースクラス: object

+

Gaussian likelihood function

+
+
+get_cand_params(t)[ソース]
+

Getting candidate parameters.

+
+
パラメータ:
+

t (numpy.ndarray) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

+
+
戻り値:
+

log[ standard deviation of t] - log 10.0

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_cov(num_data, params=None)[ソース]
+

Get a covariance matrix

+
+
パラメータ:
+
    +
  • num_data (int)

  • +
  • params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
+
+
戻り値:
+

Diagonal element matrix of exp(2.0*params)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(num_data, params=None)[ソース]
+

Get a gradient matrix

+
+
パラメータ:
+
    +
  • num_data (int)

  • +
  • params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

  • +
+
+
戻り値:
+

Diagonal element matrix of 2.0 * exp(2.0*params)

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[ソース]
+

Get boundary array.

+
+
戻り値:
+

bound -- A num_params-dimensional array with the tuple (min_params, max_params).

+
+
戻り値の型:
+

list

+
+
+
+ +
+
+sampling(fmean)[ソース]
+

Sampling by adding noise

+
+
パラメータ:
+

fmean (numpy.ndarray)

+
+
+
+ +
+
+set_params(params)[ソース]
+

Set parameters.

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
+
+ +
+
+supp_params(params=None)[ソース]
+

Set maximum (minimum) values for parameters when the parameter is greater(less) than this value.

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
+
+ +
+
+trans_params(params=None)[ソース]
+

Get exp[params].

+
+
パラメータ:
+

params (numpy.ndarray) -- Parameters for optimization. +Array of real elements of size (n,), where ‘n’ is the number of independent variables.

+
+
戻り値:
+

std

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.lik.html b/manual/v2.0.2/ja/api/physbo.gp.lik.html new file mode 100644 index 00000000..2ea9637d --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.lik.html @@ -0,0 +1,220 @@ + + + + + + + + + physbo.gp.lik package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.mean.const.html b/manual/v2.0.2/ja/api/physbo.gp.mean.const.html new file mode 100644 index 00000000..d6a0850a --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.mean.const.html @@ -0,0 +1,313 @@ + + + + + + + + + physbo.gp.mean.const module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.mean.const module

+
+
+class physbo.gp.mean.const.const(params=None, max_params=1000000000000.0, min_params=-1000000000000.0)[ソース]
+

ベースクラス: object

+

constant

+
+
+get_cand_params(t)[ソース]
+

Getting the median array of candidates.

+
+
パラメータ:
+

t (array_like) -- Input array or object that can be converted to an array

+
+
戻り値:
+

median -- A new array holding the result.

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_grad(num_data, params=None)[ソース]
+

Returning a new array of (num_data), filled with ones.

+
+
パラメータ:
+
    +
  • num_data (int) -- total number of data

  • +
  • params (object) -- not used

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[ソース]
+
+
パラメータ:
+
    +
  • num_data (int) -- total number of data

  • +
  • params (numpy.ndarray) -- parameters

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_params_bound()[ソース]
+

Getting the boundary list for parameters

+
+
戻り値:
+

bound -- num_params array with the tupple (min_param, max_params)

+
+
戻り値の型:
+

list

+
+
+
+ +
+
+init_params(params)[ソース]
+

Initializing parameters

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値:
+

params -- initialized parameters

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[ソース]
+

Setting parameters defined in const class.

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+supp_params(params)[ソース]
+

Setting maximum and minimum value of parameters.

+
+
パラメータ:
+

params (numpy.ndarray) -- parameters

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.mean.html b/manual/v2.0.2/ja/api/physbo.gp.mean.html new file mode 100644 index 00000000..e0c45123 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.mean.html @@ -0,0 +1,228 @@ + + + + + + + + + physbo.gp.mean package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.mean.zero.html b/manual/v2.0.2/ja/api/physbo.gp.mean.zero.html new file mode 100644 index 00000000..fc05d9b0 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.mean.zero.html @@ -0,0 +1,248 @@ + + + + + + + + + physbo.gp.mean.zero module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.mean.zero module

+
+
+class physbo.gp.mean.zero.zero[ソース]
+

ベースクラス: object

+
+
+get_grad(num_data, params=None)[ソース]
+

Returning empty numpy.ndarray

+
+
パラメータ:
+
    +
  • num_data (int) -- not used

  • +
  • params (object) -- not used

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_mean(num_data, params=None)[ソース]
+

Returning numpy.zeros(num_data)

+
+
パラメータ:
+
    +
  • num_data (int) -- dimension of numpy.zeros

  • +
  • params (object) -- not used

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+set_params(params)[ソース]
+

Not defined

+
+
パラメータ:
+

params

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.gp.predictor.html b/manual/v2.0.2/ja/api/physbo.gp.predictor.html new file mode 100644 index 00000000..1586e4a0 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.gp.predictor.html @@ -0,0 +1,355 @@ + + + + + + + + + physbo.gp.predictor module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.gp.predictor module

+
+
+class physbo.gp.predictor.predictor(config, model=None)[ソース]
+

ベースクラス: base_predictor

+
+
+delete_stats()[ソース]
+

Default function to delete status. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+fit(training, num_basis=None)[ソース]
+

Fitting model to training dataset

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- dataset for training

  • +
  • num_basis (int) -- the number of basis (default: self.config.predict.num_basis)

  • +
+
+
+
+ +
+
+get_basis(*args, **kwds)[ソース]
+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fcov(training, test, diag=True)[ソース]
+

Calculating posterior variance-covariance matrix of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
  • diag (bool) -- Diagonlization flag in physbo.exact.get_post_fcov function.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_fmean(training, test)[ソース]
+

Calculating posterior mean value of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_post_params(*args, **kwds)[ソース]
+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_samples(training, test, alpha=1)[ソース]
+

Drawing samples of mean values of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs (not used)

  • +
  • alpha (float) -- tuning parameter of the covariance by multiplying alpha**2 for np.random.multivariate_normal.

  • +
+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+get_predict_samples(training, test, N=1)[ソース]
+

Drawing samples of values of model

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- training dataset. If already trained, the model does not use this.

  • +
  • test (physbo.variable) -- inputs

  • +
  • N (int) -- number of samples +(default: 1)

  • +
+
+
戻り値の型:
+

numpy.ndarray (N x len(test))

+
+
+
+ +
+
+prepare(training)[ソース]
+

Initializing model by using training data set

+
+
パラメータ:
+

training (physbo.variable) -- dataset for training

+
+
+
+ +
+
+update(training, test)[ソース]
+

Default function to update variables. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.html b/manual/v2.0.2/ja/api/physbo.html new file mode 100644 index 00000000..c4514e7d --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.html @@ -0,0 +1,409 @@ + + + + + + + + + physbo package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo package

+
+

Subpackages

+
+ +
+
+
+

Submodules

+ +
+
+

Module contents

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.misc.centering.html b/manual/v2.0.2/ja/api/physbo.misc.centering.html new file mode 100644 index 00000000..60f25ae2 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.misc.centering.html @@ -0,0 +1,212 @@ + + + + + + + + + physbo.misc.centering module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.centering module

+
+
+physbo.misc.centering.centering(X)[ソース]
+

Normalize the mean and standard deviation along the each column of X to 0 and 1, respectively

+
+
パラメータ:
+

X (numpy array) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of search candidate.

+
+
戻り値:
+

X_normalized -- normalized N x d dimensional matrix.

+
+
戻り値の型:
+

numpy array

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.misc.gauss_elim.html b/manual/v2.0.2/ja/api/physbo.misc.gauss_elim.html new file mode 100644 index 00000000..208bccad --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.misc.gauss_elim.html @@ -0,0 +1,218 @@ + + + + + + + + + physbo.misc.gauss_elim module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.gauss_elim module

+
+
+physbo.misc.gauss_elim.gauss_elim(U, t)[ソース]
+

Calculate alpha using scipy.linalg.solve_triangular. +alpha = (U^T U)^-1 t = U^-1 [(U^T)-1 t]

+
+
パラメータ:
+
    +
  • U ((M, M) array_like)

  • +
  • matrix (A triangular)

  • +
  • t ((M,) or (M, N) array_like)

  • +
+
+
戻り値:
+

    +
  • alpha (numpy.ndarray)

  • +
  • Solution to the system L^T alpha = t. Shape of return matches t.

  • +
+

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.misc.html b/manual/v2.0.2/ja/api/physbo.misc.html new file mode 100644 index 00000000..7a081928 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.misc.html @@ -0,0 +1,246 @@ + + + + + + + + + physbo.misc package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.misc.set_config.html b/manual/v2.0.2/ja/api/physbo.misc.set_config.html new file mode 100644 index 00000000..999e85cd --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.misc.set_config.html @@ -0,0 +1,350 @@ + + + + + + + + + physbo.misc.set_config module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.misc.set_config module

+
+
+class physbo.misc.set_config.adam[ソース]
+

ベースクラス: online

+
+
+load(config)[ソース]
+

Loading information of configuration from config._sectoins['adam'].

+
+
パラメータ:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[ソース]
+

Showing information about configuration about adam object.

+
+ +
+ +
+
+class physbo.misc.set_config.batch[ソース]
+

ベースクラス: learning

+
+
+load(config)[ソース]
+

Loading information of configuration from config._sectoins['batch'].

+
+
パラメータ:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[ソース]
+

Showing information about configuration about batch object.

+
+ +
+ +
+
+physbo.misc.set_config.boolean(str)[ソース]
+

Return boolean.

+
+
パラメータ:
+

str (str or boolean)

+
+
戻り値の型:
+

True or False

+
+
+
+ +
+
+class physbo.misc.set_config.learning[ソース]
+

ベースクラス: object

+
+
+load(config)[ソース]
+

Loading information of configuration from config._sectoins['learning'].

+
+
パラメータ:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[ソース]
+

Showing information about learning object.

+
+ +
+ +
+
+class physbo.misc.set_config.online[ソース]
+

ベースクラス: learning

+
+
+load(config)[ソース]
+

Loading information of configuration from config._sectoins['online'].

+
+
パラメータ:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[ソース]
+

Showing information about configuration about online object.

+
+ +
+ +
+
+class physbo.misc.set_config.search[ソース]
+

ベースクラス: object

+
+
+load(config)[ソース]
+

Loading information of configuration from config._sectoins['search'].

+
+
パラメータ:
+

config (physbo.misc.set_config object)

+
+
+
+ +
+
+show()[ソース]
+

Showing information about search object.

+
+ +
+ +
+
+class physbo.misc.set_config.set_config(search_config=None, learning_config=None)[ソース]
+

ベースクラス: object

+
+
+load(file_name='config.ini')[ソース]
+

Loading information of configuration.

+
+
パラメータ:
+
    +
  • file_name (str)

  • +
  • configuration. (An input file name of)

  • +
+
+
+
+ +
+
+show()[ソース]
+

Showing information of search and learning objects.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.opt.adam.html b/manual/v2.0.2/ja/api/physbo.opt.adam.html new file mode 100644 index 00000000..69bc230c --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.opt.adam.html @@ -0,0 +1,348 @@ + + + + + + + + + physbo.opt.adam module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.opt.adam module

+
+
+class physbo.opt.adam.adam(params, grad, options={})[ソース]
+

ベースクラス: object

+

Optimizer of f(x) with the adam method

+
+
+params
+

current input, x

+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+nparams
+

dimension

+
+
Type:
+

int

+
+
+
+ +
+
+grad
+

gradient function, g(x) = f'(x)

+
+
Type:
+

function

+
+
+
+ +
+
+m
+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+v
+
+
Type:
+

numpy.ndarray

+
+
+
+ +
+
+epoch
+

the number of update already done

+
+
Type:
+

int

+
+
+
+ +
+
+max_epoch
+

the maximum number of update

+
+
Type:
+

int

+
+
+
+ +
+
+alpha
+
+
Type:
+

float

+
+
+
+ +
+
+beta
+
+
Type:
+

float

+
+
+
+ +
+
+gamma
+
+
Type:
+

float

+
+
+
+ +
+
+epsilon
+
+
Type:
+

float

+
+
+
+ +
+
+run(*args, **kwargs)[ソース]
+
+ +
+
+set_params(params)[ソース]
+
+ +
+
+update(params, *args, **kwargs)[ソース]
+

calculates the updates of params

+
+
パラメータ:
+
    +
  • params (numpy.ndarray) -- input

  • +
  • args -- will be passed to self.grad

  • +
  • kwargs -- will be passed to self.grad

  • +
+
+
戻り値:
+

update of params

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.opt.html b/manual/v2.0.2/ja/api/physbo.opt.html new file mode 100644 index 00000000..e9cbd7c7 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.opt.html @@ -0,0 +1,224 @@ + + + + + + + + + physbo.opt package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.predictor.html b/manual/v2.0.2/ja/api/physbo.predictor.html new file mode 100644 index 00000000..1e4365ad --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.predictor.html @@ -0,0 +1,386 @@ + + + + + + + + + physbo.predictor module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.predictor module

+
+
+class physbo.predictor.base_predictor(config, model=None)[ソース]
+

ベースクラス: object

+

Base predictor is defined in this class.

+
+
+delete_stats(*args, **kwds)[ソース]
+

Default function to delete status. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+fit(*args, **kwds)[ソース]
+

Default fit function. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_basis(*args, **kwds)[ソース]
+

Default function to get basis +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fcov(*args, **kwds)[ソース]
+

Default function to get a covariance of the score. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_fmean(*args, **kwds)[ソース]
+

Default function to get a mean value of the score. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_params(*args, **kwds)[ソース]
+

Default function to get parameters. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_params_samples(*args, **kwds)[ソース]
+

Default function to get parameters of samples. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_post_samples(*args, **kwds)[ソース]
+

Default function to get samples. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+get_predict_samples(*args, **kwds)[ソース]
+

Default function to get prediction variables of samples. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+load(file_name)[ソース]
+

Default function to load variables. +The information is updated using self.update function.

+
+
パラメータ:
+

file_name (str) -- A file name to load variables from the file.

+
+
+
+ +
+
+prepare(*args, **kwds)[ソース]
+

Default prepare function. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+
+save(file_name)[ソース]
+

Default function to save information by using pickle.dump function. +The protocol version is set as 3.

+
+
パラメータ:
+

file_name (str) -- A file name to save self.__dict__ object.

+
+
+
+ +
+
+update(*args, **kwds)[ソース]
+

Default function to update variables. +This function must be overwritten in each model.

+
+
パラメータ:
+
    +
  • args

  • +
  • kwds

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete.html b/manual/v2.0.2/ja/api/physbo.search.discrete.html new file mode 100644 index 00000000..21de080d --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete.html @@ -0,0 +1,239 @@ + + + + + + + + + physbo.search.discrete package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete.policy.html b/manual/v2.0.2/ja/api/physbo.search.discrete.policy.html new file mode 100644 index 00000000..eef3ee51 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete.policy.html @@ -0,0 +1,391 @@ + + + + + + + + + physbo.search.discrete.policy module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete.policy module

+
+
+class physbo.search.discrete.policy.policy(test_X, config=None, initial_data=None, comm=None)[ソース]
+

ベースクラス: object

+
+ +

Performing Bayesian optimization.

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- Training dataset.

  • +
  • max_num_probes (int) -- Maximum number of searching process by Bayesian optimization.

  • +
  • num_search_each_probe (int) -- Number of searching by Bayesian optimization at each process.

  • +
  • predictor (predictor object) -- Base class is defined in physbo.predictor. +If None, blm_predictor is defined.

  • +
  • is_disp (bool) -- If true, process messages are outputted.

  • +
  • simulator (callable) -- Callable (function or object with __call__) +Here, action is an integer which represents the index of the candidate.

  • +
  • score (str) -- The type of aquision funciton. +TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available.

  • +
  • interval (int) -- The interval number of learning the hyper parameter. +If you set the negative value to interval, the hyper parameter learning is not performed. +If you set zero to interval, the hyper parameter learning is performed only at the first step.

  • +
  • num_rand_basis (int) -- The number of basis function. If you choose 0, ordinary Gaussian process run.

  • +
+
+
戻り値:
+

history

+
+
戻り値の型:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+export_history()[ソース]
+

Returning the information of the history.

+
+ +
+
+export_predictor()[ソース]
+

Returning the predictor dataset

+
+ +
+
+export_training()[ソース]
+

Returning the training dataset

+
+ +
+
+get_post_fcov(xs)[ソース]
+

Calculate covariance of predictor (post distribution)

+
+ +
+
+get_post_fmean(xs)[ソース]
+

Calculate mean value of predictor (post distribution)

+
+ +
+
+get_score(mode, *, actions=None, xs=None, predictor=None, training=None, parallel=True, alpha=1)[ソース]
+

Calcualte score (acquisition function)

+
+
パラメータ:
+
    +
  • mode (str) -- The type of aquisition funciton. TS, EI and PI are available. +These functions are defined in score.py.

  • +
  • actions (array of int) -- actions to calculate score

  • +
  • xs (physbo.variable or np.ndarray) -- input parameters to calculate score

  • +
  • predictor (predictor object) -- predictor used to calculate score. +If not given, self.predictor will be used.

  • +
  • training (physbo.variable) -- Training dataset. +If not given, self.training will be used.

  • +
  • parallel (bool) -- Calculate scores in parallel by MPI (default: True)

  • +
  • alpha (float) -- Tuning parameter which is used if mode = TS. +In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size).

  • +
+
+
戻り値:
+

f -- Score defined in each mode.

+
+
戻り値の型:
+

float or list of float

+
+
例外:
+

RuntimeError -- If both actions and xs are given

+
+
+

メモ

+

When neither actions nor xs are given, scores for actions not yet searched will be calculated.

+

When parallel is True, it is assumed that the function receives the same input (actions or xs) for all the ranks. +If you want to split the input array itself, set parallel be False and merge results by yourself.

+
+ +
+
+load(file_history, file_training=None, file_predictor=None)[ソース]
+

Loading files about history, training and predictor.

+
+
パラメータ:
+
    +
  • file_history (str) -- The name of the file that stores the information of the history.

  • +
  • file_training (str) -- The name of the file that stores the training dataset.

  • +
  • file_predictor (str) -- The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+ +

Performing random search.

+
+
パラメータ:
+
    +
  • max_num_probes (int) -- Maximum number of random search process.

  • +
  • num_search_each_probe (int) -- Number of search at each random search process.

  • +
  • simulator (callable) -- Callable (function or object with __call__) from action to t +Here, action is an integer which represents the index of the candidate.

  • +
  • is_disp (bool) -- If true, process messages are outputted.

  • +
+
+
戻り値:
+

history

+
+
戻り値の型:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+save(file_history, file_training=None, file_predictor=None)[ソース]
+

Saving history, training and predictor into the corresponding files.

+
+
パラメータ:
+
    +
  • file_history (str) -- The name of the file that stores the information of the history.

  • +
  • file_training (str) -- The name of the file that stores the training dataset.

  • +
  • file_predictor (str) -- The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+set_seed(seed)[ソース]
+

Setting a seed parameter for np.random.

+
+
パラメータ:
+
    +
  • seed (int) -- seed number

  • +
  • -------

  • +
+
+
+
+ +
+
+write(action, t, X=None, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[ソース]
+

Writing history (update history, not output to a file).

+
+
パラメータ:
+
    +
  • action (numpy.ndarray) -- Indexes of actions.

  • +
  • t (numpy.ndarray) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • time_total (numpy.ndarray) -- N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) -- N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) -- N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) -- N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete.results.html b/manual/v2.0.2/ja/api/physbo.search.discrete.results.html new file mode 100644 index 00000000..f743e810 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete.results.html @@ -0,0 +1,301 @@ + + + + + + + + + physbo.search.discrete.results module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete.results module

+
+
+class physbo.search.discrete.results.history[ソース]
+

ベースクラス: object

+
+
+export_all_sequence_best_fx()[ソース]
+
+
Export all fx and actions at each sequence.

(The total number of data is total_num_research.)

+
+
+
+
戻り値:
+

    +
  • best_fx (numpy.ndarray)

  • +
  • best_actions (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+export_sequence_best_fx()[ソース]
+

Export fx and actions at each sequence. +(The total number of data is num_runs.)

+
+
戻り値:
+

    +
  • best_fx (numpy.ndarray)

  • +
  • best_actions (numpy.ndarray)

  • +
+

+
+
+
+ +
+
+load(filename)[ソース]
+

Load the information of the history.

+
+
パラメータ:
+

filename (str) -- The name of the file which stores the information of the history

+
+
+
+ +
+
+save(filename)[ソース]
+

Save the information of the history.

+
+
パラメータ:
+

filename (str) -- The name of the file which stores the information of the history

+
+
+
+ +
+
+property time_get_action
+
+ +
+
+property time_run_simulator
+
+ +
+
+property time_total
+
+ +
+
+property time_update_predictor
+
+ +
+
+write(t, action, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[ソース]
+

Overwrite fx and chosen_actions by t and action.

+
+
パラメータ:
+
    +
  • t (numpy.ndarray) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • action (numpy.ndarray) -- N dimensional array. The indexes of actions of each search candidate.

  • +
  • time_total (numpy.ndarray) -- N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) -- N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) -- N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) -- N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete_multi.html b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.html new file mode 100644 index 00000000..d80d1c2b --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.html @@ -0,0 +1,239 @@ + + + + + + + + + physbo.search.discrete_multi package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete_multi.policy.html b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.policy.html new file mode 100644 index 00000000..b46202c2 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.policy.html @@ -0,0 +1,384 @@ + + + + + + + + + physbo.search.discrete_multi.policy module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete_multi.policy module

+
+
+class physbo.search.discrete_multi.policy.policy(test_X, num_objectives, comm=None, config=None, initial_data=None)[ソース]
+

ベースクラス: policy

+
+ +

Performing Bayesian optimization.

+
+
パラメータ:
+
    +
  • training (physbo.variable) -- Training dataset.

  • +
  • max_num_probes (int) -- Maximum number of searching process by Bayesian optimization.

  • +
  • num_search_each_probe (int) -- Number of searching by Bayesian optimization at each process.

  • +
  • predictor (predictor object) -- Base class is defined in physbo.predictor. +If None, blm_predictor is defined.

  • +
  • is_disp (bool) -- If true, process messages are outputted.

  • +
  • simulator (callable) -- Callable (function or object with __call__) +Here, action is an integer which represents the index of the candidate.

  • +
  • score (str) -- The type of aquision funciton. +TS (Thompson Sampling), EI (Expected Improvement) and PI (Probability of Improvement) are available.

  • +
  • interval (int) -- The interval number of learning the hyper parameter. +If you set the negative value to interval, the hyper parameter learning is not performed. +If you set zero to interval, the hyper parameter learning is performed only at the first step.

  • +
  • num_rand_basis (int) -- The number of basis function. If you choose 0, ordinary Gaussian process run.

  • +
+
+
戻り値:
+

history

+
+
戻り値の型:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+get_post_fcov(xs)[ソース]
+

Calculate covariance of predictor (post distribution)

+
+ +
+
+get_post_fmean(xs)[ソース]
+

Calculate mean value of predictor (post distribution)

+
+ +
+
+get_score(mode, actions=None, xs=None, predictor_list=None, training_list=None, pareto=None, parallel=True, alpha=1)[ソース]
+

Calcualte score (acquisition function)

+
+
パラメータ:
+
    +
  • mode (str) -- The type of aquisition funciton. TS, EI and PI are available. +These functions are defined in score.py.

  • +
  • actions (array of int) -- actions to calculate score

  • +
  • xs (physbo.variable or np.ndarray) -- input parameters to calculate score

  • +
  • predictor (predictor object) -- predictor used to calculate score. +If not given, self.predictor will be used.

  • +
  • training (physbo.variable) -- Training dataset. +If not given, self.training will be used.

  • +
  • parallel (bool) -- Calculate scores in parallel by MPI (default: True)

  • +
  • alpha (float) -- Tuning parameter which is used if mode = TS. +In TS, multi variation is tuned as np.random.multivariate_normal(mean, cov*alpha**2, size).

  • +
+
+
戻り値:
+

f -- Score defined in each mode.

+
+
戻り値の型:
+

float or list of float

+
+
例外:
+

RuntimeError -- If both actions and xs are given

+
+
+

メモ

+

When neither actions nor xs are given, scores for actions not yet searched will be calculated.

+

When parallel is True, it is assumed that the function receives the same input (actions or xs) for all the ranks. +If you want to split the input array itself, set parallel be False and merge results by yourself.

+
+ +
+
+load(file_history, file_training_list=None, file_predictor_list=None)[ソース]
+

Loading files about history, training and predictor.

+
+
パラメータ:
+
    +
  • file_history (str) -- The name of the file that stores the information of the history.

  • +
  • file_training (str) -- The name of the file that stores the training dataset.

  • +
  • file_predictor (str) -- The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+load_predictor_list(file_name)[ソース]
+
+ +
+
+load_training_list(file_name)[ソース]
+
+ +
+
+new_data_list: List[variable | None]
+
+ +
+ +

Performing random search.

+
+
パラメータ:
+
    +
  • max_num_probes (int) -- Maximum number of random search process.

  • +
  • num_search_each_probe (int) -- Number of search at each random search process.

  • +
  • simulator (callable) -- Callable (function or object with __call__) from action to t +Here, action is an integer which represents the index of the candidate.

  • +
  • is_disp (bool) -- If true, process messages are outputted.

  • +
+
+
戻り値:
+

history

+
+
戻り値の型:
+

history object (physbo.search.discrete.results.history)

+
+
+
+ +
+
+save(file_history, file_training_list=None, file_predictor_list=None)[ソース]
+

Saving history, training and predictor into the corresponding files.

+
+
パラメータ:
+
    +
  • file_history (str) -- The name of the file that stores the information of the history.

  • +
  • file_training (str) -- The name of the file that stores the training dataset.

  • +
  • file_predictor (str) -- The name of the file that stores the predictor dataset.

  • +
+
+
+
+ +
+
+save_predictor_list(file_name)[ソース]
+
+ +
+
+save_training_list(file_name)[ソース]
+
+ +
+
+write(action, t, X=None, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[ソース]
+

Writing history (update history, not output to a file).

+
+
パラメータ:
+
    +
  • action (numpy.ndarray) -- Indexes of actions.

  • +
  • t (numpy.ndarray) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • X (numpy.ndarray) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • time_total (numpy.ndarray) -- N dimenstional array. The total elapsed time in each step. +If None (default), filled by 0.0.

  • +
  • time_update_predictor (numpy.ndarray) -- N dimenstional array. The elapsed time for updating predictor (e.g., learning hyperparemters) in each step. +If None (default), filled by 0.0.

  • +
  • time_get_action (numpy.ndarray) -- N dimenstional array. The elapsed time for getting next action in each step. +If None (default), filled by 0.0.

  • +
  • time_run_simulator (numpy.ndarray) -- N dimenstional array. The elapsed time for running the simulator in each step. +If None (default), filled by 0.0.

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.discrete_multi.results.html b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.results.html new file mode 100644 index 00000000..96f1ce8b --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.discrete_multi.results.html @@ -0,0 +1,243 @@ + + + + + + + + + physbo.search.discrete_multi.results module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.discrete_multi.results module

+
+
+class physbo.search.discrete_multi.results.history(num_objectives)[ソース]
+

ベースクラス: object

+
+
+export_pareto_front()[ソース]
+
+ +
+
+load(filename)[ソース]
+
+ +
+
+save(filename)[ソース]
+
+ +
+
+property time_get_action
+
+ +
+
+property time_run_simulator
+
+ +
+
+property time_total
+
+ +
+
+property time_update_predictor
+
+ +
+
+write(t, action, time_total=None, time_update_predictor=None, time_get_action=None, time_run_simulator=None)[ソース]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.html b/manual/v2.0.2/ja/api/physbo.search.html new file mode 100644 index 00000000..f71dacc1 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.html @@ -0,0 +1,282 @@ + + + + + + + + + physbo.search package — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.pareto.html b/manual/v2.0.2/ja/api/physbo.search.pareto.html new file mode 100644 index 00000000..ddb44997 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.pareto.html @@ -0,0 +1,260 @@ + + + + + + + + + physbo.search.pareto module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.pareto module

+
+
+class physbo.search.pareto.Pareto(num_objectives, dom_rule=None)[ソース]
+

ベースクラス: object

+
+
+divide_non_dominated_region(force_binary_search=False)[ソース]
+
+ +
+
+export_front()[ソース]
+
+ +
+
+set_reference_max(reference_max=None)[ソース]
+
+ +
+
+set_reference_min(reference_min=None)[ソース]
+
+ +
+
+update_front(t)[ソース]
+

Update the non-dominated set of points.

+

Pareto set is sorted on the first objective in ascending order.

+
+ +
+
+volume_in_dominance(ref_min, ref_max, dominance_ratio=False)[ソース]
+
+ +
+ +
+
+class physbo.search.pareto.Rectangles(n_dim, dtype)[ソース]
+

ベースクラス: object

+
+
+add(lb, ub)[ソース]
+

Add new rectangles.

+
+
パラメータ:
+
    +
  • lb -- lower bounds of rectangles

  • +
  • ub -- upper bounds of rectangles

  • +
+
+
+
+ +
+ +
+
+physbo.search.pareto.dominate(t1, t2)[ソース]
+

domination rule for maximization problem

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.score.html b/manual/v2.0.2/ja/api/physbo.search.score.html new file mode 100644 index 00000000..59349166 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.score.html @@ -0,0 +1,301 @@ + + + + + + + + + physbo.search.score module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.score module

+
+
+physbo.search.score.EI(predictor, training, test, fmax=None)[ソース]
+

Maximum expected improvement.

+
+
パラメータ:
+
    +
  • predictor (predictor object) -- Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) -- Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) -- Inputs

  • +
  • fmax (float) -- Max value of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used.

  • +
+
+
戻り値:
+

score

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.PI(predictor, training, test, fmax=None)[ソース]
+

Maximum probability of improvement.

+
+
パラメータ:
+
    +
  • predictor (predictor object) -- Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) -- Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) -- Inputs

  • +
  • fmax (float) -- Max value of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used.

  • +
+
+
戻り値:
+

score

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.TS(predictor, training, test, alpha=1)[ソース]
+

Thompson sampling (See Sec. 2.1 in Materials Discovery Volume 4, June 2016, Pages 18-21)

+
+
パラメータ:
+
    +
  • predictor (predictor object) -- Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) -- Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) -- Inputs

  • +
  • alpha (float) -- noise for sampling source +(default: 1.0)

  • +
+
+
戻り値:
+

score

+
+
戻り値の型:
+

numpy.ndarray

+
+
+
+ +
+
+physbo.search.score.score(mode, predictor, test, training=None, **kwargs)[ソース]
+

Calculate scores (acquisition function) for test data.

+
+
パラメータ:
+
    +
  • mode (str) --

    Kind of score.

    +

    "EI", "PI", and "TS" are available.

    +

  • +
  • predictor (predictor object) -- Base class is defined in physbo.predictor.

  • +
  • training (physbo.variable) -- Training dataset. +If the predictor is not trained, use this for training.

  • +
  • test (physbo.variable) -- Inputs

  • +
  • fmax (float) -- Max value of mean of posterior probability distribution. +If not set, the maximum value of posterior mean for training is used. +Used only for mode == "EI" and "PI"

  • +
  • alpha (float) -- noise for sampling source (default: 1.0) +Used only for mode == "TS"

  • +
+
+
戻り値:
+

score

+
+
戻り値の型:
+

numpy.ndarray

+
+
例外:
+

NotImplementedError -- If unknown mode is given

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.score_multi.html b/manual/v2.0.2/ja/api/physbo.search.score_multi.html new file mode 100644 index 00000000..524771ab --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.score_multi.html @@ -0,0 +1,220 @@ + + + + + + + + + physbo.search.score_multi module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.score_multi module

+
+
+physbo.search.score_multi.EHVI(fmean, fstd, pareto)[ソース]
+

Calculate Expected Hyper-Volume Improvement (EHVI).

+

Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization

+
+ +
+
+physbo.search.score_multi.HVPI(fmean, fstd, pareto)[ソース]
+

Calculate Hypervolume-based Probability of Improvement (HVPI).

+

Reference: (Couckuyt et al., 2014) Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization

+
+ +
+
+physbo.search.score_multi.TS(predictor_list, training_list, test, alpha=1, reduced_candidate_num=None)[ソース]
+
+ +
+
+physbo.search.score_multi.score(mode, predictor_list, test, training_list, **kwargs)[ソース]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.search.utility.html b/manual/v2.0.2/ja/api/physbo.search.utility.html new file mode 100644 index 00000000..95483114 --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.search.utility.html @@ -0,0 +1,226 @@ + + + + + + + + + physbo.search.utility module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.search.utility module

+
+
+physbo.search.utility.is_learning(n, interval)[ソース]
+
+ +
+
+physbo.search.utility.length_vector(t)[ソース]
+
+ +
+
+physbo.search.utility.show_interactive_mode(simulator, history)[ソース]
+
+ +
+
+physbo.search.utility.show_search_results(history, N)[ソース]
+
+ +
+
+physbo.search.utility.show_search_results_mo(history, N, disp_pareto_set=False)[ソース]
+
+ +
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/api/physbo.variable.html b/manual/v2.0.2/ja/api/physbo.variable.html new file mode 100644 index 00000000..7d92c94a --- /dev/null +++ b/manual/v2.0.2/ja/api/physbo.variable.html @@ -0,0 +1,327 @@ + + + + + + + + + physbo.variable module — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

physbo.variable module

+
+
+class physbo.variable.variable(X=None, t=None, Z=None)[ソース]
+

ベースクラス: object

+
+
+add(X=None, t=None, Z=None)[ソース]
+

Adding variables of X, t, Z.

+
+
パラメータ:
+
    +
  • X (numpy array) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

  • +
  • t (numpy array) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

  • +
  • Z

  • +
+
+
+
+ +
+
+add_X(X=None)[ソース]
+

Adding variable X. If self.X is None, self.X is set as X.

+
+
パラメータ:
+

X (numpy array) -- N x d dimensional matrix. Each row of X denotes the d-dimensional feature vector of each search candidate.

+
+
+
+ +
+
+add_Z(Z=None)[ソース]
+

Adding variable Z. If self.Z is None, self.Z is set as Z.

+
+
パラメータ:
+

Z

+
+
+
+ +
+
+add_t(t=None)[ソース]
+

Adding variable t. If self.t is None, self.t is set as t.

+
+
パラメータ:
+

t (numpy array) -- N dimensional array. The negative energy of each search candidate (value of the objective function to be optimized).

+
+
+
+ +
+
+delete(num_row)[ソース]
+

Deleting variables of X, t, Z whose indexes are specified by num_row.

+
+
パラメータ:
+

num_row (numpy array) -- Index array to be deleted.

+
+
+
+ +
+
+delete_X(num_row)[ソース]
+

Deleting variables of X whose indexes are specified by num_row.

+
+
パラメータ:
+

num_row (numpy array) -- Index array to be deleted.

+
+
+
+ +
+
+delete_Z(num_row)[ソース]
+

Deleting variables of Z whose indexes are specified by num_row.

+
+
パラメータ:
+

num_row (numpy array) -- Index array to be deleted.

+
+
+
+ +
+
+delete_t(num_row)[ソース]
+

Deleting variables of t whose indexes are specified by num_row.

+
+
パラメータ:
+

num_row (numpy array) -- Index array to be deleted.

+
+
+
+ +
+
+get_subset(index)[ソース]
+

Getting subset of variables.

+
+
パラメータ:
+

index (int or array of int) -- Index of selected action.

+
+
戻り値:
+

variable

+
+
戻り値の型:
+

physbo.variable

+
+
+
+ +
+
+load(file_name)[ソース]
+

Loading variables X, t, Z from the file.

+
+
パラメータ:
+

file_name (str) -- A file name for loading variables X, t, Z using numpy.load.

+
+
+
+ +
+
+save(file_name)[ソース]
+

Saving variables X, t, Z to the file.

+
+
パラメータ:
+

file_name (str) -- A file name for saving variables X, t, Z using numpy.savez_compressed.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/contact.html b/manual/v2.0.2/ja/contact.html new file mode 100644 index 00000000..4bdc9768 --- /dev/null +++ b/manual/v2.0.2/ja/contact.html @@ -0,0 +1,193 @@ + + + + + + + + + お問い合わせ — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

お問い合わせ

+

PHYSBO に関するお問い合わせはこちらにお寄せください。

+
    +
  • バグ報告

    +

    PHYSBO のバグ関連の報告は GitHubのIssues で受け付けています。

    +

    バグを早期に解決するため、報告時には次のガイドラインに従ってください。

    +
    +
      +
    • 使用している PHYSBO のバージョンを指定してください。

    • +
    • インストールに問題がある場合には、使用しているオペレーティングシステムとコンパイラの情報についてお知らせください。

    • +
    • 実行に問題が生じた場合は、実行に使用した入力ファイルとその出力を記載してください。

    • +
    +
    +
  • +
  • その他

    +

    研究に関連するトピックなどGitHubのIssuesで相談しづらいことを問い合わせる際には、以下の連絡先にコンタクトをしてください。

    +

    E-mail: physbo-dev__at__issp.u-tokyo.ac.jp (_at_を@に変更してください)

    +
  • +
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/genindex.html b/manual/v2.0.2/ja/genindex.html new file mode 100644 index 00000000..87123df5 --- /dev/null +++ b/manual/v2.0.2/ja/genindex.html @@ -0,0 +1,1516 @@ + + + + + + + + 索引 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

索引

+ +
+ _ + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + | Z + +
+

_

+ + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ +

Z

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/index.html b/manual/v2.0.2/ja/index.html new file mode 100644 index 00000000..b6fe74b1 --- /dev/null +++ b/manual/v2.0.2/ja/index.html @@ -0,0 +1,217 @@ + + + + + + + + + Welcome to PHYSBO's documentation! — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/install.html b/manual/v2.0.2/ja/install.html new file mode 100644 index 00000000..0f31dd29 --- /dev/null +++ b/manual/v2.0.2/ja/install.html @@ -0,0 +1,318 @@ + + + + + + + + + 基本的な使用方法 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

基本的な使用方法

+
+

インストール

+
+

実行環境・必要なパッケージ

+

PHYSBOの実行環境・必要なパッケージは以下の通りです。

+
    +
  • Python >= 3.6

  • +
  • numpy < 2.0.0

  • +
  • scipy

  • +
+
+
+

ダウンロード・インストール

+
    +
  • PyPI からのインストール(推奨)

    +
    $ pip3 install physbo
    +
    +
    +
      +
    • NumPy などの依存パッケージも同時にインストールされます。

    • +
    • --user オプションを追加するとユーザのホームディレクトリ以下にインストールされます。

      +
      $ pip3 install --user physbo
      +
      +
      +
    • +
    +
  • +
  • ソースコードからのインストール(開発者向け)

    +
      +
    1. 本体のダウンロード

      +

      ソースファイルをダウンロードするか、以下のように github レポジトリをクローンしてください。

      +
      $ git clone https://github.com/issp-center-dev/PHYSBO
      +
      +
      +
    2. +
    3. pip を 19.0 以上に更新

      +
      $ pip3 install -U pip
      +
      +- ここで ``pip3`` が入っていない場合には ``python3 -m ensurepip`` でインストール可能です
      +
      +
      +
    4. +
    5. インストール

      +
      $ cd PHYSBO
      +$ pip3 install --user ./
      +
      +
      +
    6. +
    +
  • +
+
+
+

アンインストール

+
    +
  1. 以下のコマンドを実行します。

    +
    $ pip uninstall physbo
    +
    +
    +
  2. +
+
+
+
+

PHYSBOの基本構造

+

PHYSBOは以下のような構成になっています(第2階層まで表示)。

+

各モジュールは以下のような構成で作成されています。

+
    +
  • blm :Baysean linear modelに関するモジュール

  • +
  • gp :Gaussian Processに関するモジュール

  • +
  • opt :最適化に関するモジュール

  • +
  • search :最適解を探索するためのモジュール

  • +
  • predictor.py :predictorの抽象クラス

  • +
  • variable.py :physboで用いる変数関連について定義されたクラス

  • +
  • misc : その他(探索空間を正規化するためのモジュールなど)

  • +
+

各モジュールの詳細についてはAPIリファレンスを参考にしてください。

+
+
+

計算の流れ

+

ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数の評価に大きなコストがかかるような最適化問題に適しています。 +PHYSBO では以下の手順により最適化を実行します(それぞれの詳細はチュートリアルおよびAPIリファレンスを参考にしてください)。

+
    +
  1. 探索空間の定義

  2. +
+
+

N: 探索候補の数 , d: 入力パラメータの次元数 とした時、探索候補である各パラメータセット (d 次元のベクトル) を定義します。パラメータセットは全ての候補をリストアップしておく必要があります。

+
+
    +
  1. simulator の定義

  2. +
+
+

上で定義した探索候補に対して、各探索候補の目的関数値(材料特性値など最適化したい値)を与えるsimulatorを定義します。PHYSBOでは、最適化の方向は「目的関数の最大化」になります。そのため,目的関数を最小化したい場合、simulatorから返す値にマイナスをかけることで実行できます。

+
+
    +
  1. 最適化の実行

  2. +
+
+

最初に、最適化の policy をセットします(探索空間はこの段階で引数としてpolicyに渡されます)。最適化方法は、以下の2種類から選択します。

+
    +
  • random_search

  • +
  • bayes_search

  • +
+

random_search では、探索空間からランダムにパラメータを選び、その中で最大となる目的関数を探します。ベイズ最適化を行うための前処理として初期パラメータ群を用意するために使用します。 bayes_search は、ベイズ最適化を行います。ベイズ最適化でのscore: 獲得関数(acquisition function) の種類は、以下のいずれかから指定します。

+
    +
  • TS (Thompson Sampling): 学習されたガウス過程の事後確率分布から回帰関数を1つサンプリングし、それを用いた予測が最大となる点を候補として選択します。

  • +
  • EI (Expected Improvement): ガウス過程による予測値と現状での最大値との差の期待値が最大となる点を候補として選択します。

  • +
  • PI (Probability of Improvement): 現状での最大値を超える確率が最大となる点を候補として選択します。

  • +
+

ガウス過程に関する詳細については アルゴリズム に記載してあります。その他、各手法の詳細については、こちらの文献 およびその参考文献を参照して下さい。

+

これらのメソッドに先ほど定義した simulator と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。

+
+

i). パラメータ候補の中から次に実行するパラメータを選択

+

ii). 選択されたパラメータで simulator を実行

+
+

i)で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。詳しくはチュートリアルの「複数候補を一度に探索する」の項目を参照してください。また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。

+
+
    +
  1. 結果の確認

  2. +
+
+

探索結果 res は history クラスのオブジェクト (physbo.search.discrete.results.history) として返されます。以下より探索結果を参照します。

+
    +
  • res.fx : simulator (目的関数) の評価値の履歴。

  • +
  • res.chosen_actions: simulator を評価したときのaction ID(パラメータ)の履歴。

  • +
  • fbest, best_action= res.export_all_sequence_best_fx(): simulator を評価した全タイミングにおけるベスト値とそのaction ID(パラメータ)の履歴。

  • +
  • res.total_num_search: simulator のトータル評価数。

  • +
+

また、探索結果は save メソッドにより外部ファイルに保存でき、load メソッドを用いて出力した結果をロードすることができます。使用方法の詳細はチュートリアルをご覧ください。

+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/introduction.html b/manual/v2.0.2/ja/introduction.html new file mode 100644 index 00000000..5d799447 --- /dev/null +++ b/manual/v2.0.2/ja/introduction.html @@ -0,0 +1,253 @@ + + + + + + + + + はじめに — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

はじめに

+
+

PHYSBO とは

+

PHYSBO(optimization tool for PHYSics based on Bayesian Optimization)は、高速でスケーラブルなベイズ最適化 (Bayesian optimization) のためのPythonライブラリです。 +COMBO(COMmon Baysian Optimization)をもとに、主に物性分野の研究者をターゲットに開発されました。 +物理、化学、材料分野において、データ駆動的な実験計画アルゴリズムによって科学的発見を加速する、という試みが多く行われています。 +ベイズ最適化は、このような科学的発見を加速するために有効なツールです。 +ベイズ最適化は、複雑なシミュレーションや、実世界における実験タスクなど、目的関数値(特性値など)の評価に大きなコストがかかるような場合に利用できる手法です。つまり、「できるだけ少ない実験・シミュレーション回数でより良い目的関数値(材料特性など)を持つパラメータ(材料の組成、構造、プロセスやシミュレーションパラメータなど)を見つけ出す」ことが、ベイズ最適化によって解かれる問題です。ベイズ最適化では、探索するパラメータの候補をあらかじめリストアップし、候補の中から目的関数値が最大と考えられる候補を機械学習(ガウス過程回帰を利用)による予測をうまく利用することで選定します。その候補に対して実験・シミュレーションを行い目的関数値を評価します。機械学習による選定・実験シミュレーションによる評価を繰り返すことにより、少ない回数での最適化が可能となります。 +一方で、一般的にベイズ最適化は計算コストが高く、scikit-learn 等のスタンダードな実装では、多くのデータを扱うことが困難です。 +PHYSBOでは以下の特徴により、高いスケーラビリティを実現しています。

+
    +
  • Thompson Sampling

  • +
  • random feature map

  • +
  • one-rank Cholesky update

  • +
  • automatic hyperparameter tuning

  • +
+

技術的な詳細については、こちらの文献 を参照して下さい。

+
+
+

PHYSBO の引用

+

PHYSBOを引用する際には、以下の文献を引用してください、

+

Yuichi Motoyama, Ryo Tamura, Kazuyoshi Yoshimi, Kei Terayama, Tsuyoshi Ueno, Koji Tsuda, +Bayesian optimization package: PHYSBO, +Computer Physics Communications Volume 278, September 2022, 108405. Available from https://www.sciencedirect.com/science/article/pii/S0010465522001242?via%3Dihub (open access).

+

Bibtexは以下の通りです。

+
@misc{@article{MOTOYAMA2022108405,
+title = {Bayesian optimization package: PHYSBO},
+journal = {Computer Physics Communications},
+volume = {278},
+pages = {108405},
+year = {2022},
+issn = {0010-4655},
+doi = {https://doi.org/10.1016/j.cpc.2022.108405},
+author = {Yuichi Motoyama and Ryo Tamura and Kazuyoshi Yoshimi and Kei Terayama and Tsuyoshi Ueno and Koji Tsuda},
+keywords = {Bayesian optimization, Multi-objective optimization, Materials screening, Effective model estimation}
+}
+
+
+
+
+

主な開発者

+
    +
  • ver. 1.0-

    +
      +
    • 田村 亮 (物質・材料研究機構 国際ナノアーキテクトニクス研究拠点)

    • +
    • 寺山 慧 (横浜市立大学大学院 生命医科学研究科)

    • +
    • 津田 宏治 (東京大学大学院 新領域創成科学研究科)

    • +
    • 植野 剛 (株式会社 Magne-Max Capital Management)

    • +
    • 本山 裕一 (東京大学 物性研究所)

    • +
    • 吉見 一慶 (東京大学 物性研究所)

    • +
    • 川島 直輝 (東京大学 物性研究所)

    • +
    +
  • +
  • ver. 0.1-0.3

    +
      +
    • 田村 亮 (物質・材料研究機構 国際ナノアーキテクトニクス研究拠点)

    • +
    • 寺山 慧 (横浜市立大学大学院 生命医科学研究科)

    • +
    • 津田 宏治 (東京大学大学院 新領域創成科学研究科)

    • +
    • 本山 裕一 (東京大学 物性研究所)

    • +
    • 吉見 一慶 (東京大学 物性研究所)

    • +
    • 川島 直輝 (東京大学 物性研究所)

    • +
    +
  • +
+
+
+

ライセンス

+

PHYSBO v2 のソースコードは Mozilla Public License version 2.0(MPL v2) (日本語訳) のもとで公開・頒布されています。

+

Copyright (c) <2020-> The University of Tokyo. All rights reserved.

+

本ソフトウェアは2020年度 東京大学物性研究所 ソフトウェア高度化プロジェクトの支援を受け開発されました。

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/index.html b/manual/v2.0.2/ja/notebook/index.html new file mode 100644 index 00000000..b03a8ef3 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/index.html @@ -0,0 +1,243 @@ + + + + + + + + + チュートリアル — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.html b/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.html new file mode 100644 index 00000000..18451e27 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.html @@ -0,0 +1,546 @@ + + + + + + + + + ガウス過程 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

ガウス過程

+

PHYSBOではガウス過程回帰を実行しながらベイズ最適化を行なっています。

+

そのため、学習データが与えられた際にガウス過程回帰を実行することもでき、学習済みモデルを利用したテストデータの予測も行うことができます。

+

ここでは、その手順について紹介します。

+
+

探索候補データの準備

+

本チュートリアルでは例として、Cuの安定した界面構造の探索問題を扱います。 目的関数の評価にあたる構造緩和計算には、実際には1回あたり数時間といったオーダーの時間を要しますが、本チュートリアルでは既に評価済みの値を使用します。問題設定については、以下の文献を参照してください。 S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).

+

データセットファイル s5-210.csvdata ディレクトリ以下に保存し、次のように読み出します。

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering( X )
+
+
+
+
+
+

学習データの定義

+

対象データのうち、ランダムに選んだ1割をトレーニングデータとして利用し、別のランダムに選んだ1割をテストデータとして利用します。

+
+
[2]:
+
+
+
N = len(t)
+Ntrain = int(N*0.1)
+Ntest = min(int(N*0.1), N-Ntrain)
+
+id_all   = np.random.choice(N, N, replace=False)
+id_train  = id_all[0:Ntrain]
+id_test = id_all[Ntrain:Ntrain+Ntest]
+
+X_train = X[id_train]
+X_test = X[id_test]
+
+t_train = t[id_train]
+t_test = t[id_test]
+
+print("Ntrain =", Ntrain)
+print("Ntest =", Ntest)
+
+
+
+
+
+
+
+
+Ntrain = 1798
+Ntest = 1798
+
+
+
+
+

ガウス過程の学習と予測

+

以下のプロセスでガウス過程を学習し、テストデータの予測を行います。

+
    +
  1. ガウス過程のモデルを生成します。

  2. +
  3. X_train(学習データのパラメータ), t_train(学習データの目的関数値)を用いてモデルを学習します。

  4. +
  5. 学習されたモデルを用いてテストデータ(X_test)に対する予測を実行します。

  6. +
+

共分散の定義(ガウシアン)

+
+
[3]:
+
+
+
cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )
+
+
+
+

平均の定義

+
+
[4]:
+
+
+
mean = physbo.gp.mean.const()
+
+
+
+

尤度関数の定義(ガウシアン)

+
+
[5]:
+
+
+
lik = physbo.gp.lik.gauss()
+
+
+
+

ガウス過程モデルの生成

+
+
[6]:
+
+
+
gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)
+config = physbo.misc.set_config()
+
+
+
+

ガウス過程モデルを学習

+
+
[7]:
+
+
+
gp.fit(X_train, t_train, config)
+
+
+
+
+
+
+
+
+Start the initial hyper parameter searching ...
+Done
+
+Start the hyper parameter learning ...
+0 -th epoch marginal likelihood 16051.69452976001
+50 -th epoch marginal likelihood 4551.39626443153
+100 -th epoch marginal likelihood 2141.377872729846
+150 -th epoch marginal likelihood 595.8361411907399
+200 -th epoch marginal likelihood -373.23922309413774
+250 -th epoch marginal likelihood -929.2472009209496
+300 -th epoch marginal likelihood -1273.8727959019732
+350 -th epoch marginal likelihood -1413.2553901394206
+400 -th epoch marginal likelihood -1477.3889625983586
+450 -th epoch marginal likelihood -1525.339082571432
+500 -th epoch marginal likelihood -1539.787541261617
+Done
+
+
+
+

学習されたガウス過程におけるパラメタを出力

+
+
[8]:
+
+
+
gp.print_params()
+
+
+
+
+
+
+
+
+
+
+likelihood parameter =   [-2.57036368]
+mean parameter in GP prior:  [-1.0654197]
+covariance parameter in GP prior:  [-0.59460765 -2.4232173 ]
+
+
+
+
+

テストデータの平均値(予測値)および分散を計算

+
+
[9]:
+
+
+
gp.prepare(X_train, t_train)
+fmean = gp.get_post_fmean(X_train, X_test)
+fcov = gp.get_post_fcov(X_train, X_test)
+
+
+
+

予測の結果

+
+
[10]:
+
+
+
fmean
+
+
+
+
+
[10]:
+
+
+
+
+array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,
+       -0.98145533, -0.9956255 ])
+
+
+

分散の結果

+
+
[11]:
+
+
+
fcov
+
+
+
+
+
[11]:
+
+
+
+
+array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,
+       0.00053435])
+
+
+

予測値の平均二乗誤差の出力

+
+
[12]:
+
+
+
np.mean((fmean-t_test)**2)
+
+
+
+
+
[12]:
+
+
+
+
+0.004179032574484333
+
+
+
+
+

訓練済みモデルによる予測

+

学習済みモデルのパラメタをgp_paramsとして読み出し、これを用いた予測を行います。

+

gp_paramsおよび学習データ(X_train, t_train)を記憶しておくことで、訓練済みモデルによる予測が可能となります。

+

学習されたパラメタを準備(学習の直後に行う必要あり)

+
+
[13]:
+
+
+
#学習したパラメタを1次元配列として準備
+gp_params =  np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)
+
+gp_params
+
+
+
+
+
[13]:
+
+
+
+
+array([-2.57036368, -1.0654197 , -0.59460765, -2.4232173 ])
+
+
+

学習に利用したモデルと同様のモデルをgpとして準備

+
+
[14]:
+
+
+
#共分散の定義 (ガウシアン)
+cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )
+
+#平均の定義
+mean = physbo.gp.mean.const()
+
+#尤度関数の定義 (ガウシアン)
+lik = physbo.gp.lik.gauss()
+
+#ガウス過程モデルの生成
+gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)
+
+
+
+

学習済みのパラメタをモデルに入力し予測を実行

+
+
[15]:
+
+
+
#学習済みのパラメタをガウス過程に入力
+gp.set_params(gp_params)
+
+
+#テストデータの平均値(予測値)および分散を計算
+gp.prepare(X_train, t_train)
+fmean = gp.get_post_fmean(X_train, X_test)
+fcov = gp.get_post_fcov(X_train, X_test)
+
+
+
+

予測の結果

+
+
[16]:
+
+
+
fmean
+
+
+
+
+
[16]:
+
+
+
+
+array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,
+       -0.98145533, -0.9956255 ])
+
+
+

分散の結果

+
+
[17]:
+
+
+
fcov
+
+
+
+
+
[17]:
+
+
+
+
+array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,
+       0.00053435])
+
+
+

予測値の平均二乗誤差の出力

+
+
[18]:
+
+
+
np.mean((fmean-t_test)**2)
+
+
+
+
+
[18]:
+
+
+
+
+0.004179032574484333
+
+
+

(注) 上の例では事前に登録されているXと同じものを利用して予測を行いました。 学習済みのモデルを利用してXに含まれていないパラメータ X_new に対して予測をしたい場合には、 学習モデルで使用したデータXの平均(X_{mean})と標準偏差(X_{std})を求めていただいたうえで、 X_{new} = (X_{new} - X_{mean}) / X_{std} の変形を行うことで予測を行うことができます。 また、渡す際のデータ形式はndarray形式になっています。 そのため、X_{new}が一つのデータの場合には事前に変換する必要があります。 +例えば、X_{new}が実数である場合には、 X_new = np.array(X_new).reshape(1) などとして変換する必要があります。

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.ipynb b/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.ipynb new file mode 100644 index 00000000..9cf4f5f5 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_Gaussian_process.ipynb @@ -0,0 +1,768 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# ガウス過程\n", + "\n", + "PHYSBOではガウス過程回帰を実行しながらベイズ最適化を行なっています。\n", + "\n", + "そのため、学習データが与えられた際にガウス過程回帰を実行することもでき、学習済みモデルを利用したテストデータの予測も行うことができます。\n", + "\n", + "ここでは、その手順について紹介します。\n", + "\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "本チュートリアルでは例として、Cuの安定した界面構造の探索問題を扱います。 目的関数の評価にあたる構造緩和計算には、実際には1回あたり数時間といったオーダーの時間を要しますが、本チュートリアルでは既に評価済みの値を使用します。問題設定については、以下の文献を参照してください。\n", + "S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).\n", + "\n", + "データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:41.987250Z", + "start_time": "2020-12-04T06:11:41.537168Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering( X )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 学習データの定義\n", + "\n", + "対象データのうち、ランダムに選んだ1割をトレーニングデータとして利用し、別のランダムに選んだ1割をテストデータとして利用します。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:51.077070Z", + "start_time": "2020-12-04T06:11:51.072211Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ntrain = 1798\n", + "Ntest = 1798\n" + ] + } + ], + "source": [ + "N = len(t)\n", + "Ntrain = int(N*0.1)\n", + "Ntest = min(int(N*0.1), N-Ntrain)\n", + "\n", + "id_all = np.random.choice(N, N, replace=False)\n", + "id_train = id_all[0:Ntrain]\n", + "id_test = id_all[Ntrain:Ntrain+Ntest]\n", + "\n", + "X_train = X[id_train]\n", + "X_test = X[id_test]\n", + "\n", + "t_train = t[id_train]\n", + "t_test = t[id_test]\n", + "\n", + "print(\"Ntrain =\", Ntrain)\n", + "print(\"Ntest =\", Ntest)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## ガウス過程の学習と予測\n", + "\n", + "以下のプロセスでガウス過程を学習し、テストデータの予測を行います。\n", + "\n", + "1. ガウス過程のモデルを生成します。\n", + "\n", + "2. X_train(学習データのパラメータ), t_train(学習データの目的関数値)を用いてモデルを学習します。\n", + "\n", + "3. 学習されたモデルを用いてテストデータ(X_test)に対する予測を実行します。\n", + "\n", + "共分散の定義(ガウシアン)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:55.403677Z", + "start_time": "2020-12-04T06:11:55.399915Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "平均の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:56.279543Z", + "start_time": "2020-12-04T06:11:56.277082Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "mean = physbo.gp.mean.const()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "尤度関数の定義(ガウシアン)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.077507Z", + "start_time": "2020-12-04T06:11:57.075581Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "lik = physbo.gp.lik.gauss()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "ガウス過程モデルの生成" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:11:57.832602Z", + "start_time": "2020-12-04T06:11:57.828902Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n", + "config = physbo.misc.set_config()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "ガウス過程モデルを学習" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.218792Z", + "start_time": "2020-12-04T06:11:58.261609Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood 16051.69452976001\n", + "50 -th epoch marginal likelihood 4551.39626443153\n", + "100 -th epoch marginal likelihood 2141.377872729846\n", + "150 -th epoch marginal likelihood 595.8361411907399\n", + "200 -th epoch marginal likelihood -373.23922309413774\n", + "250 -th epoch marginal likelihood -929.2472009209496\n", + "300 -th epoch marginal likelihood -1273.8727959019732\n", + "350 -th epoch marginal likelihood -1413.2553901394206\n", + "400 -th epoch marginal likelihood -1477.3889625983586\n", + "450 -th epoch marginal likelihood -1525.339082571432\n", + "500 -th epoch marginal likelihood -1539.787541261617\n", + "Done\n", + "\n" + ] + } + ], + "source": [ + "gp.fit(X_train, t_train, config)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習されたガウス過程におけるパラメタを出力" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.227479Z", + "start_time": "2020-12-04T06:12:58.221821Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "likelihood parameter = [-2.57036368]\n", + "mean parameter in GP prior: [-1.0654197]\n", + "covariance parameter in GP prior: [-0.59460765 -2.4232173 ]\n", + "\n", + "\n" + ] + } + ], + "source": [ + "gp.print_params()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "テストデータの平均値(予測値)および分散を計算" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.605713Z", + "start_time": "2020-12-04T06:12:58.244883Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.618218Z", + "start_time": "2020-12-04T06:12:58.607794Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,\n", + " -0.98145533, -0.9956255 ])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "分散の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.628483Z", + "start_time": "2020-12-04T06:12:58.622345Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,\n", + " 0.00053435])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測値の平均二乗誤差の出力" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.636081Z", + "start_time": "2020-12-04T06:12:58.631461Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.004179032574484333" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 訓練済みモデルによる予測\n", + "\n", + "学習済みモデルのパラメタをgp_paramsとして読み出し、これを用いた予測を行います。\n", + "\n", + "gp_paramsおよび学習データ(X_train, t_train)を記憶しておくことで、訓練済みモデルによる予測が可能となります。" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習されたパラメタを準備(学習の直後に行う必要あり)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.645968Z", + "start_time": "2020-12-04T06:12:58.639012Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.57036368, -1.0654197 , -0.59460765, -2.4232173 ])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#学習したパラメタを1次元配列として準備\n", + "gp_params = np.append(np.append(gp.lik.params, gp.prior.mean.params), gp.prior.cov.params)\n", + "\n", + "gp_params" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習に利用したモデルと同様のモデルをgpとして準備" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:58.666019Z", + "start_time": "2020-12-04T06:12:58.653259Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#共分散の定義 (ガウシアン)\n", + "cov = physbo.gp.cov.gauss( X_train.shape[1],ard = False )\n", + "\n", + "#平均の定義\n", + "mean = physbo.gp.mean.const()\n", + "\n", + "#尤度関数の定義 (ガウシアン)\n", + "lik = physbo.gp.lik.gauss()\n", + "\n", + "#ガウス過程モデルの生成\n", + "gp = physbo.gp.model(lik=lik,mean=mean,cov=cov)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "学習済みのパラメタをモデルに入力し予測を実行" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.016429Z", + "start_time": "2020-12-04T06:12:58.673034Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "#学習済みのパラメタをガウス過程に入力\n", + "gp.set_params(gp_params)\n", + "\n", + "\n", + "#テストデータの平均値(予測値)および分散を計算\n", + "gp.prepare(X_train, t_train)\n", + "fmean = gp.get_post_fmean(X_train, X_test)\n", + "fcov = gp.get_post_fcov(X_train, X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.020795Z", + "start_time": "2020-12-04T06:12:59.017606Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01865696, -0.98356729, -0.97797072, ..., -0.99978278,\n", + " -0.98145533, -0.9956255 ])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fmean" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "分散の結果" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.026523Z", + "start_time": "2020-12-04T06:12:59.023035Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.00046688, 0.0010622 , 0.0006136 , ..., 0.00043492, 0.0005969 ,\n", + " 0.00053435])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fcov" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "予測値の平均二乗誤差の出力" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:12:59.033497Z", + "start_time": "2020-12-04T06:12:59.027871Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.004179032574484333" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean((fmean-t_test)**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "(注) 上の例では事前に登録されているXと同じものを利用して予測を行いました。\n", + "学習済みのモデルを利用してXに含まれていないパラメータ X_new に対して予測をしたい場合には、\n", + "学習モデルで使用したデータXの平均(X_{mean})と標準偏差(X_{std})を求めていただいたうえで、\n", + "X_{new} = (X_{new} - X_{mean}) / X_{std}\n", + "の変形を行うことで予測を行うことができます。\n", + "また、渡す際のデータ形式はndarray形式になっています。\n", + "そのため、X_{new}が一つのデータの場合には事前に変換する必要があります。\n", + "例えば、X_{new}が実数である場合には、\n", + "X_new = np.array(X_new).reshape(1)\n", + "などとして変換する必要があります。" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_basic.html b/manual/v2.0.2/ja/notebook/tutorial_basic.html new file mode 100644 index 00000000..d3f13a33 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_basic.html @@ -0,0 +1,557 @@ + + + + + + + + + PHYSBO の基本 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

PHYSBO の基本

+
+

はじめに

+

本チュートリアルでは例として、一次元の関数の最小値を求める例題を解きます。 はじめに、PHYSBOをインポートします。

+
+
[1]:
+
+
+
import physbo
+
+
+
+
+
+

探索候補データの準備

+

最初に関数を探索する空間を定義します。 以下の例では、探索空間Xx_min = -2.0からx_max = 2.0までwindow_num=10001分割で刻んだグリッドで定義しています。 なお、Xwindow_num x d のndarray形式にする必要があります(dは次元数、この場合は1次元)。そのため、reshapeを行って変形しています。

+
+
[2]:
+
+
+
#In
+import numpy as np
+import scipy
+import physbo
+import itertools
+
+#In
+#Create candidate
+window_num=10001
+x_max = 2.0
+x_min = -2.0
+
+X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)
+
+
+
+
+
+

simulatorクラスの定義

+

目的関数を定義するためのsimulatorクラスをここで定義します。

+

今回は\(f(x) = 3 x^4 + 4 x ^3 + 1.0\) が最小となるxを探索するという問題設定にしています(答えは\(x=-1.0\))。

+

simulatorクラスでは、__call__関数を定義します(初期変数などがある場合は__init__を定義します)。 actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。 今回は一つの候補のみを毎回計算するため、action_idx=action[0]としてXから候補点を一つ選んでいます。 PHYSBOでは目的関数値が最大となるものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。

+
+
[3]:
+
+
+
# Declare the class for calling the simulator.
+class simulator:
+
+    def __call__(self, action):
+        action_idx = action[0]
+        x = X[action_idx][0]
+        fx = 3.0*x**4 + 4.0*x**3 + 1.0
+        fx_list.append(fx)
+        x_list.append(X[action_idx][0])
+
+        print ("*********************")
+        print ("Present optimum interactions")
+
+        print ("x_opt=", x_list[np.argmin(np.array(fx_list))])
+
+        return -fx
+
+
+
+
+
+

最適化の実行

+
+

policy のセット

+

まず、最適化の policy をセットします。

+

test_X に探索候補の行列 (numpy.array) を指定します。

+
+
[4]:
+
+
+
# policy のセット
+policy = physbo.search.discrete.policy(test_X=X)
+
+# シード値のセット
+policy.set_seed(0)
+
+
+
+

policy をセットした段階では、まだ最適化は行われません。 policy に対して以下のメソッドを実行することで、最適化を行います。

+
    +
  • random_search

  • +
  • bayes_search

  • +
+

これらのメソッドに先ほど定義した simulator と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。

+
    +
  1. パラメータ候補の中から次に実行するパラメータを選択

  2. +
  3. 選択されたパラメータで simulator を実行

  4. +
  5. で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。 詳しくは「複数候補を一度に探索する」の項目を参照してください。

  6. +
+

また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。

+
+
+

ランダムサーチ

+

まず初めに、ランダムサーチを行ってみましょう。

+

ベイズ最適化の実行には、目的関数値が2つ以上求まっている必要があるため(初期に必要なデータ数は、最適化したい問題、パラメータの次元dに依存して変わります)、まずランダムサーチを実行します。

+

引数

+
    +
  • max_num_probes: 探索ステップ数

  • +
  • simulator: 目的関数のシミュレータ (simulator クラスのオブジェクト)

  • +
+
+
[ ]:
+
+
+
fx_list=[]
+x_list = []
+res = policy.random_search(max_num_probes=20, simulator=simulator())
+
+
+
+

実行すると、各ステップの目的関数値とその action ID、現在までのベスト値とその action ID に関する情報が以下のように出力されます。

+
0020-th step: f(x) = -19.075990 (action=8288)
+   current best f(x) = -0.150313 (best action=2949)
+
+
+
+
+

ベイズ最適化

+

続いて、ベイズ最適化を以下のように実行します。

+

引数

+
    +
  • max_num_probes: 探索ステップ数

  • +
  • simulator: 目的関数のシミュレータ (simulator クラスのオブジェクト)

  • +
  • score: 獲得関数(acquisition function) のタイプ。以下のいずれかを指定します。

    +
      +
    • TS (Thompson Sampling)

    • +
    • EI (Expected Improvement)

    • +
    • PI (Probability of Improvement)

    • +
    +
  • +
  • interval: +指定したインターバルごとに、ハイパーパラメータを学習します。 +負の値を指定すると、ハイパーパラメータの学習は行われません。 +0 を指定すると、ハイパーパラメータの学習は最初のステップでのみ行われます。

  • +
  • num_rand_basis: 基底関数の数。0を指定すると、Bayesian linear modelを利用しない通常のガウス過程が使用されます。

  • +
+
+
[ ]:
+
+
+
res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS',
+                                                  interval=0, num_rand_basis=500)
+
+
+
+
+
+
+

結果の確認

+
+
探索結果 res は history クラスのオブジェクト (physbo.search.discrete.results.history) として返されます。
+
以下より探索結果を参照します。
+
+
    +
  • res.fx : simulator (目的関数) の評価値の履歴。

  • +
  • res.chosen_actions: simulator を評価したときの action ID (パラメータ) の履歴。

  • +
  • fbest, best_action= res.export_all_sequence_best_fx(): simulator を評価した全タイミングにおけるベスト値とその action ID (パラメータ)の履歴。

  • +
  • res.total_num_search: simulator のトータル評価数。

  • +
+
+
各ステップでの目的関数値と、ベスト値の推移をプロットしてみましょう。
+
res.fx, best_fx はそれぞれ res.total_num_search までの範囲を指定します。
+
+
+
[7]:
+
+
+
import matplotlib.pyplot as plt
+%matplotlib inline
+
+
+
+
+
[8]:
+
+
+
plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[8]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7ff618e0d820>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_15_1.png +
+
+
+
[9]:
+
+
+
best_fx, best_action = res.export_all_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[9]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7ff618f0ff70>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_16_1.png +
+
+
+
+

結果のシリアライズ

+

探索結果は save メソッドにより外部ファイルに保存できます。

+
+
[10]:
+
+
+
res.save('search_result.npz')
+
+
+
+
+
[11]:
+
+
+
del res
+
+
+
+

保存した結果ファイルは以下のようにロードすることができます。

+
+
[12]:
+
+
+
res = physbo.search.discrete.results.history()
+res.load('search_result.npz')
+
+
+
+

最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。

+
+
[13]:
+
+
+
print(X[int(best_action[-1])])
+
+
+
+
+
+
+
+
+[-1.002]
+
+
+
+
+

回帰

+

get_post_fmean, get_post_fcov メソッドでガウス過程(事後分布)の期待値と分散を計算可能です。

+
+
[14]:
+
+
+
mean = policy.get_post_fmean(X)
+var = policy.get_post_fcov(X)
+std = np.sqrt(var)
+
+x = X[:,0]
+fig, ax = plt.subplots()
+ax.plot(x, mean)
+ax.fill_between(x, (mean-std), (mean+std), color='b', alpha=.1)
+
+
+
+
+
[14]:
+
+
+
+
+<matplotlib.collections.PolyCollection at 0x7ff608adc3d0>
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_25_1.png +
+
+
+
+

獲得関数

+

get_score メソッドで獲得関数を計算可能です。

+
+
[15]:
+
+
+
score = policy.get_score(mode="EI", xs=X)
+plt.plot(score)
+
+
+
+
+
[15]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7ff608b3d070>]
+
+
+
+
+
+
+../_images/notebook_tutorial_basic_27_1.png +
+
+
+
+

並列化

+

PHYSBO は全候補点に対する獲得関数の計算をMPI を用いて並列化出来ます。 MPI 並列には mpi4py を用います。

+

並列化を有効化するには、 policy のコンストラクタのキーワード引数 comm に MPI コミュニケータ、たとえば MPI.COMM_WORLD を渡してください。

+
+
[16]:
+
+
+
# from mpi4py import MPI
+# policy = physbo.search.discrete.policy(X=test_X, comm=MPI.COMM_WORLD)
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_basic.ipynb b/manual/v2.0.2/ja/notebook/tutorial_basic.ipynb new file mode 100644 index 00000000..bcfd6e24 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_basic.ipynb @@ -0,0 +1,592 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PHYSBO の基本\n", + "\n", + "## はじめに\n", + "\n", + "\n", + "本チュートリアルでは例として、一次元の関数の最小値を求める例題を解きます。\n", + "はじめに、PHYSBOをインポートします。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.642474Z", + "start_time": "2021-03-05T04:45:04.225565Z" + } + }, + "outputs": [], + "source": [ + "import physbo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 探索候補データの準備\n", + "\n", + "最初に関数を探索する空間を定義します。\n", + "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", + "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は1次元)。そのため、reshapeを行って変形しています。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.654902Z", + "start_time": "2021-03-05T04:45:04.645777Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulatorクラスの定義\n", + "\n", + "目的関数を定義するためのsimulatorクラスをここで定義します。\n", + "\n", + "今回は$f(x) = 3 x^4 + 4 x ^3 + 1.0$ が最小となるxを探索するという問題設定にしています(答えは$x=-1.0$)。\n", + "\n", + "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", + "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", + "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", + "**PHYSBOでは目的関数値が最大となる**ものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.663622Z", + "start_time": "2021-03-05T04:45:04.657375Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### policy のセット\n", + "\n", + "まず、最適化の `policy` をセットします。 \n", + "\n", + "`test_X` に探索候補の行列 (`numpy.array`) を指定します。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.675725Z", + "start_time": "2021-03-05T04:45:04.669564Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`policy` をセットした段階では、まだ最適化は行われません。\n", + "`policy` に対して以下のメソッドを実行することで、最適化を行います。\n", + "\n", + "- `random_search` \n", + "- `bayes_search`\n", + "\n", + "これらのメソッドに先ほど定義した `simulator` と探索ステップ数を指定すると、探索ステップ数だけ以下のループが回ります。\n", + "\n", + "i) パラメータ候補の中から次に実行するパラメータを選択\n", + "\n", + "ii) 選択されたパラメータで `simulator` を実行\n", + "\n", + "i) で返されるパラメータはデフォルトでは1つですが、1ステップで複数のパラメータを返すことも可能です。\n", + "詳しくは「複数候補を一度に探索する」の項目を参照してください。 \n", + "\n", + "また、上記のループを PHYSBO の中で回すのではなく、i) と ii) を別個に外部から制御することも可能です。つまり、PHYSBO から次に実行するパラメータを提案し、その目的関数値をPHYSBOの外部で何らかの形で評価し(例えば、数値計算ではなく、実験による評価など)、それをPHYSBOの外部で何らかの形で提案し、評価値をPHYSBOに登録する、という手順が可能です。詳しくは、チュートリアルの「インタラクティブに実行する」の項目を参照してください。\n", + "\n", + "### ランダムサーチ\n", + "\n", + "まず初めに、ランダムサーチを行ってみましょう。\n", + "\n", + "ベイズ最適化の実行には、目的関数値が2つ以上求まっている必要があるため(初期に必要なデータ数は、最適化したい問題、パラメータの次元dに依存して変わります)、まずランダムサーチを実行します。 \n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:04.705741Z", + "start_time": "2021-03-05T04:45:04.677024Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "res = policy.random_search(max_num_probes=20, simulator=simulator())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "実行すると、各ステップの目的関数値とその action ID、現在までのベスト値とその action ID に関する情報が以下のように出力されます。\n", + "\n", + "```\n", + "0020-th step: f(x) = -19.075990 (action=8288)\n", + " current best f(x) = -0.150313 (best action=2949) \n", + "```\n", + "\n", + "\n", + "### ベイズ最適化\n", + "\n", + "続いて、ベイズ最適化を以下のように実行します。\n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `simulator`: 目的関数のシミュレータ (simulator クラスのオブジェクト) \n", + "- `score`: 獲得関数(acquisition function) のタイプ。以下のいずれかを指定します。\n", + " - TS (Thompson Sampling) \n", + " - EI (Expected Improvement) \n", + " - PI (Probability of Improvement) \n", + "- `interval`: \n", + "指定したインターバルごとに、ハイパーパラメータを学習します。 \n", + "負の値を指定すると、ハイパーパラメータの学習は行われません。 \n", + "0 を指定すると、ハイパーパラメータの学習は最初のステップでのみ行われます。 \n", + "- `num_rand_basis`: 基底関数の数。0を指定すると、Bayesian linear modelを利用しない通常のガウス過程が使用されます。 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.142492Z", + "start_time": "2021-03-05T04:45:04.707345Z" + }, + "code_folding": [], + "scrolled": true + }, + "outputs": [], + "source": [ + "res = policy.bayes_search(max_num_probes=50, simulator=simulator(), score='TS', \n", + " interval=0, num_rand_basis=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果の確認\n", + "\n", + "探索結果 res は history クラスのオブジェクト (`physbo.search.discrete.results.history`) として返されます。 \n", + "以下より探索結果を参照します。\n", + "\n", + "- `res.fx` : simulator (目的関数) の評価値の履歴。\n", + "- `res.chosen_actions`: simulator を評価したときの action ID (パラメータ) の履歴。 \n", + "- `fbest, best_action= res.export_all_sequence_best_fx()`: simulator を評価した全タイミングにおけるベスト値とその action ID (パラメータ)の履歴。\n", + "- `res.total_num_search`: simulator のトータル評価数。\n", + "\n", + "各ステップでの目的関数値と、ベスト値の推移をプロットしてみましょう。 \n", + "`res.fx`, `best_fx` はそれぞれ `res.total_num_search` までの範囲を指定します。" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.561032Z", + "start_time": "2021-03-05T04:45:07.144324Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.721097Z", + "start_time": "2021-03-05T04:45:07.563374Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.875556Z", + "start_time": "2021-03-05T04:45:07.722679Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果のシリアライズ\n", + "\n", + "探索結果は `save` メソッドにより外部ファイルに保存できます。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.887135Z", + "start_time": "2021-03-05T04:45:07.878666Z" + } + }, + "outputs": [], + "source": [ + "res.save('search_result.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.890553Z", + "start_time": "2021-03-05T04:45:07.888487Z" + } + }, + "outputs": [], + "source": [ + "del res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "保存した結果ファイルは以下のようにロードすることができます。" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.920747Z", + "start_time": "2021-03-05T04:45:07.900980Z" + } + }, + "outputs": [], + "source": [ + "res = physbo.search.discrete.results.history()\n", + "res.load('search_result.npz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:07.929301Z", + "start_time": "2021-03-05T04:45:07.922695Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.002]\n" + ] + } + ], + "source": [ + "print(X[int(best_action[-1])])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 回帰\n", + "\n", + "`get_post_fmean`, `get_post_fcov` メソッドでガウス過程(事後分布)の期待値と分散を計算可能です。" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.490337Z", + "start_time": "2021-03-05T04:45:07.930904Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mean = policy.get_post_fmean(X)\n", + "var = policy.get_post_fcov(X)\n", + "std = np.sqrt(var)\n", + "\n", + "x = X[:,0]\n", + "fig, ax = plt.subplots()\n", + "ax.plot(x, mean)\n", + "ax.fill_between(x, (mean-std), (mean+std), color='b', alpha=.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 獲得関数\n", + "\n", + "`get_score` メソッドで獲得関数を計算可能です。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.992517Z", + "start_time": "2021-03-05T04:45:08.491722Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "score = policy.get_score(mode=\"EI\", xs=X)\n", + "plt.plot(score)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 並列化\n", + "\n", + "PHYSBO は全候補点に対する獲得関数の計算をMPI を用いて並列化出来ます。\n", + "MPI 並列には `mpi4py` を用います。\n", + "\n", + "並列化を有効化するには、 `policy` のコンストラクタのキーワード引数 `comm` に MPI コミュニケータ、たとえば `MPI.COMM_WORLD` を渡してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-05T04:45:08.996775Z", + "start_time": "2021-03-05T04:45:08.993794Z" + } + }, + "outputs": [], + "source": [ + "# from mpi4py import MPI\n", + "# policy = physbo.search.discrete.policy(X=test_X, comm=MPI.COMM_WORLD)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.html b/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.html new file mode 100644 index 00000000..f64a01b6 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.html @@ -0,0 +1,354 @@ + + + + + + + + + インタラクティブに実行する — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

インタラクティブに実行する

+

以下の流れで、PHYSBO をインタラクティブに実行することができます。

+
    +
  1. PHYSBO から次に実行するパラメータを得ます。

  2. +
  3. PHYSBO の外部で評価値を得ます。

  4. +
  5. 評価値をPHYSBOに登録します。

  6. +
+

例えば、以下の様な場合に適しています。

+
    +
  • 人手による実験を行い、その評価値をPHYSBOに与えたい。

  • +
  • simulator の実行を別プロセスで行うなど、柔軟に実行制御を行いたい。

  • +
+
+

探索候補データの準備

+

これまでのチュートリアルと同様、データセットファイル s5-210.csvdata ディレクトリ以下に保存し、次のように読み出します。

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

simulator の定義

+
+
[2]:
+
+
+
class simulator:
+    def __init__( self ):
+        _, self.t = load_data()
+
+    def __call__( self, action ):
+        return self.t[action]
+
+
+
+
+
+

最適化の実行

+
+
[3]:
+
+
+
# policy のセット
+policy = physbo.search.discrete.policy(test_X=X)
+
+# シード値のセット
+policy.set_seed( 0 )
+
+
+
+

各探索ステップでは以下の処理を行っています。

+
    +
  1. max_num_probes=1, simulator=None として random_search または bayes_search を実行して action ID (パラメータ)を得る。

  2. +
  3. t  = simulator(actions) により評価値(の array) を得る。

  4. +
  5. policy.write(actions, t)により action ID (パラメータ) に対する評価値を登録する。

  6. +
  7. physbo.search.utility.show_search_results により履歴を表示する。

  8. +
+

以下では、ランダムサンプリングを2回(1st, and 2nd steps)、ベイズ最適化による提案を2回(3rd, and 4th steps)を行います。

+
+
[ ]:
+
+
+
simulator = simulator()
+
+''' 1st step (random sampling) '''
+actions = policy.random_search(max_num_probes=1, simulator=None)
+t  = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 2nd step (random sampling) '''
+actions = policy.random_search(max_num_probes=1, simulator=None)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 3rd step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+''' 4-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+
+
+
+
+

中断と再開

+

以下の predictor, training, history を外部ファイルに保存することで、最適化プロセスを中断し、途中から再開することができます。

+
    +
  • predictor: 目的関数の予測モデル

  • +
  • training: predictor の学習に用いるデータ (physbo.variable オブジェクト)

  • +
  • history: 最適化実行の履歴 (physbo.search.discrete.results.history オブジェクト)

  • +
+
+
[5]:
+
+
+
policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')
+
+
+
+
+
[ ]:
+
+
+
# policy を削除
+del policy
+
+# 保存した policy をロード
+policy = physbo.search.discrete.policy(test_X=X)
+policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')
+
+''' 5-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+# predictor と training を個別に指定することも可
+''' 6-th step (bayesian optimization) '''
+actions = policy.bayes_search(max_num_probes=1,
+                                            predictor=policy.predictor, training=policy.training,
+                                            simulator=None, score='EI', interval=0,  num_rand_basis = 5000)
+t = simulator(actions)
+policy.write(actions, t)
+physbo.search.utility.show_search_results(policy.history, 10)
+
+
+
+
+
[ ]:
+
+
+

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.ipynb b/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.ipynb new file mode 100644 index 00000000..dba7708e --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_interactive_mode.ipynb @@ -0,0 +1,246 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# インタラクティブに実行する\n", + "\n", + "以下の流れで、PHYSBO をインタラクティブに実行することができます。\n", + "\n", + "1. PHYSBO から次に実行するパラメータを得ます。\n", + "2. PHYSBO の外部で評価値を得ます。\n", + "3. 評価値をPHYSBOに登録します。\n", + "\n", + "例えば、以下の様な場合に適しています。\n", + "\n", + "- 人手による実験を行い、その評価値をPHYSBOに与えたい。\n", + "- simulator の実行を別プロセスで行うなど、柔軟に実行制御を行いたい。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.663215Z", + "start_time": "2020-12-04T06:17:28.658656Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "各探索ステップでは以下の処理を行っています。\n", + "\n", + "1. `max_num_probes=1, simulator=None` として random_search または bayes_search を実行して action ID (パラメータ)を得る。\n", + "2. `t = simulator(actions)` により評価値(の array) を得る。\n", + "3. `policy.write(actions, t)`により action ID (パラメータ) に対する評価値を登録する。\n", + "4. `physbo.search.utility.show_search_results` により履歴を表示する。\n", + "\n", + "以下では、ランダムサンプリングを2回(1st, and 2nd steps)、ベイズ最適化による提案を2回(3rd, and 4th steps)を行います。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:47.726433Z", + "start_time": "2020-12-04T06:17:28.677429Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "simulator = simulator()\n", + "\n", + "''' 1st step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 2nd step (random sampling) '''\n", + "actions = policy.random_search(max_num_probes=1, simulator=None)\n", + "t = simulator(actions)\n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)\n", + "\n", + "''' 3rd step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "''' 4-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t)\n", + "physbo.search.utility.show_search_results(policy.history, 10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 中断と再開\n", + "\n", + "以下の predictor, training, history を外部ファイルに保存することで、最適化プロセスを中断し、途中から再開することができます。\n", + "\n", + "- predictor: 目的関数の予測モデル\n", + "- training: predictor の学習に用いるデータ (`physbo.variable` オブジェクト)\n", + "- history: 最適化実行の履歴 (`physbo.search.discrete.results.history` オブジェクト)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:48.722691Z", + "start_time": "2020-12-04T06:17:47.728006Z" + } + }, + "outputs": [], + "source": [ + "policy.save(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:18:05.746742Z", + "start_time": "2020-12-04T06:17:48.724101Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "# policy を削除\n", + "del policy\n", + "\n", + "# 保存した policy をロード \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "policy.load(file_history='history.npz', file_training='training.npz', file_predictor='predictor.dump')\n", + "\n", + "''' 5-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) \n", + "\n", + "# predictor と training を個別に指定することも可\n", + "''' 6-th step (bayesian optimization) '''\n", + "actions = policy.bayes_search(max_num_probes=1, \n", + " predictor=policy.predictor, training=policy.training,\n", + " simulator=None, score='EI', interval=0, num_rand_basis = 5000)\n", + "t = simulator(actions) \n", + "policy.write(actions, t) \n", + "physbo.search.utility.show_search_results(policy.history, 10) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_multi_objective.html b/manual/v2.0.2/ja/notebook/tutorial_multi_objective.html new file mode 100644 index 00000000..0d4eae35 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_multi_objective.html @@ -0,0 +1,812 @@ + + + + + + + + + 多目的最適化 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

多目的最適化

+
+
最適化したい目的関数が複数 (\(p\) 個) ある場合は、多目的最適化をおこないます。
+
本チュートリアルでは、「解」は目的関数の組 \(y = (y_1(x), y_2(x), \dots, y_p(x))\) を意味することに注意してください。
+
解の大小関係 \(\prec\) を以下のように定義します。
+
+

\(y \prec y^{'}\Longleftrightarrow \forall \ i \le p, y_i \le y^{'}_i \land \exists \ j \le p, y_j < y^{'}_j\)

+
+
(最大化問題における) パレート解 とは、上記の大小関係の上で、自身よりも大きな解がないような解を指します。
+
すなわち、任意の目的関数の値を改善しようとした場合、他の目的関数のうちどれかひとつは悪化するような解です。
+
目的関数間にトレードオフが存在する場合は、パレート解は複数存在するため、それらを効率的に求めることが課題となります。
+
+

PHYSBOでは、パレート解を効率的に求めるためのベイズ最適化手法を実装しています。

+
+
[1]:
+
+
+
import numpy as np
+import matplotlib.pyplot as plt
+import physbo
+%matplotlib inline
+
+
+
+
+

テスト関数

+
+
本チュートリアルでは、多目的最適化のベンチマーク関数である VLMOP2 を利用します。
+
目的関数の数は2つです。
+
+
+\[\begin{split}\begin{split} + y_1(\vec{x}) &= 1 - \exp\left[-\sum_{i=1}^N\left( x_i - 1/\sqrt{N}\right)^2\right] \\ + y_2(\vec{x}) &= 1 - \exp\left[-\sum_{i=1}^N\left( x_i + 1/\sqrt{N}\right)^2\right] +\end{split}\end{split}\]
+

\(y_1\)\(y_2\) はそれぞれ \(x_1 = x_2 = \cdots x_N = 1/\sqrt{N}\)\(x_1 = x_2 = \cdots x_N = -1/\sqrt{N}\) に最小値があり、その値はともに0です。また、上界は1 です。

+

PHYSBO は最大化問題を仮定するため、-1を掛けたものをあらためて目的関数とします。

+
    +
  • 参考文献

    +
      +
    • Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999.

    • +
    +
  • +
+
+
[2]:
+
+
+
def vlmop2_minus(x):
+    n = x.shape[1]
+    y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))
+    y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))
+
+    return np.c_[-y1, -y2]
+
+
+
+
+
+

探索候補データの準備

+

入力空間 \(\vec{x}\) は 2次元とし、[-2, 2] × [-2, 2] の上で候補点をグリッド状に生成します。

+
+
[3]:
+
+
+
import itertools
+a = np.linspace(-2,2,101)
+test_X = np.array(list(itertools.product(a, a)))
+
+
+
+
+
[4]:
+
+
+
test_X
+
+
+
+
+
[4]:
+
+
+
+
+array([[-2.  , -2.  ],
+       [-2.  , -1.96],
+       [-2.  , -1.92],
+       ...,
+       [ 2.  ,  1.92],
+       [ 2.  ,  1.96],
+       [ 2.  ,  2.  ]])
+
+
+
+
[5]:
+
+
+
test_X.shape
+
+
+
+
+
[5]:
+
+
+
+
+(10201, 2)
+
+
+
+
+

simulator の定義

+
+
[6]:
+
+
+
class simulator(object):
+    def __init__(self, X):
+        self.t = vlmop2_minus(X)
+
+    def __call__( self, action):
+        return self.t[action]
+
+
+
+
+
[7]:
+
+
+
simu = simulator(test_X)
+
+
+
+
+
+

関数のプロット

+
+
2つの目的関数をそれぞれプロットしてみましょう。
+
1つ目の目的関数は右上にピークがあり、2つ目の目的関数は左下にピークがあるようなトレードオフがある状態となっています。 (星はピークの位置です)
+
+
+

1つ目の目的関数

+
+
[8]:
+
+
+
plt.figure()
+plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin="lower", extent=[-2.0, 2.0, -2.0, 2.0])
+plt.title("objective 1")
+plt.colorbar()
+plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')
+plt.show()
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_12_0.png +
+
+
+
+

2つ目の目的関数

+
+
[9]:
+
+
+
# plot objective 2
+plt.figure()
+plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin="lower", extent=[-2.0, 2.0, -2.0, 2.0])
+plt.title("objective 2")
+plt.colorbar()
+plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')
+plt.show()
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_14_0.png +
+
+
+
+
+

最適化の実行

+
+

policy のセット

+
+
多目的最適化用の physbo.search.discrete_multi.policy を利用します。
+
num_objectives に目的関数の数を指定してください。
+
+
+
[10]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+
+
+
+
通常の physbo.search.discrete.policy (目的関数が1つの場合)と同じく、random_search または bayes_search メソッドを呼ぶことで最適化を行います。
+
基本的なAPIや利用方法は discrete.policy とおおよそ共通しています。
+
+
+
+

ランダムサーチ

+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+res_random = policy.random_search(max_num_probes=50, simulator=simu)
+
+
+
+
+
目的関数の評価値(の array) とそのときの action ID が表示されます。
+
また、パレート解集合 (Pareto set) が更新されたときにメッセージを表示します。
+
+
+
Pareto set が更新された際に中身を表示したい場合は、disp_pareto_set=True と指定します。
+
Pareto set は1つ目の目的関数値の昇順でソートされています。
+
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+res_random = policy.random_search(max_num_probes=50, simulator=simu, disp_pareto_set=True)
+
+
+
+
+
+

結果の確認

+

#### 評価値の履歴

+
+
[ ]:
+
+
+
res_random.fx[0:res_random.num_runs]
+
+
+
+
+

パレート解の取得

+
+
[14]:
+
+
+
front, front_num = res_random.export_pareto_front()
+front, front_num
+
+
+
+
+
[14]:
+
+
+
+
+(array([[-0.95713719, -0.09067194],
+        [-0.92633083, -0.29208351],
+        [-0.63329589, -0.63329589],
+        [-0.52191048, -0.72845916],
+        [-0.26132949, -0.87913689],
+        [-0.17190645, -0.91382463]]),
+ array([40,  3, 19, 16, 29, 41]))
+
+
+
+
+

解(評価値)のプロット

+

これ以降、図示する空間が \(y = (y_1, y_2)\) であり \(x = (x_1, x_2)\) ではないことにあらためて注意してください。

+

赤のプロットがパレート解です。

+
+
[15]:
+
+
+
def plot_pareto_front(res):
+    front, front_num = res.export_pareto_front()
+    dominated = [i for i in range(res.num_runs) if i not in front_num]
+    points = res.fx[dominated, :]
+
+    plt.figure(figsize=(7, 7))
+    plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = "blue")
+    plt.scatter(front[:, 0], front[:, 1], c = "red")
+    plt.title('Pareto front')
+    plt.xlabel('Objective 1')
+    plt.ylabel('Objective 2')
+    plt.xlim([-1.0,0.0])
+    plt.ylim([-1.0,0.0])
+
+
+
+
+
[16]:
+
+
+
plot_pareto_front(res_random)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_28_0.png +
+
+
+
+

劣解領域 (dominated region) の体積を計算

+
+
パレート解ではない解、すなわち、「自らよりも優れた解 \(y'\) が存在する解 \(y\) 」 を劣解と呼びます (\(\exists y' y \prec y'\))。
+
解空間(の部分空間)のうち、劣解の占める空間である劣解領域の体積は、多目的最適化の結果を示す指標のひとつです。
+
この値が大きいほど、より良いパレート解が多く求まっていることになります。
+
+

res_random.pareto.volume_in_dominance(ref_min, ref_max) は、 ref_min, ref_max で指定された矩形(hyper-rectangle) 中の劣解領域体積を計算します。

+
+
[17]:
+
+
+
res_random.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[17]:
+
+
+
+
+0.2376881844865093
+
+
+
+
+
+
+

ベイズ最適化

+

多目的の場合の bayes_search では、score には以下のいずれかを指定します。

+
    +
  • HVPI (HyperVolume-based Probability of Improvement)

  • +
  • EHVI (Expected Hyper-Volume Improvement)

  • +
  • TS (Thompson Sampling)

  • +
+

以下、score を変えてそれぞれ 50回 (ランダムサーチ10回 + ベイズ最適化 40回) 評価を行います。

+
+

HVPI (HyperVolume-based Probability of Improvement)

+

多次元の目的関数空間における非劣解領域 (non-dominated region) の改善確率を score として求めます。

+
    +
  • 参考文献

    +
      +
    • Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. 「Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.」 Journal of Global Optimization 60.3 (2014): 575-594.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)
+
+
+
+
+

パレート解のプロット

+

ランダムサンプリングと比較して、パレート解が多く求まっていることが分かります。

+
+
[19]:
+
+
+
plot_pareto_front(res_HVPI)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_35_0.png +
+
+
+
+

劣解領域体積

+
+
[20]:
+
+
+
res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[20]:
+
+
+
+
+0.32877907991633726
+
+
+
+
+
+

EHVI (Expected Hyper-Volume Improvement)

+

多次元の目的関数空間における非劣解領域 (non-dominated region) の改善期待値を score として求めます。

+
    +
  • 参考文献

    +
      +
    • Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. 「Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.」 Journal of Global Optimization 60.3 (2014): 575-594.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)
+
+
+
+
+

パレート解のプロット

+
+
[22]:
+
+
+
plot_pareto_front(res_EHVI)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_41_0.png +
+
+
+
+

劣解領域体積

+
+
[23]:
+
+
+
res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[23]:
+
+
+
+
+0.3200467412741881
+
+
+
+
+
+

TS (Thompson Sampling)

+
+
単目的の場合の Thompson Sampling では、各候補(test_X)について、目的関数の事後分布からサンプリングを行い、値が最大となる候補を次の探索点として推薦します。
+
多目的の場合は、サンプリングした値についてパレートルールの上で最大となる候補、つまりパレート最適な候補の中からランダムに1つ選択して次の探索点とします。
+
+
    +
  • 参考文献

    +
      +
    • Yahyaa, Saba Q., and Bernard Manderick. 「Thompson sampling for multi-objective multi-armed bandits problem.」 Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015.

    • +
    +
  • +
+
+
[ ]:
+
+
+
policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
+policy.set_seed(0)
+
+policy.random_search(max_num_probes=10, simulator=simu)
+res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)
+
+
+
+
+

パレート解のプロット

+
+
[25]:
+
+
+
plot_pareto_front(res_TS)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_47_0.png +
+
+
+
+

劣解領域体積

+
+
[26]:
+
+
+
res_TS.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[26]:
+
+
+
+
+0.16415446221006114
+
+
+
+
+
+
+

付録:全探索

+
+
random_searchmax_num_probes に全データ数 (N = test_X.shape[0]) を渡すと手軽に全探索できます。
+
全データの評価には時間がかかるため、あらかじめデータ数を減らしておきます。
+
+
+
[ ]:
+
+
+
test_X_sparse = np.array(list(itertools.product(np.linspace(-2, 2, 21), repeat=2)))
+simu_sparse = simulator(test_X_sparse)
+
+policy = physbo.search.discrete_multi.policy(test_X=test_X_sparse, num_objectives=2)
+policy.set_seed(0)
+
+N = test_X_sparse.shape[0]
+res_all = policy.random_search(max_num_probes=N, simulator=simu_sparse)
+
+
+
+
+
[28]:
+
+
+
plot_pareto_front(res_all)
+
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_objective_53_0.png +
+
+
+
[29]:
+
+
+
res_all.pareto.volume_in_dominance([-1,-1],[0,0])
+
+
+
+
+
[29]:
+
+
+
+
+0.30051687493437484
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_multi_objective.ipynb b/manual/v2.0.2/ja/notebook/tutorial_multi_objective.ipynb new file mode 100644 index 00000000..2f0d6ed7 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_multi_objective.ipynb @@ -0,0 +1,975 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 多目的最適化\n", + "\n", + "最適化したい目的関数が複数 ($p$ 個) ある場合は、多目的最適化をおこないます。 \n", + "本チュートリアルでは、「解」は目的関数の組 $y = (y_1(x), y_2(x), \\dots, y_p(x))$ を意味することに注意してください。 \n", + "解の大小関係 $\\prec$ を以下のように定義します。 \n", + "\n", + "$y \\prec y^{'}\\Longleftrightarrow \\forall \\ i \\le p, y_i \\le y^{'}_i \\land \\exists \\ j \\le p, y_j < y^{'}_j$ \n", + "\n", + "(最大化問題における) **パレート解** とは、上記の大小関係の上で、自身よりも大きな解がないような解を指します。 \n", + "すなわち、任意の目的関数の値を改善しようとした場合、他の目的関数のうちどれかひとつは悪化するような解です。 \n", + "目的関数間にトレードオフが存在する場合は、パレート解は複数存在するため、それらを効率的に求めることが課題となります。\n", + "\n", + "PHYSBOでは、パレート解を効率的に求めるためのベイズ最適化手法を実装しています。 " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.657438Z", + "start_time": "2021-01-05T06:06:13.061216Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import physbo\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## テスト関数\n", + "\n", + "本チュートリアルでは、多目的最適化のベンチマーク関数である VLMOP2 を利用します。 \n", + "目的関数の数は2つです。\n", + "\n", + "$$\n", + "\\begin{split}\n", + " y_1(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i - 1/\\sqrt{N}\\right)^2\\right] \\\\\n", + " y_2(\\vec{x}) &= 1 - \\exp\\left[-\\sum_{i=1}^N\\left( x_i + 1/\\sqrt{N}\\right)^2\\right]\n", + "\\end{split}\n", + "$$\n", + "\n", + "$y_1$ と $y_2$ はそれぞれ $x_1 = x_2 = \\cdots x_N = 1/\\sqrt{N}$ と $x_1 = x_2 = \\cdots x_N = -1/\\sqrt{N}$ に最小値があり、その値はともに0です。また、上界は1 です。\n", + "\n", + "PHYSBO は最大化問題を仮定するため、-1を掛けたものをあらためて目的関数とします。\n", + "\n", + "- 参考文献\n", + " - Van Veldhuizen, David A. Multiobjective evolutionary algorithms: classifications, analyses, and new innovations. No. AFIT/DS/ENG/99-01. AIR FORCE INST OF TECH WRIGHT-PATTERSONAFB OH SCHOOL OF ENGINEERING, 1999." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.662277Z", + "start_time": "2021-01-05T06:06:13.658957Z" + } + }, + "outputs": [], + "source": [ + "def vlmop2_minus(x):\n", + " n = x.shape[1]\n", + " y1 = 1 - np.exp(-1 * np.sum((x - 1/np.sqrt(n)) ** 2, axis = 1))\n", + " y2 = 1 - np.exp(-1 * np.sum((x + 1/np.sqrt(n)) ** 2, axis = 1))\n", + "\n", + " return np.c_[-y1, -y2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 探索候補データの準備\n", + "\n", + "入力空間 $\\vec{x}$ は 2次元とし、[-2, 2] × [-2, 2] の上で候補点をグリッド状に生成します。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.676772Z", + "start_time": "2021-01-05T06:06:13.664110Z" + } + }, + "outputs": [], + "source": [ + "import itertools\n", + "a = np.linspace(-2,2,101)\n", + "test_X = np.array(list(itertools.product(a, a)))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.683329Z", + "start_time": "2021-01-05T06:06:13.678152Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-2. , -2. ],\n", + " [-2. , -1.96],\n", + " [-2. , -1.92],\n", + " ...,\n", + " [ 2. , 1.92],\n", + " [ 2. , 1.96],\n", + " [ 2. , 2. ]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.688238Z", + "start_time": "2021-01-05T06:06:13.684556Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(10201, 2)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.693027Z", + "start_time": "2021-01-05T06:06:13.690029Z" + } + }, + "outputs": [], + "source": [ + "class simulator(object):\n", + " def __init__(self, X):\n", + " self.t = vlmop2_minus(X)\n", + " \n", + " def __call__( self, action):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.699166Z", + "start_time": "2021-01-05T06:06:13.694489Z" + } + }, + "outputs": [], + "source": [ + "simu = simulator(test_X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 関数のプロット\n", + "\n", + "2つの目的関数をそれぞれプロットしてみましょう。 \n", + "1つ目の目的関数は右上にピークがあり、2つ目の目的関数は左下にピークがあるようなトレードオフがある状態となっています。\n", + "(星はピークの位置です)\n", + "\n", + "### 1つ目の目的関数" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:13.958020Z", + "start_time": "2021-01-05T06:06:13.701129Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.imshow(simu.t[:,0].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 1\")\n", + "plt.colorbar()\n", + "plt.plot([1.0/np.sqrt(2.0)], [1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2つ目の目的関数" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.158089Z", + "start_time": "2021-01-05T06:06:13.960026Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot objective 2\n", + "plt.figure()\n", + "plt.imshow(simu.t[:,1].reshape((101,101)), vmin=-1.0, vmax=0.0, origin=\"lower\", extent=[-2.0, 2.0, -2.0, 2.0])\n", + "plt.title(\"objective 2\")\n", + "plt.colorbar()\n", + "plt.plot([-1.0/np.sqrt(2.0)], [-1.0/np.sqrt(2.0)], '*')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行\n", + "\n", + "### policy のセット\n", + "\n", + "多目的最適化用の `physbo.search.discrete_multi.policy` を利用します。 \n", + "`num_objectives` に目的関数の数を指定してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.163097Z", + "start_time": "2021-01-05T06:06:14.159742Z" + } + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "通常の `physbo.search.discrete.policy` (目的関数が1つの場合)と同じく、`random_search` または `bayes_search` メソッドを呼ぶことで最適化を行います。 \n", + "基本的なAPIや利用方法は `discrete.policy` とおおよそ共通しています。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ランダムサーチ" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.316770Z", + "start_time": "2021-01-05T06:06:14.164245Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "目的関数の評価値(の array) とそのときの action ID が表示されます。 \n", + "また、パレート解集合 (Pareto set) が更新されたときにメッセージを表示します。\n", + "\n", + "Pareto set が更新された際に中身を表示したい場合は、`disp_pareto_set=True` と指定します。 \n", + "Pareto set は1つ目の目的関数値の昇順でソートされています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.493398Z", + "start_time": "2021-01-05T06:06:14.318132Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "res_random = policy.random_search(max_num_probes=50, simulator=simu, disp_pareto_set=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 結果の確認\n", + "\n", + " #### 評価値の履歴" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.498984Z", + "start_time": "2021-01-05T06:06:14.494679Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "res_random.fx[0:res_random.num_runs]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解の取得" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.504080Z", + "start_time": "2021-01-05T06:06:14.500385Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[-0.95713719, -0.09067194],\n", + " [-0.92633083, -0.29208351],\n", + " [-0.63329589, -0.63329589],\n", + " [-0.52191048, -0.72845916],\n", + " [-0.26132949, -0.87913689],\n", + " [-0.17190645, -0.91382463]]),\n", + " array([40, 3, 19, 16, 29, 41]))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "front, front_num = res_random.export_pareto_front()\n", + "front, front_num" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 解(評価値)のプロット\n", + "\n", + "これ以降、図示する空間が $y = (y_1, y_2)$ であり $x = (x_1, x_2)$ ではないことにあらためて注意してください。\n", + "\n", + "赤のプロットがパレート解です。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.511086Z", + "start_time": "2021-01-05T06:06:14.505221Z" + } + }, + "outputs": [], + "source": [ + "def plot_pareto_front(res):\n", + " front, front_num = res.export_pareto_front()\n", + " dominated = [i for i in range(res.num_runs) if i not in front_num]\n", + " points = res.fx[dominated, :]\n", + "\n", + " plt.figure(figsize=(7, 7))\n", + " plt.scatter(res.fx[dominated,0], res.fx[dominated,1], c = \"blue\")\n", + " plt.scatter(front[:, 0], front[:, 1], c = \"red\")\n", + " plt.title('Pareto front')\n", + " plt.xlabel('Objective 1')\n", + " plt.ylabel('Objective 2')\n", + " plt.xlim([-1.0,0.0])\n", + " plt.ylim([-1.0,0.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.661288Z", + "start_time": "2021-01-05T06:06:14.512392Z" + }, + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_random)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域 (dominated region) の体積を計算\n", + "\n", + "パレート解ではない解、すなわち、「自らよりも優れた解 $y'$ が存在する解 $y$ 」 を劣解と呼びます ($\\exists y' y \\prec y'$)。 \n", + "解空間(の部分空間)のうち、劣解の占める空間である劣解領域の体積は、多目的最適化の結果を示す指標のひとつです。 \n", + "この値が大きいほど、より良いパレート解が多く求まっていることになります。\n", + "\n", + "`res_random.pareto.volume_in_dominance(ref_min, ref_max)` は、\n", + "`ref_min`, `ref_max` で指定された矩形(hyper-rectangle) 中の劣解領域体積を計算します。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:14.666649Z", + "start_time": "2021-01-05T06:06:14.662809Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2376881844865093" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_random.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ベイズ最適化\n", + "\n", + "多目的の場合の `bayes_search` では、`score` には以下のいずれかを指定します。\n", + "\n", + "- HVPI (HyperVolume-based Probability of Improvement)\n", + "- EHVI (Expected Hyper-Volume Improvement)\n", + "- TS (Thompson Sampling)\n", + "\n", + "以下、score を変えてそれぞれ 50回 (ランダムサーチ10回 + ベイズ最適化 40回) 評価を行います。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### HVPI (HyperVolume-based Probability of Improvement)\n", + "\n", + "多次元の目的関数空間における非劣解領域 (non-dominated region) の改善確率を score として求めます。 \n", + "\n", + "- 参考文献\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.019463Z", + "start_time": "2021-01-05T06:06:14.668034Z" + }, + "scrolled": false + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_HVPI = policy.bayes_search(max_num_probes=40, simulator=simu, score='HVPI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット\n", + "\n", + "ランダムサンプリングと比較して、パレート解が多く求まっていることが分かります。" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.190434Z", + "start_time": "2021-01-05T06:06:29.020967Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_HVPI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:06:29.196389Z", + "start_time": "2021-01-05T06:06:29.191710Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.32877907991633726" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_HVPI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### EHVI (Expected Hyper-Volume Improvement)\n", + "\n", + "多次元の目的関数空間における非劣解領域 (non-dominated region) の改善期待値を score として求めます。 \n", + "\n", + "- 参考文献\n", + " - Couckuyt, Ivo, Dirk Deschrijver, and Tom Dhaene. \"Fast calculation of multiobjective probability of improvement and expected improvement criteria for Pareto optimization.\" Journal of Global Optimization 60.3 (2014): 575-594." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.237335Z", + "start_time": "2021-01-05T06:06:29.201353Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_EHVI = policy.bayes_search(max_num_probes=40, simulator=simu, score='EHVI', interval=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.386473Z", + "start_time": "2021-01-05T06:08:41.239067Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAG5CAYAAAAOKnSzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAkAklEQVR4nO3df5Rtd13f/+fr5ibBIWB+QEP4MXP5EYEgiGQEESkuTChaIcGlIh0lWbVMaaqr66sUU8dv8ateQZDWtpTWEUoCORUxIIQfGvKjYNWg3Cu/mqQaoLmXQAjhlyZONZC8v3/sPcncm5k9Z+bO+THnPB9rzdpnf84++7xnrzvndfc+n/35pKqQJEnr2zPqAiRJGmcGpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUplSS05P8UZI7krx+1PVI48qglHZYkpuT/N8kdya5LcklSU4awPtckuRXj2EXi8CXgQdX1c/tUFn3ao/DOTu9X2nYDEppMF5QVScBTwPmgV/cyovTGPTf5xxwQ20w6kiSvQN+f2lXMCilAaqqzwN/AHx7klOSvC/J7Um+1j5+5Oq2ST6UZH+SPwFWgMckeUKSq5J8NclfJvmxdttFYAF4ZXvm+t62/Yntfr6e5PokL1yvriSXABesef05SX4pyeVJLkvyN8CFSR6e5Ir2/T+d5GVr9vFLSd6R5K3t5dvrk8y3z70NmAXe2+7/lTt/dKXhMCilAUryKOAHgY/R/L29heZMbhb4v8AbjnrJT9JcEn0QcDtwFfDfgX8A/DjwxiRnVdUy0ANeW1UnVdULkhwPvBf4YLv9zwC9JI8/uq6quvCo11/dPnUecDlwcvv824FbgIcDPwL8WpLnrtnVC9ttTgauWP19quongcO0Z9ZV9dotHThpjBiU0mC8O8nXgT8GPgz8WlV9pareWVUrVXUHsB94zlGvu6Sqrq+qbwLPB26uqrdU1Ter6mPAO4Ef3eA9vxs4CXhNVd1VVdcC7wNesoW6r6uqd1fVPcBDgGcBP19Vf1dVHwfeBLx0zfZ/XFUfqKq7gbcB37GF95J2Bb+DkAbj/DVnaQAkmQH+PU0AntI2PyjJcW3QAHxuzUvmgGe0gbtqL00grefhwOfakFt1CHjEFupe+/4PB77ahvra/c2vWf/imscrwAOS7G2DXpoIBqU0PD8HPB54RlV9MclTaS7JZs02azvWfA74cFWdu8H+ju6E8wXgUUn2rAnLWeCvtlDj2n1+ATg1yYPWhOUs8Plt7Evatbz0Kg3Pg2i+l/x6klOBV22y/fuAb0vyk0mOb3++K8kT2+dvAx6zZvs/ozmre2W77fcBL6D5DnHLqupzwJ8Cr07ygCRPAX4KuKzPXRxdn7QrGZTS8Pwm8C009y5+BPjDro3bs7jn0XTi+QLNZc5fB05sN3kzcFbbw/XdVXUXTTD+QPsebwReWlX/+xhqfgmwr33/3wdedfQl5Q6vBn6xre8Vx1CDNFJx4mZJkjbmGaUkSR1GGpRJnt/eRP3pJBev8/yJSX63ff7PkuwbQZmSpCk2sqBMchzwn2m+TzkLeEmSs47a7KeAr1XV42i61f/6cKuUJE27UZ5RPh34dFV9tu2E8HaaUUHWOg+4tH18OfD9SYIkSUMyyvsoH8GRNzffAjxjo22q6ptJ/ho4jaZH373acS8XAR74wAee/YQnPAGAgwfhbA52V7FnD8zNwamnbvsXkSSNt4MHD365qh66nddOxIAD7biXywDz8/N14MABABK4nH3s49DGL77nnuanfY0kafIk6QiCbqO89Pp54FFr1h/J/Uf8uHebdsqfbwW+spU3+QX2cw+bXK09fHgru5QkTZFRBuVHgTOTPDrJCTQ3VV9x1DZX0EwFBM3MBdduNHfeek46CX6HBd7Iy7vDcnZ2S4VLkqbHyIKyHTT5p4ErgRuBd1TV9Ul+ec0cem8GTkvyaeBngfvdQtLlv/7X5ivIn+GN/ARv43ZOu//gkzMzsH//sf0ykqSJNXEj86z9jhKg14OXvxzuvLNZfwk9fo0lZjnMymmznPQf9sPCwoiqlSQNQ5KDVTW/+Zb3N/Ej8ywswB13wGWXNZ1b354Fvm/uZn7nsns46cs3G5KSpE4T0eu1HwsLZqIkaesm/oxSkqRjYVBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAo1+r1YN8+2LOnWfZ6o65IkjRie0ddwNjo9WBxEVZWmvVDh5p1gIWF0dUlSRopzyhXLS3dF5KrVlaadknS1DIoVx0+vLV2SdJUMChXzc5urV2SNBUMylX798PMzJFtMzNNuyRpahmUqxYWYHkZ5uYgaZbLy3bkkaQpZ6/XtRYWDEZJ0hE8o5QkqYNBuVUOSiBJU8VLr1vhoASSNHU8o9wKByWQpKljUG6FgxJI0tQxKLfCQQkkaeoYlFvhoASSNHUMyq1wUAJJmjr2et0qByWQpKniGaUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQbnTej3Ytw/27GmWvd6oK5IkHQPno9xJvR4sLsLKSrN+6FCzDs5hKUm7lGeUO2lp6b6QXLWy0rRLknYlg3InHT68tXZJ0tgzKHfS7OzW2iVJY8+g3En798PMzJFtMzNNuyRpVzIod9LCAiwvw9wcJM1yedmOPJK0i9nrdactLBiMkjRBPKOUJKmDQSlJUoeRBGWSU5NcleSmdnnKOts8Ncl1Sa5P8skkLx5FrZKk6TaqM8qLgWuq6kzgmnb9aCvAS6vqScDzgd9McvLwSpQkaXRBeR5wafv4UuD8ozeoqr+qqpvax18AvgQ8dFgFSpIEowvK06vq1vbxF4HTuzZO8nTgBOAzGzy/mORAkgO33377zlYqSZpqA7s9JMnVwMPWeeqIgU+rqpJUx37OAN4GXFBV96y3TVUtA8sA8/PzG+5LkqStGlhQVtU5Gz2X5LYkZ1TVrW0QfmmD7R4MvB9YqqqPDKhUSZI2NKpLr1cAF7SPLwDec/QGSU4Afh94a1VdPsTaJEm616iC8jXAuUluAs5p10kyn+RN7TY/BvxD4MIkH29/njqSaiVJUytVk/WV3vz8fB04cGDUZUiSxkiSg1U1v53XOjKPJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoByVXg/27YM9e5plrzfqiiRJ6xjYyDzq0OvB4iKsrDTrhw416wALC6OrS5J0P55RjsLS0n0huWplpWmXJI0Vg3IUDh/eWrskaWQMylGYnd1auyRpZAzKUdi/H2ZmjmybmWnaJUljxaAchYUFWF6GuTlImuXysh15JGkM2et1VBYWDEZJ2gU8o5QkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR1MCglSepgUEqS1MGglCSpg0EpSVIHg1KSpA4GpSRJHQzKcdTrwb59sGdPs+z1Rl2RJE0tg/IYDCTPej1YXIRDh6CqWS4uGpaSNCIG5TYNLM+WlmBl5ci2lZWmXZI0dAblNg0szw4f3lq7JGmgDMptGliezc5urV2SNFAG5TYNLM/274eZmSPbZmaadknS0BmU2zSwPFtYgOVlmJuDpFkuLzftkqSh2zvqAnar1dxaWmout87ONiG5I3m2sGAwStKYMCiPgXkmSZPPS6+SJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUk6TXg337YM+eZtnrjboiSdr19o66AO2QXg8WF2FlpVk/dKhZB1hYGF1dkrTLeUY5KZaW7gvJVSsrTbskadsMyklx+PDW2iVJfTEoJ8Xs7NbaJUl9MSgnxf79MDNzZNvMTNMuSdo2g3JSLCzA8jLMzUHSLJeX7cgjScfIXq+TZGHBYJSkHeYZpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdRhKUSU5NclWSm9rlKR3bPjjJLUneMMwaJUmC0Z1RXgxcU1VnAte06xv5FeCPhlLVNOn1YN8+2LOnWfZ6o65IksbSqILyPODS9vGlwPnrbZTkbOB04IPDKWtK9HqwuAiHDkFVs1xcNCwlaR2jCsrTq+rW9vEXacLwCEn2AK8HXrHZzpIsJjmQ5MDtt9++s5VOoqUlWFk5sm1lpWmXJB1hYLOHJLkaeNg6Tx3xaVxVlaTW2e4i4ANVdUuSzveqqmVgGWB+fn69fWmtw4e31i5JU2xgQVlV52z0XJLbkpxRVbcmOQP40jqbPRN4dpKLgJOAE5LcWVVd32eqH7OzzeXW9dolSUcY1aXXK4AL2scXAO85eoOqWqiq2araR3P59a2G5A7Zvx9mZo5sm5lp2iVJRxhVUL4GODfJTcA57TpJ5pO8aUQ1TY+FBVhehrk5SJrl8rKTPkvSOlI1WV/pzc/P14EDB0ZdhiRpjCQ5WFXz23mtI/NIktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSkmSOhiUkiR12DAo23kgX53kbUn+yVHPvXHwpUmSNHpdZ5RvAQK8E/jxJO9McmL73HcPvDJJksZAV1A+tqourqp3V9ULgb8Ark1y2pBqkyRp5LpmDzkxyZ6qugegqvYn+TzwRzSzeUiSNPG6zijfCzx3bUNVXQL8HHDXAGvSuOn1YN8+2LOnWfZ6o65IkoZmwzPKqnrlBu1/CJw5sIo0Xno9WFyElZVm/dChZh2cbUTSVPD2EHVbWrovJFetrDTtkjQFDEp1O3x4a+2SNGEMSnWbnd1auyRNmE2DMslMkv83yW+362cm+aHBl6axsH8/zMwc2TYz07RL0hTo54zyLcDfA89s1z8P/OrAKtohdtTcIQsLsLwMc3OQNMvlZTvySJoaXfdRrnpsVb04yUsAqmolSQZc1zGxo+YOW1jwwEmaWv2cUd6V5FuAAkjyWJozzLFlR01J0k7p54zyl4A/BB6VpAc8C7hwgDUdMztqSpJ2yqZBWVUfTHKQZiD0AP+qqr488MqOwexsc7l1vXZJkrain16v7wWeB3yoqt437iEJdtSUJO2cfr6j/A3g2cANSS5P8iNJHjDguo6JHTUlSTtl06Csqg9X1UXAY4DfAn4M+NKgCztWCwtw881wzz3N0pDcYd5/I2lK9NOZh7bX6wuAFwNPAy4dZFEac95/I2mK9PMd5TuAG2mm3HoDzX2VPzPowjTGvP9G0hTp54zyzcBLquruQRejXcL7byRNkQ2DMslzq+pa4IHAeUcPxlNV7xpwbRpX3n8jaYp0nVE+B7iW5rvJoxVgUE6r/fuP/I4SvP9G0sTaMCir6lXtw1+uqv+z9rkkjx5oVRpvqx12lpaay62zs01I2pFH0gTq5zvKd9L0dF3rcuDsnS9Hu4YDpUuaEl3fUT4BeBLwrUl+eM1TDwbGesABSZJ2StcZ5eOBHwJO5sjvKe8AXjbAmiRJGhtd31G+B3hPkmdW1XVDrEmSpLHRz1ivL09y8upKklOS/LfBlSRJ0vjoJyifUlVfX12pqq8B3zmwiiRJGiP9BOWeJKesriQ5lT7HiJUkabfrJyhfD1yX5FeS/Arwp8BrB1uWJpozj0jaRTY9M6yqtyY5QDMoOsAPV9UNgy1LE8uZRyTtMv2cUQKcCvxtVb0BuN2RebRtzjwiaZfpZ5qtVwE/D/ybtul44LJBFqUJ5swjknaZfs4oXwS8EPhbgKr6AvCgQRalCbbRDCPOPCJpTPUTlHdVVdHMGEKSBw62JE20/fubmUbWcuYRSWOsn6B8R5LfAk5O8jLgauC3B1uWJtbCAiwvw9wcJM1yedmOPJLGVpqTxU02Ss4FngcEuLKqrhp0Yds1Pz9fBw4cGHUZkqQxkuRgVc1v57V9DRzQBuPYhqMkSYOy4aXXJH/cLu9I8jfr/PyfJBcNr1RJkoava/aQ722X6/ZwTXIazSg9bxxMaZIkjV5fl16TPA34Xpqer39cVR+rqq8k+b4B1iZJ0sj1M+DAvwUuBU4DHgJckuQXAarq1sGWJ0nSaPVzRrkAfEdV/R1AktcAHwd+dYB1SZI0Fvq5j/ILwAPWrJ8IfH4w5UiSNF42PKNM8p9ovpP8a+D6JFe16+cCfz6c8iRJGq2uS6+rd+0fBH5/TfuHBlaNJEljpuv2kEsBkjwAeFzb/OnV7yolSZoGXQMO7E3yWuAWml6vbwU+l+S1SY4fVoGSJI1SV2ee19FM2Pzoqjq7qp4GPBY4GfiNIdQmSdLIdQXlDwEvq6o7Vhuq6m+AfwH84KALkyRpHHQFZdU6U4tU1d20c1NKkjTpuoLyhiQvPboxyU8A/3twJUmSND66bg/5l8C7kvxTmltEAOaBbwFeNOjCJEkaB123h3weeEaS5wJPaps/UFXXDKUySZLGwKZjvVbVtcC1Q6hFkqSx089Yr9L46/Vg3z7Ys6dZ9nqjrkjShOhrPkpprPV6sLgIKyvN+qFDzTrAwsLo6pI0ETyj1O63tHRfSK5aWWnaJekYGZTa/Q4f3lq7JG3BSIIyyalJrkpyU7s8ZYPtZpN8MMmNSW5Ism/IpWo3mJ3dWrskbcGozigvBq6pqjOBa9r19bwVeF1VPRF4OvClIdWn3WT/fpiZObJtZqZpl6RjNKqgPI9mRhLa5flHb5DkLGBvVV0FUFV3VtXK0dtJLCzA8jLMzUHSLJeX7cgjaUdkneFcB/+myder6uT2cYCvra6v2eZ84J8BdwGPBq4GLm7Hmj16f4vAIsDs7OzZhw4dGmT5kqRdJsnBqprfzmsHdntIkquBh63z1BFdEauqkqyX1nuBZwPfCRwGfhe4EHjz0RtW1TKwDDA/P++A7ZKkHTOwoKyqczZ6LsltSc6oqluTnMH63z3eAny8qj7bvubdwHezTlBKkjQoo/qO8grggvbxBcB71tnmo8DJSR7arj8XuGEItUmSdK9RBeVrgHOT3ASc066TZD7Jm+DeeS9fAVyT5FNAgN8eUb2SpCk1ks48g3TiifP1jW8cYHa2uTvAjo+SpLHszDMqd93VLB3uU5K0EyZ6CDuH+5QkHauJDkpwuE9J0rGZ+KB0uE/1xfksJW1g4r6jXMvhPtUX57OU1MFer9K+fU04Hm1uDm6+edjVSBoAe72u8eQnw4EDo65Cu4rzWUrqMPHfUUqbcj5LSR0MSsn5LCV1MCgl57OU1GHivqOUtmVhwWCUtC7PKKV+eJ+lNLU8o5Q2432W0lTzjFLazNLSfSG5yoGEpalhUEqb8T5LaaoZlNJmvM9SmmoGpbQZ77OUpppBKW3G+yylqWavV6kf3mcpTS3PKCVJ6mBQSpLUwaCUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJIkdTAoJUnqYFBKktTBoJQkqYNBKUlSB4NSkqQOBqUkSR0MSmmc9Hqwbx/s2dMse71RVyRNPYPyGPiZph3V68HiIhw6BFXNcnHRf1jSiBmU2+Rnmnbc0hKsrBzZtrLStEsaGYNym/xM0447fHhr7ZKGwqDcJj/TtONmZ7fWLmkoDMpt8jNNO27/fpiZObJtZqZplzQyBuU2+ZmmHbewAMvLMDcHSbNcXm7aJY3M3lEXsFutfnYtLTWXW2dnm5D0M03HZGHBf0TSmDEoj4GfaZI0+bz0KklSB4NSkqQOBqUkSR0MSkmSOhiU0iRyIGJpx9jrVZo0qwMRr46xuDoQMdhNW9oGzyilSeNAxNKOMiilSeNAxNKOMiilSeNAxNKOMiilSeNAxNKOMiilSePg6tKOsterNIkciFjaMZ5RSpLUwaCUJKmDQSlJUgeDUpKkDgalpG6OG6spZ69XSRtz3FjJM0pJHRw3VjIoJXVw3FjJoJTUwXFjJYNSUgfHjZUMSkkdHDdWsterpE04bqymnGeUkiR1GElQJjk1yVVJbmqXp2yw3WuTXJ/kxiT/MUmGXaskabqN6ozyYuCaqjoTuKZdP0KS7wGeBTwF+Hbgu4DnDLNISZJGFZTnAZe2jy8Fzl9nmwIeAJwAnAgcD9w2jOIkSVo1qqA8vapubR9/ETj96A2q6jrgfwC3tj9XVtWN6+0syWKSA0kO3H777YOqWZI0hQbW6zXJ1cDD1nnqiLGvqqqS1DqvfxzwROCRbdNVSZ5dVf/z6G2rahlYBpifn7/fviRJ2q6BBWVVnbPRc0luS3JGVd2a5AzgS+ts9iLgI1V1Z/uaPwCeCdwvKCVJGpRRXXq9ArigfXwB8J51tjkMPCfJ3iTH03TkWffSqyRJgzKqoHwNcG6Sm4Bz2nWSzCd5U7vN5cBngE8BnwA+UVXvHUWxkqTpNZKgrKqvVNX3V9WZVXVOVX21bT9QVf+sfXx3Vf3zqnpiVZ1VVT87ilolDZkTRWvMOISdpPHhRNEaQw5hJ2l8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpBBKWl8OFG0xpC9XiWNFyeK1pjxjFKSpA4GpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUNN2crUSb8D5KSdPL2UrUB88oJU0vZytRHwxKSdPL2UrUB4NS0vRythL1waCUNL2crUR9MCglTS9nK1Ef7PUqabo5W4k24RmlJEkdDEpJkjoYlJIkdTAoJWmYHDJv17EzjyQNi0Pm7UqeUUrSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kUErSsDhk3q5kr1dJGiaHzNt1PKOUJKmDQSlJUgeDUpKkDgalJEkdDEpJkjoYlJI0TRyUfcu8PUSSpoWDsm+LZ5SSNC0clH1bDEpJmhYOyr4tBqUkTQsHZd8Wg1KSpoWDsm+LQSlJ08JB2bfFXq+SNE0clH3LPKOUJKmDQSlJUgeDUpKkDgalJGn4dtFQenbmkSQN1y4bSs8zSknScO2yofQMSknScO2yofQMSkkagosugr17m/v89+5t1qfWLhtKz6CUpAG76CL4L/8F7r67Wb/77mZ9asNylw2lZ1BK0oAtL2+tfeLtsqH0UlWjrmFHnXjifH3jGweYnW3+czKmx13SFEk2fm7CPoLHVpKDVTW/nddO3BnlXXc1//BWexuP8a05kqbEccdtrV3jZeKCcq0x7m0saYqs3iLYb7vGy8QPODCmvY0lTZE3vrFZLi83HXmOO64JydV2jbeJ+44ymS84cO/63BzcfPPo6pEkjUiv11xWPHyY76i66xNVJ25nNxN9RjnGvY0lSYPU6/H3Fy5y4jebEYCOhxO2u6uJ+47yhBN2RW9jSdIAfeXlS/eG5LGauDPKJz8ZDhzYfDtJ0uQ65c6d66AycWeUkqTp1uvBYXZuODyDUpI0UZaW4BfYz051VTUoJUkT5fBh+B0W+CRn7UhYTlxQfupTu2LCbGns7aIJ6KUjrE5C8lSu54N8/zGH5UiCMsmPJrk+yT1JNhx7L8nzk/xlkk8nubiffTuEXf8m4YNwXH+Hca2rX6sT0B865N+Tdp+1k5M8n6vZQ3GQs7e/w6oa+g/wRODxwIeA+Q22OQ74DPAYmvtfPgGctfm+z67mT7v5mZsrreOyy6pmZuqIYzUz07TvFuP6O4xrXVsxN3dk/f49abe57LLm32uy+u/5IZ+tbWbWSEfmSfIh4BVVdb8bOpI8E/ilqvpH7fq/AaiqV3fv88iReRK4556drHoy7NvXnCUcbTeNZDSuv8O41rUVe/asP6uFf0/arY5l9pBxvo/yEcDn1qzfAjxjvQ2TLALt8MInAvcdi6pv3JV88lODKnL3Onud6xC3c+jQQ0kOHhx+Pdux3u/QhNSQf4eHAF++b3Vs6joGT3kyHH+/kUx2+O/pqOOmPnnctufx233hwIIyydXAw9Z5aqmq3rOT71VVy8By+74Hqg5s638N0645doc8dlvUHLft/U91mnnctsfjtj1Jtj0UzcCCsqrOOcZdfB541Jr1R7ZtkiQNzTjfHvJR4Mwkj05yAvDjwBUjrkmSNGVGdXvIi5LcAjwTeH+SK9v2hyf5AEBVfRP4aeBK4EbgHVV1fR+7Xx5Q2dPAY7c9Hrft8bhtj8dte7Z93CZuPkpJknbSOF96lSRp5AxKSZI67PqgHORweJMuyalJrkpyU7s8ZYPtXtse4xuT/MckGXat42QLx202yQfb43ZDkn1DLnWs9Hvc2m0fnOSWJG8YZo3jqJ/jluSpSa5r/04/meTFo6h1HGz2WZ/kxCS/2z7/Z/38Xe76oAT+F/DDwB9ttEGS44D/DPwAcBbwkiRnDae8sXYxcE1VnQlc064fIcn3AM8CngJ8O/BdwHOGWeQY2vS4td4KvK6qngg8HfjSkOobV/0eN4BfoeNvesr0c9xWgJdW1ZOA5wO/meTk4ZU4Hvr8rP8p4GtV9Tjg3wO/vtl+d31QVtWNVfWXm2z2dODTVfXZqroLeDtw3uCrG3vnAZe2jy8Fzl9nmwIeQDPe7onA8cBtwyhujG163No/zr1VdRVAVd1ZVStDq3A89fPvjSRnA6cDHxxOWWNv0+NWVX9VVTe1j79A85+yhw6rwDHSz2f92uN5OfD9m10l2/VB2af1hsN7xIhqGSenV9Wt7eMv0nw4HaGqrgP+B3Br+3NlVd04vBLH0qbHDfg24OtJ3pXkY0le1/5vd5ptetyS7AFeD7ximIWNuX7+vd0rydNp/mP7mUEXNob6+ay/d5v2NsS/Bk7r2uk4j/V6r2EOhzdpuo7d2pWqqiT3u1coyeNoZnt5ZNt0VZJnV9X/3PFix8ixHjeav61nA98JHAZ+F7gQePPOVjpeduC4XQR8oKpumaavwnfguK3u5wzgbcAFVeXw9TtkVwSlw+FtX9exS3JbkjOq6tb2D2y979BeBHykqu5sX/MHNANFTHRQ7sBxuwX4eFV9tn3Nu4HvZsKDcgeO2zOBZye5CDgJOCHJnVU10R3wduC4keTBwPtpTiA+MqBSx10/n/Wr29ySZC/wrcBXunY6LZdeHQ5vfVcAF7SPLwDWOzs/DDwnyd4kx9N05Jn2S6/9HLePAicnWf2e6LnADUOobZxtetyqaqGqZqtqH83l17dOekj2YdPj1n6u/T7N8bp8iLWNm34+69cezx8Brq3NRt7Z7kSW4/JDc8ZzC/D3NJ1MrmzbH05zCWd1ux8E/ormuv3SqOsehx+a6/LXADcBVwOntu3zwJvax8cBv0UTjjcA/27UdY/6p5/j1q6fC3wS+BRwCXDCqGvfDcdtzfYXAm8Ydd2j/unz7/QngG8AH1/z89RR1z6i43W/z3rgl4EXto8fAPwe8Gngz4HHbLZPh7CTJKnDtFx6lSRpWwxKSZI6GJSSJHUwKCVJ6mBQSpLUwaCUhijJI5O8p50J4jNJ/kN7vxdJLtxotowkf7rN9zt/7aDQSX45ybEO4NH3rD3SJDAopSFpB15+F/DuamaC+Daa0Wf2b/baqvqebb7t+TSzKKzu599W1dXb3Ndam87aI00Kg1IanucCf1dVbwGoqruB/wf4p0lm2m0eleRD7Rnnq1ZfmOTONY//dZKPtvMO/n9r2l/atn0iydvaKdJeCLwuyceTPDbJJUl+pJ2z7/fWvPb7kryvffy8dm7Dv0jye0lOOvoXqf5m7ZEmwq4Y61WaEE8CDq5tqKq/SXIYeFzb9HSaeT9XgI8meX9VHVjdPsnzgDPb7QJckeQf0oxV+YvA91TVl5OcWlVfTXIF8L5qhzVbM9D41cBykgdW1d8CLwbenuQh7X7Oqaq/TfLzwM/SjGwiTSWDUhovV1XVVwCSvAv4XuDAmuef1/58rF0/iSY4vwP4var6MkBVfbXrTarqm0n+EHhBksuBfwy8kmYs37OAP2lD9QTgup351aTdyaCUhucGmkGY79XO+DBLM+7k02gmyl7r6PUAr66q3zpqPz+zjXreDvw08FXgQFXd0X6PelVVvWQb+5Mmkt9RSsNzDTCT5KUA7UTOrwcuqaqVdptzk5ya5FtoOuL8yVH7uJLmO82T2n08Isk/AK4FfjTJaW37qe32dwAP2qCeD9OE88toQhPgI8Cz2nlISfLAJN92DL+ztOsZlNKQVDMDwYtoAu0mmhkO/g74hTWb/TnwTppZR9655vvJavfxQeC/A9cl+RRwOfCgqrqepvfsh5N8Avh37eveDvzrJB9L8tij6rkbeB/wA+2SqrqdZtaO30nySZrLrk84+ndJ8qIkt9DMH/n+JFdu+8BIY87ZQ6Qx154l/kVVzY26FmkaeUYpjbEkD6c5q/uNUdciTSvPKCVJ6uAZpSRJHQxKSZI6GJSSJHUwKCVJ6mBQSpLU4f8Hn3nY7utYbFAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_EHVI)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:08:41.402348Z", + "start_time": "2021-01-05T06:08:41.394521Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3200467412741881" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_EHVI.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TS (Thompson Sampling)\n", + "\n", + "単目的の場合の Thompson Sampling では、各候補(test_X)について、目的関数の事後分布からサンプリングを行い、値が最大となる候補を次の探索点として推薦します。 \n", + "多目的の場合は、サンプリングした値についてパレートルールの上で最大となる候補、つまりパレート最適な候補の中からランダムに1つ選択して次の探索点とします。\n", + "\n", + "- 参考文献\n", + " - Yahyaa, Saba Q., and Bernard Manderick. \"Thompson sampling for multi-objective multi-armed bandits problem.\" Proc. Eur. Symp. Artif. Neural Netw., Comput. Intell. Mach. Learn.. 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.534284Z", + "start_time": "2021-01-05T06:08:41.405209Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "policy.random_search(max_num_probes=10, simulator=simu)\n", + "res_TS = policy.bayes_search(max_num_probes=40, simulator=simu, score='TS', interval=10, num_rand_basis=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.716955Z", + "start_time": "2021-01-05T06:09:52.535519Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_TS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:52.722260Z", + "start_time": "2021-01-05T06:09:52.718300Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.16415446221006114" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_TS.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "code_folding": [] + }, + "source": [ + "## 付録:全探索\n", + "\n", + "`random_search` で `max_num_probes` に全データ数 (`N = test_X.shape[0]`) を渡すと手軽に全探索できます。 \n", + "全データの評価には時間がかかるため、あらかじめデータ数を減らしておきます。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.049904Z", + "start_time": "2021-01-05T06:09:52.723545Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "test_X_sparse = np.array(list(itertools.product(np.linspace(-2, 2, 21), repeat=2)))\n", + "simu_sparse = simulator(test_X_sparse)\n", + "\n", + "policy = physbo.search.discrete_multi.policy(test_X=test_X_sparse, num_objectives=2)\n", + "policy.set_seed(0)\n", + "\n", + "N = test_X_sparse.shape[0]\n", + "res_all = policy.random_search(max_num_probes=N, simulator=simu_sparse)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### パレート解のプロット" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.212669Z", + "start_time": "2021-01-05T06:09:53.051682Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_pareto_front(res_all)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 劣解領域体積" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "ExecuteTime": { + "end_time": "2021-01-05T06:09:53.218237Z", + "start_time": "2021-01-05T06:09:53.214184Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30051687493437484" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res_all.pareto.volume_in_dominance([-1,-1],[0,0])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_multi_probe.html b/manual/v2.0.2/ja/notebook/tutorial_multi_probe.html new file mode 100644 index 00000000..8da05fdf --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_multi_probe.html @@ -0,0 +1,377 @@ + + + + + + + + + 複数候補を一度に探索する — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

複数候補を一度に探索する

+

1回の探索ステップで、2つ以上の候補を一度に評価する場合のチュートリアルです。

+
+

探索候補データの準備

+

これまでのチュートリアルと同様、データセットファイル s5-210.csvdata ディレクトリ以下に保存し、次のように読み出します。

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+import matplotlib.pyplot as plt
+%matplotlib inline
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

simulator の定義

+
+
後述の num_search_each_probe を2以上にした場合、action には action ID の array が入力されます。
+
各 action ID に対応した評価値のリストを返すように定義してください。
+
+

基本チュートリアルと simulator の定義は同じですが、 t は numpy.array であり、action に array が入力されると self.t[action] も array になる点に留意してください。

+
+
[2]:
+
+
+
class simulator:
+    def __init__( self ):
+        _, self.t = load_data()
+
+    def __call__( self, action ):
+        return self.t[action]
+
+
+
+

simulator の実行例

+
+
[3]:
+
+
+
sim = simulator()
+sim([1,12,123])
+
+
+
+
+
[3]:
+
+
+
+
+array([-1.01487066, -1.22884748, -1.05572838])
+
+
+
+
+

最適化の実行

+
+
[4]:
+
+
+
# policy のセット
+policy = physbo.search.discrete.policy(test_X=X)
+
+# シード値のセット
+policy.set_seed( 0 )
+
+
+
+

num_search_each_probe によって、各探索ステップにおいて評価する候補数を指定することができます。

+

下記の実行例だと、ランダムサーチにより 2 ×10 = 20回、ベイズ最適化により 8 ×10 = 80回 simulator を評価することになります。

+

引数

+
    +
  • max_num_probes: 探索ステップ数

  • +
  • num_search_each_probe: 各探索ステップにおいて評価する候補数

  • +
+
+
[ ]:
+
+
+
res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())
+
+res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI',
+                                                  interval=2, num_rand_basis=100)
+
+
+
+
+
+

結果の確認

+
+
[6]:
+
+
+
plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[6]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7fe958b7fdc0>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_11_1.png +
+
+
+
[7]:
+
+
+
best_fx, best_action = res.export_all_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[7]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7fe9400e1e50>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_12_1.png +
+
+

res.export_sequence_best_fx() により、各ステップまでに得られたベスト値とその action の履歴 を得られます。

+
+
res.export_all_sequence_best_fx() との違いは、simulator の評価毎ではなく、探索ステップ毎の情報になるという点です。
+
(今回の場合は合計ステップ数は 10, 評価数は 100 です)
+
+
+
[8]:
+
+
+
best_fx, best_action = res.export_sequence_best_fx()
+plt.plot(best_fx)
+
+
+
+
+
[8]:
+
+
+
+
+[<matplotlib.lines.Line2D at 0x7fe9789468b0>]
+
+
+
+
+
+
+../_images/notebook_tutorial_multi_probe_14_1.png +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_multi_probe.ipynb b/manual/v2.0.2/ja/notebook/tutorial_multi_probe.ipynb new file mode 100644 index 00000000..ff94f5ef --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_multi_probe.ipynb @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 複数候補を一度に探索する\n", + "\n", + "1回の探索ステップで、2つ以上の候補を一度に評価する場合のチュートリアルです。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.096798Z", + "start_time": "2020-12-04T06:19:54.436605Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulator の定義\n", + "\n", + "後述の `num_search_each_probe` を2以上にした場合、action には action ID の array が入力されます。 \n", + "各 action ID に対応した評価値のリストを返すように定義してください。\n", + "\n", + "基本チュートリアルと simulator の定義は同じですが、\n", + "t は numpy.array であり、action に array が入力されると `self.t[action]` も array になる点に留意してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.100697Z", + "start_time": "2020-12-04T06:19:55.098103Z" + } + }, + "outputs": [], + "source": [ + "class simulator:\n", + " def __init__( self ):\n", + " _, self.t = load_data()\n", + " \n", + " def __call__( self, action ):\n", + " return self.t[action]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "simulator の実行例" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.218606Z", + "start_time": "2020-12-04T06:19:55.102879Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.01487066, -1.22884748, -1.05572838])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim = simulator()\n", + "sim([1,12,123])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 最適化の実行" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:19:55.224761Z", + "start_time": "2020-12-04T06:19:55.220423Z" + } + }, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`num_search_each_probe` によって、各探索ステップにおいて評価する候補数を指定することができます。\n", + "\n", + "下記の実行例だと、ランダムサーチにより 2 ×10 = 20回、ベイズ最適化により 8 ×10 = 80回 simulator を評価することになります。 \n", + "\n", + "**引数** \n", + "\n", + "- `max_num_probes`: 探索ステップ数 \n", + "- `num_search_each_probe`: 各探索ステップにおいて評価する候補数" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.195375Z", + "start_time": "2020-12-04T06:19:55.226486Z" + } + }, + "outputs": [], + "source": [ + "res = policy.random_search(max_num_probes=2, num_search_each_probe=10, simulator=simulator())\n", + "\n", + "res = policy.bayes_search(max_num_probes=8, num_search_each_probe=10, simulator=simulator(), score='EI', \n", + " interval=2, num_rand_basis=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果の確認" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.312635Z", + "start_time": "2020-12-04T06:20:24.196633Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA+RElEQVR4nO2deXxb5ZX3v+dKsrwvsR0ntpM4e+KEJSEsCTQwELbAQGmHFrrR0g7TTvfS6cAwnZlO5+3MvJ3ptPN2pdBCC6ULEGjZdwIlLNkI2ffFzmLH8b7Jkp73D+nKki3ZTmTFsu75fj7+JLp6rOeR773nnuf3nHMeMcagKIqiZD7WWA9AURRFOT2owVcURXEIavAVRVEcghp8RVEUh6AGX1EUxSG4x3oAQ1FWVmZqamrGehiKoijjhnXr1h03xpTHey+tDX5NTQ1r164d62EoiqKMG0TkQKL3VNJRFEVxCGrwFUVRHIIafEVRFIegBl9RFMUhqMFXFEVxCGrwFUVRHIIafEVRFIegBl9RkiQYNPzmrYO8ve8EwaCWGx8JPX0BHl5XR0D/XqeVtE68UsYH33t+J90+P3ddU5vyvowx/Py1vVy1YDJTS3NT3t9I2FjXwj+seg+AikIv15xRyZdXzKYoxzPGI0tfHnzrIN9+Yiv5XjdXLZw01sNxDOrhKwnpCwR56O2D7G3sGLLdc1uO8tR7R0/LmDbVtfKdp7bzL3/aclr6Gwk7j7YD8I/XzOfM6mLuX7Of7z67fYxHdXq5/439fO6BdSNu/9iGegCe2HQ4VUNS4pCUwReRG0Vki4gERWTJEO2uEpEdIrJbRO5Ips/R4u7Ve/j8g+vZ3dA+1kM5KXr6ArR0+VLez4GmTm786RrufPQ9/v3pxMbLGENdczeHW7vp6Qsk3W+vf+jPeHZL6MHy0vYG3j3UknR/o8HOYx3keFzceuF0fv6JJXxoSTW/X1tHY3vvWA9tVNhwsJnN9a1DtnlsYz3Pbz2GPxAc9vN2N7TzXn0rRTkeXtzWQJfPH/P+aFxHSnyS9fA3Ax8AVidqICIu4EfA1UAtcLOIpH7uPwyPbTjMk+8d4crvv8Zdq97jeMf4uDm/9vuNfODHb6S0j8c31rPyB6+xp7GD82om8OrORtp7+uK2be3uo6PXjzFw6ERXUv1uqmth4T8/y65j8R/Cxhie2XyUxVOLKc718IMXdyXV32ixq6GdWRPzsSwB4LblM+kLBPnFn/fFbd8XCPLrNw/w0vZjKR1Xc2fyjoExhs8+sI73/+jP/GrNfuJtidrrD7Clvg1/0HBsBA+5xzYcxhL41+sX0N0X4KXtDZH3thxu5cxvPTes5//qzsakrzcnkpTBN8ZsM8bsGKbZecBuY8xeY4wP+C1wfTL9jgbH2npYecYkPnb+VH73ziH+5tdDT0e7fH4Ot3SfptHFZ9uRNp567yh7j3dyYsDN7A8EaWjrOanPe3Vn4yCPrKcvwNf/8C6zKgp45ivL+cZVc/H5gzE3ZTR1zf1/k33HO0+q/4G8e6iFvoDhz7uPx31/d0MHe493csPiav76fTPSxsvfcbSdORUFkdfTy/JYuXAyD6w5QNuAB+WGg8385f97nW8+tplb71vL3z64job2kztvI+He1/ex6NvP8x9Pb0+4kNwXCPL2vhM8vrGeX6/Zz49e3j3IiNY1d3OsrZeyfC//9PgW/v6RTYNmYZvr2/CFr6O6YYywMYbHNtZz4awyrj2zkvICL0+8eyTy/n88vR2fP8h/Pbsj4Wyho9fPZ+5/J7Juooyc06HhVwGHol7XhY+NGb3+AE2dPuZWFPKt6xdy60XTea+udVDEQEuXj5+9uoeP3vMmZ3/reS757ivUNY+dV/HDl3ZH/r/tSFvMe/evOcB533mRr//h3REZkN0NHdzyi7d5YVusl9na3UdfwHDjOdVUFeeweGoJkwqzeXLTkbifE20g9jclZ/D3HQ991sYERvyZzUcRgStrK7hlWU1cL7+ly8fru45z9+o9w8oQo0FrVx8N7b3MqciPOf65S2bS3uvnwTcPAnCi08c3H9vMB37yBi1dffz4o4v5uyvn8sK2Blb896us3tk44j4f31jPTXevSSh/vbD1GP/25FaqS3L46at7+OJvN0RkktbuPp7ZfISv/W4jS/7tBT70szV8+bcb+ebjW/juszsG/T3f2X8CgHs/uYQvXTqL36+t4+/+sCmmzYaDzZH/1w/jFK070Exdczc3LKrCZQkrF07i5R0NtPf08dquRl7bdZxL5pazv6mLR8M6/0De2H2cvoDhtV3H00qSfX3XcVq74s+Ebb7z1DbuXr3nNI1oMMNG6YjIC0C8ZfS7jDGPj/aAROQ24DaAqVOnJvVZxhhu+eU7LJ9dxmfeNyNyvKEtNO2cXJQNwMzyPHyBIIdbupkyoT/y42er9/KTV/YwpyKfj5w/lV+t2c9Dbx/k766cl9S4ToVdx9p5avMRbj5vCg+9fYhtR9q4cFZZ5P01e46T73Xz+MZ6ntl8lNuvmMOnLpye8PPsdYDGjtiZQmt36IItzg1FmFiWcNXCSfzm7YN09PrJ98ZeMraHn+2x2N+U3MPwQPiBsSGRwd9ylMVTS5hYGDpvf/2+GXz32R38/cObONzazd7GzhiDc3ltBT//RMKlpRGxemcjD719kP/+0FnkZg2+XXaGDU60hw+wsKqI980u497XQ7LOj1/ZTWevn1uW1nD7FXMoyA79fa9eOImbf/4mv/zzPpbPiVvCPIbWrj7+5Y9baO7qY9X6em46L/Ye2XK4lS/9dgNnVBXxu9uW8us39/Odp7az/3gnbkt4r76VoIGiHA+XzZ/IFbWTmDUxj6KcLL752GZe29WIMQaRkDy19kAzBV438yYVsqCyiNbuPh5651DMtbD+YDMTC7w0tPfGzPjisWpDPTkeF1cuCJmUa8+q5P41B3huyzF+8ed9oYfUx87hQz9bw/++uIsbFlXhccX6pa/ubCQ3y4U/YLj/jQN8+/0Lh/27pZpXdjTwyV++w1dWzOYrK+YkbPfEu4fxBQyfuWhGRAI8nQzr4RtjVhhjFsb5GamxrwemRL2uDh9L1N/dxpglxpgl5eXD3wBDsamuldU7G3l9gERwNCx9VIQN/vSykHe2Z0A0yo6j7cybVMBzX72Yf7luAZfOq+B37xzC5x9+YSoRL+9o4OofvJbQY07ED1/eTY7Hxd9dOY+KQi9bD/d7+MYYNh5q5YoFFTz31YtZNLWYb/1pK1sOJ/ZwO31hj68rvsGPDilcecbkhLJOXXMXBV438ycXsj9JSWdf2OAfaOqiacCayqETXWw53MZVC/p9j1uW1TCpMJsnNh2mpauPJTUl/P1V83jg0+dzbk3JSa3LdPb62XE01lt891ALf/PrdTy9+Sgvb4/vgdu/M2dSwaD3PnfJTI539PKfz2xnybQSnv3Kcv7lugURYw8wozyfquIc/COMR//+iztp7e5j6oRcfrZ6b8ystKGth0/ft5aiHA/3fGIJOVkubls+kx9/dDFNHT48LosvXDqb3912AWv/cQXf+9DZXLVwErMmFlBe4OWSueUca+tld0P/fbB2/wkWTyvBFTZOV4evhegZyfoDLZw/o5SJBd5BM+AXth5j2b+/yB2PbGL1zkae2HSEKxZUkBd+WJwztYTJRdl856ltbDncxtevmEu2x8VXL59DXXM3f1hbF/N5xhhe2dHIRbPKuPasyTyyvm6QbHYyGGOSXiTu8vn5x8c2AyF5a6i+Gjt6Od7Rm9CpSTWnQ9J5B5gtItNFJAu4CfjjaeiXh9eFLpaBXsfR1pDBn1RoG/w8YLAGvauhndlRntvHl07jeIePZ7acfAhic6ePr/1uI5/65TtsO9LGyzvia+I2P3p5N3/9q7X8+s0D/Hn3cf707mE+vnQaE/KyqJ1cyNYoSae+pZvjHb0smlLM9LI8vv/hs7EEntuSeFGwqzcUGWEbeJuWrsEGf8m0EiYWeHkqzkOqrrmb6gm5TC/NS8rgB4KGQye6WDy1GIB361pi3rejc66MMvj5Xjd/vuNSNn/rSv70xYv4wU2L+NwlM7lodhlVxTk0dQxetNx1rD0iU0T3/Zn713Ll91dz++/f5USnjwNNndx63zuU5mcxIS8r0n+8z8v3uqkMOw/RLJ1RyreuW8ADnz6fX37qvJhrKRq3ZeEPDG/wdze086s1B7jpvKncefU89h3v5OnNRyLf4cu/3Uhrdx/33nJuZBYEoQf2m/9wGQ9/bhlfu3wO588oHeQ1A1w0OzRjXL0r5CC1dvWx81gHS6aVRNosmVZCSa6H57eGrq0jrd0cbeth8dRiqktyBt1rr+5spLGjlz+9e5hP/OJtWrv7eP+ifkXXsoRrzphMU6ePBZWFXHdWJQCXzCln0dRifvjSrhjpak94Fnfx3HI+tWw6Xb4ADw94KIyUE50+PnXfO5zz7ed5OcEa1Uj4n+d3UtfczeyJ+YOk1mhsuRSI/P1ON8mGZd4gInXAUuBJEXk2fLxSRJ4CMMb4gS8AzwLbgN8bY1IeRN3rD/DHd0Mr/fXN3THRBcfaYg1+WX4WBV53jMHv9gWoa+5mVnm/Nvu+WWVMK83lgTUJN5SJy/GOXq76wWr++O5hvnTpLBZPLR5ygfNEp48fvLCL13cd55uPbeaj97xFltvir8OyVG1lIbsbOiKeybuHQp78WVOKASjN97Jk2gSeG+Kisj38lgGaY0TSycmKHLMs4eqw1trZGxtCd6i5i+qSHKaV5nG4teeUvaXDLd30BQx/eVYlLkvYcLAl5v1nNh+ldnLhoGQrlyUR+SGa0nzvoFkCwH8+s52b736TV6M81J+t3sOavU2smF/B4xvruey/X+Gj97xFwBjuv/U8Lp9fwcvbG+LO7HYe62DWxPy4YxARbllWEzGkiXBZMmzGqTGGf31iG7lZLm6/fA5XLpjEjPI8fvzyHowx/PCl3azZ28S/Xr+A2srCIT8rEdUlucwoz+O1XaG/zfqwNr+kZkKkjdtlcdn8Cl7cdoy+QJD1B1oAWDy1hOqS3EEGf1dDO2dUFbHum5fzk48u5htXzWX57NiZ+wfPqSbH4+Kua+ZHZA4R4WuXz+Fwaw+/eetgpO0rYUfp4jnlnFFdxOKpxfxqzf6TznBed+AE1/zva7yxu4mKomw+86u1Mf2MlM31rdz7+j5uPm8qf3VONfUt3QmjoxrCEUxuS3hu6+nJWxlIslE6q4wx1cYYrzGmwhhzZfj4YWPMyqh2Txlj5hhjZhpj/k+ygx4JL25roLW7j0vmltPdF4iJajna2kO2x6IwJzStFBFmlOfFGOE9jR0YA7OjFuMsS/jo+VN5e/8Jth9N/CQfyL8/tZ2mDl/Iw7piLnMnFQxp8B9edwhfIMjjX7iQF2+/mH+6tpYf3LSIsnwvAPMnF+IPmsjU+926FrLcFvMm9d/ol9dWsO1IW8LQte5w7HPLIA8/9HcamCW68ozJ9PqDMTMTOwa/uiSHmrKQIT54iqFy9oLvvEmFzJtUEGPwj7R2s+5gc4x3Pxyl+Vl0+gJ0+2IfQEfbevAHDZ97YB3vHmph46EWvvfcTq45YzI//8Q5PPml9zG9LI/jHb3ce8sSZpbnc8WCCtp7/azZ2zSon53H2pmbwHMfKW6X4A8mlgkPt3Tz41f2sHpnI1++bDal+V4sS/jsxTPZeqQtvNi6kxsWVfFX51QnNZbls8t5c28Tvf4A7+w/gdsSzg47EjaX11bQ1uPnnX0nWH+wGa/bYv7kQqpLcjjc0h3z8Nrd0MHsiQVke1xcfcZk/vaSWRF5yGb+5EK2fOtKls2MfTBeNKuMC2eV8r8v7ooshr66s5FZE/OpLgldb7csq2F/UxerNtQPOteJeGRdHR/+2Zt4XBaP/u0y/vSFi1g+u4x/WPUe//eZ7XFDT+PR6w9wx6ObKM33csfV8yIP2kRevp2XceWCSext7BwkIZ8OMjbT9pF1dVQUevnwktDyQfRi3pG2HiYX5cR4ZdPL8tjb2G+EbWM6e2Js9MWN50why23xwJsj8/Lf3neCR9bX8dfLZ0RunJrSPE50+uKu6Nt1Wc6tKWFORQEzy/O59aLpMcaudnLowrJ1/I0HW1hQWUiWu/90Xl5bATAoCscmouEPMPht3X2IQEF27ALlkpoJlOV7Y6aizV19dPkCVJfkJpTFRootB00vy2PR1GLePdQS8dp+veYAAnxg8ciDu8ryQg/Hps5YL7+xvZdL502kND+LT933Dl/4zXoqCrP5zgfOQESYO6mAhz+7jHfuWsE500Ke7YWzysjLcg2SdZo6emnq9MU4BaeC25K4Gv7L2xu46vurWfYfL/HdZ3dwzrQSPrG0JvL++8+uYnJRNj9+ZQ81pXl8+/0L4840Tob3zS6jpy/Iuv3NrD3QzILKQnKyXDFtls8uJ9tj8dzWY6w/2MyZ1UVkuS2qSkJrEXaU2IlOH8c7Rvb3ibeAKSLctbKWlu4+fvjyLrp9Ad7ad4KLoxa3r144mariHG7/w7vM/6dnuPA/XuL237+bcP3qjT3H+ftHNnH+jAn86YsXsbCqiDyvm59/Ygk3nzeVH7+yh6/9/t1h1+l6/QH+9oH1bK5v49vXL6Qox9N/Xw5j8D9yfmihfSxknYw0+I3tvbyys5EbFlVHJIDoqeax1h4qCr0xvzO9LJ/6lv5s0V0N7bgtYVppXky7krws/vLMSlatrx92sagvEOSbj22mqjiHL146K6qvsHGME8a4Zm8T+5u6IhdFPKaV5pGb5WLrkTb8gSDv1bcO8sJqyvKYU5GfUMePaPhxJJ3CbM+gG9BlCedNL2Hdgf4QPHuBbkpY0gES6viHW7p5ZnPiher9TV1keywmFng5e0oJ7b1+9jR20O0L8Ju3D3JF7aSYCKrhKM0PSVLROn4waDje4aN2ciH3f+q8yLh+cNPZMTMay5KYhdVsj4tL5k7k+a3HYqSDncdCTsHcOAu2J4MrgYb/6IZ66pq7ufPqeTz/1eU8/NmlMQ/1LLfFV1bMpiDbzf/7yKJBEVSnwvkzSnFbEslxiJZzbHKyXFw0q5xnNh9lS30bi6eGNH7b67bvNdtpmjXx1B+ItZWF3HhONfe9sZ/fvXMQnz8YY/Cz3BaPff5CfviRRXzt8jksnlbC05uPcM3/vs7Nd7/JC1uPRWYcexs7+NwD65lelsdPPnZOzDl3uyy+c8NCvn7FHFZtqOfW+95JmGzo8wf5/IMbeHF7A//nhoWRWkCl+V4mFWbHBFREYz8Iz6wuYmFVoRr80eLxjfUEgoa/OqeK6uLQRVgfZfCPtvVE9Hub6eVhgxU2wruOdVBTlhdzg9l86sIaOn0B7vvz/iHHcd+f97PjWDv/9Je1MSF9M8ptb3jwlO43bx2kONfD1QsnJ/xclyXMm1TA1iNt7DzWQXdfYJDBh5CX//b+E3FLMUQ0/O7Y91q6+xIW/Vo8tYS65u7IhXvoROhvWl2SS1GOhwl5WXFDMwNhCeWzD6xPmCOw/3gnNaV5WJawKLxwu+FQC49uqKOlq49Pvy9xiGk8SvMHe/gnunwEgobyAi8zyvN55HPLeODT58c1agO5YkEFje29bDjU/8DblSAk82RxJ9Dw/YEgk4uy+ZuLZzK7oiCu9/7hc6ey/puXs6CyKKkx2OR73SyeVsJDbx+k1x+MWbCN5ooFFRxt68EXCLIoYvBzgH5HwP77JFqsHim3XzEXj8vi209uI9tjcd702PNVXuDl2jMr+dJls/l/Ny9izZ2XcefV89jf1MlnfrWWv/ivV/jZq3v4zP1rcVnCvbecS2H24GtcRPjCpbP57l+dyZt7m/jwz94ctCYVDBq++NB6Xth2jH+9fgEfPX9azPu1lYVsSWDwG9t7yfZY5HvdXD5/EusPNp/28hsZZ/CNMTy8ro6zphQza2IBhTluCrzuiKQTDBoa2nojIZk2M2yvOyzrhLTH+J7JwqoiVsyv4J7X9g6SRGxau/r4/gs7uXTeRK4Iyys2UybkYkl/opFNY3svz245ygcXV5PtiZ1GD6S2spBth9siSUpnVRcPanNF7SQCQRM3IsiuXzJw/K1DGHz7xrYX6uwbuyp8o08rzY3r4f/yz/t4ty40xX5tZ/ws2v1NIYMPML00j8JsN+sPNPOL1/dxRlVRQsOTiNK8kId/PMrDt2+u8oLQw2B6WR7LZg29oGrzF/Mm4nFJzIxpx9F2CrPdTCzwDvGbw+NKoOH7g2aQ3h2PeBE3ybB8dlnEITinJv7f/bJ5E7GHtnhaMQBVxWGDH3YEdh3rIC/LFTeC6WSoKMzmsxfPJBA0LJ1ROuy9UZTj4W8unsnqb/wFP/rIYiYVZvPvT2/nUHMXP/3YOcNWWb1xyRT+84NnsvVIG+ujZrQA6w428+yWY/zdlXNj5DWb2smF7G7siBu80Njey8SCbESEKxZUYAy8mEByTRUZZ/C7fAEqi3Mi2r2IUFWSEzFOJ7p8+AJBJg/08MMGf+/xTnr9AfY3dQ45Ff3Kitm09fj5ZYJ6KVsOt9LpC/CpC2sGeWZet4uqkpxBevcf1h3CHzRDyjk2tZOLaO/188SmwxTnepgW5yI+o6qIikJvXFmnszd0Qfb0BWMuztbuvkjS1UAWVhWS5bIi0Rt1zd0UZrsjD4jppXmDsm0PNHXyX8/t4LJ5EynL98ZEx9iEQjK7mRZe+LUs4eypJTy2sZ49jZ3cetHgv+FwxJN0Bhr8k6Ew28PSmWU8u+VoZFFv17EO5k6K73mfDIk8/EDQ4Had/uSc94WjaKaV5jKxIL6xLs33sqRmAlMn9LfJ9rgoL/BGJB27xlCyfx8IJdmdP30CHz53yvCNw3hcFtecOZnff3YpT33pfTz82WWDZgeJsJPgBurxW8LZ24kWx2srCwkEDbuODZ69N3b0Rq69eZMKqC7J4YVtpx4OeipknMHP87r5xSfPjTGa0fHBkRj8AV5HntdNRaGXvY2d7DveSdAMrT0urCriitoK7n19X1wvf1dYv0wUwTG9LH+QpPPIujrOnz6BmeXDa552RMAbe5o4q7o47k1lWcKK+RW8urNxkMcRXaEwevytXX0UJvDwvW4XC6oKI15PXXNXRLeF0LrBkajQTGMMdz76Hh7L4t9uWMjy2WW8tqtxkHE73NKNLxBketR6yaIpxfT0BZlYEKovf7LkZrnJzXLFhGZGDH7+qXnkVy2YxP6mLv5h1Xs0tveyc0CexqniSrBo6w8a3Nbpv0UXVhVRXuBl2czSIdv9941nDcpkri7Joa4lLOkc62DWxOT/PhBaN/jd3yzlqiGkzqGorSyMhC2PhPICL+UFXrYdiU3G23qkjdK8rISzugWV9sLt4EXjhrbeyLUnIpxbM2HI5MhUkHEGPx5VxTkRDd+Owa8oHOy5TC/LY9/xjqgInaEv1q+smEN7jz+SPh/NzmOh6X4ib3JGWR77Gjsj3uLR1h72NHayYn5F3PYDmVtREJlSx9PvbS6cVUaXLxCTPQn9Hj4MMPhDSDoQyozcVN+Kzx+krrmbKRNyIu/Zs4wDYR3/t+8c4o09Tdyxch6Ti3K4eG45zV19g2rc2LOC6AVyW8f/xNJpcddRRkJpfhZNUeG4jR2n7uFDyKu79cLp/GFtHRd/92VauvqYk8SCpM1QGr57DNLvXZbw+Ocv5B9Wzh+y3ZQJuYMWrKtLcqlv7o7UGEo2gmksmT+5cFCI5dYjbdRWFiactUwpySXf646r4zd29DIxKlhkdkU+R1p7ksoUPlkcYfCrS3Jp7/XT2t0XKasw0MMH2+vuZNexDizpX1xNRG1lIVcvnMQvXt83KNplV0NHwoW2UF95dPoCESO0Zm9I2146jFdlk5PlYkZ4JjCUwS/JDUkbAy+qLp8fT1gusJOvjDEhSWcIg794Wgk+f5Ath1vDMfj9Hn50aOaexg7+9U9bWTazlJvPDc22LppVhgiDCoXZC73279ttv339Am696OQWa6MpzfPGlFdobO8lL8sVSes/WbLcFv/0l7U8+9XlLJtZigiR0M1kcFlWQg9/JBp+KqgszomJVBop1SU51Ld0R2oMJVoHGw/Mn1zA7oaOSIhmXyDIzqMdkfDLeFiWMH9ywaBInV5/gJauvpjZpT37jyf/pApHGPyqqOiBo609WBJ/Wj+jLI/mrj7e2X+CqRNyh10cArj1oul0xEnKGWrRF0LyB/QvEq/Z00RhdqgmzUixL7wzqxNHaNjx9B09sRmynb5A5KFnR/F0+gL4g2ZID98OwXth2zG6+wKRyAzo99B3HWvnSw9tINtj8b0PnR0J8SzN93JGVdEgHX//8c5ISKaN22Xx8aU1cQuWjZSy/KxBGv6pevfRzCzP555bzmXTP1/BGUP87UdKumn4yVBdkhNT4nq4WXI6Uzu5EF8gGEmQ2tPYgS8QHDaTuTY8M4gO4bWDB6KvPzu6a2eC/R9SgSMMvm2U6pu7OdraQ3mBF3ecyAbbo39r34kRa49nVBXhcUlMSd+mjl5OdPqGXAOYMSBRac3eJi6YUXpSHt1Hzp/K5/9iZiQEMR62wW8fYPC7ev1UFoX+Lna2bbzCaQOZVJRNZVE2fwrXMI/28O3QzB+/socth9v4zw+eOWgmtXx2ORsOtcTISAea+kMyR5PSPG9MWGZDe8+oGHybU/GA4+F2Sdza72Ol4SeDHanz8o5Gsj1WjEMw3rCdL1vWsb324ZyyBZVFdPoCMVnn9vpRtKRTVZxDjselBn+0iYSLNXfHjcG3sSWFQNCMWHvM9rionVwYsxGHvWA7VHx2ZXEOWS6LfU2d1DV3cehE94jlHJsLZpQOW6rZTsbp6B3s4dt/lzbb4McpnBaPRdNKIhdztIYPUFOaS3dfgI9fMI0r4pRCuHhuOYGg4Y2oCqb7jnfGjTJKltKwh2+vk4yWhz/aJMq0HSsNPxlsB2BTXUvMLmDjkRnhPJxog5/ltiLOWiLsGUC0jt8fMNBveyxLmF2Rr5LOaDMhL4scj4v6lm6OtfXEXbCF0CKU7WHPGkGkjM1ZU4rZVNcSmZbbW/QN9dBwWcLU0lz2NXayZk9IDjpZgz8S8iMe/mANv7zQiyX9Gr6dhFWUICzTxpZ1oP9harNsZhlnTSnmrmviL/gtmlJMQbY7IuvYIZk1w9xEp0Jpvhd/0NDWHXrYNbb3nnKETipJpOEHxlDDP1Vsj96Y8S3nQEhWnFtREInU2Xa0jXmTCuKqA9HMrsjHbUlMBI6dcDjQ4ZhTUcAO9fBHFzsWv765myOtPXEXbCEUtzs1nL5/MtEFZ08pptMXiGh9uxo6yPe6E84kbEJRQZ2s2dvEhLws5qTgBvG6XWS5LdqjPHyfP0hfwFDgDcXQ24a+bQSSDsA54SSo4lzPIFnj61fO5bG/XZZw/cPtsrhwZhmv7Ghk17H2SEhmTenoG/yycCz+8c5eevoCtPX409bDjxulMw41/GyPK1LkL5mSCunC/MkFbDvShjGGrYfbhlywtfG6XcyuKGDzAA9fpD8/xGZORT6N7b1xs+FTgSMMPoQ8j50N7bT3+BMafOiXdUYSC29jx/duDFd43DVEydxoZpTlceBEF2v2NHHBjAkpm/4WZrtjNHw7Bj83y01xbhat3bFZt8MZ/NrJhXjdifXZ4b73B8+p5mhbD5f/z2qu++HrACky+OHyCh2+SLROOhp8uzzywCqNgXGo4UO/lz+eI3Rs5k8upKnTx6a6Vpq7+kZcenphZSFb6ltj5MQJuVmDsqJnRxZuT4+sM/6uplOkqjgnUg1zKM97xfwKLq+tOKnQPbsUgL2Lza6GjkF7nMb9vbI8fP4gR1p7WDpj9OUcm3zvQIMfisHP87oozPFEvAtb2inOzRr8IVFkuS2uXjgpZovFk+Hy2greuONSvnPDGZwzbQLzJxeecg33oejPtu1NKss21dg6/UAv3x8cfxo+RBn8UUhKG2vsBdpH1oc2WRmJhw9wRnURTZ0+joQTPROtH53uSJ3ky+uNE6KjSYYy+B85f+qIShtEY1nCWVNCJX2bO0Pe5Ej0y2jdOhX6vU1BtoeOKA0/xsPP8dAcNvit3X24LCEva/hw1O/ftCipMVUW55zS3/pkKA2XSD7e6Yto4dGLZumCKyzbhCSc/uP+wPjT8CEUX/5aznGmjOMIHZv54T0m7M2U5o3Q4NvF7DbXt1JZnENDAoNfWZRNvtd92gy+czz8qItvYOG00eDsKcXsONbOpnAW6awRePj2an95gfekJKSTpWCApGNn2eZ5XRTneiJSjp1lOxq1T9KBklwPIiEPv2FcevjjT8MHuO3iGTz/1eXDLm6OB4pyPVQV59DS1UdNae6IS1DXTi7EEiJZ5Yk8fJFQpI4a/FEmWm8ebjH1VDh7SjGBoOGxDaH92UeiX5YXeCnMdoezNlN3Y+d73TFhmZ0DPPz+KJ2hs2zHG26XRUluKDQz0aJZOuAK6/QDI3XGq4bvdbti9tQd79iyzskkReZkuZg1MZ/Nh9sim5cncjbmTCw4baGZye5pe6OIbBGRoIgsSdBmioi8LCJbw22/nEyfp0p1OHywINt9yqn1Q2Ev3D69+Qi5Wa5IUtNQiAj333resDVLkqUg2xOr4dseflYoSqetp49g0NDWnbhw2nilNC+Lps5eGjviL5qlAwk9/EBwXEo6mUbt5ILwvye3zrSwqoj36ltp6/bj8wcThgTPrsinqdMXUwYkVSR79W8GPgCsHqKNH7jdGFMLXAB8XkRqk+z3pCnL95LltlLi3dufX12SQ09fkNknkXCyaGpJwryA0SIk6fRr+BEP3+uiKDcLY0KZuMMVThuPlOZncTzs4aejnANEZJuBNfFDmbZq8McaO6DgZAMLFlYW0djeG4nHT3T92QXoToesk+wm5tuMMTuGaXPEGLM+/P92YBsw8s1JRwnLEqpLcoYMyUwW28sfrZKwo0VBdkjSsUPEIlE6YUkHQklXLV2Ja+GPV0rzvZEonbQ1+GGjPnCbQ3/QRBZ0lbHjsvkV/N8PnhmzteJIWFgVWrh9aXuo5n2ivQXmnMYiaqc1SkdEaoBFwFtDtLkNuA1g6tTRjeD4t/cvpMCbOoO2aEoxT246knYlYfO9boImZOjzvG46w3p+TpYr4tG3dPVlpIdflhfy8Hv6gsOmxI8VtoY/UNIJqIefFnhcFh86iY1XbEJllInsOJfI4ZgYXss7HR7+sAZfRF4ABhdFgbuMMY+PtCMRyQceAb5ijIm/6SNgjLkbuBtgyZIlg9MPk2DZzFOLGx8p508PhVaeWTU6+4uOFnY2bHuPnzyvO+Lh52a5Ih59c5ePtp7MM/il+V5au/tCpSTS3cOPMvjGmHG7aKuEyPe6mV6Wx55w/k+i609EmFNRkB4G3xizItlORMRDyNg/aIx5NNnPS1fOqC7ila9fkpJCYMkQXU9nUlE2nT4/WW4Lj8uKGPxDzd0YM3yW7XjDjsrpC5i0NfiuyKJtv4ZvG3/18Mc3Z1QVsbexE6/bojA7sbmtKMoetNlKKki5+yCheMN7gW3GmO+lur+xpqYsL+3i2CMlksNSTldvIJJcVZQTMoiHwtUvM87g5/Ub+XQ1+PE8fFveUQ1/fLMwnIBVXuAd0i54LBm0hpMKkg3LvEFE6oClwJMi8mz4eKWIPBVudiHwceBSEdkY/lmZ1KiVk6LAG1sTv9Pnj2wsYhv4A+FtBjPN4JdFxd2nY6VM6Pfwo2949fAzA3vhdjhnw+2y4u6JMNoktWhrjFkFrIpz/DCwMvz/1wG9ascQW8O3d73q6g2Q5w15+Flui9wsV2Qf2uHq6Iw3ojeHid58Ip2wwzKjF20DAdvgq4Y/nllQFQrlTLTpuY3HZeFLdw9fGR8UDKiJH+3hAxTneCIbmmSah18a4+GnZ/ZnvEzbvrCePx5LKyj9FGZ7uGRuOefWDL33scclg/IwUoFjiqc5GXvR1i6v0O3r9/ABCnM8HA5X9cs0g1/gdZMVzq4tzEnPy90TJ9M2ouGrpDPuue9T5w3bxm1Zp0XDT887QBlV8sPefFtEww9Qktfv+UYnW2Va4pWIUJqfhSWSdovpNv0avkbpOBWPW/Clu4avjA8sS0IF1GwN3+ePKYFcHI7UyXJbCXeqGs+U5mdFZJN0xO2KE6WjGr6j8FjjYNFWGT9E19Pp7A2QG1VAzvbqM03Osblt+UzS2VGOl2nrVw3fUbhdQtCkfh9jNfgOIXrXq4Eevm3oM6k0cjTXnVU51kMYknhx+H7V8B2FXcW1LxDEZaVulq3zRYdgF1ALBg1dvkBMlE5Rhnv46U7cTNuAavhOwhNH1ksFavAdQn62h/aePrr7+ne7srE1fDX4Y8NQmbaq4TuDiIfvT62Or1eTQyjIdtPe64/Uws+J9vDDhr4owyJ0xguuOGGZtoavpRWcgb0dZF+KY/HV4DuEwvC+tv27XUV5+CrpjCm2F6+lFZyLJ8GeCKONGnyHYIdlRu9naxPx8NXgjwmuOKUV7BtfF22dQfSibSpRg+8QCrI9dPcFaO0OhWZGa/h2ElamRumkO54hNPx03INXGX3s8Nu+FHv4GpbpEPLDcfcNbaGNkqM9/MqibL513QKuPXPymIzN6UQybWPq4Qdj3lMyG/vBnup6OmrwHYJdQO1YW6hmTrSHLyLcsqxmLIalkEDD17BMR9EfpaMavjIK2Ab/qG3ws/RZny7E1fA18cpRRCQdjdJRRgO7Jn6/pJN5NXPGKxqHr3jizPJSgV5NDsHW8PslHfXw04X4e9pqLR0n4Yks2qqHr4wCEQ2/vQdLwOvWU58uuCROLR3V8B2FezyEZYrIjSKyRUSCIrJkmLYuEdkgIk8k06dyatiSzrG2XvKy3GlbG96JWJZgiW6A4mQitXTSXNLZDHwAWD2Ctl8GtiXZn3KK2B6+zx8k16v6fbrhtqy41TJVw3cG4yLxyhizzRizY7h2IlINXAPck0x/yqnjdVsRL0IjdNIPlyUDPHzV8J1ERMPPkGqZ3we+AQz7+BKR20RkrYisbWxsTPnAnIKIRBZu1cNPP9wuifHutJaOs7BncmNeLVNEXhCRzXF+rh9JByJyLdBgjFk3kvbGmLuNMUuMMUvKy8tH8ivKCLF1/FyPevjphnuAh6+1dJyFx50mmbbGmBVJ9nEhcJ2IrASygUIRecAY87EkP1c5SdTDT19cquE7GrueUqpr6aT8ajLG3GmMqTbG1AA3AS+psR8b7IVb1fDTD7clkY3LQTV8pzEuFm1F5AYRqQOWAk+KyLPh45Ui8tRoDFAZPWyDr1m26YfLkvh72mr4rCNwn6awzKRcPWPMKmBVnOOHgZVxjr8CvJJMn8qpY2v4mmWbfrhdMmhPW0tCMfpK5uPRHa+U0Sai4auHn3bE8/BVv3cOWi1TGXUiGr56+GnHwCidQDCo+r2DcFmCSOqjdNTgO4hIWKZ6+GlHvCgdDcl0Fh7LGv9ROkr6kK9ROmlLvDh8TbpyFp4ByXepQA2+gyjM1jj8dCVepq1LNXxH4XZZ+NXgK6OFvWirHn76EVfDVw/fUXhckjG1dJQ0YPbEAsryvcwozxvroSgDiBulo4u2jsLjslJeS0ddPQcxtTSXtf+YbKUMJRW4LYvuvkDktWr4zsPtin3opwL18BUlDRjo4Qc0SsdxhKJ0VMNXlIwnpOHH7mmriVfOwuNSg68ojsBlSUwdlYBq+I7D7ZK03+JQUZRRIFRLZ2BpBTX4TsLtsvCph68omY/LsgYlXqmG7yyy1MNXFGfgGRSWqRq+0whtZK8evqJkPCENv/9mVw3feXjcFj718BUl8xkYg63F05yHZ8BDPxWowVeUNMClxdMcj0bpKIpDcMctj6y3p5NI+zh8EblRRLaISFBElgzRrlhEHhaR7SKyTUSWJtOvomQaAz38QDCIRzV8R+FxWWm/xeFm4APA6mHa/QB4xhgzDzgL2JZkv4qSUbgtiYnQUA3febit1Es6yW5ivg1AJPGFKSJFwHLgk+Hf8QG+ZPpVlExDNXzF405zSWeETAcagV+KyAYRuUdEEtbnFZHbRGStiKxtbGw8DcNTlLHHHbd4mmr4TsJjydhvcSgiL4jI5jg/14+wDzewGPiJMWYR0AnckaixMeZuY8wSY8yS8vLyEXahKOMbl2VhDATDRt+vGr7jOB07Xg0r6Rhjki2gXgfUGWPeCr9+mCEMvqI4ETvJqi8YxGu5tDyyAwlF6YzzsExjzFHgkIjMDR+6DNia6n4VZTxh6/W2jt+nGr7jCG1xmMYavojcICJ1wFLgSRF5Nny8UkSeimr6ReBBEdkEnA18J5l+FSXTsL15W8dXDd95uMOyXiCFu14lG6WzClgV5/hhYGXU641Awjh9RXE6EQ8/0K/hay0dZ+Fxh2W9QBCX5UpJH+pCKEoa4HKFbsVoD18lHWfhCc/oUhmaqQZfUdKAgRq+boDiPOyorFQmX6nBV5Q0oF/DDxIIGoxBNXyH4Xaph68ojiDaw7dLLKiG7yw8kdBc9fAVJaOJjtKxZR2VdJyFx/bw/erhK0pGY29nGPLwQwZfE6+chTuycK8GX1EymkimbSAYWbRTD99ZeCz7GlBJR1Eymngavh2qqTgDjy7aKooziKfhe9TDdxT9szz18BUlo4nR8AOq4TsR28NPZcVMNfiKkgZEPPxA/6KthmU6i35JRz18RclobOMeCBoCtoaviVeOIrpEdqrQK0pR0oDoTFu/aviOxK6lo6UVFCXDiYnSUQ3fkURXy0wVavAVJQ2IjtJRDd+ZuLVapqI4g+goHdXwnYlWy1QUh6CZtoomXimKQ4jW8LV4mjNxp3u1TBG5UUS2iEhQRBJuYSgiXw232ywiD4lIdjL9KkqmoRq+kjUOEq82Ax8AVidqICJVwJeAJcaYhYALuCnJfhUlo4itlqkavhM5HRugJLuJ+TYAkWE9ETeQIyJ9QC5wOJl+FSXTiPHwVcN3JO5MqJZpjKkH/gs4CBwBWo0xzyVqLyK3ichaEVnb2NiY6uEpSloQ0fADwX4NXyUdR5EWi7Yi8kJYex/4c/1IOhCREuB6YDpQCeSJyMcStTfG3G2MWWKMWVJeXj7S76Eo4xqXK46Grx6+o3BZgiWpDcscVtIxxqxIso8VwD5jTCOAiDwKLAMeSPJzFSVjiFsPXzV8x+F2WeO+ls5B4AIRyZWQ2H8ZsO009Kso4wbV8BUIRer0+dNUwxeRG0SkDlgKPCkiz4aPV4rIUwDGmLeAh4H1wHvhPu9OatSKkmFEF85SDd+5uF2S0j1tk43SWQWsinP8MLAy6vU/A/+cTF+KkslYliACgahqmVo8zXm4LWt8R+koijIy3JaEJZ1g+LXenk4jyyVaWkFRnIDLkvCirXr4TsXtstI601ZRlFHCbVmxm5irhu843C5J31o6iqKMHurhK6EoHfXwFSXjCWn40eWR9fZ0GqEoHfXwFSXjsT18ewMUdfCdRyhKRz18Rcl43JbgD4QkHY9LRlKUUMkwslxq8BXFEbhcEtkARfV7Z+J2iW5xqChOwGNZ9IUXbVW/dyYel6VROoriBEIafhB/IKgevkPxuESjdBTFCbiiNHwtnOZMQrkYavAVJeNxR2n4WjjNmXjcWktHURyBK5xpqxq+c/FYWktHURyB2860VQ3fsWiUjqI4BJedaasavmPxaBy+ojgDt6UavtNRg68oDsFl18MPGt3P1qHYeyKkimS3OPyuiGwXkU0iskpEihO0u0pEdojIbhG5I5k+FSVTiZRWCARV0nEooSid9PXwnwcWGmPOBHYCdw5sICIu4EfA1UAtcLOI1CbZr6JkHG6XFeXhq8F3IqEoHYMxqfHykzL4xpjnjDH+8Ms3geo4zc4Ddhtj9hpjfMBvgeuT6VdRMhF3ONM2EC6epjgPtytkkgMpknVGUyi8FXg6zvEq4FDU67rwsbiIyG0islZE1jY2No7i8BQlvYnV8NXgOxFP2OCnKvlqWIMvIi+IyOY4P9dHtbkL8AMPJjsgY8zdxpglxpgl5eXlyX6coowbYqJ0dNHWkdgzu74UlVdwD9fAGLNiqPdF5JPAtcBlJr7wVA9MiXpdHT6mKEoULsuKLNq6vMPemkoGYnv4qUq+SjZK5yrgG8B1xpiuBM3eAWaLyHQRyQJuAv6YTL+Kkom4o/a0VQ3fmdj5F6mK1El23vhDoAB4XkQ2ishPAUSkUkSeAggv6n4BeBbYBvzeGLMlyX4VJeNwhfcz1Q1QnIvHsjX8MZJ0hsIYMyvB8cPAyqjXTwFPJdOXomQ6dpSOFk9zLh536EGflpKOoiijRyRKR4unORZ3ij18NfiKkia4dQMUxxOJ0lEPX1EyG7fL0uJpDqc/Dl89fEXJaNxR5ZG1eJozsTNtU7XNoV5VipImuCwhaELenUo6zsRjqaSjKI7ANvK9fbpo61Q8bpV0FMUR2DJOrz+giVcOxX7oa1imomQ49s0eNKiG71B00VZRHEK0jKMavjMZ82qZiqKcHqJDMVXDdyb2NaBROoqS4UQbedXwnUl/LR318BUlo4mWcVTDdyZ2LR3V8BUlw4kumKYavjOxrwG/GnxFyWxUw1eydNFWUZyBavhKum+AoijKKKEavtIfpaMevqJkNC7V8B1Pqne8UoOvKGlCrIevBt+JWJbgsiQ9Db6IfFdEtovIJhFZJSLFcdpMEZGXRWSriGwRkS8n06eiZCoxmbaq4TsWeyOcVJCsh/88sNAYcyawE7gzThs/cLsxpha4APi8iNQm2a+iZBzumNIKOvl2KlkuC186evjGmOeMMf7wyzeB6jhtjhhj1of/3w5sA6qS6VdRMhGXSjoKodldunr40dwKPD1UAxGpARYBbw3R5jYRWSsiaxsbG0dxeIqS3ti7HYEu2joZt8tKWS0d93ANROQFYFKct+4yxjwebnMXIenmwSE+Jx94BPiKMaYtUTtjzN3A3QBLlixJzWNOUdKQmEVb1fAdS5bLwudPjekb1uAbY1YM9b6IfBK4FrjMGBN3lCLiIWTsHzTGPHoK41SUjCcm8Uo1fMfidsnYefhDISJXAd8ALjbGdCVoI8C9wDZjzPeS6U9RMhktraBAekfp/BAoAJ4XkY0i8lMAEakUkafCbS4EPg5cGm6zUURWJtmvomQcbg3LVAhtgpKqKJ2kPHxjzKwExw8DK8P/fx3Qq1dRhiE601Y9fOficVlaLVNRMh23avgKocJ5WktHUTIcjcNXIBSW6fOrh68oGY1q+Aqoh68ojkA9fAVUw1cURxCdaasavnNxWxa+NA3LVBRllNBMWwXCko56+IqS2cSUR1ZJx7F4XJZq+IqS6egGKAqEFuw1SkdRMhytpaNA6NynZS0dRVFGD5HQ9naBoFEN38HMnJhHU2dxSj5bDb6ipBG2wVcN37nctnwmty1PzWfrvFFR0gjb0KuGr6QCNfiKkkbYhl49fCUVqMFXlDTCbYV0/NA2EooyuqjBV5Q0wu2yVM5RUoYafEVJI9yWqJyjpAw1+IqSRrjCko6ipAI1+IqSRrgtwePS21JJDUldWSLyXRHZLiKbRGSViBQP0dYlIhtE5Ilk+lSUTEY9fCWVJOtKPA8sNMacCewE7hyi7ZeBbUn2pygZjduyVMNXUkZSBt8Y85wxxh9++SZQHa+diFQD1wD3JNOfomQ66uErqWQ0xcJbgacTvPd94BvAsBWBROQ2EVkrImsbGxtHcXiKkv64XarhK6lj2CtLRF4Qkc1xfq6PanMX4AcejPP71wINxph1IxmQMeZuY8wSY8yS8vLyk/gqijL+UQ9fSSXDFk8zxqwY6n0R+SRwLXCZMSZe1f4LgetEZCWQDRSKyAPGmI+dwngVJaPROHwllSQbpXMVIanmOmNMV7w2xpg7jTHVxpga4CbgJTX2ihIft6WZtkrqSFYs/CFQADwvIhtF5KcAIlIpIk8lPTpFcRhul3r4SupIqh6+MWZWguOHgZVxjr8CvJJMn4qSydx64XR6+gJjPQwlQ9ENUBQljfiLeRPHeghKBqPxX4qiKA5BDb6iKIpDUIOvKIriENTgK4qiOAQ1+IqiKA5BDb6iKIpDUIOvKIriENTgK4qiOASJX+8sPRCRRuDAKf56GXB8FIczHnDidwZnfm8nfmdw5vc+2e88zRgTt9RwWhv8ZBCRtcaYJWM9jtOJE78zOPN7O/E7gzO/92h+Z5V0FEVRHIIafEVRFIeQyQb/7rEewBjgxO8MzvzeTvzO4MzvPWrfOWM1fEVRFCWWTPbwFUVRlCjU4CuKojiEjDP4InKViOwQkd0icsdYjydViMgUEXlZRLaKyBYR+XL4+AQReV5EdoX/LRnrsY42IuISkQ0i8kT49XQReSt8zn8nIlljPcbRRkSKReRhEdkuIttEZGmmn2sR+Wr42t4sIg+JSHYmnmsR+YWINIjI5qhjcc+thPjf8PffJCKLT6avjDL4IuICfgRcDdQCN4tI7diOKmX4gduNMbXABcDnw9/1DuBFY8xs4MXw60zjy8C2qNf/CfxPeMvNZuDTYzKq1PID4BljzDzgLELfP2PPtYhUAV8ClhhjFgIu4CYy81zfB1w14Fiic3s1MDv8cxvwk5PpKKMMPnAesNsYs9cY4wN+C1w/xmNKCcaYI8aY9eH/txMyAFWEvu/94Wb3A+8fkwGmCBGpBq4B7gm/FuBS4OFwk0z8zkXAcuBeAGOMzxjTQoafa0JbsOaIiBvIBY6QgefaGLMaODHgcKJzez3wKxPiTaBYRCaPtK9MM/hVwKGo13XhYxmNiNQAi4C3gApjzJHwW0eBirEaV4r4PvANIBh+XQq0GGP84deZeM6nA43AL8NS1j0ikkcGn2tjTD3wX8BBQoa+FVhH5p9rm0TnNikbl2kG33GISD7wCPAVY0xb9HsmFHObMXG3InIt0GCMWTfWYznNuIHFwE+MMYuATgbINxl4rksIebPTgUogj8GyhyMYzXObaQa/HpgS9bo6fCwjEREPIWP/oDHm0fDhY/YUL/xvw1iNLwVcCFwnIvsJyXWXEtK2i8PTfsjMc14H1Blj3gq/fpjQAyCTz/UKYJ8xptEY0wc8Suj8Z/q5tkl0bpOycZlm8N8BZodX8rMILfL8cYzHlBLC2vW9wDZjzPei3vojcEv4/7cAj5/usaUKY8ydxphqY0wNoXP7kjHmo8DLwF+Fm2XUdwYwxhwFDonI3PChy4CtZPC5JiTlXCAiueFr3f7OGX2uo0h0bv8IfCIcrXMB0Bol/QyPMSajfoCVwE5gD3DXWI8nhd/zIkLTvE3AxvDPSkKa9ovALuAFYMJYjzVF3/8S4Inw/2cAbwO7gT8A3rEeXwq+79nA2vD5fgwoyfRzDXwL2A5sBn4NeDPxXAMPEVqn6CM0m/t0onMLCKFIxD3Ae4SimEbcl5ZWUBRFcQiZJukoiqIoCVCDryiK4hDU4CuKojgENfiKoigOQQ2+oiiKQ1CDryiK4hDU4CuKojiE/w8i0SdPVulZYwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.415783Z", + "start_time": "2020-12-04T06:20:24.314259Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`res.export_sequence_best_fx()` により、各ステップまでに得られたベスト値とその action の履歴 を得られます。 \n", + "\n", + "`res.export_all_sequence_best_fx()` との違いは、simulator の評価毎ではなく、探索ステップ毎の情報になるという点です。 \n", + "(今回の場合は合計ステップ数は 10, 評価数は 100 です)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:20:24.535770Z", + "start_time": "2020-12-04T06:20:24.418352Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "best_fx, best_action = res.export_sequence_best_fx()\n", + "plt.plot(best_fx)" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_once_mode.html b/manual/v2.0.2/ja/notebook/tutorial_once_mode.html new file mode 100644 index 00000000..b29690c3 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_once_mode.html @@ -0,0 +1,305 @@ + + + + + + + + + 既存の計算結果を読み込んで実行する — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

既存の計算結果を読み込んで実行する

+

以下の流れで、既存のaction ID(パラメータ)とその評価値を読み込み、PHYSBO を実行することができます。

+
    +
  1. 外部ファイルを読み込み、既存のaction ID(パラメータ)と評価値を読み込む。

  2. +
  3. action ID(パラメータ)と評価値をPHYSBOに登録する。

  4. +
  5. PHYSBO から次に実行するパラメータを得る。

  6. +
+

時間制限の関係上、PHYSBO をずっと開いたままにできないため、インタラクティブに実行できないといった場合に、利用することができます。

+
+

探索候補データの準備

+

これまでのチュートリアルと同様、データセットファイル s5-210.csvdata ディレクトリ以下に保存し、次のように読み出します。

+
+
[1]:
+
+
+
import physbo
+
+import numpy as np
+
+
+def load_data():
+    A =  np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )
+    X = A[:,0:3]
+    t  = -A[:,3]
+    return X, t
+
+X, t = load_data()
+X = physbo.misc.centering(X)
+
+
+
+
+
+

事前に計算したデータの用意

+

上述の load_data 関数では全てのXとtが格納されています。ここでは事前に計算したとして、actoin IDのリストをランダムに20個取得し、その評価値を得ます。

+
+
[2]:
+
+
+
import random
+random.seed(0)
+calculated_ids = random.sample(range(t.size), 20)
+print(calculated_ids)
+t_initial = t[calculated_ids]
+
+
+
+
+
+
+
+
+[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]
+
+
+
+
+

action ID(パラメータ)と評価値をPHYSBOに登録

+

policyの初期変数 initial_datacalculated_idst[calculated_ids] をリストとして登録します。

+
+
[3]:
+
+
+
# policy のセット
+policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])
+
+# シード値のセット
+policy.set_seed( 0 )
+
+
+
+
+
+

PHYSBO から次に実行するパラメータを取得

+

ベイズ最適化を行い、次の候補点を得ます。

+
+
[4]:
+
+
+
actions = policy.bayes_search(max_num_probes=1, simulator=None, score="TS", interval=0,  num_rand_basis = 5000)
+print(actions, X[actions])
+
+
+
+
+
+
+
+
+Start the initial hyper parameter searching ...
+Done
+
+Start the hyper parameter learning ...
+0 -th epoch marginal likelihood -20.09302189053099
+50 -th epoch marginal likelihood -23.11964735598211
+100 -th epoch marginal likelihood -24.83020118385076
+150 -th epoch marginal likelihood -25.817906570042602
+200 -th epoch marginal likelihood -26.42342027124426
+250 -th epoch marginal likelihood -26.822598600211865
+300 -th epoch marginal likelihood -27.10872736571494
+350 -th epoch marginal likelihood -27.331572599126865
+400 -th epoch marginal likelihood -27.517235815448124
+450 -th epoch marginal likelihood -27.67892333553869
+500 -th epoch marginal likelihood -27.82299469827059
+Done
+
+[73] [[-1.6680279  -1.46385011  1.68585446]]
+
+
+

得られた候補点について外部で計算を行い、ファイルにactionsとそのスコアを登録する。再びファイルを読み込み、ベイズ最適化を実行し次の候補点を得るというプロセスを繰り返すことで、ベイズ最適化を進めることができます。

+
+
+ + +
+
+ +
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_once_mode.ipynb b/manual/v2.0.2/ja/notebook/tutorial_once_mode.ipynb new file mode 100644 index 00000000..754390c2 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_once_mode.ipynb @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 既存の計算結果を読み込んで実行する\n", + "\n", + "以下の流れで、既存のaction ID(パラメータ)とその評価値を読み込み、PHYSBO を実行することができます。\n", + "\n", + "1. 外部ファイルを読み込み、既存のaction ID(パラメータ)と評価値を読み込む。\n", + "2. action ID(パラメータ)と評価値をPHYSBOに登録する。\n", + "3. PHYSBO から次に実行するパラメータを得る。\n", + "\n", + "時間制限の関係上、PHYSBO をずっと開いたままにできないため、インタラクティブに実行できないといった場合に、利用することができます。\n", + "\n", + "## 探索候補データの準備\n", + "\n", + "これまでのチュートリアルと同様、データセットファイル [s5-210.csv](https://raw.githubusercontent.com/issp-center-dev/PHYSBO/master/examples/grain_bound/data/s5-210.csv) を `data` ディレクトリ以下に保存し、次のように読み出します。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.657314Z", + "start_time": "2020-12-04T06:17:27.967614Z" + } + }, + "outputs": [], + "source": [ + "import physbo\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def load_data():\n", + " A = np.asarray(np.loadtxt('data/s5-210.csv',skiprows=1, delimiter=',') )\n", + " X = A[:,0:3]\n", + " t = -A[:,3]\n", + " return X, t\n", + "\n", + "X, t = load_data()\n", + "X = physbo.misc.centering(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 事前に計算したデータの用意\n", + "\n", + "上述の `load_data` 関数では全てのXとtが格納されています。ここでは事前に計算したとして、actoin IDのリストをランダムに20個取得し、その評価値を得ます。" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[12623, 13781, 1326, 8484, 16753, 15922, 13268, 9938, 15617, 11732, 7157, 16537, 4563, 9235, 4579, 3107, 8208, 17451, 4815, 10162]\n" + ] + } + ], + "source": [ + "import random\n", + "random.seed(0)\n", + "calculated_ids = random.sample(range(t.size), 20)\n", + "print(calculated_ids)\n", + "t_initial = t[calculated_ids]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## action ID(パラメータ)と評価値をPHYSBOに登録\n", + "\n", + "policyの初期変数 `initial_data` に `calculated_ids` と `t[calculated_ids]` をリストとして登録します。" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# policy のセット \n", + "policy = physbo.search.discrete.policy(test_X=X, initial_data=[calculated_ids, t_initial])\n", + "\n", + "# シード値のセット \n", + "policy.set_seed( 0 )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PHYSBO から次に実行するパラメータを取得\n", + "\n", + "ベイズ最適化を行い、次の候補点を得ます。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:17:28.674407Z", + "start_time": "2020-12-04T06:17:28.669875Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start the initial hyper parameter searching ...\n", + "Done\n", + "\n", + "Start the hyper parameter learning ...\n", + "0 -th epoch marginal likelihood -20.09302189053099\n", + "50 -th epoch marginal likelihood -23.11964735598211\n", + "100 -th epoch marginal likelihood -24.83020118385076\n", + "150 -th epoch marginal likelihood -25.817906570042602\n", + "200 -th epoch marginal likelihood -26.42342027124426\n", + "250 -th epoch marginal likelihood -26.822598600211865\n", + "300 -th epoch marginal likelihood -27.10872736571494\n", + "350 -th epoch marginal likelihood -27.331572599126865\n", + "400 -th epoch marginal likelihood -27.517235815448124\n", + "450 -th epoch marginal likelihood -27.67892333553869\n", + "500 -th epoch marginal likelihood -27.82299469827059\n", + "Done\n", + "\n", + "[73] [[-1.6680279 -1.46385011 1.68585446]]\n" + ] + } + ], + "source": [ + "actions = policy.bayes_search(max_num_probes=1, simulator=None, score=\"TS\", interval=0, num_rand_basis = 5000)\n", + "print(actions, X[actions])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "得られた候補点について外部で計算を行い、ファイルにactionsとそのスコアを登録する。再びファイルを読み込み、ベイズ最適化を実行し次の候補点を得るというプロセスを繰り返すことで、ベイズ最適化を進めることができます。" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/manual/v2.0.2/ja/notebook/tutorial_simulator.html b/manual/v2.0.2/ja/notebook/tutorial_simulator.html new file mode 100644 index 00000000..4d5630d0 --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_simulator.html @@ -0,0 +1,333 @@ + + + + + + + + + simulatorクラスの定義 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

simulatorクラスの定義

+

PHYSBOではSimulator関数を使用して目的関数を定義します。 ここでは、一次元の関数の最小値を求める例題をもとに、simulatorクラスの定義方法について紹介します。

+
+

探索空間の定義

+

その他のチュートリアルと同じように、最初に関数を探索する空間を定義します。 以下の例では、探索空間Xx_min = -2.0からx_max = 2.0までwindow_num=10001分割で刻んだグリッドで定義しています。 なお、Xwindow_num x d のndarray形式にする必要があります(dは次元数、この場合は2次元)。そのため、reshapeを行って変形しています。

+
+
[ ]:
+
+
+
#In
+import numpy as np
+import scipy
+import physbo
+import itertools
+
+#In
+#Create candidate
+window_num=10001
+x_max = 2.0
+x_min = -2.0
+
+X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)
+
+
+
+
+
+

simulatorクラスの定義

+

目的関数を定義するためのsimulatorクラスをここで定義します。

+

今回はf(x) = 3 x^4 + 4 x ^3 + 1.0 が最小となるxを探索するという問題設定にしています(答えはx=-1.0)。

+

simulatorクラスでは、__call__関数を定義します(初期変数などがある場合は__init__を定義します)。 actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。 今回は一つの候補のみを毎回計算するため、action_idx=action[0]としてXから候補点を一つ選んでいます。 PHYSBOでは目的関数値が最大となるものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。

+
+
[ ]:
+
+
+
# Declare the class for calling the simulator.
+class simulator:
+
+    def __call__(self, action ):
+        action_idx = action[0]
+        x = X[action_idx][0]
+        fx = 3.0*x**4 + 4.0*x**3 + 1.0
+        fx_list.append(fx)
+        x_list.append(X[action_idx][0])
+
+        print ("*********************")
+        print ("Present optimum interactions")
+
+        print ("x_opt=", x_list[np.argmin(np.array(fx_list))])
+
+        return -fx, x
+
+
+
+
+
+

ランダムサーチ

+

ベイズ最適化を行う前に、探索空間からランダムに候補点を選び目的関数値を評価することで、事前にトレーニングデータを用意します(飛ばすことも可能です)。

+
+
[ ]:
+
+
+
fx_list=[]
+x_list = []
+#In
+# Design of policy
+# Declaring the policy by
+policy = physbo.search.discrete.policy(test_X=X)
+# test_X is the set of candidates which is represented by numpy.array.
+# Each row vector represents the feature vector of the corresponding candidate
+
+# set the seed parameter
+policy.set_seed( 1 )
+
+
+# If you want to perform the initial random search before starting the Bayesian optimization,
+# the random sampling is performed by
+
+res = policy.random_search(max_num_probes=50, simulator=simulator())
+# Input:
+# max_num_probes: number of random search
+# simulator = simulator
+# output: combo.search.discreate.results (class)
+
+
+
+
+
+

ベイズ最適化

+

定義したsimulatorに対してベイズ最適化を実施します。

+
+
[ ]:
+
+
+
# single query Bayesian search
+# The single query version of COMBO is performed by
+res = policy.bayes_search(max_num_probes= 150, simulator=simulator(), score='TS',
+                                                  interval=20, num_rand_basis=5000)
+
+# Input
+# max_num_probes: number of searching by Bayesian optimization
+# simulator: the class of simulator which is defined above
+# score: the type of aquision funciton. TS, EI and PI are available
+# interval: the timing for learning the hyper parameter.
+#               In this case, the hyper parameter is learned at each 20 steps
+#               If you set the negative value to interval, the hyper parameter learning is not performed
+#               If you set zero to interval, the hyper parameter learning is performed only at the first step
+# num_rand_basis: the number of basis function. If you choose 0,  ordinary Gaussian process runs
+
+
+
+
+
+

結果表示

+

得られた結果のうち、一番よいスコアを持つものはexport_all_sequence_best_fx()を用いることで取り出すことができます。 また、これまでの全ての履歴をみたい場合には、chosen_actionsを呼び出すことで表示することができます。以下、結果を表示するサンプルスクリプトを記載します。

+
+
[ ]:
+
+
+
#In
+best_fx, best_action = res.export_all_sequence_best_fx()
+
+import matplotlib.pyplot as plt
+# The result of searching is summarized in the class combo.search.discrete.results.history()
+# res.fx: observed negative energy at each step
+# res.chosen_actions: history of choosed actions
+# fbest, best_action= res.export_all_sequence_best_fx(): current best fx and current best action
+#                                                                                                   that has been observed until each step
+# res.total_num_search: total number of search
+plt.plot(res.fx[0:res.total_num_search])
+
+
+
+
+
[ ]:
+
+
+
plt.plot(best_fx)
+
+
+
+
+
[ ]:
+
+
+
plt.plot(best_action)
+
+
+
+

最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。

+
+
[ ]:
+
+
+
print(X[int(best_action[-1])])
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/notebook/tutorial_simulator.ipynb b/manual/v2.0.2/ja/notebook/tutorial_simulator.ipynb new file mode 100644 index 00000000..06275c8d --- /dev/null +++ b/manual/v2.0.2/ja/notebook/tutorial_simulator.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# simulatorクラスの定義\n", + "\n", + "\n", + "PHYSBOではSimulator関数を使用して目的関数を定義します。\n", + "ここでは、一次元の関数の最小値を求める例題をもとに、simulatorクラスの定義方法について紹介します。\n", + "\n", + "## 探索空間の定義\n", + "\n", + "その他のチュートリアルと同じように、最初に関数を探索する空間を定義します。\n", + "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", + "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は2次元)。そのため、reshapeを行って変形しています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.552947Z", + "start_time": "2020-12-04T06:21:37.242727Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "import numpy as np\n", + "import scipy\n", + "import physbo\n", + "import itertools\n", + "\n", + "#In\n", + "#Create candidate\n", + "window_num=10001\n", + "x_max = 2.0\n", + "x_min = -2.0\n", + "\n", + "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulatorクラスの定義\n", + "\n", + "目的関数を定義するためのsimulatorクラスをここで定義します。\n", + "\n", + "今回はf(x) = 3 x^4 + 4 x ^3 + 1.0 が最小となるxを探索するという問題設定にしています(答えはx=-1.0)。\n", + "\n", + "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", + "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", + "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", + "PHYSBOでは目的関数値が最大となるものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.558852Z", + "start_time": "2020-12-04T06:21:37.554788Z" + } + }, + "outputs": [], + "source": [ + "# Declare the class for calling the simulator.\n", + "class simulator:\n", + "\n", + " def __call__(self, action ):\n", + " action_idx = action[0]\n", + " x = X[action_idx][0]\n", + " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", + " fx_list.append(fx)\n", + " x_list.append(X[action_idx][0])\n", + "\n", + " print (\"*********************\")\n", + " print (\"Present optimum interactions\")\n", + "\n", + " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", + "\n", + " return -fx, x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ランダムサーチ\n", + "\n", + "ベイズ最適化を行う前に、探索空間からランダムに候補点を選び目的関数値を評価することで、事前にトレーニングデータを用意します(飛ばすことも可能です)。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:21:37.717038Z", + "start_time": "2020-12-04T06:21:37.563144Z" + } + }, + "outputs": [], + "source": [ + "fx_list=[]\n", + "x_list = []\n", + "#In\n", + "# Design of policy\n", + "# Declaring the policy by\n", + "policy = physbo.search.discrete.policy(test_X=X)\n", + "# test_X is the set of candidates which is represented by numpy.array.\n", + "# Each row vector represents the feature vector of the corresponding candidate\n", + "\n", + "# set the seed parameter\n", + "policy.set_seed( 1 )\n", + "\n", + "\n", + "# If you want to perform the initial random search before starting the Bayesian optimization,\n", + "# the random sampling is performed by\n", + "\n", + "res = policy.random_search(max_num_probes=50, simulator=simulator())\n", + "# Input:\n", + "# max_num_probes: number of random search\n", + "# simulator = simulator\n", + "# output: combo.search.discreate.results (class)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ベイズ最適化\n", + "\n", + "定義したsimulatorに対してベイズ最適化を実施します。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:30.554566Z", + "start_time": "2020-12-04T06:21:37.718406Z" + } + }, + "outputs": [], + "source": [ + "# single query Bayesian search\n", + "# The single query version of COMBO is performed by\n", + "res = policy.bayes_search(max_num_probes= 150, simulator=simulator(), score='TS',\n", + " interval=20, num_rand_basis=5000)\n", + "\n", + "# Input\n", + "# max_num_probes: number of searching by Bayesian optimization\n", + "# simulator: the class of simulator which is defined above\n", + "# score: the type of aquision funciton. TS, EI and PI are available\n", + "# interval: the timing for learning the hyper parameter.\n", + "# In this case, the hyper parameter is learned at each 20 steps\n", + "# If you set the negative value to interval, the hyper parameter learning is not performed\n", + "# If you set zero to interval, the hyper parameter learning is performed only at the first step\n", + "# num_rand_basis: the number of basis function. If you choose 0, ordinary Gaussian process runs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 結果表示\n", + "\n", + "得られた結果のうち、一番よいスコアを持つものは``export_all_sequence_best_fx()``を用いることで取り出すことができます。\n", + "また、これまでの全ての履歴をみたい場合には、``chosen_actions``を呼び出すことで表示することができます。以下、結果を表示するサンプルスクリプトを記載します。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:30.932451Z", + "start_time": "2020-12-04T06:24:30.555830Z" + } + }, + "outputs": [], + "source": [ + "#In\n", + "best_fx, best_action = res.export_all_sequence_best_fx()\n", + "\n", + "import matplotlib.pyplot as plt\n", + "# The result of searching is summarized in the class combo.search.discrete.results.history()\n", + "# res.fx: observed negative energy at each step\n", + "# res.chosen_actions: history of choosed actions\n", + "# fbest, best_action= res.export_all_sequence_best_fx(): current best fx and current best action\n", + "# that has been observed until each step\n", + "# res.total_num_search: total number of search\n", + "plt.plot(res.fx[0:res.total_num_search])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.066401Z", + "start_time": "2020-12-04T06:24:30.934178Z" + } + }, + "outputs": [], + "source": [ + "plt.plot(best_fx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.200565Z", + "start_time": "2020-12-04T06:24:31.068515Z" + } + }, + "outputs": [], + "source": [ + "plt.plot(best_action)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2020-12-04T06:24:31.204953Z", + "start_time": "2020-12-04T06:24:31.201964Z" + } + }, + "outputs": [], + "source": [ + "print(X[int(best_action[-1])])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/manual/v2.0.2/ja/objects.inv b/manual/v2.0.2/ja/objects.inv new file mode 100644 index 00000000..f71ecf9a Binary files /dev/null and b/manual/v2.0.2/ja/objects.inv differ diff --git a/manual/v2.0.2/ja/py-modindex.html b/manual/v2.0.2/ja/py-modindex.html new file mode 100644 index 00000000..6198adb2 --- /dev/null +++ b/manual/v2.0.2/ja/py-modindex.html @@ -0,0 +1,423 @@ + + + + + + + + Pythonモジュール索引 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Pythonモジュール索引

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ physbo +
    + physbo.blm +
    + physbo.blm.basis +
    + physbo.blm.basis.fourier +
    + physbo.blm.core +
    + physbo.blm.core.model +
    + physbo.blm.inf +
    + physbo.blm.inf.exact +
    + physbo.blm.lik +
    + physbo.blm.lik.gauss +
    + physbo.blm.lik.linear +
    + physbo.blm.predictor +
    + physbo.blm.prior +
    + physbo.blm.prior.gauss +
    + physbo.gp +
    + physbo.gp.core +
    + physbo.gp.core.learning +
    + physbo.gp.core.model +
    + physbo.gp.core.prior +
    + physbo.gp.cov +
    + physbo.gp.cov.gauss +
    + physbo.gp.inf +
    + physbo.gp.inf.exact +
    + physbo.gp.lik +
    + physbo.gp.lik.gauss +
    + physbo.gp.mean +
    + physbo.gp.mean.const +
    + physbo.gp.mean.zero +
    + physbo.gp.predictor +
    + physbo.misc +
    + physbo.misc.centering +
    + physbo.misc.gauss_elim +
    + physbo.misc.set_config +
    + physbo.opt +
    + physbo.opt.adam +
    + physbo.predictor +
    + physbo.search +
    + physbo.search.discrete +
    + physbo.search.discrete.policy +
    + physbo.search.discrete.results +
    + physbo.search.discrete_multi +
    + physbo.search.discrete_multi.policy +
    + physbo.search.discrete_multi.results +
    + physbo.search.pareto +
    + physbo.search.score +
    + physbo.search.score_multi +
    + physbo.search.utility +
    + physbo.variable +
+ + +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/search.html b/manual/v2.0.2/ja/search.html new file mode 100644 index 00000000..7c23caca --- /dev/null +++ b/manual/v2.0.2/ja/search.html @@ -0,0 +1,188 @@ + + + + + + + + 検索 — PHYSBO 2.0.2 ドキュメント + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2020-, PHYSBO developers.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + +
+ + Read the Docs + v: v2.0.2 + + +
+
+
Languages
+ + +
+ + en + +
+ + +
+ + ja + +
+ + +
Branches
+ + +
+ + develop + +
+ + +
+ + master + +
+ + +
+ + v2.0.2 + +
+ + +
Tags
+ + +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/manual/v2.0.2/ja/searchindex.js b/manual/v2.0.2/ja/searchindex.js new file mode 100644 index 00000000..69f20659 --- /dev/null +++ b/manual/v2.0.2/ja/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"1\u3064\u76ee\u306e\u76ee\u7684\u95a2\u6570": [[59, "1\u3064\u76ee\u306e\u76ee\u7684\u95a2\u6570"]], "2\u3064\u76ee\u306e\u76ee\u7684\u95a2\u6570": [[59, "2\u3064\u76ee\u306e\u76ee\u7684\u95a2\u6570"]], "Contents:": [[52, null], [55, null]], "EHVI (Expected Hyper-Volume Improvement)": [[59, "EHVI-(Expected-Hyper-Volume-Improvement)"]], "HVPI (HyperVolume-based Probability of Improvement)": [[59, "HVPI-(HyperVolume-based-Probability-of-Improvement)"]], "Module contents": [[3, "module-physbo"], [4, "module-physbo.blm"], [5, "module-physbo.blm.basis"], [7, "module-physbo.blm.core"], [9, "module-physbo.blm.inf"], [11, "module-physbo.blm.lik"], [15, "module-physbo.blm.prior"], [17, "module-physbo.gp"], [18, "module-physbo.gp.core"], [22, "module-physbo.gp.cov"], [24, "module-physbo.gp.inf"], [26, "module-physbo.gp.lik"], [28, "module-physbo.gp.mean"], [32, "module-physbo.misc"], [36, "module-physbo.opt"], [39, "module-physbo.search"], [40, "module-physbo.search.discrete"], [43, "module-physbo.search.discrete_multi"]], "PHYSBO \u304b\u3089\u6b21\u306b\u5b9f\u884c\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u53d6\u5f97": [[61, "PHYSBO-\u304b\u3089\u6b21\u306b\u5b9f\u884c\u3059\u308b\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u53d6\u5f97"]], "PHYSBO \u3068\u306f": [[54, "physbo"]], "PHYSBO \u306e\u57fa\u672c": [[57, null]], "PHYSBO \u306e\u5f15\u7528": [[54, "id3"]], "PHYSBO\u306b\u3088\u308b\u30d9\u30a4\u30ba\u6700\u9069\u5316\u306e\u9ad8\u901f\u5316": [[1, "physbo"]], "PHYSBO\u306e\u57fa\u672c\u69cb\u9020": [[53, "physbo"]], "Submodules": [[3, "submodules"], [4, "submodules"], [5, "submodules"], [7, "submodules"], [9, "submodules"], [11, "submodules"], [15, "submodules"], [17, "submodules"], [18, "submodules"], [22, "submodules"], [24, "submodules"], [26, "submodules"], [28, "submodules"], [32, "submodules"], [36, "submodules"], [39, "submodules"], [40, "submodules"], [43, "submodules"]], "Subpackages": [[3, "subpackages"], [4, "subpackages"], [17, "subpackages"], [39, "subpackages"]], "TS (Thompson Sampling)": [[59, "TS-(Thompson-Sampling)"]], "Welcome to PHYSBO's documentation!": [[52, null]], "action ID(\u30d1\u30e9\u30e1\u30fc\u30bf)\u3068\u8a55\u4fa1\u5024\u3092PHYSBO\u306b\u767b\u9332": [[61, "action-ID(\u30d1\u30e9\u30e1\u30fc\u30bf)\u3068\u8a55\u4fa1\u5024\u3092PHYSBO\u306b\u767b\u9332"]], "physbo": [[2, null]], "physbo package": [[3, null]], "physbo.blm package": [[4, null]], "physbo.blm.basis package": [[5, null]], "physbo.blm.basis.fourier module": [[6, null]], "physbo.blm.core package": [[7, null]], "physbo.blm.core.model module": [[8, null]], "physbo.blm.inf package": [[9, null]], "physbo.blm.inf.exact module": [[10, null]], "physbo.blm.lik package": [[11, null]], "physbo.blm.lik.gauss module": [[12, null]], "physbo.blm.lik.linear module": [[13, null]], "physbo.blm.predictor module": [[14, null]], "physbo.blm.prior package": [[15, null]], "physbo.blm.prior.gauss module": [[16, null]], "physbo.gp package": [[17, null]], "physbo.gp.core package": [[18, null]], "physbo.gp.core.learning module": [[19, null]], "physbo.gp.core.model module": [[20, null]], "physbo.gp.core.prior module": [[21, null]], "physbo.gp.cov package": [[22, null]], "physbo.gp.cov.gauss module": [[23, null]], "physbo.gp.inf package": [[24, null]], "physbo.gp.inf.exact module": [[25, null]], "physbo.gp.lik package": [[26, null]], "physbo.gp.lik.gauss module": [[27, null]], "physbo.gp.mean package": [[28, null]], "physbo.gp.mean.const module": [[29, null]], "physbo.gp.mean.zero module": [[30, null]], "physbo.gp.predictor module": [[31, null]], "physbo.misc package": [[32, null]], "physbo.misc.centering module": [[33, null]], "physbo.misc.gauss_elim module": [[34, null]], "physbo.misc.set_config module": [[35, null]], "physbo.opt package": [[36, null]], "physbo.opt.adam module": [[37, null]], "physbo.predictor module": [[38, null]], "physbo.search package": [[39, null]], "physbo.search.discrete package": [[40, null]], "physbo.search.discrete.policy module": [[41, null]], "physbo.search.discrete.results module": [[42, null]], "physbo.search.discrete_multi package": [[43, null]], "physbo.search.discrete_multi.policy module": [[44, null]], "physbo.search.discrete_multi.results module": [[45, null]], "physbo.search.pareto module": [[46, null]], "physbo.search.score module": [[47, null]], "physbo.search.score_multi module": [[48, null]], "physbo.search.utility module": [[49, null]], "physbo.variable module": [[50, null]], "policy \u306e\u30bb\u30c3\u30c8": [[57, "policy-\u306e\u30bb\u30c3\u30c8"], [59, "policy-\u306e\u30bb\u30c3\u30c8"]], "simulator \u306e\u5b9a\u7fa9": [[58, "simulator-\u306e\u5b9a\u7fa9"], [59, "simulator-\u306e\u5b9a\u7fa9"], [60, "simulator-\u306e\u5b9a\u7fa9"]], "simulator\u30af\u30e9\u30b9\u306e\u5b9a\u7fa9": [[57, "simulator\u30af\u30e9\u30b9\u306e\u5b9a\u7fa9"], [62, null], [62, "id2"]], "\u304a\u554f\u3044\u5408\u308f\u305b": [[51, null]], "\u306f\u3058\u3081\u306b": [[54, null], [57, "\u306f\u3058\u3081\u306b"]], "\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0": [[1, null]], "\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": [[53, "id5"]], "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": [[53, "id2"]], "\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306b\u5b9f\u884c\u3059\u308b": [[58, null]], "\u30ac\u30a6\u30b9\u904e\u7a0b": [[56, null]], "\u30ac\u30a6\u30b9\u904e\u7a0b\u306e\u5b66\u7fd2\u3068\u4e88\u6e2c": [[56, "\u30ac\u30a6\u30b9\u904e\u7a0b\u306e\u5b66\u7fd2\u3068\u4e88\u6e2c"]], "\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30fb\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": [[53, "id4"]], "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": [[55, null]], "\u30c6\u30b9\u30c8\u95a2\u6570": [[59, "\u30c6\u30b9\u30c8\u95a2\u6570"]], "\u30d1\u30ec\u30fc\u30c8\u89e3\u306e\u30d7\u30ed\u30c3\u30c8": [[59, "\u30d1\u30ec\u30fc\u30c8\u89e3\u306e\u30d7\u30ed\u30c3\u30c8"], [59, "id15"], [59, "id17"]], "\u30d1\u30ec\u30fc\u30c8\u89e3\u306e\u53d6\u5f97": [[59, "\u30d1\u30ec\u30fc\u30c8\u89e3\u306e\u53d6\u5f97"]], "\u30d9\u30a4\u30ba\u6700\u9069\u5316": [[1, "id3"], [57, "\u30d9\u30a4\u30ba\u6700\u9069\u5316"], [59, "\u30d9\u30a4\u30ba\u6700\u9069\u5316"], [62, "\u30d9\u30a4\u30ba\u6700\u9069\u5316"]], "\u30e9\u30a4\u30bb\u30f3\u30b9": [[54, "id5"]], "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1": [[57, "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1"], [59, "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1"], [62, "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1"]], "\u4e26\u5217\u5316": [[57, "\u4e26\u5217\u5316"]], "\u4e2d\u65ad\u3068\u518d\u958b": [[58, "\u4e2d\u65ad\u3068\u518d\u958b"]], "\u4e3b\u306a\u958b\u767a\u8005": [[54, "id4"]], "\u4e8b\u524d\u306b\u8a08\u7b97\u3057\u305f\u30c7\u30fc\u30bf\u306e\u7528\u610f": [[61, "\u4e8b\u524d\u306b\u8a08\u7b97\u3057\u305f\u30c7\u30fc\u30bf\u306e\u7528\u610f"]], "\u4ed8\u9332\uff1a\u5168\u63a2\u7d22": [[59, "\u4ed8\u9332\uff1a\u5168\u63a2\u7d22"]], "\u52a3\u89e3\u9818\u57df (dominated region) \u306e\u4f53\u7a4d\u3092\u8a08\u7b97": [[59, "\u52a3\u89e3\u9818\u57df-(dominated-region)-\u306e\u4f53\u7a4d\u3092\u8a08\u7b97"]], "\u52a3\u89e3\u9818\u57df\u4f53\u7a4d": [[59, "\u52a3\u89e3\u9818\u57df\u4f53\u7a4d"], [59, "id16"], [59, "id18"]], "\u56de\u5e30": [[57, "\u56de\u5e30"]], "\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5": [[53, null]], "\u591a\u76ee\u7684\u6700\u9069\u5316": [[59, null]], "\u5b66\u7fd2\u30c7\u30fc\u30bf\u306e\u5b9a\u7fa9": [[56, "\u5b66\u7fd2\u30c7\u30fc\u30bf\u306e\u5b9a\u7fa9"]], "\u5b9f\u884c\u74b0\u5883\u30fb\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8": [[53, "id3"]], "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099": [[56, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"], [57, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"], [58, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"], [59, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"], [60, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"], [61, "\u63a2\u7d22\u5019\u88dc\u30c7\u30fc\u30bf\u306e\u6e96\u5099"]], "\u63a2\u7d22\u7a7a\u9593\u306e\u5b9a\u7fa9": [[62, "\u63a2\u7d22\u7a7a\u9593\u306e\u5b9a\u7fa9"]], "\u65e2\u5b58\u306e\u8a08\u7b97\u7d50\u679c\u3092\u8aad\u307f\u8fbc\u3093\u3067\u5b9f\u884c\u3059\u308b": [[61, null]], "\u6700\u9069\u5316\u306e\u5b9f\u884c": [[57, "\u6700\u9069\u5316\u306e\u5b9f\u884c"], [58, "\u6700\u9069\u5316\u306e\u5b9f\u884c"], [59, "\u6700\u9069\u5316\u306e\u5b9f\u884c"], [60, "\u6700\u9069\u5316\u306e\u5b9f\u884c"]], "\u7372\u5f97\u95a2\u6570": [[57, "\u7372\u5f97\u95a2\u6570"]], "\u7d50\u679c\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba": [[57, "\u7d50\u679c\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba"]], "\u7d50\u679c\u306e\u78ba\u8a8d": [[57, "\u7d50\u679c\u306e\u78ba\u8a8d"], [59, "\u7d50\u679c\u306e\u78ba\u8a8d"], [60, "\u7d50\u679c\u306e\u78ba\u8a8d"]], "\u7d50\u679c\u8868\u793a": [[62, "\u7d50\u679c\u8868\u793a"]], "\u8907\u6570\u5019\u88dc\u3092\u4e00\u5ea6\u306b\u63a2\u7d22\u3059\u308b": [[60, null]], "\u89e3\uff08\u8a55\u4fa1\u5024\uff09\u306e\u30d7\u30ed\u30c3\u30c8": [[59, "\u89e3\uff08\u8a55\u4fa1\u5024\uff09\u306e\u30d7\u30ed\u30c3\u30c8"]], "\u8a08\u7b97\u306e\u6d41\u308c": [[53, "id6"]], "\u8a13\u7df4\u6e08\u307f\u30e2\u30c7\u30eb\u306b\u3088\u308b\u4e88\u6e2c": [[56, "\u8a13\u7df4\u6e08\u307f\u30e2\u30c7\u30eb\u306b\u3088\u308b\u4e88\u6e2c"]], "\u8b1d\u8f9e": [[0, null]], "\u95a2\u6570\u306e\u30d7\u30ed\u30c3\u30c8": [[59, "\u95a2\u6570\u306e\u30d7\u30ed\u30c3\u30c8"]]}, "docnames": ["acknowledgement", "algorithm", "api/modules", "api/physbo", "api/physbo.blm", "api/physbo.blm.basis", "api/physbo.blm.basis.fourier", "api/physbo.blm.core", "api/physbo.blm.core.model", "api/physbo.blm.inf", "api/physbo.blm.inf.exact", "api/physbo.blm.lik", "api/physbo.blm.lik.gauss", "api/physbo.blm.lik.linear", "api/physbo.blm.predictor", "api/physbo.blm.prior", "api/physbo.blm.prior.gauss", "api/physbo.gp", "api/physbo.gp.core", "api/physbo.gp.core.learning", "api/physbo.gp.core.model", "api/physbo.gp.core.prior", "api/physbo.gp.cov", "api/physbo.gp.cov.gauss", "api/physbo.gp.inf", "api/physbo.gp.inf.exact", "api/physbo.gp.lik", "api/physbo.gp.lik.gauss", "api/physbo.gp.mean", "api/physbo.gp.mean.const", "api/physbo.gp.mean.zero", "api/physbo.gp.predictor", "api/physbo.misc", "api/physbo.misc.centering", "api/physbo.misc.gauss_elim", "api/physbo.misc.set_config", "api/physbo.opt", "api/physbo.opt.adam", "api/physbo.predictor", "api/physbo.search", "api/physbo.search.discrete", "api/physbo.search.discrete.policy", "api/physbo.search.discrete.results", "api/physbo.search.discrete_multi", "api/physbo.search.discrete_multi.policy", "api/physbo.search.discrete_multi.results", "api/physbo.search.pareto", "api/physbo.search.score", "api/physbo.search.score_multi", "api/physbo.search.utility", "api/physbo.variable", "contact", "index", "install", "introduction", "notebook/index", "notebook/tutorial_Gaussian_process", "notebook/tutorial_basic", "notebook/tutorial_interactive_mode", "notebook/tutorial_multi_objective", "notebook/tutorial_multi_probe", "notebook/tutorial_once_mode", "notebook/tutorial_simulator"], "envversion": {"nbsphinx": 4, "sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["acknowledgement.rst", "algorithm.rst", "api/modules.rst", "api/physbo.rst", "api/physbo.blm.rst", "api/physbo.blm.basis.rst", "api/physbo.blm.basis.fourier.rst", "api/physbo.blm.core.rst", "api/physbo.blm.core.model.rst", "api/physbo.blm.inf.rst", "api/physbo.blm.inf.exact.rst", "api/physbo.blm.lik.rst", "api/physbo.blm.lik.gauss.rst", "api/physbo.blm.lik.linear.rst", "api/physbo.blm.predictor.rst", "api/physbo.blm.prior.rst", "api/physbo.blm.prior.gauss.rst", "api/physbo.gp.rst", "api/physbo.gp.core.rst", "api/physbo.gp.core.learning.rst", "api/physbo.gp.core.model.rst", "api/physbo.gp.core.prior.rst", "api/physbo.gp.cov.rst", "api/physbo.gp.cov.gauss.rst", "api/physbo.gp.inf.rst", "api/physbo.gp.inf.exact.rst", "api/physbo.gp.lik.rst", "api/physbo.gp.lik.gauss.rst", "api/physbo.gp.mean.rst", "api/physbo.gp.mean.const.rst", "api/physbo.gp.mean.zero.rst", "api/physbo.gp.predictor.rst", "api/physbo.misc.rst", "api/physbo.misc.centering.rst", "api/physbo.misc.gauss_elim.rst", "api/physbo.misc.set_config.rst", "api/physbo.opt.rst", "api/physbo.opt.adam.rst", "api/physbo.predictor.rst", "api/physbo.search.rst", "api/physbo.search.discrete.rst", "api/physbo.search.discrete.policy.rst", "api/physbo.search.discrete.results.rst", "api/physbo.search.discrete_multi.rst", "api/physbo.search.discrete_multi.policy.rst", "api/physbo.search.discrete_multi.results.rst", "api/physbo.search.pareto.rst", "api/physbo.search.score.rst", "api/physbo.search.score_multi.rst", "api/physbo.search.utility.rst", "api/physbo.variable.rst", "contact.rst", "index.rst", "install.rst", "introduction.rst", "notebook/index.rst", "notebook/tutorial_Gaussian_process.ipynb", "notebook/tutorial_basic.ipynb", "notebook/tutorial_interactive_mode.ipynb", "notebook/tutorial_multi_objective.ipynb", "notebook/tutorial_multi_probe.ipynb", "notebook/tutorial_once_mode.ipynb", "notebook/tutorial_simulator.ipynb"], "indexentries": {"_init_params (physbo.blm.lik.linear.linear \u306e\u5c5e\u6027)": [[13, "physbo.blm.lik.linear.linear._init_params", false]], "adam (physbo.gp.core.learning \u306e\u30af\u30e9\u30b9)": [[19, "physbo.gp.core.learning.adam", false]], "adam (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.adam", false]], "adam (physbo.opt.adam \u306e\u30af\u30e9\u30b9)": [[37, "physbo.opt.adam.adam", false]], "add() (physbo.search.pareto.rectangles \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Rectangles.add", false]], "add() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.add", false]], "add_t() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.add_t", false]], "add_x() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.add_X", false]], "add_z() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.add_Z", false]], "alpha (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.alpha", false]], "base_predictor (physbo.predictor \u306e\u30af\u30e9\u30b9)": [[38, "physbo.predictor.base_predictor", false]], "basis (physbo.blm.lik.linear.linear \u306e\u5c5e\u6027)": [[13, "physbo.blm.lik.linear.linear.basis", false]], "batch (physbo.gp.core.learning \u306e\u30af\u30e9\u30b9)": [[19, "physbo.gp.core.learning.batch", false]], "batch (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.batch", false]], "bayes_search() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.bayes_search", false]], "bayes_search() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.bayes_search", false]], "beta (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.beta", false]], "bias (physbo.blm.lik.linear.linear \u306e\u5c5e\u6027)": [[13, "physbo.blm.lik.linear.linear.bias", false]], "blm (physbo.blm.predictor.predictor \u306e\u5c5e\u6027)": [[14, "physbo.blm.predictor.predictor.blm", false]], "boolean() (physbo.misc.set_config \u30e2\u30b8\u30e5\u30fc\u30eb)": [[35, "physbo.misc.set_config.boolean", false]], "cat_params() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.cat_params", false]], "cat_params() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.cat_params", false]], "cat_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.cat_params", false]], "centering() (physbo.misc.centering \u30e2\u30b8\u30e5\u30fc\u30eb)": [[33, "physbo.misc.centering.centering", false]], "config (physbo.blm.predictor.predictor \u306e\u5c5e\u6027)": [[14, "physbo.blm.predictor.predictor.config", false]], "const (physbo.gp.mean.const \u306e\u30af\u30e9\u30b9)": [[29, "physbo.gp.mean.const.const", false]], "cov (physbo.blm.lik.gauss.gauss \u306e\u5c5e\u6027)": [[12, "physbo.blm.lik.gauss.gauss.cov", false]], "cov (physbo.blm.prior.gauss.gauss \u306e\u5c5e\u6027)": [[16, "physbo.blm.prior.gauss.gauss.cov", false]], "cov_const (physbo.blm.prior.gauss \u306e\u30af\u30e9\u30b9)": [[16, "physbo.blm.prior.gauss.cov_const", false]], "decomp_params() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.decomp_params", false]], "decomp_params() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.decomp_params", false]], "decomp_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.decomp_params", false]], "delete() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.delete", false]], "delete_stats() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.delete_stats", false]], "delete_stats() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.delete_stats", false]], "delete_stats() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.delete_stats", false]], "delete_t() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.delete_t", false]], "delete_x() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.delete_X", false]], "delete_z() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.delete_Z", false]], "disp_marlik() (physbo.gp.core.learning.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.online.disp_marlik", false]], "divide_non_dominated_region() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.divide_non_dominated_region", false]], "dominate() (physbo.search.pareto \u30e2\u30b8\u30e5\u30fc\u30eb)": [[46, "physbo.search.pareto.dominate", false]], "ehvi() (physbo.search.score_multi \u30e2\u30b8\u30e5\u30fc\u30eb)": [[48, "physbo.search.score_multi.EHVI", false]], "ei() (physbo.search.score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[47, "physbo.search.score.EI", false]], "epoch (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.epoch", false]], "epsilon (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.epsilon", false]], "eval_marlik() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.eval_marlik", false]], "eval_marlik() (physbo.gp.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[25, "physbo.gp.inf.exact.eval_marlik", false]], "export_all_sequence_best_fx() (physbo.search.discrete.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[42, "physbo.search.discrete.results.history.export_all_sequence_best_fx", false]], "export_blm() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.export_blm", false]], "export_front() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.export_front", false]], "export_history() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.export_history", false]], "export_pareto_front() (physbo.search.discrete_multi.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[45, "physbo.search.discrete_multi.results.history.export_pareto_front", false]], "export_predictor() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.export_predictor", false]], "export_sequence_best_fx() (physbo.search.discrete.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[42, "physbo.search.discrete.results.history.export_sequence_best_fx", false]], "export_training() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.export_training", false]], "fit() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.fit", false]], "fit() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.fit", false]], "fit() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.fit", false]], "fit() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.fit", false]], "fourier (physbo.blm.basis.fourier \u306e\u30af\u30e9\u30b9)": [[6, "physbo.blm.basis.fourier.fourier", false]], "gamma (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.gamma", false]], "gauss (physbo.blm.lik.gauss \u306e\u30af\u30e9\u30b9)": [[12, "physbo.blm.lik.gauss.gauss", false]], "gauss (physbo.blm.prior.gauss \u306e\u30af\u30e9\u30b9)": [[16, "physbo.blm.prior.gauss.gauss", false]], "gauss (physbo.gp.cov.gauss \u306e\u30af\u30e9\u30b9)": [[23, "physbo.gp.cov.gauss.gauss", false]], "gauss (physbo.gp.lik.gauss \u306e\u30af\u30e9\u30b9)": [[27, "physbo.gp.lik.gauss.gauss", false]], "gauss_elim() (physbo.misc.gauss_elim \u30e2\u30b8\u30e5\u30fc\u30eb)": [[34, "physbo.misc.gauss_elim.gauss_elim", false]], "get_basis() (physbo.blm.basis.fourier.fourier \u306e\u30e1\u30bd\u30c3\u30c9)": [[6, "physbo.blm.basis.fourier.fourier.get_basis", false]], "get_basis() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.get_basis", false]], "get_basis() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_basis", false]], "get_basis() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_basis", false]], "get_basis() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_basis", false]], "get_cand_params() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.get_cand_params", false]], "get_cand_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.get_cand_params", false]], "get_cand_params() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.get_cand_params", false]], "get_cand_params() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.get_cand_params", false]], "get_cov() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.get_cov", false]], "get_cov() (physbo.blm.prior.gauss.cov_const \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.cov_const.get_cov", false]], "get_cov() (physbo.blm.prior.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.gauss.get_cov", false]], "get_cov() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.get_cov", false]], "get_cov() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.get_cov", false]], "get_cov() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.get_cov", false]], "get_grad() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.get_grad", false]], "get_grad() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.get_grad", false]], "get_grad() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.get_grad", false]], "get_grad() (physbo.gp.mean.zero.zero \u306e\u30e1\u30bd\u30c3\u30c9)": [[30, "physbo.gp.mean.zero.zero.get_grad", false]], "get_grad_cov() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.get_grad_cov", false]], "get_grad_marlik() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.get_grad_marlik", false]], "get_grad_marlik() (physbo.gp.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[25, "physbo.gp.inf.exact.get_grad_marlik", false]], "get_grad_mean() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.get_grad_mean", false]], "get_mean() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.get_mean", false]], "get_mean() (physbo.blm.lik.linear.linear \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "physbo.blm.lik.linear.linear.get_mean", false]], "get_mean() (physbo.blm.prior.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.gauss.get_mean", false]], "get_mean() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.get_mean", false]], "get_mean() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.get_mean", false]], "get_mean() (physbo.gp.mean.zero.zero \u306e\u30e1\u30bd\u30c3\u30c9)": [[30, "physbo.gp.mean.zero.zero.get_mean", false]], "get_one_update() (physbo.gp.core.learning.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.adam.get_one_update", false]], "get_one_update() (physbo.gp.core.learning.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.online.get_one_update", false]], "get_params_bound() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.get_params_bound", false]], "get_params_bound() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.get_params_bound", false]], "get_params_bound() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.get_params_bound", false]], "get_params_bound() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.get_params_bound", false]], "get_post_fcov() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.get_post_fcov", false]], "get_post_fcov() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.get_post_fcov", false]], "get_post_fcov() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_post_fcov", false]], "get_post_fcov() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.get_post_fcov", false]], "get_post_fcov() (physbo.gp.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[25, "physbo.gp.inf.exact.get_post_fcov", false]], "get_post_fcov() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_post_fcov", false]], "get_post_fcov() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_post_fcov", false]], "get_post_fcov() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.get_post_fcov", false]], "get_post_fcov() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.get_post_fcov", false]], "get_post_fmean() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.get_post_fmean", false]], "get_post_fmean() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.get_post_fmean", false]], "get_post_fmean() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_post_fmean", false]], "get_post_fmean() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.get_post_fmean", false]], "get_post_fmean() (physbo.gp.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[25, "physbo.gp.inf.exact.get_post_fmean", false]], "get_post_fmean() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_post_fmean", false]], "get_post_fmean() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_post_fmean", false]], "get_post_fmean() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.get_post_fmean", false]], "get_post_fmean() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.get_post_fmean", false]], "get_post_params() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_post_params", false]], "get_post_params() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_post_params", false]], "get_post_params() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_post_params", false]], "get_post_params_mean() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.get_post_params_mean", false]], "get_post_params_mean() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.get_post_params_mean", false]], "get_post_params_samples() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_post_params_samples", false]], "get_post_samples() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_post_samples", false]], "get_post_samples() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_post_samples", false]], "get_post_samples() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_post_samples", false]], "get_prec() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.get_prec", false]], "get_prec() (physbo.blm.prior.gauss.cov_const \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.cov_const.get_prec", false]], "get_prec() (physbo.blm.prior.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.gauss.get_prec", false]], "get_predict_samples() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.get_predict_samples", false]], "get_predict_samples() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.get_predict_samples", false]], "get_predict_samples() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.get_predict_samples", false]], "get_score() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.get_score", false]], "get_score() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.get_score", false]], "get_subset() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.get_subset", false]], "grad (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.grad", false]], "history (physbo.search.discrete.results \u306e\u30af\u30e9\u30b9)": [[42, "physbo.search.discrete.results.history", false]], "history (physbo.search.discrete_multi.results \u306e\u30af\u30e9\u30b9)": [[45, "physbo.search.discrete_multi.results.history", false]], "hvpi() (physbo.search.score_multi \u30e2\u30b8\u30e5\u30fc\u30eb)": [[48, "physbo.search.score_multi.HVPI", false]], "init_params() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.init_params", false]], "init_params_search() (physbo.gp.core.learning.batch \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.batch.init_params_search", false]], "init_params_search() (physbo.gp.core.learning.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.online.init_params_search", false]], "is_learning() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.is_learning", false]], "learning (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.learning", false]], "length_vector() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.length_vector", false]], "lik (physbo.blm.core.model.model \u306e\u5c5e\u6027)": [[8, "physbo.blm.core.model.model.lik", false]], "linear (physbo.blm.lik.gauss.gauss \u306e\u5c5e\u6027)": [[12, "physbo.blm.lik.gauss.gauss.linear", false]], "linear (physbo.blm.lik.linear \u306e\u30af\u30e9\u30b9)": [[13, "physbo.blm.lik.linear.linear", false]], "load() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.load", false]], "load() (physbo.misc.set_config.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.adam.load", false]], "load() (physbo.misc.set_config.batch \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.batch.load", false]], "load() (physbo.misc.set_config.learning \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.learning.load", false]], "load() (physbo.misc.set_config.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.online.load", false]], "load() (physbo.misc.set_config.search \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.search.load", false]], "load() (physbo.misc.set_config.set_config \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.set_config.load", false]], "load() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.load", false]], "load() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.load", false]], "load() (physbo.search.discrete.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[42, "physbo.search.discrete.results.history.load", false]], "load() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.load", false]], "load() (physbo.search.discrete_multi.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[45, "physbo.search.discrete_multi.results.history.load", false]], "load() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.load", false]], "load_predictor_list() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.load_predictor_list", false]], "load_training_list() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.load_training_list", false]], "m (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.m", false]], "max_epoch (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.max_epoch", false]], "method (physbo.blm.core.model.model \u306e\u5c5e\u6027)": [[8, "physbo.blm.core.model.model.method", false]], "model (physbo.blm.core.model \u306e\u30af\u30e9\u30b9)": [[8, "physbo.blm.core.model.model", false]], "model (physbo.gp.core.model \u306e\u30af\u30e9\u30b9)": [[20, "physbo.gp.core.model.model", false]], "module": [[3, "module-physbo", false], [4, "module-physbo.blm", false], [5, "module-physbo.blm.basis", false], [6, "module-physbo.blm.basis.fourier", false], [7, "module-physbo.blm.core", false], [8, "module-physbo.blm.core.model", false], [9, "module-physbo.blm.inf", false], [10, "module-physbo.blm.inf.exact", false], [11, "module-physbo.blm.lik", false], [12, "module-physbo.blm.lik.gauss", false], [13, "module-physbo.blm.lik.linear", false], [14, "module-physbo.blm.predictor", false], [15, "module-physbo.blm.prior", false], [16, "module-physbo.blm.prior.gauss", false], [17, "module-physbo.gp", false], [18, "module-physbo.gp.core", false], [19, "module-physbo.gp.core.learning", false], [20, "module-physbo.gp.core.model", false], [21, "module-physbo.gp.core.prior", false], [22, "module-physbo.gp.cov", false], [23, "module-physbo.gp.cov.gauss", false], [24, "module-physbo.gp.inf", false], [25, "module-physbo.gp.inf.exact", false], [26, "module-physbo.gp.lik", false], [27, "module-physbo.gp.lik.gauss", false], [28, "module-physbo.gp.mean", false], [29, "module-physbo.gp.mean.const", false], [30, "module-physbo.gp.mean.zero", false], [31, "module-physbo.gp.predictor", false], [32, "module-physbo.misc", false], [33, "module-physbo.misc.centering", false], [34, "module-physbo.misc.gauss_elim", false], [35, "module-physbo.misc.set_config", false], [36, "module-physbo.opt", false], [37, "module-physbo.opt.adam", false], [38, "module-physbo.predictor", false], [39, "module-physbo.search", false], [40, "module-physbo.search.discrete", false], [41, "module-physbo.search.discrete.policy", false], [42, "module-physbo.search.discrete.results", false], [43, "module-physbo.search.discrete_multi", false], [44, "module-physbo.search.discrete_multi.policy", false], [45, "module-physbo.search.discrete_multi.results", false], [46, "module-physbo.search.pareto", false], [47, "module-physbo.search.score", false], [48, "module-physbo.search.score_multi", false], [49, "module-physbo.search.utility", false], [50, "module-physbo.variable", false]], "nbasis (physbo.blm.basis.fourier.fourier \u306e\u5c5e\u6027)": [[6, "physbo.blm.basis.fourier.fourier.nbasis", false]], "nbasis (physbo.blm.core.model.model \u306e\u5c5e\u6027)": [[8, "physbo.blm.core.model.model.nbasis", false]], "nbasis (physbo.blm.lik.linear.linear \u306e\u5c5e\u6027)": [[13, "physbo.blm.lik.linear.linear.nbasis", false]], "nbasis (physbo.blm.prior.gauss.gauss \u306e\u5c5e\u6027)": [[16, "physbo.blm.prior.gauss.gauss.nbasis", false]], "new_data_list (physbo.search.discrete_multi.policy.policy \u306e\u5c5e\u6027)": [[44, "physbo.search.discrete_multi.policy.policy.new_data_list", false]], "nparams (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.nparams", false]], "one_run() (physbo.gp.core.learning.batch \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.batch.one_run", false]], "one_run() (physbo.gp.core.learning.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.online.one_run", false]], "online (physbo.gp.core.learning \u306e\u30af\u30e9\u30b9)": [[19, "physbo.gp.core.learning.online", false]], "online (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.online", false]], "params (physbo.blm.basis.fourier.fourier \u306e\u5c5e\u6027)": [[6, "physbo.blm.basis.fourier.fourier.params", false]], "params (physbo.blm.lik.linear.linear \u306e\u5c5e\u6027)": [[13, "physbo.blm.lik.linear.linear.params", false]], "params (physbo.blm.prior.gauss.cov_const \u306e\u5c5e\u6027)": [[16, "physbo.blm.prior.gauss.cov_const.params", false]], "params (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.params", false]], "pareto (physbo.search.pareto \u306e\u30af\u30e9\u30b9)": [[46, "physbo.search.pareto.Pareto", false]], "physbo": [[3, "module-physbo", false]], "physbo.blm": [[4, "module-physbo.blm", false]], "physbo.blm.basis": [[5, "module-physbo.blm.basis", false]], "physbo.blm.basis.fourier": [[6, "module-physbo.blm.basis.fourier", false]], "physbo.blm.core": [[7, "module-physbo.blm.core", false]], "physbo.blm.core.model": [[8, "module-physbo.blm.core.model", false]], "physbo.blm.inf": [[9, "module-physbo.blm.inf", false]], "physbo.blm.inf.exact": [[10, "module-physbo.blm.inf.exact", false]], "physbo.blm.lik": [[11, "module-physbo.blm.lik", false]], "physbo.blm.lik.gauss": [[12, "module-physbo.blm.lik.gauss", false]], "physbo.blm.lik.linear": [[13, "module-physbo.blm.lik.linear", false]], "physbo.blm.predictor": [[14, "module-physbo.blm.predictor", false]], "physbo.blm.prior": [[15, "module-physbo.blm.prior", false]], "physbo.blm.prior.gauss": [[16, "module-physbo.blm.prior.gauss", false]], "physbo.gp": [[17, "module-physbo.gp", false]], "physbo.gp.core": [[18, "module-physbo.gp.core", false]], "physbo.gp.core.learning": [[19, "module-physbo.gp.core.learning", false]], "physbo.gp.core.model": [[20, "module-physbo.gp.core.model", false]], "physbo.gp.core.prior": [[21, "module-physbo.gp.core.prior", false]], "physbo.gp.cov": [[22, "module-physbo.gp.cov", false]], "physbo.gp.cov.gauss": [[23, "module-physbo.gp.cov.gauss", false]], "physbo.gp.inf": [[24, "module-physbo.gp.inf", false]], "physbo.gp.inf.exact": [[25, "module-physbo.gp.inf.exact", false]], "physbo.gp.lik": [[26, "module-physbo.gp.lik", false]], "physbo.gp.lik.gauss": [[27, "module-physbo.gp.lik.gauss", false]], "physbo.gp.mean": [[28, "module-physbo.gp.mean", false]], "physbo.gp.mean.const": [[29, "module-physbo.gp.mean.const", false]], "physbo.gp.mean.zero": [[30, "module-physbo.gp.mean.zero", false]], "physbo.gp.predictor": [[31, "module-physbo.gp.predictor", false]], "physbo.misc": [[32, "module-physbo.misc", false]], "physbo.misc.centering": [[33, "module-physbo.misc.centering", false]], "physbo.misc.gauss_elim": [[34, "module-physbo.misc.gauss_elim", false]], "physbo.misc.set_config": [[35, "module-physbo.misc.set_config", false]], "physbo.opt": [[36, "module-physbo.opt", false]], "physbo.opt.adam": [[37, "module-physbo.opt.adam", false]], "physbo.predictor": [[38, "module-physbo.predictor", false]], "physbo.search": [[39, "module-physbo.search", false]], "physbo.search.discrete": [[40, "module-physbo.search.discrete", false]], "physbo.search.discrete.policy": [[41, "module-physbo.search.discrete.policy", false]], "physbo.search.discrete.results": [[42, "module-physbo.search.discrete.results", false]], "physbo.search.discrete_multi": [[43, "module-physbo.search.discrete_multi", false]], "physbo.search.discrete_multi.policy": [[44, "module-physbo.search.discrete_multi.policy", false]], "physbo.search.discrete_multi.results": [[45, "module-physbo.search.discrete_multi.results", false]], "physbo.search.pareto": [[46, "module-physbo.search.pareto", false]], "physbo.search.score": [[47, "module-physbo.search.score", false]], "physbo.search.score_multi": [[48, "module-physbo.search.score_multi", false]], "physbo.search.utility": [[49, "module-physbo.search.utility", false]], "physbo.variable": [[50, "module-physbo.variable", false]], "pi() (physbo.search.score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[47, "physbo.search.score.PI", false]], "policy (physbo.search.discrete.policy \u306e\u30af\u30e9\u30b9)": [[41, "physbo.search.discrete.policy.policy", false]], "policy (physbo.search.discrete_multi.policy \u306e\u30af\u30e9\u30b9)": [[44, "physbo.search.discrete_multi.policy.policy", false]], "post_sampling() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.post_sampling", false]], "post_sampling() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.post_sampling", false]], "prec (physbo.blm.prior.gauss.cov_const \u306e\u5c5e\u6027)": [[16, "physbo.blm.prior.gauss.cov_const.prec", false]], "predict_sampling() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.predict_sampling", false]], "predict_sampling() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.predict_sampling", false]], "predictor (physbo.blm.predictor \u306e\u30af\u30e9\u30b9)": [[14, "physbo.blm.predictor.predictor", false]], "predictor (physbo.gp.predictor \u306e\u30af\u30e9\u30b9)": [[31, "physbo.gp.predictor.predictor", false]], "prepare() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.prepare", false]], "prepare() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.prepare", false]], "prepare() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.prepare", false]], "prepare() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.prepare", false]], "prepare() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.prepare", false]], "prepare() (physbo.gp.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[25, "physbo.gp.inf.exact.prepare", false]], "prepare() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.prepare", false]], "prepare() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.prepare", false]], "print_params() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.print_params", false]], "print_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.print_params", false]], "prior (physbo.blm.core.model.model \u306e\u5c5e\u6027)": [[8, "physbo.blm.core.model.model.prior", false]], "prior (physbo.gp.core.prior \u306e\u30af\u30e9\u30b9)": [[21, "physbo.gp.core.prior.prior", false]], "rand_expans() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.rand_expans", false]], "random_search() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.random_search", false]], "random_search() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.random_search", false]], "rectangles (physbo.search.pareto \u306e\u30af\u30e9\u30b9)": [[46, "physbo.search.pareto.Rectangles", false]], "reset() (physbo.gp.core.learning.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.adam.reset", false]], "run() (physbo.gp.core.learning.batch \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.batch.run", false]], "run() (physbo.gp.core.learning.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[19, "physbo.gp.core.learning.online.run", false]], "run() (physbo.opt.adam.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "physbo.opt.adam.adam.run", false]], "sampling() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.sampling", false]], "sampling() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.sampling", false]], "sampling() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.sampling", false]], "sampling() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.sampling", false]], "sampling() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.sampling", false]], "save() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.save", false]], "save() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.save", false]], "save() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.save", false]], "save() (physbo.search.discrete.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[42, "physbo.search.discrete.results.history.save", false]], "save() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.save", false]], "save() (physbo.search.discrete_multi.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[45, "physbo.search.discrete_multi.results.history.save", false]], "save() (physbo.variable.variable \u306e\u30e1\u30bd\u30c3\u30c9)": [[50, "physbo.variable.variable.save", false]], "save_predictor_list() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.save_predictor_list", false]], "save_training_list() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.save_training_list", false]], "score() (physbo.search.score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[47, "physbo.search.score.score", false]], "score() (physbo.search.score_multi \u30e2\u30b8\u30e5\u30fc\u30eb)": [[48, "physbo.search.score_multi.score", false]], "search (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.search", false]], "set_bias() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.set_bias", false]], "set_bias() (physbo.blm.lik.linear.linear \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "physbo.blm.lik.linear.linear.set_bias", false]], "set_config (physbo.misc.set_config \u306e\u30af\u30e9\u30b9)": [[35, "physbo.misc.set_config.set_config", false]], "set_cov_params() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.set_cov_params", false]], "set_mean_params() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.set_mean_params", false]], "set_params() (physbo.blm.basis.fourier.fourier \u306e\u30e1\u30bd\u30c3\u30c9)": [[6, "physbo.blm.basis.fourier.fourier.set_params", false]], "set_params() (physbo.blm.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[12, "physbo.blm.lik.gauss.gauss.set_params", false]], "set_params() (physbo.blm.lik.linear.linear \u306e\u30e1\u30bd\u30c3\u30c9)": [[13, "physbo.blm.lik.linear.linear.set_params", false]], "set_params() (physbo.blm.prior.gauss.cov_const \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.cov_const.set_params", false]], "set_params() (physbo.blm.prior.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[16, "physbo.blm.prior.gauss.gauss.set_params", false]], "set_params() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.set_params", false]], "set_params() (physbo.gp.core.prior.prior \u306e\u30e1\u30bd\u30c3\u30c9)": [[21, "physbo.gp.core.prior.prior.set_params", false]], "set_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.set_params", false]], "set_params() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.set_params", false]], "set_params() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.set_params", false]], "set_params() (physbo.gp.mean.zero.zero \u306e\u30e1\u30bd\u30c3\u30c9)": [[30, "physbo.gp.mean.zero.zero.set_params", false]], "set_params() (physbo.opt.adam.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "physbo.opt.adam.adam.set_params", false]], "set_reference_max() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.set_reference_max", false]], "set_reference_min() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.set_reference_min", false]], "set_seed() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.set_seed", false]], "show() (physbo.blm.basis.fourier.fourier \u306e\u30e1\u30bd\u30c3\u30c9)": [[6, "physbo.blm.basis.fourier.fourier.show", false]], "show() (physbo.misc.set_config.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.adam.show", false]], "show() (physbo.misc.set_config.batch \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.batch.show", false]], "show() (physbo.misc.set_config.learning \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.learning.show", false]], "show() (physbo.misc.set_config.online \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.online.show", false]], "show() (physbo.misc.set_config.search \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.search.show", false]], "show() (physbo.misc.set_config.set_config \u306e\u30e1\u30bd\u30c3\u30c9)": [[35, "physbo.misc.set_config.set_config.show", false]], "show_interactive_mode() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.show_interactive_mode", false]], "show_search_results() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.show_search_results", false]], "show_search_results_mo() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.show_search_results_mo", false]], "show_start_message_multi_search() (physbo.search.utility \u30e2\u30b8\u30e5\u30fc\u30eb)": [[49, "physbo.search.utility.show_start_message_multi_search", false]], "sigma2 (physbo.blm.prior.gauss.cov_const \u306e\u5c5e\u6027)": [[16, "physbo.blm.prior.gauss.cov_const.sigma2", false]], "stats (physbo.blm.core.model.model \u306e\u5c5e\u6027)": [[8, "physbo.blm.core.model.model.stats", false]], "stats (physbo.blm.lik.gauss.gauss \u306e\u5c5e\u6027)": [[12, "physbo.blm.lik.gauss.gauss.stats", false]], "sub_sampling() (physbo.gp.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[20, "physbo.gp.core.model.model.sub_sampling", false]], "supp_params() (physbo.gp.cov.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[23, "physbo.gp.cov.gauss.gauss.supp_params", false]], "supp_params() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.supp_params", false]], "supp_params() (physbo.gp.mean.const.const \u306e\u30e1\u30bd\u30c3\u30c9)": [[29, "physbo.gp.mean.const.const.supp_params", false]], "time_get_action (physbo.search.discrete.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[42, "physbo.search.discrete.results.history.time_get_action", false]], "time_get_action (physbo.search.discrete_multi.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[45, "physbo.search.discrete_multi.results.history.time_get_action", false]], "time_run_simulator (physbo.search.discrete.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[42, "physbo.search.discrete.results.history.time_run_simulator", false]], "time_run_simulator (physbo.search.discrete_multi.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[45, "physbo.search.discrete_multi.results.history.time_run_simulator", false]], "time_total (physbo.search.discrete.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[42, "physbo.search.discrete.results.history.time_total", false]], "time_total (physbo.search.discrete_multi.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[45, "physbo.search.discrete_multi.results.history.time_total", false]], "time_update_predictor (physbo.search.discrete.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[42, "physbo.search.discrete.results.history.time_update_predictor", false]], "time_update_predictor (physbo.search.discrete_multi.results.history \u306e\u30d7\u30ed\u30d1\u30c6\u30a3)": [[45, "physbo.search.discrete_multi.results.history.time_update_predictor", false]], "trans_params() (physbo.gp.lik.gauss.gauss \u306e\u30e1\u30bd\u30c3\u30c9)": [[27, "physbo.gp.lik.gauss.gauss.trans_params", false]], "ts() (physbo.search.score \u30e2\u30b8\u30e5\u30fc\u30eb)": [[47, "physbo.search.score.TS", false]], "ts() (physbo.search.score_multi \u30e2\u30b8\u30e5\u30fc\u30eb)": [[48, "physbo.search.score_multi.TS", false]], "update() (physbo.blm.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[14, "physbo.blm.predictor.predictor.update", false]], "update() (physbo.gp.predictor.predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[31, "physbo.gp.predictor.predictor.update", false]], "update() (physbo.opt.adam.adam \u306e\u30e1\u30bd\u30c3\u30c9)": [[37, "physbo.opt.adam.adam.update", false]], "update() (physbo.predictor.base_predictor \u306e\u30e1\u30bd\u30c3\u30c9)": [[38, "physbo.predictor.base_predictor.update", false]], "update_front() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.update_front", false]], "update_stats() (physbo.blm.core.model.model \u306e\u30e1\u30bd\u30c3\u30c9)": [[8, "physbo.blm.core.model.model.update_stats", false]], "update_stats() (physbo.blm.inf.exact \u30e2\u30b8\u30e5\u30fc\u30eb)": [[10, "physbo.blm.inf.exact.update_stats", false]], "v (physbo.opt.adam.adam \u306e\u5c5e\u6027)": [[37, "physbo.opt.adam.adam.v", false]], "variable (physbo.variable \u306e\u30af\u30e9\u30b9)": [[50, "physbo.variable.variable", false]], "volume_in_dominance() (physbo.search.pareto.pareto \u306e\u30e1\u30bd\u30c3\u30c9)": [[46, "physbo.search.pareto.Pareto.volume_in_dominance", false]], "write() (physbo.search.discrete.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[41, "physbo.search.discrete.policy.policy.write", false]], "write() (physbo.search.discrete.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[42, "physbo.search.discrete.results.history.write", false]], "write() (physbo.search.discrete_multi.policy.policy \u306e\u30e1\u30bd\u30c3\u30c9)": [[44, "physbo.search.discrete_multi.policy.policy.write", false]], "write() (physbo.search.discrete_multi.results.history \u306e\u30e1\u30bd\u30c3\u30c9)": [[45, "physbo.search.discrete_multi.results.history.write", false]], "zero (physbo.gp.mean.zero \u306e\u30af\u30e9\u30b9)": [[30, "physbo.gp.mean.zero.zero", false]]}, "objects": {"": [[3, 0, 0, "-", "physbo"]], "physbo": [[4, 0, 0, "-", "blm"], [17, 0, 0, "-", "gp"], [32, 0, 0, "-", "misc"], [36, 0, 0, "-", "opt"], [38, 0, 0, "-", "predictor"], [39, 0, 0, "-", "search"], [50, 0, 0, "-", "variable"]], "physbo.blm": [[5, 0, 0, "-", "basis"], [7, 0, 0, "-", "core"], [9, 0, 0, "-", "inf"], [11, 0, 0, "-", "lik"], [14, 0, 0, "-", "predictor"], [15, 0, 0, "-", "prior"]], "physbo.blm.basis": [[6, 0, 0, "-", "fourier"]], "physbo.blm.basis.fourier": [[6, 1, 1, "", "fourier"]], "physbo.blm.basis.fourier.fourier": [[6, 2, 1, "", "get_basis"], [6, 3, 1, "", "nbasis"], [6, 3, 1, "", "params"], [6, 2, 1, "", "set_params"], [6, 2, 1, "", "show"]], "physbo.blm.core": [[8, 0, 0, "-", "model"]], "physbo.blm.core.model": [[8, 1, 1, "", "model"]], "physbo.blm.core.model.model": [[8, 2, 1, "", "get_post_fcov"], [8, 2, 1, "", "get_post_fmean"], [8, 2, 1, "", "get_post_params_mean"], [8, 3, 1, "", "lik"], [8, 3, 1, "", "method"], [8, 3, 1, "", "nbasis"], [8, 2, 1, "", "post_sampling"], [8, 2, 1, "", "predict_sampling"], [8, 2, 1, "", "prepare"], [8, 3, 1, "", "prior"], [8, 2, 1, "", "sampling"], [8, 3, 1, "", "stats"], [8, 2, 1, "", "update_stats"]], "physbo.blm.inf": [[10, 0, 0, "-", "exact"]], "physbo.blm.inf.exact": [[10, 4, 1, "", "get_post_fcov"], [10, 4, 1, "", "get_post_fmean"], [10, 4, 1, "", "get_post_params_mean"], [10, 4, 1, "", "prepare"], [10, 4, 1, "", "sampling"], [10, 4, 1, "", "update_stats"]], "physbo.blm.lik": [[12, 0, 0, "-", "gauss"], [13, 0, 0, "-", "linear"]], "physbo.blm.lik.gauss": [[12, 1, 1, "", "gauss"]], "physbo.blm.lik.gauss.gauss": [[12, 3, 1, "", "cov"], [12, 2, 1, "", "get_basis"], [12, 2, 1, "", "get_cov"], [12, 2, 1, "", "get_mean"], [12, 2, 1, "", "get_prec"], [12, 3, 1, "", "linear"], [12, 2, 1, "", "sampling"], [12, 2, 1, "", "set_bias"], [12, 2, 1, "", "set_params"], [12, 3, 1, "", "stats"]], "physbo.blm.lik.linear": [[13, 1, 1, "", "linear"]], "physbo.blm.lik.linear.linear": [[13, 3, 1, "", "_init_params"], [13, 3, 1, "", "basis"], [13, 3, 1, "", "bias"], [13, 2, 1, "", "get_mean"], [13, 3, 1, "", "nbasis"], [13, 3, 1, "", "params"], [13, 2, 1, "", "set_bias"], [13, 2, 1, "", "set_params"]], "physbo.blm.predictor": [[14, 1, 1, "", "predictor"]], "physbo.blm.predictor.predictor": [[14, 3, 1, "", "blm"], [14, 3, 1, "", "config"], [14, 2, 1, "", "delete_stats"], [14, 2, 1, "", "fit"], [14, 2, 1, "", "get_basis"], [14, 2, 1, "", "get_post_fcov"], [14, 2, 1, "", "get_post_fmean"], [14, 2, 1, "", "get_post_params"], [14, 2, 1, "", "get_post_samples"], [14, 2, 1, "", "get_predict_samples"], [14, 2, 1, "", "prepare"], [14, 2, 1, "", "update"]], "physbo.blm.prior": [[16, 0, 0, "-", "gauss"]], "physbo.blm.prior.gauss": [[16, 1, 1, "", "cov_const"], [16, 1, 1, "", "gauss"]], "physbo.blm.prior.gauss.cov_const": [[16, 2, 1, "", "get_cov"], [16, 2, 1, "", "get_prec"], [16, 3, 1, "", "params"], [16, 3, 1, "", "prec"], [16, 2, 1, "", "set_params"], [16, 3, 1, "", "sigma2"]], "physbo.blm.prior.gauss.gauss": [[16, 3, 1, "", "cov"], [16, 2, 1, "", "get_cov"], [16, 2, 1, "", "get_mean"], [16, 2, 1, "", "get_prec"], [16, 3, 1, "", "nbasis"], [16, 2, 1, "", "set_params"]], "physbo.gp": [[18, 0, 0, "-", "core"], [22, 0, 0, "-", "cov"], [24, 0, 0, "-", "inf"], [26, 0, 0, "-", "lik"], [28, 0, 0, "-", "mean"], [31, 0, 0, "-", "predictor"]], "physbo.gp.core": [[19, 0, 0, "-", "learning"], [20, 0, 0, "-", "model"], [21, 0, 0, "-", "prior"]], "physbo.gp.core.learning": [[19, 1, 1, "", "adam"], [19, 1, 1, "", "batch"], [19, 1, 1, "", "online"]], "physbo.gp.core.learning.adam": [[19, 2, 1, "", "get_one_update"], [19, 2, 1, "", "reset"]], "physbo.gp.core.learning.batch": [[19, 2, 1, "", "init_params_search"], [19, 2, 1, "", "one_run"], [19, 2, 1, "", "run"]], "physbo.gp.core.learning.online": [[19, 2, 1, "", "disp_marlik"], [19, 2, 1, "", "get_one_update"], [19, 2, 1, "", "init_params_search"], [19, 2, 1, "", "one_run"], [19, 2, 1, "", "run"]], "physbo.gp.core.model": [[20, 1, 1, "", "model"]], "physbo.gp.core.model.model": [[20, 2, 1, "", "cat_params"], [20, 2, 1, "", "decomp_params"], [20, 2, 1, "", "eval_marlik"], [20, 2, 1, "", "export_blm"], [20, 2, 1, "", "fit"], [20, 2, 1, "", "get_cand_params"], [20, 2, 1, "", "get_grad_marlik"], [20, 2, 1, "", "get_params_bound"], [20, 2, 1, "", "get_post_fcov"], [20, 2, 1, "", "get_post_fmean"], [20, 2, 1, "", "post_sampling"], [20, 2, 1, "", "predict_sampling"], [20, 2, 1, "", "prepare"], [20, 2, 1, "", "print_params"], [20, 2, 1, "", "set_params"], [20, 2, 1, "", "sub_sampling"]], "physbo.gp.core.prior": [[21, 1, 1, "", "prior"]], "physbo.gp.core.prior.prior": [[21, 2, 1, "", "cat_params"], [21, 2, 1, "", "decomp_params"], [21, 2, 1, "", "get_cov"], [21, 2, 1, "", "get_grad_cov"], [21, 2, 1, "", "get_grad_mean"], [21, 2, 1, "", "get_mean"], [21, 2, 1, "", "sampling"], [21, 2, 1, "", "set_cov_params"], [21, 2, 1, "", "set_mean_params"], [21, 2, 1, "", "set_params"]], "physbo.gp.cov": [[23, 0, 0, "-", "gauss"]], "physbo.gp.cov.gauss": [[23, 1, 1, "", "gauss"]], "physbo.gp.cov.gauss.gauss": [[23, 2, 1, "", "cat_params"], [23, 2, 1, "", "decomp_params"], [23, 2, 1, "", "get_cand_params"], [23, 2, 1, "", "get_cov"], [23, 2, 1, "", "get_grad"], [23, 2, 1, "", "get_params_bound"], [23, 2, 1, "", "load"], [23, 2, 1, "", "prepare"], [23, 2, 1, "", "print_params"], [23, 2, 1, "", "rand_expans"], [23, 2, 1, "", "save"], [23, 2, 1, "", "set_params"], [23, 2, 1, "", "supp_params"]], "physbo.gp.inf": [[25, 0, 0, "-", "exact"]], "physbo.gp.inf.exact": [[25, 4, 1, "", "eval_marlik"], [25, 4, 1, "", "get_grad_marlik"], [25, 4, 1, "", "get_post_fcov"], [25, 4, 1, "", "get_post_fmean"], [25, 4, 1, "", "prepare"]], "physbo.gp.lik": [[27, 0, 0, "-", "gauss"]], "physbo.gp.lik.gauss": [[27, 1, 1, "", "gauss"]], "physbo.gp.lik.gauss.gauss": [[27, 2, 1, "", "get_cand_params"], [27, 2, 1, "", "get_cov"], [27, 2, 1, "", "get_grad"], [27, 2, 1, "", "get_params_bound"], [27, 2, 1, "", "sampling"], [27, 2, 1, "", "set_params"], [27, 2, 1, "", "supp_params"], [27, 2, 1, "", "trans_params"]], "physbo.gp.mean": [[29, 0, 0, "-", "const"], [30, 0, 0, "-", "zero"]], "physbo.gp.mean.const": [[29, 1, 1, "", "const"]], "physbo.gp.mean.const.const": [[29, 2, 1, "", "get_cand_params"], [29, 2, 1, "", "get_grad"], [29, 2, 1, "", "get_mean"], [29, 2, 1, "", "get_params_bound"], [29, 2, 1, "", "init_params"], [29, 2, 1, "", "set_params"], [29, 2, 1, "", "supp_params"]], "physbo.gp.mean.zero": [[30, 1, 1, "", "zero"]], "physbo.gp.mean.zero.zero": [[30, 2, 1, "", "get_grad"], [30, 2, 1, "", "get_mean"], [30, 2, 1, "", "set_params"]], "physbo.gp.predictor": [[31, 1, 1, "", "predictor"]], "physbo.gp.predictor.predictor": [[31, 2, 1, "", "delete_stats"], [31, 2, 1, "", "fit"], [31, 2, 1, "", "get_basis"], [31, 2, 1, "", "get_post_fcov"], [31, 2, 1, "", "get_post_fmean"], [31, 2, 1, "", "get_post_params"], [31, 2, 1, "", "get_post_samples"], [31, 2, 1, "", "get_predict_samples"], [31, 2, 1, "", "prepare"], [31, 2, 1, "", "update"]], "physbo.misc": [[33, 0, 0, "-", "centering"], [34, 0, 0, "-", "gauss_elim"], [35, 0, 0, "-", "set_config"]], "physbo.misc.centering": [[33, 4, 1, "", "centering"]], "physbo.misc.gauss_elim": [[34, 4, 1, "", "gauss_elim"]], "physbo.misc.set_config": [[35, 1, 1, "", "adam"], [35, 1, 1, "", "batch"], [35, 4, 1, "", "boolean"], [35, 1, 1, "", "learning"], [35, 1, 1, "", "online"], [35, 1, 1, "", "search"], [35, 1, 1, "", "set_config"]], "physbo.misc.set_config.adam": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.batch": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.learning": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.online": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.search": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.misc.set_config.set_config": [[35, 2, 1, "", "load"], [35, 2, 1, "", "show"]], "physbo.opt": [[37, 0, 0, "-", "adam"]], "physbo.opt.adam": [[37, 1, 1, "", "adam"]], "physbo.opt.adam.adam": [[37, 3, 1, "", "alpha"], [37, 3, 1, "", "beta"], [37, 3, 1, "", "epoch"], [37, 3, 1, "", "epsilon"], [37, 3, 1, "", "gamma"], [37, 3, 1, "", "grad"], [37, 3, 1, "", "m"], [37, 3, 1, "", "max_epoch"], [37, 3, 1, "", "nparams"], [37, 3, 1, "", "params"], [37, 2, 1, "", "run"], [37, 2, 1, "", "set_params"], [37, 2, 1, "", "update"], [37, 3, 1, "", "v"]], "physbo.predictor": [[38, 1, 1, "", "base_predictor"]], "physbo.predictor.base_predictor": [[38, 2, 1, "", "delete_stats"], [38, 2, 1, "", "fit"], [38, 2, 1, "", "get_basis"], [38, 2, 1, "", "get_post_fcov"], [38, 2, 1, "", "get_post_fmean"], [38, 2, 1, "", "get_post_params"], [38, 2, 1, "", "get_post_params_samples"], [38, 2, 1, "", "get_post_samples"], [38, 2, 1, "", "get_predict_samples"], [38, 2, 1, "", "load"], [38, 2, 1, "", "prepare"], [38, 2, 1, "", "save"], [38, 2, 1, "", "update"]], "physbo.search": [[40, 0, 0, "-", "discrete"], [43, 0, 0, "-", "discrete_multi"], [46, 0, 0, "-", "pareto"], [47, 0, 0, "-", "score"], [48, 0, 0, "-", "score_multi"], [49, 0, 0, "-", "utility"]], "physbo.search.discrete": [[41, 0, 0, "-", "policy"], [42, 0, 0, "-", "results"]], "physbo.search.discrete.policy": [[41, 1, 1, "", "policy"]], "physbo.search.discrete.policy.policy": [[41, 2, 1, "", "bayes_search"], [41, 2, 1, "", "export_history"], [41, 2, 1, "", "export_predictor"], [41, 2, 1, "", "export_training"], [41, 2, 1, "", "get_post_fcov"], [41, 2, 1, "", "get_post_fmean"], [41, 2, 1, "", "get_score"], [41, 2, 1, "", "load"], [41, 2, 1, "", "random_search"], [41, 2, 1, "", "save"], [41, 2, 1, "", "set_seed"], [41, 2, 1, "", "write"]], "physbo.search.discrete.results": [[42, 1, 1, "", "history"]], "physbo.search.discrete.results.history": [[42, 2, 1, "", "export_all_sequence_best_fx"], [42, 2, 1, "", "export_sequence_best_fx"], [42, 2, 1, "", "load"], [42, 2, 1, "", "save"], [42, 5, 1, "", "time_get_action"], [42, 5, 1, "", "time_run_simulator"], [42, 5, 1, "", "time_total"], [42, 5, 1, "", "time_update_predictor"], [42, 2, 1, "", "write"]], "physbo.search.discrete_multi": [[44, 0, 0, "-", "policy"], [45, 0, 0, "-", "results"]], "physbo.search.discrete_multi.policy": [[44, 1, 1, "", "policy"]], "physbo.search.discrete_multi.policy.policy": [[44, 2, 1, "", "bayes_search"], [44, 2, 1, "", "get_post_fcov"], [44, 2, 1, "", "get_post_fmean"], [44, 2, 1, "", "get_score"], [44, 2, 1, "", "load"], [44, 2, 1, "", "load_predictor_list"], [44, 2, 1, "", "load_training_list"], [44, 3, 1, "", "new_data_list"], [44, 2, 1, "", "random_search"], [44, 2, 1, "", "save"], [44, 2, 1, "", "save_predictor_list"], [44, 2, 1, "", "save_training_list"], [44, 2, 1, "", "write"]], "physbo.search.discrete_multi.results": [[45, 1, 1, "", "history"]], "physbo.search.discrete_multi.results.history": [[45, 2, 1, "", "export_pareto_front"], [45, 2, 1, "", "load"], [45, 2, 1, "", "save"], [45, 5, 1, "", "time_get_action"], [45, 5, 1, "", "time_run_simulator"], [45, 5, 1, "", "time_total"], [45, 5, 1, "", "time_update_predictor"], [45, 2, 1, "", "write"]], "physbo.search.pareto": [[46, 1, 1, "", "Pareto"], [46, 1, 1, "", "Rectangles"], [46, 4, 1, "", "dominate"]], "physbo.search.pareto.Pareto": [[46, 2, 1, "", "divide_non_dominated_region"], [46, 2, 1, "", "export_front"], [46, 2, 1, "", "set_reference_max"], [46, 2, 1, "", "set_reference_min"], [46, 2, 1, "", "update_front"], [46, 2, 1, "", "volume_in_dominance"]], "physbo.search.pareto.Rectangles": [[46, 2, 1, "", "add"]], "physbo.search.score": [[47, 4, 1, "", "EI"], [47, 4, 1, "", "PI"], [47, 4, 1, "", "TS"], [47, 4, 1, "", "score"]], "physbo.search.score_multi": [[48, 4, 1, "", "EHVI"], [48, 4, 1, "", "HVPI"], [48, 4, 1, "", "TS"], [48, 4, 1, "", "score"]], "physbo.search.utility": [[49, 4, 1, "", "is_learning"], [49, 4, 1, "", "length_vector"], [49, 4, 1, "", "show_interactive_mode"], [49, 4, 1, "", "show_search_results"], [49, 4, 1, "", "show_search_results_mo"], [49, 4, 1, "", "show_start_message_multi_search"]], "physbo.variable": [[50, 1, 1, "", "variable"]], "physbo.variable.variable": [[50, 2, 1, "", "add"], [50, 2, 1, "", "add_X"], [50, 2, 1, "", "add_Z"], [50, 2, 1, "", "add_t"], [50, 2, 1, "", "delete"], [50, 2, 1, "", "delete_X"], [50, 2, 1, "", "delete_Z"], [50, 2, 1, "", "delete_t"], [50, 2, 1, "", "get_subset"], [50, 2, 1, "", "load"], [50, 2, 1, "", "save"]]}, "objnames": {"0": ["py", "module", "Python \u30e2\u30b8\u30e5\u30fc\u30eb"], "1": ["py", "class", "Python \u30af\u30e9\u30b9"], "2": ["py", "method", "Python \u30e1\u30bd\u30c3\u30c9"], "3": ["py", "attribute", "Python \u306e\u5c5e\u6027"], "4": ["py", "function", "Python \u306e\u95a2\u6570"], "5": ["py", "property", "Python \u30d7\u30ed\u30d1\u30c6\u30a3"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "terms": {"\")": [57, 59, 62], "\"*": [57, 62], "\",": [47, 56, 57, 59, 61], "\"ei": 47, "##": 59, "#in": [57, 62], "& \\": 1, "& k": 1, "<": 57, "''": 58, "'(": 37, "')": [1, 57, 58, 59], "',": [56, 57, 58, 59, 60, 61, 62], "']": 35, "'config": 35, "'exact": 20, "'hvpi": 44, "'ts": 41, "'}\\": 59, "'}_": 59, "(\"": [56, 59], "('": [56, 57, 58, 59, 60, 61], "((": [56, 59], "()": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43, 53, 56, 57, 58, 59, 60, 61, 62], "(-": 59, "([": [56, 59, 60], "(\\": [1, 59], "(_": 51, "(a": 59, "(acquisition": [53, 57], "(actions": [58, 61], "(array": 59, "(baysean": 20, "(best": [57, 60, 62], "(blm": 10, "(calculated": 61, "(common": 54, "(default": 13, "(ei": 1, "(figsize": 59, "(file": 58, "(front": 59, "(fx": [57, 62], "(gp": 56, "(hyper": 59, "(int": 56, "(itertools": 59, "(k": 1, "(l": 1, "(less": [23, 27], "(lik": 56, "(list": 59, "(max": [57, 58, 59, 60, 61, 62], "(mean": [41, 44], "(mode": 57, "(n": [56, 59], "(np": [56, 57, 58, 59, 60, 61, 62], "(num": 30, "(object": 59, "(open": 54, "(optimization": 54, "(pi": 1, "(policy": 58, "(range": 61, "(ref": 59, "(res": [57, 59, 60, 62], "(score": 57, "(simu": 59, "(t": [56, 61], "(test": [57, 58, 59, 60, 61, 62], "(the": 42, "(u": [10, 34], "(var": 57, "(window": [57, 62], "(x": [6, 8, 10, 13, 14, 37, 56, 57, 58, 59, 60, 61, 62], "(xtest": 8, "(y": 59, "({": 1, "(\u6ce8": 56, ") \\": 1, "))": [8, 10, 13, 57, 59, 62], ")*": 56, "),": [1, 14, 29, 41, 42, 44, 56, 57, 59, 61], ")-": 34, ").": [14, 20, 23, 25, 27, 41, 42, 44, 48, 50, 53, 54, 56, 57, 62], "):": [53, 57, 59], ")]": 59, ")^": [1, 34, 59], ")^\\": 1, ")}": 1, ")\u3001": 1, ")\u3002": [53, 57, 62], "*'": 59, "**": [31, 41, 44, 57, 62], "*alpha": [41, 44], "*}": 1, "+ \\": 1, "+\\": 1, "+ntest": 56, "+std": 57, ", '": 59, ", [": 59, ", \\": 1, ", k": 1, ", score": [57, 60, 62], ", vmin": 59, ", where": [19, 23, 27], ", x": [57, 62], ", y": 1, ", z": 1, ",\"": 6, ",')": [56, 58, 60, 61], ",)": [19, 23, 27], ",[": 59, ",b": 6, "- \\": 1, "- x": 56, "--": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 37, 38, 41, 42, 44, 46, 47, 50], "-1": 59, "->": 54, "-\\": 1, "-armed": 59, "-b": 19, "-based": 48, "-basis": 16, "-bfgs": 19, "-by": [6, 13, 16], "-center": 53, "-covariance": [14, 16, 21, 31], "-d": [6, 13], "-dev": [51, 53], "-dimensional": [19, 20, 21, 23, 25, 27, 33, 41, 44, 50], "-dominated": [46, 59], "-l": [6, 13], "-learn": 54, "-mail": 51, "-max": 54, "-n": 16, "-ntrain": 56, "-objective": [54, 59], "-pattersonafb": 59, "-rank": 54, "-rectangle": 59, "-scale": 6, "-std": 57, "-t": 56, "-th": 58, "-tokyo": 51, "-update": 10, "-user": 53, "-volume": 48, "-y": 1, ".)": 42, ".,": [41, 42, 44, 48, 56, 59], "..": [56, 59, 61], "...": [1, 56], "._": [11, 35, 38], ".ac": 51, ".adam": [3, 36], ".add": [3, 39], ".alpha": 36, ".append": [56, 57, 62], ".argmin": [57, 62], ".array": [56, 57, 59, 60, 62], ".asarray": [56, 58, 60, 61], ".basis": [3, 4, 8, 10, 11, 12], ".bayes": [40, 43, 57, 58, 59, 60, 61, 62], ".beta": 36, ".bias": [11, 13], ".blm": [2, 3, 20], ".c": 59, ".cat": [18, 22], ".centering": [3, 32, 56, 58, 60, 61], ".choice": 56, ".chosen": [53, 57, 62], ".collections": 57, ".colorbar": 59, ".com": [53, 54], ".comm": 57, ".config": [4, 14, 31], ".const": [17, 28, 56], ".core": [3, 4, 10, 14, 17, 25], ".cov": [3, 11, 12, 15, 16, 17, 56], ".cpc": 54, ".decomp": [18, 22], ".delete": [3, 4, 17], ".discreate": 62, ".discrete": [3, 39, 53, 57, 58, 59, 60, 61, 62], ".disp": 18, ".divide": 39, ".dump": [38, 58], ".epoch": 36, ".epsilon": 36, ".eval": 18, ".exact": [4, 8, 9, 17, 20, 24, 31], ".exp": 59, ".export": [18, 39, 40, 43, 53, 57, 59, 60, 62], ".figure": 59, ".fill": 57, ".fit": [3, 4, 17, 18, 56], ".fourier": [4, 5, 12], ".fx": [53, 57, 59, 60, 62], ".g": [41, 42, 44], ".gamma": 36, ".gauss": [3, 4, 8, 11, 15, 17, 22, 26, 32, 56], ".get": [3, 4, 5, 7, 8, 10, 11, 12, 13, 15, 17, 18, 20, 22, 26, 28, 31, 40, 43, 56, 57], ".gp": [2, 3, 56], ".grad": [36, 37], ".history": [41, 44, 53, 57, 58, 62], ".imshow": 59, ".inf": [3, 4, 8, 17, 20], ".ini": 35, ".init": [18, 28], ".jp": 51, ".learning": [17, 18], ".lik": [3, 4, 7, 8, 10, 17, 56], ".linalg": 34, ".line": [57, 60], ".linear": [4, 8, 10, 11], ".lines": [57, 60], ".linspace": [57, 59, 62], ".load": [3, 22, 32, 40, 43, 50, 57, 58], ".loadtxt": [56, 58, 60, 61], ".m": 36, ".max": 36, ".mean": [3, 17, 56], ".method": 7, ".misc": [2, 3, 14, 20, 56, 58, 60, 61], ".model": [4, 7, 10, 14, 17, 18, 25, 56], ".multivariate": [31, 41, 44], ".nbasis": [5, 7, 11, 15], ".ndarray": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 34, 37, 41, 42, 44, 47], ".new": 43, ".nparams": 36, ".npz": [57, 58], ".num": [14, 31, 59], ".one": 18, ".opt": [2, 3], ".org": 54, ".params": [5, 6, 11, 12, 13, 15, 16, 36, 56], ".pareto": [3, 39, 59], ".plot": [57, 59, 60, 62], ".policy": [39, 40, 43, 57, 58, 59, 60, 61, 62], ".polycollection": 57, ".post": [7, 18], ".prec": 15, ".predict": [7, 14, 18, 31], ".predictor": [2, 3, 4, 17, 41, 44, 47, 58], ".prepare": [3, 4, 7, 8, 17, 18, 22, 56], ".print": [18, 22, 56], ".prior": [3, 4, 7, 8, 17, 18, 56], ".product": 59, ".py": [41, 44, 53], ".pyplot": [57, 59, 60, 62], ".rand": 22, ".random": [31, 40, 41, 43, 44, 56, 57, 58, 59, 60, 62], ".reset": 18, ".results": [39, 40, 41, 43, 44, 53, 57, 58, 62], ".run": [18, 36], ".sample": 61, ".sampling": [7, 8, 11, 18, 26], ".save": [3, 22, 40, 43, 57, 58], ".savez": 50, ".scatter": 59, ".sciencedirect": 54, ".score": [3, 39], ".search": [2, 3, 53, 57, 58, 59, 60, 61, 62], ".seed": 61, ".set": [3, 5, 11, 14, 15, 18, 20, 22, 26, 28, 32, 36, 39, 40, 56, 57, 58, 59, 60, 61, 62], ".shape": [56, 59], ".show": [5, 32, 58, 59], ".sigma": 15, ".size": 61, ".solve": 34, ".sqrt": [57, 59], ".stats": [7, 10, 11], ".sub": 18, ".subplots": 57, ".sum": 59, ".supp": [22, 26, 28], ".t": [50, 58, 59, 60], ".time": [40, 43], ".title": 59, ".total": [53, 57, 60, 62], ".training": [41, 44, 58], ".trans": 26, ".u": 51, ".update": [3, 4, 7, 8, 17, 36, 38, 39], ".utility": [3, 39, 58], ".v": 36, ".variable": [2, 3, 14, 31, 41, 44, 47, 58], ".volume": [39, 59], ".write": [40, 43, 58], ".x": 50, ".xlabel": 59, ".xlim": 59, ".ylabel": 59, ".ylim": 59, ".z": 50, ".zero": [17, 28], ".zeros": 30, ".\u300d": 59, "/\\": 59, "/article": 54, "/ds": 59, "/eng": 59, "/issp": 53, "/physbo": 53, "/pii": 54, "/s": [54, 56, 58, 60, 61], "/science": 54, "0d": 57, "0ff": 57, "0x": [57, 60], "10": [56, 57, 59], "11": [56, 57], "12": [56, 57], "13": [56, 57], "14": [56, 57, 59], "15": [56, 57, 59], "16": [56, 57, 59], "17": [56, 59], "18": 56, "19": 59, "1e": [23, 27, 60], "1st": 58, "1\u3064": [53, 57], "2d": [57, 60], "2nd": 58, "2\u3064": [57, 60], "3d": 57, "3dihub": 54, "3rd": 58, "4py": 57, "4th": 58, "73": 61, "7fdc": 60, "7fe": 60, "7ff": 57, "80": 60, ":/": [53, 54], ":]": 59, ":baysean": 53, ":gaussian": 53, ":ntrain": 56, ":physbo": 53, ":predictor": 53, ";]": [57, 60], ";matplotlib": [57, 60], "= \"": 47, "= (": 56, "= -": [56, 58, 60, 61], "= \\": 1, "= a": 1, "= f": 37, "= k": 1, "=\"": [57, 59, 61, 62], "='": [56, 57, 58, 59, 60, 61, 62], "=(": 59, "=-": [57, 59, 62], "=.": 57, "=[": [57, 59, 61, 62], "=action": [57, 62], "=cov": 56, "=false": 56, "=lik": 56, "=mean": 56, "=mpi": 57, "=n": 59, "=none": [58, 61], "=policy": 58, "=simu": 59, "=simulator": [57, 60, 62], "=test": [57, 59], "=true": 59, "=x": [57, 58, 60, 61, 62], "@misc": 54, "[&": [57, 60], "['": 35, "[-": [57, 59, 62], "[1": [56, 57, 58, 59, 60, 61], "[2": [56, 57, 58, 59, 60, 61], "[3": [56, 57, 58, 59, 60, 61], "[4": [56, 57, 59, 60, 61], "[5": [56, 58, 59], "[6": [56, 59, 60], "[7": [56, 57, 59, 60], "[8": [56, 57, 59, 60], "[9": [56, 57, 59], "[:": [56, 57, 58, 59, 60, 61], "[[": 61, "[\\": 1, "[action": [57, 58, 59, 60, 62], "[actions": 61, "[calculated": 61, "[dominated": 59, "[i": 59, "[id": 56, "[int": [57, 62], "[np": [57, 62], "[ntrain": 56, "[params": 27, "[x": 6, "\\\nk": 1, "\\[": 1, "\\\\": [1, 59], "\\begin": 59, "\\bf": 1, "\\boldsymbol": 1, "\\eta": 1, "\\exists": 59, "\\left": 59, "\\mathbf": 1, "\\mathcal": 1, "\\mu": 1, "\\phi": 1, "\\pi": 1, "\\prec": 59, "\\sigma": 1, "\\text": 1, "\\vec": 59, "\\|": 1, "]\n#": 62, "]\nx": [57, 62], "])": [56, 57, 59, 60, 61, 62], "],": [56, 59], "].": [27, 59], "]:": [56, 57, 58, 59, 60, 61, 62], "][": [57, 62], "]]": [59, 61], "]^": 1, "^-": 34, "^\\": 1, "^t": [1, 34], "^{": [1, 59], "_,": [58, 60], "_[": 59, "__": [38, 41, 44, 51, 57, 58, 59, 60, 62], "_action": [40, 41, 42, 43, 44, 45, 53, 57, 60, 62], "_actions": [42, 53, 57, 62], "_all": [40, 42, 53, 56, 57, 59, 60, 62], "_basis": [3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 17, 20, 23, 31, 38, 41, 44, 57, 58, 59, 60, 61, 62], "_best": [40, 42, 53, 57, 60, 62], "_between": 57, "_bias": [11, 12, 13], "_binary": 46, "_blm": [18, 20], "_bound": [18, 20, 22, 23, 26, 27, 28, 29], "_c": 1, "_call": [41, 44, 57, 62], "_cand": [18, 20, 22, 23, 26, 27, 28, 29], "_candidate": 48, "_compressed": 50, "_config": [3, 14, 20, 32, 56], "_const": [4, 15, 16], "_cov": [11, 12, 15, 16, 18, 21, 22, 23, 26, 27], "_data": [21, 27, 29, 30, 41, 43, 44, 56, 58, 60, 61], "_dim": [23, 46], "_disp": [19, 41, 44], "_dominance": [39, 46, 59], "_dominated": [39, 46], "_each": [41, 44, 60], "_ehvi": 59, "_elim": [3, 32], "_epoch": [19, 36, 37], "_expans": [22, 23], "_fcov": [3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 24, 25, 31, 38, 40, 41, 43, 44, 56, 57], "_fmean": [3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 24, 25, 31, 38, 40, 41, 43, 44, 56, 57], "_front": [39, 43, 45, 46, 59], "_fx": [40, 42, 53, 57, 60, 62], "_get": [40, 41, 42, 43, 44, 45], "_grad": [17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], "_history": [40, 41, 44, 58], "_hvpi": 59, "_i": [1, 59], "_ids": 61, "_idx": [57, 62], "_in": [39, 46, 59], "_init": [13, 57, 62], "_initial": 61, "_interactive": [3, 39, 49], "_iter": 19, "_j": 59, "_l": 1, "_learning": [3, 39, 49], "_like": [29, 34], "_list": [43, 44, 48, 57, 62], "_marlik": [17, 18, 19, 20, 24, 25], "_max": [39, 46, 57, 59, 62], "_mean": [4, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 21, 28, 29, 30], "_message": [3, 39, 49], "_min": [39, 46, 57, 59, 62], "_mo": [3, 39, 49], "_mode": [3, 39, 49], "_mu": [8, 10], "_multi": [3, 39, 49, 59], "_n": 59, "_name": [23, 35, 38, 44, 50], "_new": 56, "_non": [39, 46], "_normal": [31, 41, 44], "_normalized": 33, "_num": [41, 42, 44, 48, 53, 57, 58, 59, 60, 61, 62], "_objectives": [44, 45, 46, 59], "_one": [18, 19], "_opt": [57, 62], "_p": 59, "_param": 29, "_params": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30, 31, 36, 37, 38, 56], "_pareto": [43, 44, 45, 49, 59], "_post": [3, 4, 7, 8, 9, 10, 14, 17, 18, 20, 24, 25, 31, 38, 40, 41, 43, 44, 56, 57], "_prec": [11, 12, 15, 16], "_predict": [3, 4, 14, 17, 31, 38], "_predictor": [2, 3, 14, 31, 38, 40, 41, 42, 43, 44, 45, 58], "_probe": [41, 44, 60], "_probes": [41, 44, 57, 58, 59, 60, 61, 62], "_rand": [41, 44, 57, 58, 59, 60, 61, 62], "_random": 59, "_ratio": 46, "_reference": [39, 46], "_region": [39, 46], "_research": 42, "_result": 57, "_results": [3, 39, 49, 58], "_row": 50, "_rule": 46, "_run": [18, 19, 40, 41, 42, 43, 44, 45], "_runs": [42, 59], "_samples": [3, 4, 14, 17, 31, 38], "_sampling": [7, 8, 18, 20], "_scale": 23, "_score": [40, 41, 43, 44, 57], "_search": [3, 18, 19, 39, 40, 41, 43, 44, 46, 49, 53, 57, 58, 59, 60, 61, 62], "_seed": [40, 41, 57, 58, 59, 60, 61, 62], "_sequence": [40, 42, 53, 57, 60, 62], "_set": [44, 49, 59], "_simulator": [40, 41, 42, 43, 44, 45], "_sparse": 59, "_start": [3, 39, 49], "_stats": [3, 4, 7, 8, 9, 10, 14, 17, 31, 38], "_subset": [3, 50], "_t": [3, 19, 50], "_test": 56, "_total": [40, 41, 42, 43, 44, 45], "_train": 56, "_training": [40, 41, 43, 44, 58], "_triangular": 34, "_ts": 59, "_update": [18, 19, 40, 41, 42, 43, 44, 45], "_vector": [3, 39, 49], "_width": 23, "_world": 57, "_x": [3, 19, 41, 44, 50, 57, 58, 59, 60, 61, 62], "_z": [3, 50], "_{": [1, 56, 59], "``": 53, "about": [20, 35, 41, 44], "above": 62, "acceleration": 56, "access": 54, "acquisition": [41, 44, 47], "action": [41, 42, 44, 45, 50, 53, 55, 57, 58, 59, 60, 62], "actions": [41, 42, 44, 58, 61, 62], "actoin": 61, "adam": [3, 17, 18, 19, 32, 35, 36, 37], "adc": 57, "add": [46, 50], "adding": [27, 50], "advances": 6, "afit": 59, "air": 59, "al": 48, "algorithm": 19, "algorithms": 59, "all": [16, 20, 41, 42, 44, 54], "along": 33, "alpha": [6, 8, 10, 14, 20, 31, 34, 37, 41, 44, 47, 48, 57], "already": [14, 31, 37], "amp": 23, "an": [13, 20, 29, 35, 41, 44], "analyses": 59, "and": [6, 16, 19, 20, 21, 23, 29, 33, 35, 41, 42, 44, 47, 48, 54, 56, 58, 59, 62], "another": 8, "api": [52, 53, 59], "appl": 56, "approach": 56, "aquision": [41, 44, 62], "aquisition": [41, 44], "ard": [23, 56], "are": [16, 41, 44, 47, 50, 62], "args": [31, 37, 38], "array": [19, 20, 23, 25, 27, 29, 33, 34, 41, 42, 44, 50, 56, 58, 59, 60], "article": 54, "artif": 59, "as": [8, 10, 13, 38, 41, 44, 50, 56, 57, 58, 59, 60, 61, 62], "ascending": 46, "assumed": [41, 44], "at": [12, 41, 42, 44, 51, 57, 60, 62], "author": 54, "automatic": 54, "auxiaialy": 10, "auxially": [8, 10], "available": [41, 44, 47, 54, 62], "ax": 57, "axis": 59, "bandits": 59, "base": [2, 3, 14, 19, 31, 38, 41, 44, 47], "based": 54, "basis": [6, 12, 13, 14, 19, 20, 23, 31, 38, 41, 44, 62], "batch": [3, 17, 18, 19, 32, 35], "bayes": [41, 44, 53, 57, 58, 59], "bayesian": [4, 41, 44, 54, 57, 58, 62], "baysean": [8, 14], "baysian": 54, "be": [10, 14, 20, 23, 25, 27, 29, 31, 37, 38, 41, 42, 44, 50], "been": 62, "before": 62, "begin": 1, "bernard": 59, "best": [42, 53, 57, 60, 62], "beta": 37, "bf": 1, "bias": [6, 12, 13], "bibtex": 54, "blm": [8, 10, 12, 14, 20, 41, 44, 53], "blue": 59, "boldsymbol": 1, "bool": [8, 10, 20, 21, 23, 25, 31, 41, 44], "boolean": [3, 32, 35], "both": [41, 44], "bound": [20, 23, 27, 29], "boundary": [20, 23, 27, 29], "bounds": 46, "by": [8, 10, 14, 27, 31, 38, 41, 42, 44, 50, 62], "calcualte": [41, 44], "calculate": [13, 34, 41, 44, 47, 48], "calculated": [41, 44, 61], "calculates": [8, 10, 12, 14, 16, 37], "calculating": [20, 21, 25, 31], "calculation": [48, 59], "call": [57, 58, 59, 60, 62], "callable": [41, 44], "calling": [57, 62], "can": 29, "candidate": [19, 20, 21, 23, 25, 27, 33, 41, 42, 44, 50, 57, 62], "candidates": [19, 29, 62], "capital": 54, "case": 62, "cat": [20, 21, 23], "cccc": 1, "cd": 53, "cdot": 1, "cdots": [1, 59], "centering": [3, 32, 33], "cholesky": 54, "choose": [41, 44, 62], "choosed": 62, "chosen": [42, 62], "class": [6, 8, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 35, 37, 38, 41, 42, 44, 45, 46, 47, 50, 57, 58, 59, 60, 62], "classifications": 59, "clone": 53, "coefficient": 6, "color": 57, "column": 33, "combo": [54, 62], "comm": [41, 44, 57], "communications": 54, "components": 16, "comput": 59, "compute": [6, 23], "computer": 54, "computes": 16, "concatinate": [20, 23], "config": [14, 19, 20, 31, 35, 38, 41, 44, 56], "configuration": [14, 35], "const": [17, 28, 29], "constant": 29, "contents": 2, "converted": 29, "copyright": 54, "corresponding": [19, 41, 44, 62], "cos": [1, 6], "couckuyt": [48, 59], "cov": [4, 12, 15, 16, 20, 21, 41, 44, 56], "covariance": [8, 10, 12, 16, 20, 21, 25, 27, 31, 38, 41, 44, 56], "covariant": 23, "create": [57, 62], "criteria": [48, 59], "csv": [56, 58, 60, 61], "cu": 56, "current": [23, 37, 57, 62], "data": [6, 8, 14, 20, 21, 29, 31, 42, 47, 56, 58, 60, 61], "dataset": [8, 14, 20, 31, 41, 44, 47], "datasets": 20, "david": 59, "ddots": 1, "declare": [57, 62], "declaring": 62, "decomp": [20, 21, 23], "decompose": 23, "decomposing": [20, 21], "def": [56, 57, 58, 59, 60, 61, 62], "default": [6, 8, 10, 12, 13, 14, 16, 19, 20, 31, 38, 41, 42, 44, 47], "defined": [23, 29, 30, 38, 41, 44, 47, 62], "del": [57, 58], "delete": [14, 31, 38, 50], "deleted": 50, "deleting": 50, "delimiter": [56, 58, 60, 61], "denotes": [19, 20, 21, 23, 25, 33, 41, 44, 50], "deschrijver": 59, "design": 62, "deviation": [27, 33], "dhaene": 59, "diag": [8, 10, 20, 21, 23, 25, 31], "diagonal": [8, 10, 27], "diagonalization": [20, 21, 23, 25], "diagonlization": 31, "dict": 38, "dimension": [6, 12, 30, 37], "dimensional": [19, 20, 21, 23, 25, 27, 33, 41, 42, 44, 50], "dimenstional": [41, 42, 44], "dirk": 59, "discovery": 47, "discrete": 59, "disp": [19, 44, 49, 59], "displaying": 19, "distribution": [8, 41, 44, 47], "divide": 46, "does": [14, 31], "doi": 54, "dom": 46, "dominance": 46, "dominate": [3, 39, 46], "domination": 46, "done": [37, 56, 61], "dots": 59, "drawing": 31, "draws": [8, 10, 12, 14, 20], "dtype": 46, "each": [16, 19, 20, 21, 23, 25, 27, 31, 33, 38, 41, 42, 44, 50, 62], "effective": 54, "ehvi": [3, 39, 48], "ei": [1, 3, 39, 41, 44, 47, 53, 57, 58, 60, 62], "elapsed": [41, 42, 44], "element": 27, "elements": [16, 19, 23, 27], "empty": 30, "end": [1, 59], "energy": [19, 20, 23, 25, 27, 41, 42, 44, 50, 62], "engineering": 59, "ensurepip": 53, "epoch": [37, 56, 61], "epochs": 19, "epsilon": 37, "estimation": 54, "et": 48, "eta": 1, "eur": 59, "eval": [17, 19, 20, 24, 25], "evaluating": [20, 25], "evolutionary": 59, "exists": 59, "exp": [1, 27, 59], "expansion": 23, "expected": [1, 41, 44, 47, 48, 53, 57], "export": [20, 41, 42, 45, 46, 62], "exporting": 20, "extent": 59, "false": [19, 21, 23, 35, 41, 44, 46, 49, 56], "fast": [10, 48, 59], "fbest": [53, 57, 62], "fcov": 56, "feature": [1, 6, 8, 10, 12, 13, 14, 19, 20, 21, 23, 25, 33, 41, 44, 50, 54, 62], "features": [6, 8], "fig": 57, "file": [23, 35, 38, 41, 42, 44, 50, 58], "filename": [42, 45], "files": [41, 44], "filled": [29, 41, 42, 44], "first": [8, 41, 44, 46, 62], "fit": [14, 20, 31, 38], "fitting": [20, 31], "flag": 31, "float": [8, 10, 12, 13, 14, 16, 20, 21, 23, 25, 31, 37, 41, 44, 47], "fmax": 47, "fmean": [12, 27, 48, 56], "for": [6, 8, 10, 13, 14, 19, 20, 21, 23, 27, 29, 31, 41, 42, 44, 46, 47, 48, 50, 54, 57, 59, 62], "forall": 59, "force": [46, 59], "fourier": [4, 5, 6], "frac": 1, "from": [8, 21, 23, 35, 38, 41, 44, 50, 54, 57], "front": 59, "fstd": 48, "funciton": [41, 44, 62], "function": [8, 12, 20, 23, 25, 27, 31, 37, 38, 41, 42, 44, 47, 50, 53, 57, 62], "functions": [41, 44], "fx": [42, 57, 62], "gamma": 37, "gauss": [3, 4, 11, 12, 15, 16, 17, 22, 23, 26, 27, 32, 34], "gaussian": [12, 16, 21, 23, 27, 41, 44, 62], "get": [4, 6, 8, 9, 10, 12, 13, 14, 16, 17, 19, 20, 21, 23, 24, 25, 27, 29, 30, 31, 38, 41, 44, 50, 57], "getting": [20, 23, 27, 29, 41, 42, 44, 50], "git": 53, "github": [51, 53], "give": 19, "given": [41, 44, 47], "gives": 19, "global": 59, "gp": [19, 21, 25, 53, 56], "grad": [20, 23, 25, 37], "gradiant": [20, 21, 23, 25], "gradient": [27, 37], "greater": [23, 27], "gt": [57, 60], "guess": 19, "half": [12, 16], "has": 62, "have": 16, "here": [41, 44], "history": [39, 40, 41, 42, 43, 44, 45, 49, 53, 57, 58, 62], "holding": 29, "https": [53, 54], "hvpi": [3, 39, 48], "hyper": [19, 41, 44, 48, 56, 61, 62], "hyperparameter": 54, "hyperparemters": [41, 42, 44], "hypervolume": 48, "id": [53, 55, 56, 57, 58, 59, 60], "if": [8, 10, 14, 20, 21, 23, 25, 31, 41, 42, 44, 47, 50, 59, 62], "ignore": 14, "ii": [53, 57], "import": [56, 57, 58, 59, 60, 61, 62], "improvement": [1, 41, 44, 47, 48, 53, 57], "in": [6, 8, 20, 29, 31, 38, 41, 42, 44, 46, 47, 56, 57, 59, 62], "independent": [16, 19, 23, 27], "index": [41, 44, 50, 57, 62], "indexes": [41, 42, 44, 50], "inf": 20, "information": [6, 23, 35, 38, 41, 42, 44], "infty": 1, "init": [11, 19, 29, 58, 59, 60], "initial": [13, 19, 41, 44, 56, 61, 62], "initialization": 14, "initialized": [14, 29], "initializes": [8, 10, 14], "initializing": [29, 31], "inline": [57, 59, 60], "innovations": 59, "input": [6, 8, 10, 12, 13, 20, 29, 35, 37, 41, 44, 62], "inputs": [8, 10, 14, 20, 31, 47], "inst": 59, "install": 53, "int": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 37, 41, 44, 50, 56], "integer": [41, 44], "intell": 59, "interactions": [57, 62], "interface": 56, "interval": [41, 44, 49, 57, 58, 59, 60, 61, 62], "into": [23, 41, 44], "inv": 16, "is": [3, 6, 19, 20, 21, 23, 25, 27, 38, 39, 41, 42, 44, 46, 47, 49, 50, 62], "isotropic": 16, "issn": 54, "issp": 51, "issues": 51, "it": [41, 44], "iterations": 19, "itertools": [57, 59, 62], "itself": [41, 44], "ivo": 59, "journal": [54, 59], "jpn": 56, "june": 47, "kazuyoshi": 54, "kei": 54, "kernel": [6, 8, 23], "keywords": 54, "kind": 47, "kiyohara": 56, "koji": 54, "kriging": 56, "kwargs": [37, 47, 48], "kwds": [31, 38], "label": [8, 10], "land": 59, "large": 6, "lb": 46, "ldots": 1, "le": 59, "learn": 59, "learned": 62, "learning": [3, 19, 32, 35, 41, 42, 44, 56, 61, 62], "left": 1, "len": [14, 31, 56], "length": [3, 39, 49], "license": 54, "lik": [8, 20, 56], "likelifood": 20, "likelihood": [19, 20, 25, 27, 56, 61], "linear": [4, 8, 11, 12, 13, 14, 20, 53, 57], "list": [20, 23, 27, 29, 41, 44], "load": [23, 35, 38, 41, 42, 44, 45, 50, 53, 56, 58, 60, 61], "loading": [35, 41, 44, 50], "log": [12, 16, 23, 27], "logarithm": 23, "longleftrightarrow": 59, "lower": [46, 59], "lt": [57, 60], "mach": 59, "machines": 6, "magne": 54, "make": 20, "management": 54, "manderick": 59, "map": [1, 8, 10, 13, 54], "maps": [6, 8, 10, 12, 13, 14, 20], "marginal": [19, 20, 25, 56, 61], "marlik": [20, 25], "matches": 34, "materials": [47, 54], "mathbf": 1, "mathcal": 1, "matplotlib": [57, 59, 60, 62], "matrix": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 31, 33, 34, 41, 44, 50], "max": [1, 19, 20, 23, 27, 29, 37, 41, 44, 47, 57, 58, 59, 60, 62], "maximization": 46, "maximum": [19, 23, 27, 29, 37, 41, 44, 47], "mean": [8, 10, 12, 13, 14, 16, 20, 21, 25, 31, 33, 38, 41, 44, 47, 56, 57], "means": 12, "median": 29, "merge": [41, 44], "messages": [41, 44], "method": [8, 37], "min": [20, 23, 27, 29, 56], "minimum": [19, 23, 27, 29], "minus": 59, "misc": 53, "mizoguchi": 56, "mode": [41, 44, 47, 48], "model": [4, 7, 8, 10, 14, 17, 18, 20, 31, 38, 53, 54, 57], "module": [2, 52], "motoyama": 54, "mozilla": 54, "mpi": [41, 44, 57], "mpl": 54, "mu": 1, "multi": [41, 44, 54, 59], "multiobjective": [48, 59], "multiplying": 31, "must": [31, 38], "mutated": 10, "name": [23, 35, 38, 41, 42, 44, 50], "nbasis": [6, 8, 13, 16], "ndarray": [23, 56, 57, 62], "negative": [19, 20, 23, 25, 27, 41, 42, 44, 50, 62], "neither": [41, 44], "netw": 59, "neural": [6, 59], "new": [10, 29, 44, 46, 56, 59], "next": [41, 42, 44], "no": 59, "noise": [8, 10, 14, 20, 27, 47], "non": [46, 59], "none": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 35, 38, 41, 42, 44, 45, 46, 47, 48, 49, 50], "nor": [41, 44], "normalize": 33, "normalized": 33, "not": [10, 14, 16, 20, 29, 30, 31, 41, 44, 47, 59, 62], "notimplementederror": 47, "np": [13, 31, 41, 44, 56, 57, 58, 59, 60, 61, 62], "nparams": 37, "ntest": 56, "ntrain": 56, "num": [14, 19, 20, 21, 23, 27, 29, 30, 31, 41, 42, 44, 45, 46, 50, 57, 58, 59, 60, 61, 62], "number": [6, 8, 10, 13, 14, 16, 19, 20, 21, 23, 27, 29, 31, 37, 41, 42, 44, 62], "numpy": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 37, 41, 42, 44, 47, 50, 53, 56, 57, 58, 59, 60, 61, 62], "nxn": 12, "object": [6, 8, 12, 13, 16, 19, 20, 21, 23, 27, 29, 30, 35, 37, 38, 41, 42, 44, 45, 46, 47, 50], "objective": [20, 23, 25, 27, 41, 42, 44, 46, 50, 59], "objects": 35, "observed": 62, "oda": 56, "of": [1, 6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 38, 41, 42, 44, 46, 47, 48, 50, 53, 54, 56, 57, 62], "oh": 59, "omega": 1, "on": [23, 46, 54], "one": [19, 23, 54], "ones": 29, "online": [3, 17, 18, 19, 32, 35], "only": [8, 10, 41, 44, 47, 62], "opt": 53, "optimization": [19, 23, 27, 41, 44, 48, 54, 58, 59, 62], "optimized": [20, 23, 25, 27, 41, 42, 44, 50], "optimizer": 37, "optimum": [57, 62], "options": [8, 37], "or": [29, 34, 35, 41, 44, 50], "order": 46, "ordinary": [41, 44, 62], "origin": 59, "other": 16, "others": 10, "otherwise": 14, "output": [41, 44, 62], "outputted": [41, 44], "overwrite": 42, "overwritten": [31, 38], "package": [2, 54], "pages": [47, 54], "parallel": [41, 44], "param": 23, "parameter": [13, 19, 23, 27, 31, 41, 44, 56, 61, 62], "parameters": [6, 8, 10, 12, 13, 19, 20, 21, 23, 25, 27, 29, 38, 41, 44], "params": [6, 12, 13, 16, 19, 20, 21, 23, 25, 27, 29, 30, 37], "pareto": [3, 39, 44, 46, 48, 59], "passed": 37, "perform": [19, 62], "performed": [41, 44, 62], "performing": [19, 41, 44], "phi": 1, "phys": 56, "physbo": [0, 51, 55, 56, 58, 59, 60, 62], "physics": 54, "pi": [1, 3, 39, 41, 44, 47, 53, 57, 62], "pickle": 38, "pip": 53, "pi\u30b9\u30b3\u30a2": 1, "plot": 59, "plt": [57, 59, 60, 62], "points": [46, 59], "policy": [39, 40, 41, 43, 44, 53, 58, 60, 61, 62], "post": [8, 20, 41, 44], "posterior": [8, 10, 14, 20, 25, 31, 47], "pp": 6, "prec": [16, 59], "precise": 16, "precision": [12, 16], "predict": [8, 20], "prediction": 38, "predictor": [3, 4, 14, 17, 20, 31, 38, 41, 42, 44, 47, 48, 53, 58], "preparation": 14, "prepare": [4, 8, 9, 10, 14, 17, 20, 23, 24, 25, 31, 38], "prepared": 14, "present": [57, 62], "print": [6, 20, 23, 56, 57, 61, 62], "printing": 20, "prior": [8, 16, 17, 18, 20, 21, 56], "priors": [16, 20, 21], "probability": [1, 41, 44, 47, 48, 53, 57], "problem": [46, 59], "proc": 59, "process": [21, 41, 44, 53, 62], "processing": 6, "property": [42, 45], "protocol": 38, "psi": [6, 8, 10, 12, 13, 14], "public": 54, "pypi": 53, "python": [53, 54], "query": 62, "quick": 10, "rahimi": 6, "rand": 23, "random": [1, 6, 8, 13, 41, 44, 53, 54, 57, 58, 59, 61, 62], "range": 59, "ranks": [41, 44], "raw": 12, "real": [19, 23, 27], "receives": [41, 44], "recht": 6, "recovering": 23, "rectangles": [3, 39, 46], "red": 59, "reduced": 48, "ref": [46, 59], "reference": [46, 48, 52], "region": 23, "repeat": 59, "replace": 56, "represented": 62, "represents": [19, 41, 44, 62], "res": [53, 57, 59, 60, 62], "reserved": 54, "reset": 19, "resets": 14, "reshape": [56, 57, 59, 62], "respectively": 33, "result": [29, 62], "results": [41, 44], "return": [34, 35, 56, 57, 58, 59, 60, 61, 62], "returning": [29, 30, 41], "returns": [8, 10, 12], "right": [1, 59], "rights": 54, "row": [19, 20, 21, 23, 25, 33, 41, 44, 50, 62], "rule": 46, "run": [19, 37, 41, 44], "running": [19, 41, 42, 44], "runs": 62, "runtimeerror": [41, 44], "ryo": 54, "saba": 59, "same": [16, 41, 44], "samples": [8, 10, 12, 14, 20, 31, 38], "sampling": [4, 8, 9, 10, 12, 14, 20, 21, 27, 41, 44, 47, 53, 54, 57, 58, 62], "save": [23, 38, 41, 42, 44, 45, 50, 53, 57], "saving": [41, 44, 50], "scale": 23, "school": 59, "scikit": 54, "scipy": [34, 53, 57, 62], "score": [3, 38, 39, 41, 44, 47, 48, 49, 53, 57, 58, 59, 61, 62], "scores": [41, 44, 47], "screening": 54, "search": [3, 19, 20, 21, 23, 25, 27, 32, 33, 35, 41, 42, 44, 50, 53, 57, 62], "searched": [41, 44], "searching": [41, 44, 56, 61, 62], "searchs": 19, "sec": 47, "sectoins": 35, "see": 47, "seed": [41, 62], "selected": 50, "self": [6, 12, 13, 14, 16, 31, 37, 38, 41, 44, 50, 57, 58, 59, 60, 62], "september": 54, "sequence": 42, "set": [3, 6, 12, 13, 14, 16, 20, 21, 23, 27, 29, 30, 31, 32, 35, 37, 38, 41, 44, 46, 47, 50, 59, 62], "sets": [12, 16], "setting": [20, 21, 23, 29, 41], "shape": 34, "show": [3, 6, 23, 35, 39, 49], "showing": 35, "sigma": [1, 16], "sim": 60, "simeq": 1, "simu": 59, "simulator": [41, 42, 44, 49, 53, 55, 61], "single": 62, "size": [13, 19, 23, 27, 41, 44], "skiprows": [56, 58, 60, 61], "solution": [19, 34], "sorted": 46, "source": [8, 10, 14, 20, 47], "specified": [20, 50], "split": [41, 44], "sqrt": [1, 59], "stable": 56, "standard": [27, 33], "start": [56, 61], "starting": 62, "stats": [8, 12, 25], "status": [31, 38], "std": [27, 56, 57], "step": [41, 42, 44, 57, 58, 62], "steps": [58, 62], "stores": [41, 42, 44], "str": [8, 23, 35, 38, 41, 42, 44, 47, 50], "structure": 56, "sub": 20, "submodules": [2, 52], "subpackages": [2, 52], "subset": [20, 50], "subt": 20, "subx": 20, "sum": 59, "summarized": 62, "supp": [23, 27, 29], "symp": 59, "system": 34, "systems": 6, "taking": 23, "tamura": 54, "target": [8, 10], "tech": 59, "terayama": 54, "test": [14, 31, 41, 44, 47, 48, 57, 59, 62], "tests": [21, 25], "th": [56, 57, 58, 61], "than": [23, 27], "that": [19, 29, 41, 44, 62], "the": [6, 8, 10, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 31, 33, 34, 37, 38, 41, 42, 44, 46, 47, 50, 54, 56, 57, 61, 62], "them": 23, "these": [41, 44], "this": [14, 23, 27, 31, 38, 47, 62], "thompson": [41, 44, 47, 53, 54, 57], "those": [20, 21], "time": [41, 42, 44, 45], "timing": 62, "title": 54, "to": [1, 14, 19, 20, 21, 23, 25, 27, 29, 31, 33, 34, 37, 38, 41, 42, 44, 50, 62], "tokyo": 54, "tom": 59, "tool": 54, "top": 1, "total": [20, 21, 23, 29, 41, 42, 44, 62], "trained": [14, 31, 47], "training": [8, 14, 20, 31, 41, 44, 47, 48, 58], "trans": 27, "transpose": 6, "triangular": 34, "true": [8, 10, 20, 21, 23, 25, 31, 35, 41, 44], "ts": [3, 39, 41, 44, 47, 48, 53, 57, 61, 62], "tsuda": [54, 56], "tsuyoshi": 54, "tuned": [41, 44], "tuning": [31, 41, 44, 54], "tuple": [6, 8, 10, 20, 23, 27], "tupple": [23, 25, 29], "type": [6, 8, 12, 13, 14, 16, 23, 37, 41, 44, 62], "ub": 46, "ueno": 54, "uninstall": 53, "university": 54, "unknown": 47, "until": 62, "update": [4, 6, 8, 9, 10, 14, 20, 31, 37, 38, 41, 44, 46, 54], "updated": [10, 14, 38], "updates": [8, 14, 37], "updating": [41, 42, 44], "upper": 46, "use": [14, 31, 47], "used": [14, 16, 20, 29, 30, 31, 41, 44, 47], "user": 53, "using": [8, 14, 19, 31, 34, 38, 50, 56], "value": [6, 8, 12, 13, 14, 16, 20, 21, 23, 25, 27, 29, 31, 38, 41, 42, 44, 47, 50, 62], "values": [13, 14, 20, 21, 23, 27, 31], "van": 59, "var": 57, "variable": [2, 3, 44, 50, 53], "variables": [19, 23, 27, 31, 38, 50], "variance": [12, 14, 16, 21, 31], "variances": [8, 10], "variation": [41, 44], "vdots": 1, "vec": 59, "vector": [13, 19, 20, 21, 23, 25, 33, 41, 44, 50, 62], "veldhuizen": 59, "ver": 54, "version": [38, 54, 62], "via": 54, "vlmop": 59, "vmax": 59, "volume": [46, 47, 54], "want": [41, 44, 62], "weight": [6, 8, 10, 12, 13], "weights": [8, 10, 14], "when": [23, 27, 41, 44], "where": 6, "which": [19, 41, 42, 44, 62], "while": 10, "whose": 50, "width": 23, "will": [10, 14, 37, 41, 44], "window": [57, 62], "with": [13, 16, 20, 23, 27, 29, 37, 41, 44], "wright": 59, "write": [41, 42, 44, 45], "writing": [41, 44], "wt": 6, "www": 54, "xs": [41, 44, 57], "xtest": 8, "y1": 59, "y2": 59, "yahyaa": 59, "year": 54, "yet": [14, 41, 44], "yoshimi": 54, "you": [41, 44, 62], "yourself": [41, 44], "yuichi": 54, "zero": [17, 28, 30, 41, 44, 62], "{(i": 1, "{-": 1, "{-d": 1, "{@": 54, "{\\": 1, "{array": 1, "{ei": 1, "{k": 1, "{motoyama": 54, "{n": [1, 59], "{pi": 1, "{split": 59, "{ts": 1, "{w": 1, "{x": [1, 59], "{y": 1, "| \\": 1, "|\\": 1, "|^": 1, "|{\\": 1, "||": 1, "}'": 1, "}(": 1, "})": [1, 56, 59], "}+": 1, "},": [1, 54], "}/": 1, "}\\": [1, 59], "}]": 1, "}^": [1, 59], "}_": 1, "}{": 1, "}|": 1, "}}": 1, "\u201d,": 56, "\u3001-": 59, "\u3001[": 59, "\u3001\u300c": [1, 54, 59], "\u3002physbo": 53, "\u3002\u3064\u307e\u308a": [1, 53, 54, 57], "\u3002\u307e\u305f": 59, "\u3042\u305f\u308a": 56, "\u3042\u305f\u308b": 56, "\u3042\u3089": 59, "\u3042\u3089\u304b\u3058\u3081": [1, 54, 59], "\u3042\u308a": [1, 53, 56, 57, 59, 60, 62], "\u3042\u308b": [1, 51, 53, 56, 57, 59, 62], "\u3044\u304f\u3064\u304b": 1, "\u3044\u307e\u305b": 1, "\u3044\u308b": [1, 51, 56, 57, 59, 62], "\u3046\u3061": [1, 56, 62], "\u3046\u3061\u3069\u308c": 59, "\u3046\u307e\u304f": [1, 54], "\u304a\u3044": [1, 54, 60], "\u304a\u304d": 59, "\u304a\u304f": [53, 56], "\u304a\u3051\u308b": [1, 53, 54, 56, 57, 59], "\u304a\u3053": 59, "\u304a\u3088\u3073": [1, 53, 56], "\u304a\u308a": [57, 62], "\u304a\u554f\u3044": 52, "\u304b\u304b\u308b": [1, 53, 54, 59], "\u304b\u3051": [57, 62], "\u304b\u3051\u308b": 53, "\u304b\u3055": 1, "\u304b\u3072": 59, "\u304b\u3089": [1, 53, 54, 55, 57, 58, 59, 62], "\u304c\u3042\u305f\u3048": 1, "\u304c\u3063": 1, "\u304c\u308f\u304b\u308a": [1, 57, 62], "\u304f\u3060": [1, 51, 53, 54, 56, 57, 59, 60], "\u3053\u3053": [1, 55, 56, 57, 61, 62], "\u3053\u3053\u3067": [1, 53, 62], "\u3053\u3061\u3089": [1, 51, 53, 54], "\u3053\u3068": [1, 51, 53, 54, 56, 57, 58, 59, 60, 61, 62], "\u3053\u306e": [0, 1, 53, 54, 57, 59, 62], "\u3053\u308c": [1, 56, 58, 59, 60, 61, 62], "\u3053\u308c\u3089": [1, 53, 57], "\u3054\u3068": [1, 57], "\u3054\u89a7\u304f": 53, "\u3055\u3044": [1, 51, 53, 54, 56, 57, 59, 60], "\u3055\u3089\u306b": 1, "\u3057\u3065\u3089\u3044": 51, "\u3057\u3066": [51, 53], "\u3057\u307e\u3046": 1, "\u3057\u307e\u3059": 59, "\u3057\u3088": 59, "\u3059\u306a\u308f\u3061": 59, "\u3059\u308b": [1, 51, 52, 53, 54, 55, 56, 57, 59, 62], "\u305a\u3063\u3068": 61, "\u305a\u308c": [53, 57, 59], "\u305b\u304f": 51, "\u305d\u3057\u3066": 1, "\u305d\u306e": [1, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62], "\u305d\u308c": [1, 53, 57], "\u305d\u308c\u305e\u308c": [53, 59], "\u305d\u308c\u3089": 59, "\u305f\u3044": [1, 53, 56, 57, 58, 59], "\u305f\u3046\u3048": 56, "\u305f\u3060\u3044": 56, "\u305f\u3060\u3057": 1, "\u305f\u307e\u307e": 61, "\u305f\u3081": [1, 51, 53, 54, 56, 57, 59, 61, 62], "\u3060\u3051": [1, 53, 54, 57], "\u3060\u3055\u3044": [51, 53, 57], "\u3064\u307e\u308a": 59, "\u3067\u3042\u308a": 59, "\u3067\u304d": [1, 53, 56, 57, 58, 59, 60, 61, 62], "\u3067\u304d\u308b": [1, 54, 57, 62], "\u3067\u3059": [1, 53, 54, 57, 59, 60, 62], "\u3067\u8fd4\u3055": 57, "\u3068\u3044\u3046": [1, 53, 54, 57, 60, 61, 62], "\u3068\u3044\u3063": [56, 61], "\u3068\u3048": 57, "\u3068\u304a\u304a\u3088": 59, "\u3068\u304d": [1, 53, 57, 59], "\u3068\u3057": [1, 53, 59], "\u3068\u3057\u3066": [1, 53, 56, 57, 58, 59, 61, 62], "\u3068\u3059\u308b": 1, "\u3068\u305d\u306e": [59, 61], "\u3068\u3064": 59, "\u3068\u306e": [1, 60], "\u3068\u3082": 59, "\u3068\u8868\u3059": 1, "\u306a\u3044": [1, 53, 56, 57, 59, 61], "\u306a\u304a": [57, 62], "\u306a\u304c\u3089": 56, "\u306a\u304f": [53, 57, 60], "\u306a\u3063": [1, 53, 56, 57, 59, 62], "\u306a\u3069": [1, 51, 53, 54, 56, 57, 58, 62], "\u306a\u308a": [1, 53, 54, 56, 59, 60], "\u306a\u308b": [1, 53, 57, 59, 60, 62], "\u306a\u308f\u3061": 59, "\u306b\u304a\u3051\u308b": 1, "\u306b\u304a\u5bc4\u305b\u304f": 51, "\u306b\u3059\u308b": 1, "\u306b\u3064\u3044\u3066": [1, 51, 53, 54, 56, 59, 61, 62], "\u306b\u3088\u3063": [1, 54, 60], "\u306b\u3088\u3063\u3066": 54, "\u306b\u3088\u308a": [1, 53, 54, 57, 58, 60], "\u306b\u3088\u308b": [52, 53, 54, 55, 57, 58], "\u306b\u3088\u308c": 1, "\u306b\u5bfe\u3057": [1, 53, 54, 56, 57, 62], "\u306b\u5bfe\u3059\u308b": [56, 57, 58], "\u306b\u5bfe\u5fdc": 60, "\u306b\u95a2\u3059\u308b": [1, 51, 53, 57], "\u306e\u3044": [53, 57, 59], "\u306e\u3046\u3061": 59, "\u306e\u307f": [57, 62], "\u306e\u3082": 54, "\u306f\u3058\u3081": [52, 55], "\u306f\u305d\u308c\u305e\u308c": [57, 59], "\u3072\u3068\u3064": 59, "\u307b\u3069": 59, "\u307b\u307c": 1, "\u307e\u3057": [0, 54, 56], "\u307e\u3059": [0, 1, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62], "\u307e\u305a": [1, 57], "\u307e\u305b": 57, "\u307e\u305f": [1, 53, 56, 57, 58, 59, 62], "\u307e\u3060": [1, 57], "\u307e\u3060\u308f\u304b\u3063": 1, "\u307e\u3067": [53, 57, 58, 60, 61, 62], "\u307f\u305f\u3044": 62, "\u307f\u307e\u3057\u3087": [57, 59], "\u3082\u3057": 1, "\u3082\u3068": [54, 62], "\u3082\u306e": [56, 57, 59, 62], "\u3082\u308a": 1, "\u3088\u3044": [1, 57, 62], "\u3088\u3046": [1, 53, 54, 56, 57, 58, 59, 60, 61, 62], "\u3088\u308a": [1, 53, 54, 57, 59], "\u3089\u308c": [1, 56, 61, 62], "\u3089\u308c\u308b": [1, 54], "\u308c\u308b": [1, 53, 54, 57, 60], "\u308f\u304b\u3063": 1, "\u3092\u901a\u3057": 55, "\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0": [52, 53, 54], "\u30a4\u30c6\u30ec\u30fc\u30b7\u30e7\u30f3": 1, "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": [51, 52], "\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6": [52, 53, 55, 57, 61], "\u30a4\u30f3\u30bf\u30fc\u30d0\u30eb": 57, "\u30a4\u30f3\u30dd\u30fc\u30c8": 57, "\u30aa\u30d6\u30b8\u30a7\u30af\u30c8": [53, 57, 58], "\u30aa\u30d7\u30b7\u30e7\u30f3": 53, "\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0": 51, "\u30aa\u30fc\u30c0\u30fc": 56, "\u30ab\u30fc\u30cd\u30eb": 1, "\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3": 51, "\u30ac\u30a6\u30b7\u30a2\u30f3": 56, "\u30ac\u30a6\u30b9": [1, 52, 53, 54, 55, 57], "\u30ac\u30a6\u30b9\u30ab\u30fc\u30cd\u30eb": 1, "\u30ad\u30fc\u30ef\u30fc\u30c9": 57, "\u30af\u30e9\u30b9": [53, 55], "\u30af\u30ed\u30fc\u30f3": 53, "\u30b0\u30ea\u30c3\u30c9": [57, 59, 62], "\u30b3\u30b9\u30c8": [1, 53, 54], "\u30b3\u30de\u30f3\u30c9": 53, "\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30bf": 57, "\u30b3\u30ec\u30b9\u30ad\u30fc": 1, "\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf": 57, "\u30b3\u30f3\u30bf\u30af\u30c8": 51, "\u30b3\u30f3\u30d1\u30a4\u30e9": 51, "\u30b5\u30f3\u30d7\u30ea\u30f3\u30b0": [1, 53, 59], "\u30b5\u30f3\u30d7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8": 62, "\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3": [1, 53, 54], "\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u30d1\u30e9\u30e1\u30fc\u30bf": [1, 54], "\u30b7\u30df\u30e5\u30ec\u30fc\u30bf": 57, "\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba": 55, "\u30b7\u30fc\u30c9": [57, 58, 60, 61], "\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3": 54, "\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb": 54, "\u30b9\u30b3\u30a2": [1, 57, 61, 62], "\u30b9\u30bf\u30f3\u30c0\u30fc\u30c9": 54, "\u30b9\u30bf\u30fc\u30c8": 1, "\u30b9\u30c6\u30c3\u30d7": [1, 53, 57, 58, 60], "\u30bb\u30c3\u30c8": [53, 58, 60, 61], "\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2": [0, 54], "\u30bd\u30fc\u30b9": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 38, 41, 42, 44, 45, 46, 47, 48, 49, 50], "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9": [53, 54], "\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb": 53, "\u30bd\u30fc\u30c8": 59, "\u30bf\u30a4\u30d7": 57, "\u30bf\u30a4\u30df\u30f3\u30b0": [53, 57], "\u30bf\u30b9\u30af": [1, 53, 54], "\u30bf\u30fc\u30b2\u30c3\u30c8": 54, "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": [52, 53, 56, 57, 58, 59, 60, 61, 62], "\u30c4\u30fc\u30eb": 54, "\u30c6\u30b9\u30c8": 55, "\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf": 56, "\u30c7\u30a3\u30ec\u30af\u30c8\u30ea": [56, 58, 60, 61], "\u30c7\u30d5\u30a9\u30eb\u30c8": [53, 57], "\u30c7\u30fc\u30bf": [1, 54, 55], "\u30c7\u30fc\u30bfx": 56, "\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb": [56, 58, 60, 61], "\u30c8\u30d4\u30c3\u30af": 51, "\u30c8\u30ec\u30fc\u30c9\u30aa\u30d5": 59, "\u30c8\u30ec\u30fc\u30cb\u30f3\u30b0\u30c7\u30fc\u30bf": [56, 62], "\u30c8\u30f3\u30d7\u30bd\u30f3\u30b5\u30f3\u30d7\u30ea\u30f3\u30b0": 1, "\u30c8\u30fc\u30bf\u30eb": [53, 57], "\u30ca\u30ce\u30a2\u30fc\u30ad\u30c6\u30af\u30c8\u30cb\u30af\u30b9": 54, "\u30cf\u30a4\u30d1\u30fc\u30d1\u30e9\u30e1\u30bf": 1, "\u30cf\u30a4\u30d1\u30fc\u30d1\u30e9\u30e1\u30fc\u30bf": 57, "\u30d0\u30b0": 51, "\u30d0\u30fc\u30b8\u30e7\u30f3": 51, "\u30d1\u30e9\u30e1\u30bf": 56, "\u30d1\u30e9\u30e1\u30fc\u30bf": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 38, 41, 42, 44, 46, 47, 50, 53, 54, 55, 56, 57, 58], "\u30d1\u30e9\u30e1\u30fc\u30bf\u30bb\u30c3\u30c8": 53, "\u30d1\u30ec\u30fc\u30c8\u30eb\u30fc\u30eb": 59, "\u30d4\u30fc\u30af": 59, "\u30d5\u30a1\u30a4\u30eb": [51, 53, 57, 58, 61], "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8": [0, 54], "\u30d7\u30ed\u30bb\u30b9": [1, 54, 56, 58, 61], "\u30d7\u30ed\u30c3\u30c8": [55, 57], "\u30d9\u30a4\u30ba": [52, 53, 54, 55, 56, 58, 60, 61], "\u30d9\u30af\u30c8\u30eb": [1, 53], "\u30d9\u30b9\u30c8": [53, 57, 60], "\u30d9\u30f3\u30c1\u30de\u30fc\u30af": 59, "\u30d9\u30fc\u30b9\u30af\u30e9\u30b9": [6, 8, 12, 13, 14, 16, 19, 20, 21, 23, 27, 29, 30, 31, 35, 37, 38, 41, 42, 44, 45, 46, 50], "\u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea": 53, "\u30de\u30a4\u30ca\u30b9": 53, "\u30e1\u30bd\u30c3\u30c9": [53, 57, 59], "\u30e1\u30c3\u30bb\u30fc\u30b8": 59, "\u30e1\u30e2": [10, 41, 44], "\u30e2\u30b8\u30e5\u30fc\u30eb": 53, "\u30e2\u30c7\u30eb": [1, 55, 58], "\u30e6\u30fc\u30b6": 53, "\u30e9\u30a4\u30bb\u30f3\u30b9": 52, "\u30e9\u30a4\u30d6\u30e9\u30ea": 54, "\u30e9\u30f3\u30c0\u30e0": [53, 56, 59, 61, 62], "\u30e9\u30f3\u30c0\u30e0\u30b5\u30f3\u30d7\u30ea\u30f3\u30b0": [58, 59], "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1": 60, "\u30ea\u30b9\u30c8": [60, 61], "\u30ea\u30b9\u30c8\u30a2\u30c3\u30d7": [1, 53, 54], "\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9": 53, "\u30eb\u30fc\u30d7": [53, 57], "\u30ec\u30dd\u30b8\u30c8\u30ea": 53, "\u30ed\u30fc\u30c9": [53, 57, 58], "\u30fb\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3": [1, 54], "\u30fb\u30d7\u30ed\u30bb\u30b9": 1, "\u4e00\u3064": [1, 56, 57, 62], "\u4e00\u5ea6": [52, 53, 55, 57, 62], "\u4e00\u6176": 54, "\u4e00\u65b9": 54, "\u4e00\u69d8": 1, "\u4e00\u6b21\u5143": [57, 62], "\u4e00\u756a": [57, 62], "\u4e00\u822c": [1, 54, 57, 62], "\u4e0a\u754c": 59, "\u4e0a\u8a18": [53, 57, 59], "\u4e0a\u8ff0": 61, "\u4e0b\u3055\u3044": [53, 54], "\u4e0b\u8a18": 60, "\u4e0d\u78ba": 1, "\u4e0e\u3048": [1, 56, 58], "\u4e0e\u3048\u308b": 53, "\u4e26\u5217": 57, "\u4e26\u5217\u5316": 55, "\u4e2d\u65ad": 55, "\u4e2d\u8eab": 59, "\u4e88\u6e2c": [1, 53, 54, 55, 58], "\u4e88\u6e2c\u5024": 56, "\u4e8b\u524d": [55, 56, 62], "\u4e8b\u5f8c": [1, 53, 57, 59], "\u4e8c\u4e57": 56, "\u4eba\u624b": 58, "\u4eca\u56de": [57, 60, 62], "\u4ed5\u69d8": [57, 62], "\u4ed8\u9332": 55, "\u4ee5\u4e0a": [53, 57, 60], "\u4ee5\u4e0b": [1, 51, 53, 54, 56, 57, 58, 59, 60, 61, 62], "\u4ee5\u964d": 59, "\u4eee\u5b9a": 59, "\u4efb\u610f": [1, 59], "\u4f1a\u793e": 54, "\u4f4d\u7f6e": 59, "\u4f55\u3089\u304b": [53, 57], "\u4f5c\u6210": 53, "\u4f7f\u308f": 1, "\u4f7f\u7528": [51, 52, 55, 56, 57, 62], "\u4f8b\u3048": [1, 53, 56, 57, 58], "\u4f8b\u3068\u3057\u3066": [56, 57], "\u4f8b\u5916": [41, 44, 47], "\u4f8b\u984c": [57, 62], "\u4f9d\u5b58": [53, 57], "\u4fc2\u6570": 1, "\u4fdd\u5b58": [53, 56, 57, 58, 60, 61], "\u500b\u5225": 58, "\u5019\u88dc": [1, 52, 53, 54, 55, 62], "\u501f\u308a": 0, "\u504f\u5dee": 56, "\u512a\u308c": 59, "\u5143\u914d": 56, "\u5148\u307b\u3069": [53, 57], "\u5165\u3063": 53, "\u5165\u529b": [51, 53, 56, 59, 60], "\u5168\u3066": [53, 61, 62], "\u5168\u5019": 57, "\u5168\u63a2": 55, "\u516c\u958b": 54, "\u5171\u5206": 56, "\u5171\u5206\u6563": 56, "\u5171\u901a": 59, "\u518d\u3073": 61, "\u518d\u958b": 55, "\u51e6\u7406": 58, "\u51fa\u3059": [1, 54], "\u51fa\u529b": [51, 53, 56, 57], "\u5206\u304b\u308a": 59, "\u5206\u5272": [57, 62], "\u5206\u5e03": [1, 53, 57, 59], "\u5206\u6563": [1, 56, 57], "\u5206\u89e3": 1, "\u5206\u91ce": 54, "\u5217\u884c": 1, "\u521d\u3081": 57, "\u521d\u671f": [1, 53, 57, 61, 62], "\u521d\u671f\u5316": 1, "\u5225\u500b": [53, 57], "\u5229\u7528": [1, 54, 56, 57, 59, 61], "\u5236\u5fa1": [53, 57, 58], "\u5236\u9650": 61, "\u523b\u3093": [57, 62], "\u524a\u9664": 58, "\u524d\u51e6": 53, "\u524d\u8ff0": 1, "\u52a0\u308f\u3063": 1, "\u52a0\u901f": 54, "\u52b9\u7387": 59, "\u5316\u51fa": 57, "\u5316\u554f": 59, "\u5316\u5b66": 54, "\u5316\u5b9f": 58, "\u5316\u624b": 59, "\u5316\u65b9": 53, "\u5316\u7528": 59, "\u533b\u79d1": 54, "\u5358\u76ee": 59, "\u5360\u3081\u308b": 59, "\u53b3\u5bc6": 1, "\u53c2\u7167": [1, 6, 53, 54, 56, 57], "\u53c2\u8003": [53, 59], "\u53d6\u3063": [57, 62], "\u53d6\u308a\u51fa\u3059": [57, 62], "\u53d6\u5f97": 55, "\u53d7\u3051": [0, 54], "\u53d7\u3051\u4ed8\u3051": 51, "\u53ef\u80fd": [1, 53, 54, 56, 57, 62], "\u53f3\u4e0a": 59, "\u5404\u5019": 59, "\u5404\u5217": 1, "\u5404\u624b": 53, "\u5404\u63a2": [53, 60], "\u5408\u308f": 52, "\u5408\u8a08": 60, "\u5409\u898b": 54, "\u540c\u3058": [56, 60, 62], "\u540c\u3058\u304f": 59, "\u540c\u6642": 53, "\u540c\u69d8": [56, 58, 60, 61], "\u5411\u3051": 53, "\u542b\u307e": 56, "\u547c\u3070": 1, "\u547c\u3073": 59, "\u547c\u3073\u51fa\u3059": 62, "\u547c\u3076": 59, "\u554f\u3044\u5408\u308f\u305b": 51, "\u554f\u3044\u5408\u308f\u305b\u308b": 51, "\u554f\u984c": [1, 51, 53, 54, 56, 57, 62], "\u56de\u3059": [53, 57], "\u56de\u308a": [53, 57], "\u56de\u5e30": [1, 53, 54, 55, 56], "\u56de\u6570": [1, 54], "\u56f0\u96e3": 54, "\u56f3\u793a": 59, "\u56fd\u969b": 54, "\u57df\u5275": 54, "\u57fa\u5e95": 57, "\u57fa\u672c": [52, 55, 59, 60], "\u5831\u544a": 51, "\u5834\u5408": [1, 51, 53, 54, 56, 57, 58, 59, 60, 61, 62], "\u5909\u3048": 59, "\u5909\u308f\u308a": 57, "\u5909\u5f62": [56, 57, 62], "\u5909\u63db": 56, "\u5909\u6570": [1, 53, 57, 61, 62], "\u5909\u66f4": 51, "\u5916\u90e8": [53, 57, 58, 61], "\u591a\u304f": [54, 59], "\u591a\u6b21\u5143": 59, "\u591a\u76ee": [52, 55], "\u5927\u304d": [1, 53, 54, 59], "\u5927\u304d\u3044": 59, "\u5927\u5b66": [0, 54], "\u5927\u5b66\u9662": 54, "\u5927\u5c0f": 59, "\u5b58\u5728": 59, "\u5b66\u7814": 54, "\u5b66\u7fd2": [1, 53, 54, 55, 57, 58], "\u5b66\u7fd2\u6e08": 56, "\u5b66\u9662": 54, "\u5b89\u5b9a": 56, "\u5b8f\u6cbb": 54, "\u5b9a\u7fa9": [1, 53, 55], "\u5b9f\u4e16\u754c": [1, 53, 54], "\u5b9f\u6570": 56, "\u5b9f\u65bd": 62, "\u5b9f\u73fe": [1, 54], "\u5b9f\u884c": [1, 51, 52, 55, 56], "\u5b9f\u88c5": [54, 59], "\u5b9f\u969b": [1, 56], "\u5b9f\u9a13": [1, 53, 54, 57, 58], "\u5bc6\u5ea6": 1, "\u5bfa\u5c71": 54, "\u5bfe\u8c61": 56, "\u5c0e\u5165": 1, "\u5c11\u306a\u3044": [1, 54], "\u5c24\u5ea6": 56, "\u5c65\u6b74": [53, 57, 58, 59, 60, 62], "\u5ddd\u5cf6": 54, "\u5de6\u4e0b": 59, "\u5e02\u7acb": 54, "\u5e73\u5747": [1, 56], "\u5e74\u5ea6": [0, 54], "\u5f15\u6570": [53, 57, 60], "\u5f15\u7528": 52, "\u5f62\u5f0f": [56, 57, 62], "\u5f8c\u8ff0": 60, "\u5f93\u3046": 1, "\u5f93\u3063": 51, "\u5f97\u3089\u308c": 60, "\u5f97\u308b": [58, 61], "\u5fc5\u8981": [1, 56, 57, 62], "\u60aa\u5316": 59, "\u60c5\u5831": [51, 57, 60], "\u610f\u5473": 59, "\u611f\u8b1d": 0, "\u6210\u79d1": 54, "\u6210\u7acb": 1, "\u623b\u308a\u5024": [6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 25, 27, 29, 30, 31, 33, 34, 35, 37, 41, 42, 44, 47, 50], "\u624b\u6cd5": [1, 54], "\u624b\u8efd": 59, "\u624b\u9806": [53, 56, 57], "\u6271\u3044": 56, "\u6271\u3046": 54, "\u6280\u8853": [1, 54], "\u62bd\u8c61": 53, "\u62e0\u70b9": 54, "\u6301\u3064": [1, 54, 57, 62], "\u6307\u3057": 59, "\u6307\u5b9a": [51, 53, 57, 58, 59, 60], "\u6307\u6a19": 59, "\u639b\u3051": 59, "\u63a2\u3057": 53, "\u63a2\u7d22": [1, 52, 53, 54, 55], "\u63a8\u5968": 53, "\u63a8\u79fb": 57, "\u63a8\u85a6": 59, "\u63c3\u3063": 1, "\u63d0\u6848": [53, 57, 58], "\u652f\u63f4": [0, 54], "\u6539\u5584": [1, 59], "\u6570\u5024": [53, 57], "\u6587\u732e": [1, 53, 54, 56, 59], "\u65b0\u3057\u304f": 1, "\u65b0\u9818": 54, "\u65b9\u5411": 53, "\u65b9\u6cd5": [52, 55, 59, 62], "\u65e2\u5b58": [52, 55], "\u65e5\u672c": 54, "\u65e9\u671f": 51, "\u6607\u9806": 59, "\u6642\u9593": [1, 56, 59, 61], "\u66f4\u65b0": [1, 53, 59], "\u6700\u521d": [53, 57, 62], "\u6700\u5927": [1, 53, 54, 57, 59, 62], "\u6700\u5c0f": [57, 62], "\u6700\u5c0f\u5024": [57, 59, 62], "\u6700\u5c0f\u5316": 53, "\u6700\u5f8c": [57, 62], "\u6700\u9069": [52, 53, 54, 55, 56, 58, 60, 61], "\u6700\u9069\u5316": [53, 55], "\u6700\u9069\u89e3": 53, "\u6709\u52b9": [54, 57], "\u6709\u7528": 1, "\u671f\u5f85": [1, 53, 57, 59], "\u672c\u4f53": 53, "\u672c\u5c71": 54, "\u6750\u6599": [1, 53, 54], "\u6771\u4eac": [0, 54], "\u6771\u4eac\u5927\u5b66\u5927": 54, "\u67d4\u8edf": 58, "\u682a\u5f0f": 54, "\u683c\u7d0d": 61, "\u690d\u91ce": 54, "\u6975\u9650": 1, "\u69cb\u6210": 53, "\u69cb\u9020": [1, 52, 54, 56], "\u6a19\u6e96": 56, "\u6a2a\u6d5c": 54, "\u6a5f\u68b0": [1, 54], "\u6a5f\u69cb": 54, "\u6b21\u5143": [1, 53, 57, 59, 62], "\u6b21\u5f0f": 1, "\u6b63\u3057\u3044": [57, 62], "\u6b63\u898f": 53, "\u6bb5\u968e": [1, 53, 57], "\u6bce\u56de": [1, 57, 62], "\u6bd4\u8f03": 59, "\u6c42\u307e\u3063": [57, 59], "\u6c42\u3081": [56, 59], "\u6c42\u3081\u308b": [57, 59, 62], "\u6c7a\u307e\u308a": 1, "\u6ce8\u610f": [1, 59], "\u6d25\u7530": 54, "\u6d41\u308c": [52, 58, 61], "\u6e08\u307f": 56, "\u6e1b\u3089": 59, "\u6e21\u3055": 53, "\u6e21\u3057": 57, "\u6e21\u3059": 59, "\u6e21\u3059\u969b": 56, "\u6e96\u5099": 55, "\u7269\u6027": [0, 54], "\u7269\u7406": 54, "\u7269\u8cea": 54, "\u7279\u5fb4": 54, "\u7279\u6027": [1, 53, 54], "\u72b6\u614b": [1, 59], "\u72b6\u6cc1": 1, "\u7372\u5f97": [1, 53, 55], "\u73fe\u5728": [1, 57], "\u73fe\u72b6": 53, "\u751f\u3058": 51, "\u751f\u547d": 54, "\u751f\u6210": [1, 56, 59], "\u7528\u3044": [1, 53, 56, 57], "\u7528\u3044\u308b": [1, 53, 58, 62], "\u7528\u610f": [1, 53, 55, 62], "\u7530\u6751": 54, "\u754c\u9762": 56, "\u7559\u610f": 60, "\u756a\u53f7": [57, 62], "\u767a\u898b": 54, "\u767b\u9332": [53, 55, 56, 57, 58], "\u76ee\u7684": [1, 53, 54, 56, 57, 58, 62], "\u76f4\u5f8c": 56, "\u76f4\u8f1d": 54, "\u76f8\u8ac7": 51, "\u77e5\u3089": 51, "\u77e9\u5f62": 59, "\u7814\u7a76": [0, 51, 54], "\u7814\u7a76\u6240": 54, "\u78ba\u7387": [1, 53, 59], "\u78ba\u8a8d": [53, 55], "\u793a\u3057": [1, 57, 62], "\u793a\u3059": 59, "\u79d1\u5b66": 54, "\u7a2e\u985e": 53, "\u7a76\u79d1": 54, "\u7a7a\u9593": [1, 53, 57, 59], "\u7b54\u3048": [57, 62], "\u7bc4\u56f2": 57, "\u7d22\u5019": 53, "\u7d2f\u7a4d": 1, "\u7d39\u4ecb": [1, 55, 56, 62], "\u7d44\u6210": [1, 54], "\u7d50\u679c": [52, 53, 55, 56], "\u7d9a\u3044": 57, "\u7dda\u5f62": 1, "\u7de9\u548c": 56, "\u7e70\u308a\u8fd4\u3059": [1, 54, 61], "\u8003\u3048": [1, 54], "\u81ea\u3089\u3088\u308a": 59, "\u81ea\u52d5": 1, "\u81ea\u8eab": 59, "\u826f\u3044": [1, 54, 59], "\u826f\u304f": 1, "\u884c\u3044": [1, 53, 54, 56, 57, 58, 59, 61], "\u884c\u3046": [1, 53, 56, 58, 62], "\u884c\u304d\u7740\u3044": [57, 62], "\u884c\u3063": [1, 57, 58, 62], "\u884c\u306a\u3063": 56, "\u884c\u308f": [54, 57], "\u884c\u5217": [1, 57], "\u8868\u3057": 1, "\u8868\u3059": 1, "\u8868\u73fe": 1, "\u8868\u793a": [53, 57, 58, 59], "\u88d5\u4e00": 54, "\u88dc\u70b9": 57, "\u8907\u6570": [52, 53, 55, 57, 59, 62], "\u8907\u96d1": [1, 53, 54], "\u8981\u3057": 56, "\u898b\u3064\u3051": [1, 54], "\u898b\u7a4d": 1, "\u89e3\u304b": [1, 54], "\u89e3\u304d": 57, "\u89e3\u304f": 1, "\u89e3\u6c7a": 51, "\u89e3\u7a7a\u9593": 59, "\u89e3\u96c6\u5408": 59, "\u89e3\u9818": 59, "\u8a08\u753b": 54, "\u8a08\u7b97": [1, 52, 54, 55, 56, 57, 62], "\u8a13\u7df4": 56, "\u8a13\u7df4\u6e08": 55, "\u8a18\u61b6": 56, "\u8a18\u8f09": [51, 53, 62], "\u8a2d\u5b9a": [1, 56, 57, 62], "\u8a55\u4fa1": [1, 53, 54, 55, 56, 57, 58, 59, 60, 62], "\u8a55\u4fa1\u5024": 58, "\u8a55\u4fa1\u6570": 60, "\u8a66\u307f": 54, "\u8a73\u3057\u304f": [53, 57], "\u8a73\u7d30": [1, 53, 54], "\u8a9e\u8a33": 54, "\u8aa4\u5dee": 56, "\u8aac\u660e": 1, "\u8aad\u307f\u51fa\u3057": [56, 58, 60, 61], "\u8aad\u307f\u8fbc\u307f": 61, "\u8aad\u307f\u8fbc\u3080": 61, "\u8aad\u307f\u8fbc\u3093": [52, 55], "\u8ab2\u984c": 59, "\u8b1d\u8f9e": 52, "\u8d85\u3048\u308b": [1, 53], "\u8fd1\u4f3c": 1, "\u8fd4\u3055": [53, 57], "\u8fd4\u3057": [57, 62], "\u8fd4\u3059": [53, 57, 60], "\u8fd4\u3059\u5024": 53, "\u8ffd\u52a0": [1, 53], "\u9014\u4e2d": 58, "\u901a\u308a": [53, 54], "\u901a\u5e38": [57, 59], "\u9023\u7d61": 51, "\u9032\u3081\u308b": 61, "\u904e\u7a0b": [1, 52, 53, 54, 55, 57], "\u9055\u3044": 60, "\u9069\u3057": [53, 58], "\u9078\u3070": 1, "\u9078\u3073": [1, 53, 62], "\u9078\u3093": [56, 57, 62], "\u9078\u51fa": 1, "\u9078\u5b9a": [1, 54], "\u9078\u629e": [53, 57, 59], "\u90e8\u5206": 59, "\u958b\u3044": 61, "\u958b\u767a": [0, 52, 53], "\u95a2\u4fc2": [1, 59, 61], "\u95a2\u6570": [1, 53, 54, 55, 56, 58, 61, 62], "\u95a2\u9023": [1, 51, 53], "\u975e\u52a3": 59, "\u9805\u76ee": [53, 57], "\u9812\u5e03": 54, "\u985e\u4f3c": 1, "\u98db\u3070\u3059": 62, "\u99c6\u52d5": 54, "\u9ad8\u3044": 54, "\u9ad8\u304f": 54, "\u9ad8\u5ea6": [0, 54], "\u9ad8\u901f": [52, 54], "\uff09,": 56, "\uff09\u3001": [53, 57, 58], "\uff11\u3064": 53, "\uff12\u3064": 1, "\uff12\u56de": 58}, "titles": ["\u8b1d\u8f9e", "\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0", "physbo", "physbo package", "physbo.blm package", "physbo.blm.basis package", "physbo.blm.basis.fourier module", "physbo.blm.core package", "physbo.blm.core.model module", "physbo.blm.inf package", "physbo.blm.inf.exact module", "physbo.blm.lik package", "physbo.blm.lik.gauss module", "physbo.blm.lik.linear module", "physbo.blm.predictor module", "physbo.blm.prior package", "physbo.blm.prior.gauss module", "physbo.gp package", "physbo.gp.core package", "physbo.gp.core.learning module", "physbo.gp.core.model module", "physbo.gp.core.prior module", "physbo.gp.cov package", "physbo.gp.cov.gauss module", "physbo.gp.inf package", "physbo.gp.inf.exact module", "physbo.gp.lik package", "physbo.gp.lik.gauss module", "physbo.gp.mean package", "physbo.gp.mean.const module", "physbo.gp.mean.zero module", "physbo.gp.predictor module", "physbo.misc package", "physbo.misc.centering module", "physbo.misc.gauss_elim module", "physbo.misc.set_config module", "physbo.opt package", "physbo.opt.adam module", "physbo.predictor module", "physbo.search package", "physbo.search.discrete package", "physbo.search.discrete.policy module", "physbo.search.discrete.results module", "physbo.search.discrete_multi package", "physbo.search.discrete_multi.policy module", "physbo.search.discrete_multi.results module", "physbo.search.pareto module", "physbo.search.score module", "physbo.search.score_multi module", "physbo.search.utility module", "physbo.variable module", "\u304a\u554f\u3044\u5408\u308f\u305b", "Welcome to PHYSBO's documentation!", "\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5", "\u306f\u3058\u3081\u306b", "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb", "\u30ac\u30a6\u30b9\u904e\u7a0b", "PHYSBO \u306e\u57fa\u672c", "\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306b\u5b9f\u884c\u3059\u308b", "\u591a\u76ee\u7684\u6700\u9069\u5316", "\u8907\u6570\u5019\u88dc\u3092\u4e00\u5ea6\u306b\u63a2\u7d22\u3059\u308b", "\u65e2\u5b58\u306e\u8a08\u7b97\u7d50\u679c\u3092\u8aad\u307f\u8fbc\u3093\u3067\u5b9f\u884c\u3059\u308b", "simulator\u30af\u30e9\u30b9\u306e\u5b9a\u7fa9"], "titleterms": {"'s": 52, "-based": 59, "-volume": 59, ".adam": 37, ".basis": [5, 6], ".blm": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], ".centering": 33, ".const": 29, ".core": [7, 8, 18, 19, 20, 21], ".cov": [22, 23], ".discrete": [40, 41, 42, 43, 44, 45], ".exact": [10, 25], ".fourier": 6, ".gauss": [12, 16, 23, 27, 34], ".gp": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], ".inf": [9, 10, 24, 25], ".learning": 19, ".lik": [11, 12, 13, 26, 27], ".linear": 13, ".mean": [28, 29, 30], ".misc": [32, 33, 34, 35], ".model": [8, 20], ".opt": [36, 37], ".pareto": 46, ".policy": [41, 44], ".predictor": [14, 31, 38], ".prior": [15, 16, 21], ".results": [42, 45], ".score": [47, 48], ".search": [39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], ".set": 35, ".utility": 49, ".variable": 50, ".zero": 30, "1\u3064": 59, "2\u3064": 59, "_config": 35, "_elim": 34, "_multi": [43, 44, 45, 48], "action": 61, "contents": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43, 52, 55], "documentation": 52, "dominated": 59, "ehvi": 59, "expected": 59, "hvpi": 59, "hyper": 59, "hypervolume": 59, "id": 61, "improvement": 59, "module": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "of": 59, "package": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43], "physbo": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 57, 61], "policy": [57, 59], "probability": 59, "region": 59, "sampling": 59, "simulator": [57, 58, 59, 60, 62], "submodules": [3, 4, 5, 7, 9, 11, 15, 17, 18, 22, 24, 26, 28, 32, 36, 39, 40, 43], "subpackages": [3, 4, 17, 39], "thompson": 59, "to": 52, "ts": 59, "welcome": 52, "\u304a\u554f\u3044": 51, "\u304b\u3089": 61, "\u3059\u308b": [58, 60, 61], "\u306b\u3088\u308b": [1, 56], "\u306f\u3058\u3081": [54, 57], "\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0": 1, "\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": 53, "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb": 53, "\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6": 58, "\u30ac\u30a6\u30b9": 56, "\u30af\u30e9\u30b9": [57, 62], "\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba": 57, "\u30bb\u30c3\u30c8": [57, 59], "\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9": 53, "\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb": 55, "\u30c6\u30b9\u30c8": 59, "\u30c7\u30fc\u30bf": [56, 57, 58, 59, 60, 61], "\u30d1\u30c3\u30b1\u30fc\u30b8": 53, "\u30d1\u30e9\u30e1\u30fc\u30bf": 61, "\u30d1\u30ec\u30fc\u30c8": 59, "\u30d7\u30ed\u30c3\u30c8": 59, "\u30d9\u30a4\u30ba": [1, 57, 59, 62], "\u30e2\u30c7\u30eb": 56, "\u30e9\u30a4\u30bb\u30f3\u30b9": 54, "\u30e9\u30f3\u30c0\u30e0\u30b5\u30fc\u30c1": [57, 59, 62], "\u4e00\u5ea6": 60, "\u4e26\u5217\u5316": 57, "\u4e2d\u65ad": 58, "\u4e88\u6e2c": 56, "\u4e8b\u524d": 61, "\u4ed8\u9332": 59, "\u4f53\u7a4d": 59, "\u4f7f\u7528": 53, "\u5019\u88dc": [56, 57, 58, 59, 60, 61], "\u5168\u63a2": 59, "\u518d\u958b": 58, "\u52a3\u89e3": 59, "\u52a3\u89e3\u9818": 59, "\u53d6\u5f97": [59, 61], "\u5408\u308f": 51, "\u56de\u5e30": 57, "\u57df\u4f53": 59, "\u57fa\u672c": [53, 57], "\u591a\u76ee": 59, "\u5b66\u7fd2": 56, "\u5b9a\u7fa9": [56, 57, 58, 59, 60, 62], "\u5b9f\u884c": [53, 57, 58, 59, 60, 61], "\u5f15\u7528": 54, "\u5fc5\u8981": 53, "\u63a2\u7d22": [56, 57, 58, 59, 60, 61, 62], "\u65b9\u6cd5": 53, "\u65e2\u5b58": 61, "\u6700\u9069": [1, 57, 59, 62], "\u6700\u9069\u5316": [57, 58, 59, 60], "\u69cb\u9020": 53, "\u6d41\u308c": 53, "\u6e96\u5099": [56, 57, 58, 59, 60, 61], "\u7372\u5f97": 57, "\u74b0\u5883": 53, "\u7528\u610f": 61, "\u767b\u9332": 61, "\u76ee\u7684": 59, "\u78ba\u8a8d": [57, 59, 60], "\u7a7a\u9593": 62, "\u7d50\u679c": [57, 59, 60, 61, 62], "\u8868\u793a": 62, "\u8907\u6570": 60, "\u8a08\u7b97": [53, 59, 61], "\u8a13\u7df4\u6e08": 56, "\u8a55\u4fa1": 61, "\u8a55\u4fa1\u5024": 59, "\u8aad\u307f\u8fbc\u3093": 61, "\u8b1d\u8f9e": 0, "\u904e\u7a0b": 56, "\u958b\u767a": 54, "\u95a2\u6570": [57, 59], "\u9818\u57df": 59, "\u9ad8\u901f": 1}}) \ No newline at end of file