@@ -38,15 +38,19 @@ def __init__(
3838 model : Model ,
3939 sampler : Optional [MCSampler ] = None ,
4040 objective : Optional [MCAcquisitionObjective ] = None ,
41+ X_pending : Optional [Tensor ] = None ,
4142 ) -> None :
4243 r"""Constructor for the MCAcquisitionFunction base class.
4344
4445 Args:
4546 model: A fitted model.
4647 sampler: The sampler used to draw base samples. Defaults to
4748 `SobolQMCNormalSampler(num_samples=512, collapse_batch_dims=True)`.
48- objective: THe MCAcquisitionObjective under which the samples are
49+ objective: The MCAcquisitionObjective under which the samples are
4950 evaluated. Defaults to `IdentityMCObjective()`.
51+ X_pending: A `m x d`-dim Tensor of `m` design points that have
52+ points that have been submitted for function evaluation
53+ but have not yet been evaluated.
5054 """
5155 super ().__init__ (model = model )
5256 if sampler is None :
@@ -55,12 +59,15 @@ def __init__(
5559 if objective is None :
5660 objective = IdentityMCObjective ()
5761 self .add_module ("objective" , objective )
62+ self .set_X_pending (X_pending )
5863
5964 @abstractmethod
6065 def forward (self , X : Tensor ) -> Tensor :
61- r"""Takes in a `(b) x q x d` X Tensor of `b` t-batches with `q` `d`-dim
62- design points each, expands and concatenates `self.X_pending` and
63- returns a one-dimensional Tensor with `b` elements."""
66+ r"""Takes in a `(b) x q x d` X Tensor of `(b)` t-batches with `q` `d`-dim
67+ design points each, and returns a one-dimensional Tensor with
68+ `(b)` elements. Should utilize the result of set_X_pending as needed
69+ to account for pending function evaluations.
70+ """
6471 pass # pragma: no cover
6572
6673
@@ -89,6 +96,7 @@ def __init__(
8996 best_f : Union [float , Tensor ],
9097 sampler : Optional [MCSampler ] = None ,
9198 objective : Optional [MCAcquisitionObjective ] = None ,
99+ X_pending : Optional [Tensor ] = None ,
92100 ) -> None :
93101 r"""q-Expected Improvement.
94102
@@ -100,8 +108,14 @@ def __init__(
100108 `SobolQMCNormalSampler(num_samples=500, collapse_batch_dims=True)`
101109 objective: The MCAcquisitionObjective under which the samples are
102110 evaluated. Defaults to `IdentityMCObjective()`.
111+ X_pending: A `m x d`-dim Tensor of `m` design points that have
112+ points that have been submitted for function evaluation
113+ but have not yet been evaluated. Concatenated into X upon
114+ forward call. Copied and set to have no gradient.
103115 """
104- super ().__init__ (model = model , sampler = sampler , objective = objective )
116+ super ().__init__ (
117+ model = model , sampler = sampler , objective = objective , X_pending = X_pending
118+ )
105119 if not torch .is_tensor (best_f ):
106120 best_f = torch .tensor (float (best_f ))
107121 self .register_buffer ("best_f" , best_f )
@@ -118,6 +132,8 @@ def forward(self, X: Tensor) -> Tensor:
118132 A `(b)`-dim Tensor of Expected Improvement values at the given
119133 design points `X`.
120134 """
135+ if self .X_pending is not None :
136+ X = torch .cat ([X , match_batch_shape (self .X_pending , X )], dim = - 2 )
121137 posterior = self .model .posterior (X )
122138 samples = self .sampler (posterior )
123139 obj = self .objective (samples )
@@ -150,20 +166,28 @@ def __init__(
150166 X_baseline : Tensor ,
151167 sampler : Optional [MCSampler ] = None ,
152168 objective : Optional [MCAcquisitionObjective ] = None ,
169+ X_pending : Optional [Tensor ] = None ,
153170 ) -> None :
154171 r"""q-Noisy Expected Improvement.
155172
156173 Args:
157174 model: A fitted model.
158- X_baseline: A `m x d`-dim Tensor of `m ` design points that have
159- either already been observed or whose evaluation is pending.
160- These points are considered as the potential best design point.
175+ X_baseline: A `r x d`-dim Tensor of `r ` design points that have
176+ already been observed. These points are considered as the
177+ potential best design point.
161178 sampler: The sampler used to draw base samples. Defaults to
162179 `SobolQMCNormalSampler(num_samples=500, collapse_batch_dims=True)`.
163180 objective: The MCAcquisitionObjective under which the samples are
164181 evaluated. Defaults to `IdentityMCObjective()`.
182+ X_pending: A `m x d`-dim Tensor of `m` design points that have
183+ points that have been submitted for function evaluation
184+ but have not yet been evaluated. Concatenated into X upon
185+ forward call. Copied and set to have no gradient.
186+
165187 """
166- super ().__init__ (model = model , sampler = sampler , objective = objective )
188+ super ().__init__ (
189+ model = model , sampler = sampler , objective = objective , X_pending = X_pending
190+ )
167191 self .register_buffer ("X_baseline" , X_baseline )
168192
169193 @t_batch_mode_transform ()
@@ -178,6 +202,8 @@ def forward(self, X: Tensor) -> Tensor:
178202 A `(b)`-dim Tensor of Noisy Expected Improvement values at the given
179203 design points `X`.
180204 """
205+ if self .X_pending is not None :
206+ X = torch .cat ([X , match_batch_shape (self .X_pending , X )], dim = - 2 )
181207 q = X .shape [- 2 ]
182208 X_full = torch .cat ([X , match_batch_shape (self .X_baseline , X )], dim = - 2 )
183209 # TODO (T41248036): Implement more efficient way to compute posterior
@@ -214,6 +240,7 @@ def __init__(
214240 best_f : Union [float , Tensor ],
215241 sampler : Optional [MCSampler ] = None ,
216242 objective : Optional [MCAcquisitionObjective ] = None ,
243+ X_pending : Optional [Tensor ] = None ,
217244 tau : float = 1e-3 ,
218245 ) -> None :
219246 r"""q-Probability of Improvement.
@@ -226,12 +253,18 @@ def __init__(
226253 `SobolQMCNormalSampler(num_samples=500, collapse_batch_dims=True)`
227254 objective: The MCAcquisitionObjective under which the samples are
228255 evaluated. Defaults to `IdentityMCObjective()`.
256+ X_pending: A `m x d`-dim Tensor of `m` design points that have
257+ points that have been submitted for function evaluation
258+ but have not yet been evaluated. Concatenated into X upon
259+ forward call. Copied and set to have no gradient.
229260 tau: The temperature parameter used in the sigmoid approximation
230261 of the step function. Smaller values yield more accurate
231262 approximations of the function, but result in gradients
232263 estimates with higher variance.
233264 """
234- super ().__init__ (model = model , sampler = sampler , objective = objective )
265+ super ().__init__ (
266+ model = model , sampler = sampler , objective = objective , X_pending = X_pending
267+ )
235268 if not torch .is_tensor (best_f ):
236269 best_f = torch .tensor (float (best_f ))
237270 self .register_buffer ("best_f" , best_f )
@@ -251,6 +284,8 @@ def forward(self, X: Tensor) -> Tensor:
251284 A `(b)`-dim Tensor of Probability of Improvement values at the given
252285 design points `X`.
253286 """
287+ if self .X_pending is not None :
288+ X = torch .cat ([X , match_batch_shape (self .X_pending , X )], dim = - 2 )
254289 posterior = self .model .posterior (X )
255290 samples = self .sampler (posterior )
256291 obj = self .objective (samples )
@@ -286,6 +321,8 @@ def forward(self, X: Tensor) -> Tensor:
286321 A `(b)`-dim Tensor of Simple Regret values at the given design
287322 points `X`.
288323 """
324+ if self .X_pending is not None :
325+ X = torch .cat ([X , match_batch_shape (self .X_pending , X )], dim = - 2 )
289326 posterior = self .model .posterior (X )
290327 samples = self .sampler (posterior )
291328 obj = self .objective (samples )
@@ -315,6 +352,7 @@ def __init__(
315352 beta : float ,
316353 sampler : Optional [MCSampler ] = None ,
317354 objective : Optional [MCAcquisitionObjective ] = None ,
355+ X_pending : Optional [Tensor ] = None ,
318356 ) -> None :
319357 r"""q-Upper Confidence Bound.
320358
@@ -325,8 +363,14 @@ def __init__(
325363 `SobolQMCNormalSampler(num_samples=500, collapse_batch_dims=True)`
326364 objective: The MCAcquisitionObjective under which the samples are
327365 evaluated. Defaults to `IdentityMCObjective()`.
366+ X_pending: A `m x d`-dim Tensor of `m` design points that have
367+ points that have been submitted for function evaluation
368+ but have not yet been evaluated. Concatenated into X upon
369+ forward call. Copied and set to have no gradient.
328370 """
329- super ().__init__ (model = model , sampler = sampler , objective = objective )
371+ super ().__init__ (
372+ model = model , sampler = sampler , objective = objective , X_pending = X_pending
373+ )
330374 self .register_buffer ("beta" , torch .tensor (float (beta )))
331375
332376 @t_batch_mode_transform ()
@@ -341,6 +385,8 @@ def forward(self, X: Tensor) -> Tensor:
341385 A `(b)`-dim Tensor of Upper Confidence Bound values at the given
342386 design points `X`.
343387 """
388+ if self .X_pending is not None :
389+ X = torch .cat ([X , match_batch_shape (self .X_pending , X )], dim = - 2 )
344390 posterior = self .model .posterior (X )
345391 samples = self .sampler (posterior )
346392 obj = self .objective (samples )
0 commit comments