Skip to content

Commit 8770fa4

Browse files
swierhfacebook-github-bot
authored andcommitted
Allow for observation noise without mask in ModelListGP (#2735)
Summary: <!-- Thank you for sending the PR! We appreciate you spending the time to make BoTorch better. Help us understand your motivation by explaining why you decided to make this change. You can learn more about contributing to BoTorch here: https://github.com/pytorch/botorch/blob/main/CONTRIBUTING.md --> ## Motivation Fixes #2734 ### Have you read the [Contributing Guidelines on pull requests](https://github.com/pytorch/botorch/blob/main/CONTRIBUTING.md#pull-requests)? Yes Pull Request resolved: #2735 Test Plan: I've added a test to the unit test, in addition, a separate example: ```python import torch from botorch.fit import fit_gpytorch_mll from botorch.models.gp_regression import SingleTaskGP from botorch.models.model_list_gp_regression import ModelListGP from botorch.sampling.list_sampler import ListSampler from botorch.sampling.normal import SobolQMCNormalSampler from gpytorch.mlls.sum_marginal_log_likelihood import SumMarginalLogLikelihood model = ModelListGP( *[SingleTaskGP(train_X=torch.tensor([[0.0], [1.0]]), train_Y=torch.tensor([[0.0], [1.0]])) for _ in range(2)] ) mll = SumMarginalLogLikelihood(model.likelihood, model) mll = fit_gpytorch_mll(mll) sampler = ListSampler(*[SobolQMCNormalSampler(sample_shape=torch.Size([1])) for _ in range(2)]) # Works: model.fantasize( torch.tensor([[0.5]]), sampler=sampler, observation_noise=torch.tensor([[0.2, 0.2]]), evaluation_mask=torch.tensor([[1.0, 1.0]], dtype=torch.bool), ) # Now also works: model.fantasize( torch.tensor([[0.5]]), sampler=sampler, observation_noise=torch.tensor([[0.2, 0.2]]), ) ``` Reviewed By: esantorella Differential Revision: D69261331 Pulled By: saitcakmak fbshipit-source-id: f51ab84144ecfcf1b142ad7b447fc6c56d518202
1 parent f413275 commit 8770fa4

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

botorch/models/model.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ def fantasize(
661661
sampler_i = (
662662
sampler.samplers[i] if isinstance(sampler, ListSampler) else sampler
663663
)
664+
if observation_noise is not None:
665+
observation_noise_i = observation_noise[..., i : i + 1]
664666

665667
fant_model = self.models[i].fantasize(
666668
X=X_i,

test/models/test_model_list_gp_regression.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,27 @@ def test_fantasize(self):
479479
(3, 2), 0.3, dtype=x1.dtype, device=x1.device
480480
)
481481
observation_noise[:, 1] = 0.4
482+
483+
# check observation noise without mask
484+
fm = modellist.fantasize(
485+
torch.rand(3, 2),
486+
sampler=ListSampler(sampler1, sampler2),
487+
observation_noise=observation_noise,
488+
)
489+
for i in range(2):
490+
fm_i = fm.models[i]
491+
self.assertIsInstance(fm_i, SingleTaskGP)
492+
self.assertIsInstance(fm_i.likelihood, FixedNoiseGaussianLikelihood)
493+
self.assertEqual(fm_i.train_inputs[0].shape, torch.Size([2, 8, 2]))
494+
self.assertEqual(fm_i.train_targets.shape, torch.Size([2, 8]))
495+
# check observation_noise
496+
self.assertTrue(
497+
torch.equal(
498+
fm_i.likelihood.noise[..., -3:], observation_noise[:, i]
499+
)
500+
)
501+
502+
# check masked noise
482503
for obs_noise in (None, observation_noise):
483504
fm = modellist.fantasize(
484505
torch.rand(3, 2),

0 commit comments

Comments
 (0)