Skip to content

Commit 5cd114f

Browse files
saitcakmakfacebook-github-bot
authored andcommitted
Ax side fixes for adding feature & outcome names to datasets (facebook#1853)
Summary: Pull Request resolved: facebook#1853 Follows up pytorch/botorch#2015 to propagate the changes in Ax and fixes the tests. Reviewed By: Balandat Differential Revision: D49340640 fbshipit-source-id: 81a51ce81d4d1977e88365f73065f9214ca3d48b
1 parent 47ac71c commit 5cd114f

30 files changed

+932
-251
lines changed

ax/benchmark/tests/test_benchmark.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import tempfile
77

88
import numpy as np
9-
import torch
109
from ax.benchmark.benchmark import (
1110
benchmark_multiple_problems_methods,
1211
benchmark_one_method_problem,
@@ -40,11 +39,10 @@
4039
get_sobol_benchmark_method,
4140
get_soo_surrogate,
4241
)
43-
from ax.utils.testing.core_stubs import get_experiment
42+
from ax.utils.testing.core_stubs import get_dataset, get_experiment
4443
from ax.utils.testing.mock import fast_botorch_optimize
4544
from botorch.acquisition.max_value_entropy_search import qMaxValueEntropy
4645
from botorch.test_functions.synthetic import Branin
47-
from botorch.utils.datasets import SupervisedDataset
4846

4947

5048
class TestBenchmark(TestCase):
@@ -122,9 +120,7 @@ def test_replication_sobol_surrogate(self) -> None:
122120

123121
with self.subTest(name, problem=problem):
124122
surrogate, datasets = not_none(problem.get_surrogate_and_datasets)()
125-
datasets = [
126-
SupervisedDataset(X=torch.zeros((2, 2)), Y=torch.zeros((2, 2)))
127-
]
123+
datasets = [get_dataset()]
128124
surrogate.fit(
129125
datasets,
130126
metric_names=[],

ax/modelbridge/pairwise.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ def _convert_observations(
6363
# pyre-fixme[6]: For 2nd param expected `LongTensor` but got `Tensor`.
6464
dataset_X = SliceContainer(datapoints, comparisons, event_shape=event_shape)
6565
dataset_Y = torch.tensor([[0, 1]]).expand(comparisons.shape)
66-
dataset = RankingDataset(X=dataset_X, Y=dataset_Y)
66+
dataset = RankingDataset(
67+
X=dataset_X,
68+
Y=dataset_Y,
69+
feature_names=parameters,
70+
outcome_names=[outcome],
71+
)
6772

6873
datasets.append(dataset)
6974
candidate_metadata.append(candidate_metadata_dict[outcome])

ax/modelbridge/tests/test_torch_modelbridge.py

+4
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,15 @@ def test_TorchModelBridge(self, mock_init, dtype=None, device=None) -> None:
8282
X=X,
8383
Y=torch.tensor([[3.0], [1.0]], **tkwargs),
8484
Yvar=torch.tensor([[4.0], [2.0]], **tkwargs),
85+
feature_names=feature_names,
86+
outcome_names=["y1"],
8587
),
8688
"y2": SupervisedDataset(
8789
X=X,
8890
Y=torch.tensor([[2.0], [0.0]], **tkwargs),
8991
Yvar=torch.tensor([[2.0], [1.0]], **tkwargs),
92+
feature_names=feature_names,
93+
outcome_names=["y2"],
9094
),
9195
}
9296
observation_features = [

ax/modelbridge/torch.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,16 @@ def _convert_observations(
329329
Yvars[outcome], dtype=self.dtype, device=self.device
330330
).unsqueeze(-1)
331331
if Yvar.isnan().all():
332-
dataset = SupervisedDataset(X=X, Y=Y)
332+
Yvar = None
333333
else:
334-
dataset = SupervisedDataset(X=X, Y=Y, Yvar=Yvar.clamp_min(1e-6))
334+
Yvar = Yvar.clamp_min(1e-6)
335+
dataset = SupervisedDataset(
336+
X=X,
337+
Y=Y,
338+
Yvar=Yvar,
339+
feature_names=parameters,
340+
outcome_names=[outcome],
341+
)
335342
datasets.append(dataset)
336343
candidate_metadata.append(candidate_metadata_dict[outcome])
337344

ax/models/tests/test_alebo.py

+15-3
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def testAcq(self) -> None:
266266
self.assertTrue(torch.allclose(Z, X[:, 0, :]))
267267

268268
@fast_botorch_optimize
269-
def testALEBO(self) -> None:
269+
def test_ALEBO(self) -> None:
270270
B = torch.tensor(
271271
[[1.0, 2.0, 3.0, 4.0, 5.0], [2.0, 3.0, 4.0, 5.0, 6.0]], dtype=torch.double
272272
)
@@ -288,7 +288,13 @@ def testALEBO(self) -> None:
288288
)
289289
train_Y = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.double)
290290
train_Yvar = 0.1 * torch.ones(3, 1, dtype=torch.double)
291-
dataset = SupervisedDataset(X=train_X, Y=train_Y, Yvar=train_Yvar)
291+
dataset = SupervisedDataset(
292+
X=train_X,
293+
Y=train_Y,
294+
Yvar=train_Yvar,
295+
feature_names=[f"x{i}" for i in range(5)],
296+
outcome_names=["y"],
297+
)
292298

293299
# Test fit
294300
m.fit(
@@ -368,7 +374,13 @@ def testALEBO(self) -> None:
368374
],
369375
dtype=torch.double,
370376
)
371-
dataset2 = SupervisedDataset(X=train_X2, Y=train_Y, Yvar=train_Yvar)
377+
dataset2 = SupervisedDataset(
378+
X=train_X2,
379+
Y=train_Y,
380+
Yvar=train_Yvar,
381+
feature_names=[f"x{i}" for i in range(5)],
382+
outcome_names=["y2"],
383+
)
372384
m.update(datasets=[dataset, dataset2])
373385
self.assertTrue(torch.allclose(m.Xs[0], (B @ train_X.t()).t()))
374386
self.assertTrue(torch.allclose(m.Xs[1], (B @ train_X2.t()).t()))

ax/models/tests/test_botorch_kg.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@ def setUp(self) -> None:
3838
"device": torch.device("cpu"),
3939
"dtype": torch.double,
4040
}
41+
self.feature_names = ["x1", "x2", "x3"]
42+
self.metric_names = ["y"]
4143
self.dataset = SupervisedDataset(
4244
X=torch.tensor([[1.0, 2.0, 3.0], [2.0, 3.0, 4.0]], **self.tkwargs),
4345
Y=torch.tensor([[3.0], [4.0]], **self.tkwargs),
4446
Yvar=torch.tensor([[0.0], [2.0]], **self.tkwargs),
47+
feature_names=self.feature_names,
48+
outcome_names=self.metric_names,
4549
)
4650
self.bounds = [(0.0, 1.0), (1.0, 4.0), (2.0, 5.0)]
47-
self.feature_names = ["x1", "x2", "x3"]
48-
self.metric_names = ["y"]
4951
self.acq_options = {"num_fantasies": 30, "mc_samples": 30}
5052
self.objective_weights = torch.tensor([1.0], **self.tkwargs)
5153
self.optimizer_options = {

ax/models/tests/test_botorch_mes.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,18 @@ def setUp(self) -> None:
3030
"device": torch.device("cpu"),
3131
"dtype": torch.double,
3232
}
33+
self.feature_names = ["x1", "x2", "x3"]
34+
self.metric_names = ["y"]
3335
self.training_data = [
3436
SupervisedDataset(
3537
X=torch.tensor([[1.0, 2.0, 3.0], [2.0, 3.0, 4.0]], **self.tkwargs),
3638
Y=torch.tensor([[3.0], [4.0]], **self.tkwargs),
3739
Yvar=torch.tensor([[0.0], [2.0]], **self.tkwargs),
40+
feature_names=self.feature_names,
41+
outcome_names=self.metric_names,
3842
)
3943
]
4044
self.bounds = [(0.0, 1.0), (1.0, 4.0), (2.0, 5.0)]
41-
self.feature_names = ["x1", "x2", "x3"]
42-
self.metric_names = ["y"]
4345
self.acq_options = {"num_fantasies": 30, "candidate_size": 100}
4446
self.objective_weights = torch.tensor([1.0], **self.tkwargs)
4547
self.optimize_acqf = "ax.models.torch.botorch_mes.optimize_acqf"

0 commit comments

Comments
 (0)