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 bygen_specs["user"]["ub"]andgen_specs["user"]["lb"].See also
- sampling.uniform_random_sample_with_variable_resources(_, persis_info, gen_specs)
Generates
gen_specs["user"]["gen_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)
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)
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)
Output Datatypes:
[('x', <class 'float'>, (1,))]Generates
gen_specs["user"]["gen_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)
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