sampling

This module contains multiple generator functions for sampling a domain.

sampling.uniform_random_sample(_, persis_info, gen_specs)

Output Datatypes: [('x', <class 'float'>, 2)]

Generates gen_specs["user"]["gen_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)

Generates gen_specs["user"]["gen_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)

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)

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)

Output Datatypes: [('x', <class 'float'>, (1,))]

Generates gen_specs["user"]["gen_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)

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