sampling

This module contains multiple generator functions for sampling a domain.

sampling.uniform_random_sample(_, persis_info, gen_specs, libE_info)

Generates gen_specs["batch_size"] points uniformly over the domain defined by gen_specs["user"]["ub"] and gen_specs["user"]["lb"].

sampling.uniform_random_sample_with_variable_resources(_, persis_info, gen_specs, libE_info)

Generates gen_specs["batch_size"] points uniformly over the domain defined by gen_specs["user"]["ub"] and gen_specs["user"]["lb"].

Also randomly requests a different number of resource sets to be used in each evaluation.

This generator is used to test/demonstrate setting of resource sets.

sampling.uniform_random_sample_with_var_priorities_and_resources(H, persis_info, gen_specs, libE_info)

Generates points uniformly over the domain defined by gen_specs["user"]["ub"] and gen_specs["user"]["lb"]. Also, randomly requests a different priority and number of resource sets to be used in the evaluation of the generated points, after the initial batch.

This generator is used to test/demonstrate setting of priorities and resource sets.

sampling.uniform_random_sample_obj_components(H, persis_info, gen_specs, libE_info)

Generates points uniformly over the domain defined by gen_specs["user"]["ub"] and gen_specs["user"]["lb"] but requests each obj_component be evaluated separately.

sampling.latin_hypercube_sample(_, persis_info, gen_specs, libE_info)

Generates gen_specs["batch_size"] points in a Latin hypercube sample over the domain defined by gen_specs["user"]["ub"] and gen_specs["user"]["lb"].

sampling.uniform_random_sample_cancel(_, persis_info, gen_specs, libE_info)

Similar to uniform_random_sample but with immediate cancellation of selected points for testing.

sampling.py
  1"""
  2This module contains multiple generator functions for sampling a domain.
  3"""
  4
  5import numpy as np
  6
  7from libensemble.tools import get_rng
  8
  9__all__ = [
 10    "uniform_random_sample",
 11    "uniform_random_sample_with_variable_resources",
 12    "uniform_random_sample_with_var_priorities_and_resources",
 13    "uniform_random_sample_obj_components",
 14    "latin_hypercube_sample",
 15    "uniform_random_sample_cancel",
 16]
 17
 18
 19def uniform_random_sample(_, persis_info, gen_specs, libE_info):
 20    """
 21    Generates ``gen_specs["batch_size"]`` points uniformly over the domain
 22    defined by ``gen_specs["user"]["ub"]`` and ``gen_specs["user"]["lb"]``.
 23
 24    .. seealso::
 25        `test_uniform_sampling.py <https://github.com/Libensemble/libensemble/blob/develop/libensemble/tests/functionality_tests/test_uniform_sampling.py>`_ # noqa
 26    """
 27    if "rand_stream" not in persis_info:
 28        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
 29    rng = persis_info["rand_stream"]
 30
 31    ub = gen_specs["user"]["ub"]
 32    lb = gen_specs["user"]["lb"]
 33
 34    n = len(lb)
 35    b = gen_specs["batch_size"]
 36
 37    H_o = np.zeros(b, dtype=gen_specs["out"])
 38
 39    H_o["x"] = rng.uniform(lb, ub, (b, n))
 40
 41    return H_o, persis_info
 42
 43
 44def uniform_random_sample_with_variable_resources(_, persis_info, gen_specs, libE_info):
 45    """
 46    Generates ``gen_specs["batch_size"]`` points uniformly over the domain
 47    defined by ``gen_specs["user"]["ub"]`` and ``gen_specs["user"]["lb"]``.
 48
 49    Also randomly requests a different number of resource sets to be used in each evaluation.
 50
 51    This generator is used to test/demonstrate setting of resource sets.
 52
 53    .. seealso::
 54        `test_uniform_sampling_with_variable_resources.py <https://github.com/Libensemble/libensemble/blob/develop/libensemble/tests/functionality_tests/test_uniform_sampling_with_variable_resources.py>`_ # noqa
 55    """
 56    if "rand_stream" not in persis_info:
 57        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
 58    rng = persis_info["rand_stream"]
 59
 60    ub = gen_specs["user"]["ub"]
 61    lb = gen_specs["user"]["lb"]
 62    max_rsets = gen_specs["user"]["max_resource_sets"]
 63
 64    n = len(lb)
 65    b = gen_specs["batch_size"]
 66
 67    H_o = np.zeros(b, dtype=gen_specs["out"])
 68
 69    H_o["x"] = rng.uniform(lb, ub, (b, n))
 70    H_o["resource_sets"] = rng.integers(1, max_rsets + 1, b)
 71
 72    print(f'GEN: H rsets requested: {H_o["resource_sets"]}')
 73
 74    return H_o, persis_info
 75
 76
 77def uniform_random_sample_with_var_priorities_and_resources(H, persis_info, gen_specs, libE_info):
 78    """
 79    Generates points uniformly over the domain defined by ``gen_specs["user"]["ub"]`` and
 80    ``gen_specs["user"]["lb"]``. Also, randomly requests a different priority and number of
 81    resource sets to be used in the evaluation of the generated points, after the initial batch.
 82
 83    This generator is used to test/demonstrate setting of priorities and resource sets.
 84
 85    """
 86    if "rand_stream" not in persis_info:
 87        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
 88    rng = persis_info["rand_stream"]
 89
 90    ub = gen_specs["user"]["ub"]
 91    lb = gen_specs["user"]["lb"]
 92    max_rsets = gen_specs["user"]["max_resource_sets"]
 93
 94    n = len(lb)
 95
 96    if len(H) == 0:
 97        b = gen_specs["initial_batch_size"]
 98
 99        H_o = np.zeros(b, dtype=gen_specs["out"])
100        for i in range(0, b):
101            # x= i*np.ones(n)
102            x = rng.uniform(lb, ub, (1, n))
103            H_o["x"][i] = x
104            H_o["resource_sets"][i] = 1
105            H_o["priority"] = 1
106
107    else:
108        H_o = np.zeros(1, dtype=gen_specs["out"])
109        # H_o["x"] = len(H)*np.ones(n)  # Can use a simple count for testing.
110        H_o["x"] = rng.uniform(lb, ub)
111        H_o["resource_sets"] = rng.integers(1, max_rsets + 1)
112        H_o["priority"] = 10 * H_o["resource_sets"]
113        # print("Created sim for {} resource sets".format(H_o["resource_sets"]), flush=True)
114
115    return H_o, persis_info
116
117
118def uniform_random_sample_obj_components(H, persis_info, gen_specs, libE_info):
119    """
120    Generates points uniformly over the domain defined by ``gen_specs["user"]["ub"]``
121    and ``gen_specs["user"]["lb"]`` but requests each ``obj_component`` be evaluated
122    separately.
123
124    .. seealso::
125        `test_uniform_sampling_one_residual_at_a_time.py <https://github.com/Libensemble/libensemble/blob/develop/libensemble/tests/functionality_tests/test_uniform_sampling_one_residual_at_a_time.py>`_ # noqa
126    """
127    if "rand_stream" not in persis_info:
128        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
129    rng = persis_info["rand_stream"]
130
131    ub = gen_specs["user"]["ub"]
132    lb = gen_specs["user"]["lb"]
133
134    n = len(lb)
135    m = gen_specs["user"]["components"]
136    b = gen_specs["batch_size"]
137
138    H_o = np.zeros(b * m, dtype=gen_specs["out"])
139    for i in range(0, b):
140        x = rng.uniform(lb, ub, (1, n))
141        H_o["x"][i * m : (i + 1) * m, :] = np.tile(x, (m, 1))
142        H_o["priority"][i * m : (i + 1) * m] = rng.uniform(0, 1, m)
143        H_o["obj_component"][i * m : (i + 1) * m] = np.arange(0, m)
144
145        H_o["pt_id"][i * m : (i + 1) * m] = len(H) // m + i
146
147    return H_o, persis_info
148
149
150def uniform_random_sample_cancel(_, persis_info, gen_specs, libE_info):
151    """
152    Similar to uniform_random_sample but with immediate cancellation of
153    selected points for testing.
154
155    """
156    if "rand_stream" not in persis_info:
157        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
158    rng = persis_info["rand_stream"]
159
160    ub = gen_specs["user"]["ub"]
161    lb = gen_specs["user"]["lb"]
162
163    n = len(lb)
164    b = gen_specs["batch_size"]
165
166    H_o = np.zeros(b, dtype=gen_specs["out"])
167    for i in range(b):
168        if i % 10 == 0:
169            H_o[i]["cancel_requested"] = True
170
171    H_o["x"] = rng.uniform(lb, ub, (b, n))
172
173    return H_o, persis_info
174
175
176def latin_hypercube_sample(_, persis_info, gen_specs, libE_info):
177    """
178    Generates ``gen_specs["batch_size"]`` points in a Latin
179    hypercube sample over the domain defined by ``gen_specs["user"]["ub"]`` and
180    ``gen_specs["user"]["lb"]``.
181
182    .. seealso::
183        `test_1d_sampling.py <https://github.com/Libensemble/libensemble/blob/develop/libensemble/tests/regression_tests/test_1d_sampling.py>`_ # noqa
184    """
185    if "rand_stream" not in persis_info:
186        persis_info["rand_stream"] = get_rng(gen_specs, libE_info)
187    rng = persis_info["rand_stream"]
188
189    ub = gen_specs["user"]["ub"]
190    lb = gen_specs["user"]["lb"]
191
192    n = len(lb)
193    b = gen_specs["batch_size"]
194
195    H_o = np.zeros(b, dtype=gen_specs["out"])
196
197    A = lhs_sample(n, b, rng)
198
199    H_o["x"] = A * (ub - lb) + lb
200
201    return H_o, persis_info
202
203
204def lhs_sample(n, k, stream):
205    # Generate the intervals and random values
206    intervals = np.linspace(0, 1, k + 1)
207    rand_source = stream.uniform(0, 1, (k, n))
208    rand_pts = np.zeros((k, n))
209    sample = np.zeros((k, n))
210
211    # Add a point uniformly in each interval
212    a = intervals[:k]
213    b = intervals[1:]
214    for j in range(n):
215        rand_pts[:, j] = rand_source[:, j] * (b - a) + a
216
217    # Randomly perturb
218    for j in range(n):
219        sample[:, j] = rand_pts[stream.permutation(k), j]
220
221    return sample