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 bygen_specs["user"]["ub"]andgen_specs["user"]["lb"].See also
- sampling.uniform_random_sample_with_variable_resources(_, persis_info, gen_specs, libE_info)¶
Generates
gen_specs["batch_size"]points uniformly over the domain defined bygen_specs["user"]["ub"]andgen_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"]andgen_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"]andgen_specs["user"]["lb"]but requests eachobj_componentbe 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 bygen_specs["user"]["ub"]andgen_specs["user"]["lb"].See also
- 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