in botorch/models/multitask.py [0:0]
def construct_inputs(cls, training_data: TrainingData, **kwargs) -> Dict[str, Any]:
r"""Construct kwargs for the `Model` from `TrainingData` and other options.
Args:
training_data: `TrainingData` container with data for single outcome
or for multiple outcomes for batched multi-output case.
**kwargs: Additional options for the model that pertain to the
training data, including:
- `task_features`: Indices of the input columns containing the task
features (expected list of length 1),
- `task_covar_prior`: A GPyTorch `Prior` object to use as prior on
the cross-task covariance matrix,
- `prior_config`: A dict representing a prior config, should only be
used if `prior` is not passed directly. Should contain:
`use_LKJ_prior` (whether to use LKJ prior) and `eta` (eta value,
float),
- `rank`: The rank of the cross-task covariance matrix.
"""
task_features = kwargs.pop("task_features", None)
if task_features is None:
raise ValueError(f"`task_features` required for {cls.__name__}.")
task_feature = task_features[0]
inputs = {
"train_X": training_data.X,
"train_Y": training_data.Y,
"task_feature": task_feature,
"rank": kwargs.get("rank"),
}
prior = kwargs.get("task_covar_prior")
prior_config = kwargs.get("prior_config")
if prior and prior_config:
raise ValueError(
"Only one of `prior` and `prior_config` arguments expected."
)
if prior_config:
if not prior_config.get("use_LKJ_prior"):
raise ValueError("Currently only config for LKJ prior is supported.")
all_tasks, _, _ = MultiTaskGP.get_all_tasks(training_data.X, task_feature)
num_tasks = len(all_tasks)
sd_prior = GammaPrior(1.0, 0.15)
sd_prior._event_shape = torch.Size([num_tasks])
eta = prior_config.get("eta", 0.5)
if not isinstance(eta, float) and not isinstance(eta, int):
raise ValueError(f"eta must be a real number, your eta was {eta}.")
prior = LKJCovariancePrior(num_tasks, eta, sd_prior)
inputs["task_covar_prior"] = prior
return inputs