Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
7a6d68f
Support scoping kernels to parameters
Scienfitz Aug 21, 2026
e108661
Add kernel overrides to parameters
Scienfitz Aug 21, 2026
42118b9
Generate valid parameter kernel overrides
Scienfitz Aug 21, 2026
7314c9a
Warn when surrogates ignore kernel overrides
Scienfitz Aug 21, 2026
3743956
Partition GP kernels around parameter overrides
Scienfitz Aug 24, 2026
09fc113
Test parameter-specific kernel overrides
Scienfitz Aug 24, 2026
1f65a5e
Test parameter kernel overrides end to end
Scienfitz Aug 21, 2026
a97dbb6
Document parameter-specific kernel overrides
Scienfitz Aug 21, 2026
21ca202
Group kernel override helpers into a subpackage
Scienfitz Aug 24, 2026
c0165b1
Test selector precedence with kernel overrides
Scienfitz Sep 9, 2026
a306cfd
Preserve kernel partition validation in unified overrides
Scienfitz Sep 9, 2026
361d431
Consolidate kernel override regression tests
Scienfitz Sep 9, 2026
3d5b256
Align kernel scoping docstring with parameter removal
Scienfitz Sep 9, 2026
429f4d6
Explain the lazy GPyTorch import guard
Scienfitz Sep 9, 2026
2747064
Clarify empty kernel reduction semantics
Scienfitz Sep 9, 2026
389c7fe
Annotate the basic kernel iterator return type
Scienfitz Sep 9, 2026
e8e0cf0
Reject unsupported kernel structures during leaf traversal
Scienfitz Sep 9, 2026
8562c12
Document the parameter override helper precondition
Scienfitz Sep 9, 2026
8d1c6d0
Support parameter removal from product kernels
Scienfitz Sep 9, 2026
bc2c5cb
Clarify the custom kernel deprecation flag
Scienfitz Sep 9, 2026
1dceb3f
Test nondefault residual indices around a parameter override
Scienfitz Sep 9, 2026
b157684
Extend reducible kernel override success cases
Scienfitz Sep 9, 2026
6e424f9
Document surrogate kernel override behavior
Scienfitz Sep 9, 2026
891b3b2
Fix documentation reference for KernelOverride alias
Scienfitz Sep 9, 2026
26ac436
Remove comment
Scienfitz Sep 22, 2026
8f749b4
Improve variable names
Scienfitz Sep 22, 2026
33ee99e
Clarify override condition in kernel factory docstring
Scienfitz Sep 22, 2026
6789cfe
Rename kernel scoping method to _scope_to_parameter
Scienfitz Sep 22, 2026
a67f896
Absorb None handling via converters.optional
Scienfitz Sep 22, 2026
4ca445c
Use field alias in kernel override error message
Scienfitz Sep 22, 2026
898a443
Align kernel override flag docstring with sibling flags
Scienfitz Sep 22, 2026
7f7e2e6
Remove self-referential surrogate kernel definition
Scienfitz Sep 22, 2026
72c2a55
Link kernel_override attribute on first mention
Scienfitz Sep 22, 2026
42b3934
Lead kernel override section with the mechanism
Scienfitz Sep 22, 2026
1c87ebe
Clarify that overrides accept kernel instances
Scienfitz Sep 22, 2026
c3bcbed
Support parameter removal from additive kernels
Scienfitz Sep 22, 2026
29d2e1f
Allow unscoping kernels via _scope_to_parameter
Scienfitz Sep 22, 2026
755d509
Clarify selector override test
Scienfitz Sep 22, 2026
705012e
Retarget pyrefly suppressions for stricter active_dims inference
Scienfitz Sep 22, 2026
26fe66e
Update CHANGELOG
Scienfitz Aug 21, 2026
4d3690c
Compare GPyTorch kernel overrides structurally
Scienfitz Sep 24, 2026
2357887
Rename kernel_override to override_kernel
Scienfitz Sep 24, 2026
135b202
Back override_kernel by a private attribute
Scienfitz Sep 24, 2026
bf0b64b
Store kernel overrides unscoped
Scienfitz Sep 24, 2026
df92f4e
Derive task parameter kernel override from transfer learning mode
Scienfitz Sep 24, 2026
0c6e21e
Regularize override kernel in iteration test
Scienfitz Sep 24, 2026
f26beb6
Improve docstring
Scienfitz Oct 5, 2026
516ebac
Cache override_kernel property
Scienfitz Oct 5, 2026
fd3b369
Clarify kernel type in _reduce_base_kernels docstring
Scienfitz Oct 5, 2026
c0405bc
Clarify parameter scoping docstring
Scienfitz Oct 5, 2026
b5da88d
Simplify GPyTorch override binding
Scienfitz Oct 5, 2026
1978680
Use default iteration count in override iteration test
Scienfitz Oct 5, 2026
69b9460
Test composite surrogate kernels with parameter overrides
Scienfitz Oct 5, 2026
f8e0754
Improve equation
Scienfitz Oct 14, 2026
b2fdfeb
Improve wording
Scienfitz Oct 14, 2026
dfdfb5d
Improve documentation
Scienfitz Oct 14, 2026
5c62b08
Reuse lazy GPyTorch component check for kernel overrides
Scienfitz Oct 15, 2026
b57e9fa
Improve wording in kernel override comments
Scienfitz Oct 15, 2026
e7b9c0c
Improve references in kernel override docs
Scienfitz Oct 15, 2026
1f77d69
Improve override extraction signature
Scienfitz Oct 15, 2026
2e18234
Improve type safety of default kernel base resolution
Scienfitz Oct 15, 2026
6199c44
Improve typing workaround comments with issue links
Scienfitz Oct 15, 2026
954da73
Remove branch-specific kernel override tests
Scienfitz Oct 15, 2026
3d4257a
Add kernel override assignment test
Scienfitz Oct 15, 2026
e078e97
Add parameter equivalence test
Scienfitz Oct 15, 2026
095bcd6
Make kernel override strategy scope configurable
Scienfitz Oct 15, 2026
e92fbb6
Add kernel override construction test
Scienfitz Oct 15, 2026
de72cad
Add fitted kernel override test
Scienfitz Oct 15, 2026
c8746be
Extend multitask kernel deprecation test with transfer learning modes
Scienfitz Oct 15, 2026
0c10d4e
Add kernel override iteration test
Scienfitz Oct 15, 2026
7a0fbb8
Move parameter equivalence test to its own file
Scienfitz Oct 15, 2026
31a5717
Consolidate kernel override test helpers
Scienfitz Oct 15, 2026
fe42885
Add TODO note
Scienfitz Oct 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `DiscreteLinearConstraint` for (optionally weighted) sum constraints on discrete
parameters, supporting `coefficients` and mirroring `ContinuousLinearConstraint`'s
`operator`/`rhs`/`coefficients` interface (replaces `DiscreteSumConstraint`)
- Parameter-specific kernel overrides for conveniently composing Gaussian process
kernels on individual parameter dimensions

### Changed
- `BOTORCH` GP preset now includes `BetaPrior(2.5, 1.5)` for the task covariance
Expand Down
23 changes: 22 additions & 1 deletion baybe/kernels/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@

from baybe.exceptions import UnmatchedAttributeError
from baybe.priors.base import Prior
from baybe.searchspace.core import SearchSpace
from baybe.serialization.mixin import SerialMixin
from baybe.settings import active_settings
from baybe.utils.basic import classproperty, get_baseclasses, match_attributes, to_tuple

if TYPE_CHECKING:
from baybe.searchspace.core import SearchSpace
from baybe.surrogates.gaussian_process.components.kernel import PlainKernelFactory


Expand Down Expand Up @@ -121,6 +121,23 @@ def _without_parameter(
f"Cannot remove a parameter from kernel '{self.__class__.__name__}'. "
)

def _scope_to_parameter(self, name: str | None, /) -> Kernel:
"""Return a copy of the kernel that acts only on the named parameter.

Args:
name: The name of the parameter to scope the kernel to, or ``None`` to
remove all scoping so that the kernel acts on all dimensions.

Raises:
TypeError: If the kernel structure cannot be scoped unambiguously.

Returns:
The scoped kernel.
"""
raise TypeError(
f"Cannot scope kernel '{self.__class__.__name__}' to a parameter."
)

@abstractmethod
def _get_dimensions(
self, searchspace: SearchSpace
Expand Down Expand Up @@ -273,6 +290,10 @@ def _without_parameter(
return self
return evolve(self, parameter_names=remaining) if remaining else None

@override
def _scope_to_parameter(self, name: str | None, /) -> Kernel:
return evolve(self, parameter_names=None if name is None else (name,))


@define(frozen=True)
class CompositeKernel(Kernel, ABC):
Expand Down
63 changes: 62 additions & 1 deletion baybe/kernels/composite.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
"""Composite kernels (that is, kernels composed of other kernels)."""

from __future__ import annotations

import gc
from functools import reduce
from operator import add, mul
from typing import TYPE_CHECKING

from attrs import define, evolve, field
from attrs.converters import optional as optional_c
Expand All @@ -12,11 +15,39 @@

from baybe.kernels.base import CompositeKernel, Kernel
from baybe.priors.base import Prior
from baybe.searchspace.core import SearchSpace
from baybe.settings import active_settings
from baybe.utils.basic import to_tuple
from baybe.utils.validation import finite_float

if TYPE_CHECKING:
from baybe.searchspace.core import SearchSpace


def _reduce_base_kernels(
kernel: AdditiveKernel | ProductKernel, name: str, searchspace: SearchSpace, /
Comment thread
AVHopp marked this conversation as resolved.
) -> Kernel | None:
"""Remove a parameter from all base kernels of an additive or product kernel.

Args:
kernel: The additive or product kernel whose base kernels are to be reduced.
name: The name of the parameter to remove.
searchspace: The search space the kernel operates on.

Returns:
The reduced kernel of the same type, the sole remaining base kernel, or
``None`` if no base kernel remains.
"""
remaining = tuple(
reduced
for k in kernel.base_kernels
if (reduced := k._without_parameter(name, searchspace)) is not None
)
if not remaining:
return None
if len(remaining) == 1:
return remaining[0]
return evolve(kernel, base_kernels=remaining)


@define(frozen=True)
class ScaleKernel(CompositeKernel):
Expand Down Expand Up @@ -50,6 +81,10 @@ def _without_parameter(
stripped = self.base_kernel._without_parameter(name, searchspace)
return None if stripped is None else evolve(self, base_kernel=stripped)

@override
def _scope_to_parameter(self, name: str | None, /) -> Kernel:
return evolve(self, base_kernel=self.base_kernel._scope_to_parameter(name))

@override
def to_gpytorch(self, *args, **kwargs):
import torch
Expand All @@ -76,6 +111,19 @@ class AdditiveKernel(CompositeKernel):
)
"""The individual kernels to be summed."""

@override
def _without_parameter(
self, name: str, searchspace: SearchSpace, /
) -> Kernel | None:
return _reduce_base_kernels(self, name, searchspace)

@override
def _scope_to_parameter(self, name: str | None, /) -> Kernel:
return evolve(
self,
base_kernels=tuple(k._scope_to_parameter(name) for k in self.base_kernels),
)

@override
def to_gpytorch(self, *args, **kwargs):
return reduce(add, (k.to_gpytorch(*args, **kwargs) for k in self.base_kernels))
Expand All @@ -93,6 +141,19 @@ class ProductKernel(CompositeKernel):
)
"""The individual kernels to be multiplied."""

@override
def _without_parameter(
self, name: str, searchspace: SearchSpace, /
) -> Kernel | None:
return _reduce_base_kernels(self, name, searchspace)

@override
def _scope_to_parameter(self, name: str | None, /) -> Kernel:
return evolve(
self,
base_kernels=tuple(k._scope_to_parameter(name) for k in self.base_kernels),
)

@override
def to_gpytorch(self, *args, **kwargs):
return reduce(mul, (k.to_gpytorch(*args, **kwargs) for k in self.base_kernels))
Expand Down
Loading
Loading