botorch icon indicating copy to clipboard operation
botorch copied to clipboard

[Bug] `qMultiFidelityLowerBoundMaxValueEntropy` not working with fantasization

Open fjzzq2002 opened this issue 2 years ago • 1 comments

🐛 Bug

qMultiFidelityLowerBoundMaxValueEntropy seems to break with fantasization. The error seems specific to GIBBON as using qMultiFidelityMaxValueEntropy instead is fine.

To reproduce

I defined a SingleTaskMultiFidelityGP model for a toy multi-fidelity task:

import torch
from botorch.acquisition.max_value_entropy_search import (
    qMultiFidelityLowerBoundMaxValueEntropy,
    qMultiFidelityMaxValueEntropy,
)
from botorch.fit import fit_gpytorch_mll
from botorch.models import SingleTaskMultiFidelityGP
from botorch.optim import optimize_acqf_mixed
from gpytorch.mlls import ExactMarginalLogLikelihood
from botorch.acquisition.utils import project_to_target_fidelity
train_X = torch.rand((10, 3), dtype=torch.double)
train_Y = torch.rand((10, 1), dtype=torch.double)
model = SingleTaskMultiFidelityGP(train_X, train_Y, data_fidelity=-1)
bounds = torch.tensor([[0.0] * 3, [1.0] * 3], dtype=torch.double)

When we evaluate its multi-fidelity GIBBON without fantasization, everything is working fine:

candidate_set = torch.rand(100, bounds.size(1))
candidate_set = bounds[0] + (bounds[1] - bounds[0]) * candidate_set
MF_qGIBBON = qMultiFidelityLowerBoundMaxValueEntropy(model, candidate_set)
mf_gibbon = MF_qGIBBON(train_X[:1])

But when we fantasize it by setting X_pending, evaluation throws an error:

pending_X = torch.rand((5, 3), dtype=torch.double)
MF_qGIBBON.set_X_pending(pending_X)
mf_gibbon = MF_qGIBBON(train_X[:1]) # ERROR!

Stack trace/error message

Traceback (most recent call last):
  File "test.py", line 21, in <module>
    mf_gibbon = MF_qGIBBON(train_X[:1])
  File "lib/python3.10/site-packages/torch/nn/modules/module.py", line 1194, in _call_impl
    return forward_call(*input, **kwargs)
  File "lib/python3.10/site-packages/botorch/utils/transforms.py", line 277, in decorated
    output = method(acqf, X, *args, **kwargs)
  File "lib/python3.10/site-packages/botorch/acquisition/max_value_entropy_search.py", line 809, in forward
    ig = self._compute_information_gain(
  File "lib/python3.10/site-packages/botorch/acquisition/max_value_entropy_search.py", line 861, in _compute_information_gain
    return qLowerBoundMaxValueEntropy._compute_information_gain(
  File "lib/python3.10/site-packages/botorch/acquisition/max_value_entropy_search.py", line 586, in _compute_information_gain
    normalized_mvs = (mvs - mean_m) / stdv
RuntimeError: The size of tensor a (10) must match the size of tensor b (16) at non-singleton dimension 1

Expected Behavior

Evaluation runs through correctly.

System information

  • BoTorch Version 0.9.1
  • GPyTorch Version 1.11
  • PyTorch Version 1.13.1+cpu

fjzzq2002 avatar Aug 10 '23 14:08 fjzzq2002

Confirming that the code above still produces the same error as of today.

esantorella avatar Mar 08 '24 21:03 esantorella