Metadata-Version: 2.4
Name: baybe
Version: 0.15.0
Summary: A Bayesian Back End for Design of Experiments
Author: Merck KGaA, Darmstadt, Germany
License: Apache-2.0
Project-URL: Homepage, https://emdgroup.github.io/baybe/
Project-URL: Documentation, https://emdgroup.github.io/baybe/_autosummary/baybe.html
Project-URL: Changelog, https://emdgroup.github.io/baybe/misc/changelog_link.html
Project-URL: GitHub, https://github.com/emdgroup/baybe/
Project-URL: Issues, https://github.com/emdgroup/baybe/issues/
Keywords: Active Learning,Bayesian Optimization,Design of Experiments,DOE,Optimization
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Classifier: Typing :: Typed
Requires-Python: <3.15,>=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: attrs>=26.1.0
Requires-Dist: botorch<1,>=0.13.0
Requires-Dist: cattrs>=25.2.0
Requires-Dist: exceptiongroup
Requires-Dist: gpytorch<2,>=1.9.1
Requires-Dist: joblib<2,>1.4.0
Requires-Dist: numpy<3,>=1.24.1
Requires-Dist: pandas<4,>=2.1.0
Requires-Dist: scikit-learn<2,>=1.1.1
Requires-Dist: scipy>=1.10.1
Requires-Dist: torch<3,>=1.13.1
Requires-Dist: typing_extensions>=4.7.0
Provides-Extra: extras
Requires-Dist: baybe[chem]; extra == "extras"
Requires-Dist: baybe[insights]; extra == "extras"
Requires-Dist: baybe[onnx]; extra == "extras"
Requires-Dist: baybe[polars]; extra == "extras"
Requires-Dist: baybe[simulation]; extra == "extras"
Requires-Dist: ngboost<1,>=0.3.12; extra == "extras"
Requires-Dist: fpsample>=1.0.1; extra == "extras"
Provides-Extra: chem
Requires-Dist: scikit-fingerprints>=1.13.1; extra == "chem"
Provides-Extra: onnx
Requires-Dist: onnx>=1.16.0; extra == "onnx"
Requires-Dist: onnxruntime<1.24,>=1.15.1; python_version < "3.11" and extra == "onnx"
Requires-Dist: onnxruntime>=1.15.1; python_version >= "3.11" and extra == "onnx"
Requires-Dist: skl2onnx>=1.19.1; extra == "onnx"
Provides-Extra: dev
Requires-Dist: baybe[examples]; extra == "dev"
Requires-Dist: baybe[docs]; extra == "dev"
Requires-Dist: baybe[lint]; extra == "dev"
Requires-Dist: baybe[mypy]; extra == "dev"
Requires-Dist: baybe[test]; extra == "dev"
Requires-Dist: baybe[benchmarking]; extra == "dev"
Requires-Dist: pip-audit>=2.5.5; extra == "dev"
Requires-Dist: setuptools-scm>=7.1.0; extra == "dev"
Requires-Dist: tox-uv>=1.7.0; extra == "dev"
Requires-Dist: uv>=0.11.3; extra == "dev"
Provides-Extra: insights
Requires-Dist: shap[others]>=0.47.0; extra == "insights"
Provides-Extra: docs
Requires-Dist: baybe[examples]; extra == "docs"
Requires-Dist: furo>=2023.09.10; extra == "docs"
Requires-Dist: jupyter>=1.1.1; extra == "docs"
Requires-Dist: jupytext>=1.16.4; extra == "docs"
Requires-Dist: myst-parser>=4.0.0; extra == "docs"
Requires-Dist: sphinx>=8.0.2; extra == "docs"
Requires-Dist: sphinx-autodoc-typehints>=2.4.4; extra == "docs"
Requires-Dist: sphinx-copybutton==0.5.2; extra == "docs"
Requires-Dist: sphinx-paramlinks==0.6.0; extra == "docs"
Requires-Dist: sphinx-design==0.6.1; extra == "docs"
Requires-Dist: sphinxcontrib-bibtex>=2.6.2; extra == "docs"
Requires-Dist: tqdm; extra == "docs"
Provides-Extra: examples
Requires-Dist: baybe[extras]; extra == "examples"
Requires-Dist: matplotlib!=3.9.1,>=3.7.3; extra == "examples"
Requires-Dist: openpyxl>=3.0.9; extra == "examples"
Requires-Dist: pillow>=10.0.1; extra == "examples"
Requires-Dist: plotly>=5.10.0; extra == "examples"
Requires-Dist: seaborn>=0.12.2; extra == "examples"
Requires-Dist: streamlit>=1.37.0; extra == "examples"
Requires-Dist: tornado>=6.3.3; extra == "examples"
Provides-Extra: lint
Requires-Dist: flake8==7.3.0; extra == "lint"
Requires-Dist: pre-commit==4.2.0; extra == "lint"
Requires-Dist: pydoclint==0.5.5; extra == "lint"
Requires-Dist: pyupgrade==3.21.2; extra == "lint"
Requires-Dist: ruff==0.15.9; extra == "lint"
Requires-Dist: zizmor==1.25.2; extra == "lint"
Provides-Extra: mypy
Requires-Dist: mypy>=1.19.1; extra == "mypy"
Requires-Dist: pandas-stubs>=2.2.2.240603; extra == "mypy"
Requires-Dist: types-seaborn>=0.13.2.20240618; extra == "mypy"
Requires-Dist: types-psutil>=7.0.0.20250801; extra == "mypy"
Requires-Dist: types-tqdm; extra == "mypy"
Provides-Extra: polars
Requires-Dist: polars[pyarrow]<2,>=0.19.19; extra == "polars"
Provides-Extra: simulation
Requires-Dist: xyzpy>=1.2.1; extra == "simulation"
Provides-Extra: benchmarking
Requires-Dist: baybe[chem]; extra == "benchmarking"
Requires-Dist: baybe[onnx]; extra == "benchmarking"
Requires-Dist: baybe[simulation]; extra == "benchmarking"
Requires-Dist: baybe[examples]; extra == "benchmarking"
Requires-Dist: boto3<2,>=1.0.0; extra == "benchmarking"
Requires-Dist: GitPython<4,>=3.0.6; extra == "benchmarking"
Requires-Dist: psutil>=7.0.0; extra == "benchmarking"
Requires-Dist: torch>=2.4.0; extra == "benchmarking"
Provides-Extra: test
Requires-Dist: hypothesis[pandas]>=6.88.4; extra == "test"
Requires-Dist: tenacity>=8.5.0; extra == "test"
Requires-Dist: pytest>=7.2.0; extra == "test"
Requires-Dist: pytest-cov>=4.1.0; extra == "test"
Dynamic: license-file

<div align="center">
  <br/>

[![CI](https://img.shields.io/github/actions/workflow/status/emdgroup/baybe/ci.yml?branch=main&style=flat-square&label=CI&labelColor=0f69af&color=ffdcb9)](https://github.com/emdgroup/baybe/actions/workflows/ci.yml?query=branch%3Amain)
[![Regular](https://img.shields.io/github/actions/workflow/status/emdgroup/baybe/regular.yml?branch=main&style=flat-square&label=Regular%20Check&labelColor=0f69af&color=ffdcb9)](https://github.com/emdgroup/baybe/actions/workflows/regular.yml?query=branch%3Amain)
[![Docs](https://img.shields.io/github/actions/workflow/status/emdgroup/baybe/docs.yml?branch=main&style=flat-square&label=Docs&labelColor=0f69af&color=ffdcb9)](https://github.com/emdgroup/baybe/actions/workflows/docs.yml?query=branch%3Amain)

[![Supports Python](https://img.shields.io/pypi/pyversions/baybe?style=flat-square&label=Supports%20Python&labelColor=96d7d2&color=ffdcb9)](https://pypi.org/project/baybe/)
[![PyPI version](https://img.shields.io/pypi/v/baybe.svg?style=flat-square&label=PyPI%20Version&labelColor=96d7d2&color=ffdcb9)](https://pypi.org/project/baybe/)
[![Downloads](https://img.shields.io/pypi/dm/baybe?style=flat-square&label=Downloads&labelColor=96d7d2&color=ffdcb9)](https://pypistats.org/packages/baybe)
[![Issues](https://img.shields.io/github/issues/emdgroup/baybe?style=flat-square&label=Issues&labelColor=96d7d2&color=ffdcb9)](https://github.com/emdgroup/baybe/issues/)
[![PRs](https://img.shields.io/github/issues-pr/emdgroup/baybe?style=flat-square&label=PRs&labelColor=96d7d2&color=ffdcb9)](https://github.com/emdgroup/baybe/pulls/)
[![License](https://shields.io/badge/License-Apache%202.0-green.svg?style=flat-square&labelColor=96d7d2&color=ffdcb9)](http://www.apache.org/licenses/LICENSE-2.0)

[![Logo](https://raw.githubusercontent.com/emdgroup/baybe/main/docs/_static/banner2.svg)](https://github.com/emdgroup/baybe/)

&nbsp;
<a href="https://emdgroup.github.io/baybe/">Homepage<a/>
&nbsp;•&nbsp;
<a href="https://emdgroup.github.io/baybe/stable/userguide/userguide.html">User Guide<a/>
&nbsp;•&nbsp;
<a href="https://emdgroup.github.io/baybe/stable/_autosummary/baybe.html">Documentation<a/>
&nbsp;•&nbsp;
<a href="https://emdgroup.github.io/baybe/stable/misc/contributing_link.html">Contribute<a/>
&nbsp;
</div>

# BayBE — A Bayesian Back End for Design of Experiments

The **Bay**esian **B**ack **E**nd (**BayBE**) helps to find **good parameter configurations** 
within complex parameter search spaces. 

<div align="center">

![Complex Search Space](https://raw.githubusercontent.com/Hrovatin/baybe/docs/easy_access/docs/_static/complex_search_space.svg)

</div>

BayBE can help to solve many real-world optimization problems, such as:

- 🧪 Find chemical reaction conditions or process parameters
- 🥣 Create materials, chemical mixtures or formulations with desired properties
- ✈️ Optimize the 3D shape of a physical object
- 🖥️ Optimize a virtual simulation
- ⚙️ Select model hyperparameters
- 🫖 Find tasty espresso machine settings

This is achieved via **Bayesian Design of Experiments**, 
which helps to efficiently navigate parameter search spaces. 
It balances
exploitation of parameter space regions known to lead to good outcomes 
and exploration of unknown regions. 

BayBE provides a **general-purpose toolbox** for Bayesian Design of Experiments, 
focusing on making this procedure easily accessible for real-world experiments.
Its utility was already shown in a variety of [real-world experimental campaigns](#citation) in both industry and academia.

## 🔋 Batteries Included
BayBE offers a range of ✨**built&#8209;in&nbsp;features**✨, including:

<details style="border:2px solid #535353; border-radius: 7px; margin: 5px;">
  <summary style="background-color: #535353; color: white; padding: 10px; border-radius: 5px; cursor: pointer;">
    🛠️ Flexible modeling options
  </summary>
  <div style="padding: 10px;">
    <ul>
      <li>Use both continuous and discrete parameters within a single <a href="https://emdgroup.github.io/baybe/stable/examples/Searchspaces/hybrid_space.html">hybrid search space</a>.</li>
      <li>Exclude undesired or impossible parameter configurations (e.g., to define a maximal number of mixture components) using <a href="https://emdgroup.github.io/baybe/stable/components/constraints.html">constraints</a>.</li>
      <li>Choose between different optimization strategies to balance exploration and exploitation of the search space:
        <ul>
          <li>Smartly acquire training data for model building via <a href="https://emdgroup.github.io/baybe/stable/concepts/active_learning.html">active learning</a>.</li>
          <li>Conduct AB testing via <a href="https://emdgroup.github.io/baybe/stable/examples/Multi_Armed_Bandit/Multi_Armed_Bandit.html">bandit models</a>.</li>
        </ul>
      </li>
      <li>Specify the desired target value via <a href="https://emdgroup.github.io/baybe/stable/components/transformations.html">target transformations</a>.</li>
      <li>Optimize multiple targets at the same time via <a href="https://emdgroup.github.io/baybe/stable/components/objectives.html#paretoobjective">Pareto optimization</a> or <a href="https://emdgroup.github.io/baybe/stable/components/objectives.html#desirabilityobjective">desirability scalarization</a>.</li>
    </ul>
  </div>
</details>
<details style="border:2px solid #535353; border-radius: 7px; margin: 5px;">
  <summary style="background-color: #535353; color: white; padding: 10px; border-radius: 5px; cursor: pointer;">
    📚 Mechanisms for leveraging additional information
  </summary>
  <div style="padding: 10px;">
    <ul>
      <li>Capture relationships between categories via <a href="https://emdgroup.github.io/baybe/stable/components/parameters.html#customdiscreteparameter">custom encodings for categorical</a> data.</li>
      <li>Use built-in <a href="https://emdgroup.github.io/baybe/stable/components/parameters.html#substanceparameter">chemical encodings</a> for chemistry-related parameters.</li>
      <li>Add mechanistic process understanding via <a href="https://emdgroup.github.io/baybe/stable/components/surrogates.html#using-custom-models">custom surrogate</a> models.</li>
      <li>Leverage additional data from similar campaigns to accelerate optimization via <a href="https://emdgroup.github.io/baybe/stable/concepts/transfer_learning.html">transfer learning</a>.</li>
    </ul>
  </div>
</details>
<details style="border:2px solid #535353; border-radius: 7px; margin: 5px;">
  <summary style="background-color: #535353; color: white; padding: 10px; border-radius: 5px; cursor: pointer;">
    🔗 Advanced optimization workflows
  </summary>
  <div style="padding: 10px;">
    <ul>
      <li>Run campaigns <a href="https://emdgroup.github.io/baybe/stable/concepts/async.html">asynchronously</a> with partial measurements and pending experiments.</li>
      <li>Store BayBE objects and use API wrappers with the <a href="https://emdgroup.github.io/baybe/stable/concepts/serialization.html">serialization</a> functionality.</li>
    </ul>
  </div>
</details>
<details style="border:2px solid #535353; border-radius: 7px; margin: 5px;">
  <summary style="background-color: #535353; color: white; padding: 10px; border-radius: 5px; cursor: pointer;">
    🔍 Performance evaluation tools
  </summary>
  <div style="padding: 10px;">
    <ul>
      <li>Gain <a href="https://emdgroup.github.io/baybe/stable/components/insights.html">insights</a> about the optimization campaigns by analyzing model behavior and feature importance.</li>
      <li>Conduct benchmarks to select between different Bayesian optimization settings via <a href="https://emdgroup.github.io/baybe/stable/concepts/simulation.html">backtesting</a>.</li>
    </ul>
  </div>
</details>

## ⚡ Quick Start

To perform Bayesian Design of Experiments with BayBE, 
you should first specify the **parameter search space** and **objective** to be optimized. 
Based on this information and any **available data** about outcomes of specific parameter configurations, 
BayBE will **recommend the next set of parameter configurations** to be **measured**. 
To inform the next recommendation cycle, the newly generated measurements can be added to BayBE.

<div align="center">

![Quick Start](https://raw.githubusercontent.com/Hrovatin/baybe/docs/easy_access/docs/_static/quick_start.svg)

</div>

From the user perspective, the most important part is the "setup" step (top of the figure).

Below we show a simple optimization procedure, starting with the setup step and subsequently
performing the recommendation loop. 
The provided example aims to maximize the yield of a chemical reaction by adjusting its parameter configurations 
(also known as reaction conditions).

First, install BayBE into your Python environment: 
```bash 
pip install baybe 
``` 
For more information on this step, see our
[detailed installation instructions](#installation).

### Defining the Optimization Objective

In BayBE's language, the reaction yield can be represented as a `NumericalTarget`,
which we wrap into a `SingleTargetObjective`:

```python
from baybe.targets import NumericalTarget
from baybe.objectives import SingleTargetObjective

target = NumericalTarget(name="Yield")
objective = SingleTargetObjective(target=target)
```
In cases where we are confronted with multiple (potentially conflicting) targets 
(e.g., yield vs selectivity),
the `ParetoObjective` or `DesirabilityObjective` can be used to define how the targets should be balanced.
For more details, see the
[objectives section](https://emdgroup.github.io/baybe/stable/components/objectives.html)
of the user guide.

### Defining the Search Space

Next, we inform BayBE about the available "control knobs", that is, the underlying
reaction parameters we can tune to optimize the yield. 
In this case we tune granularity, pressure and solvent, each being encoded as a `Parameter`.
We also need to specify which values individual parameters can take.

```python
from baybe.parameters import (
    CategoricalParameter,
    NumericalDiscreteParameter,
    SubstanceParameter,
)

parameters = [
    CategoricalParameter(
        name="Granularity",
        values=["coarse", "medium", "fine"],
        encoding="OHE",  # one-hot encoding of categories
    ),
    NumericalDiscreteParameter(
        name="Pressure[bar]",
        values=[1, 5, 10],
        tolerance=0.2,  # allows experimental inaccuracies up to 0.2 when reading values
    ),
    SubstanceParameter(
        name="Solvent",
        data={
            "Solvent A": "COC",
            "Solvent B": "CCC",  # label-SMILES pairs
            "Solvent C": "O",
            "Solvent D": "CS(=O)C",
        },
        encoding="MORDRED",  # chemical encoding via scikit-fingerprints
    ),
]
```

For more parameter types and their details, see the
[parameters section](https://emdgroup.github.io/baybe/stable/components/parameters.html)
of the user guide.

Additionally, we can define a set of constraints to further specify allowed ranges and
relationships between our parameters. Details can be found in the
[constraints section](https://emdgroup.github.io/baybe/stable/components/constraints.html) of the user guide.
In this example, we assume no further constraints.

With the parameter definitions at hand, we can now create our
`SearchSpace` based on the Cartesian product of all possible parameter values:

```python
from baybe.searchspace import SearchSpace

searchspace = SearchSpace.from_product(parameters)
```

See the [search spaces section](https://emdgroup.github.io/baybe/stable/components/searchspace.html)
of our user guide for more information on the structure of search spaces
and alternative ways of construction. 

### Optional: Defining the Optimization Strategy

As an optional step, we can specify details on how the optimization of the experimental configurations should be
performed. If omitted, BayBE will choose a default Bayesian optimization setting.

For our example, we combine two recommenders via a so-called meta recommender named
`TwoPhaseMetaRecommender`:

1. In cases where no measurements have been made prior to the interaction with BayBE,
   the parameters will be recommended with the `initial_recommender`.
2. As soon as the first measurements are available, we switch to the `recommender`.

```python
from baybe.recommenders import (
    BotorchRecommender,
    FPSRecommender,
    TwoPhaseMetaRecommender,
)

recommender = TwoPhaseMetaRecommender(
    initial_recommender=FPSRecommender(),  # farthest point sampling
    recommender=BotorchRecommender(),  # Bayesian model-based optimization
)
```

For more details on the different recommenders, their underlying algorithmic
details and how their settings can be adjusted, see the
[recommenders section](https://emdgroup.github.io/baybe/stable/components/recommenders.html)
of the user guide.

### The Optimization Loop

We can now construct a `Campaign` that performs the Bayesian optimization of the experimental configurations:

```python
from baybe import Campaign

campaign = Campaign(searchspace, objective, recommender)
```

With this object at hand, we can start our optimization cycle.
In particular:

* The campaign can `recommend` new experiments.
* We can `add_measurements` of target values for the measured parameter configurations 
  to the campaign's database.

Note that these two steps can be performed in any order.
In particular, available measurements can be submitted at any time and also several 
times before querying the next recommendations.

```python
df = campaign.recommend(
    batch_size=3
)  # Recommend three experimental configurations to test
print(df)
```

The below table shows the three parameter configurations for which BayBE recommended to 
measure the reaction yield.

```none
   Granularity  Pressure[bar]    Solvent
15      medium            1.0  Solvent D
10      coarse           10.0  Solvent C
29        fine            5.0  Solvent B
```

Next, we need to conduct the recommended experiments and record the corresponding `Target` values.

```python
df["Yield"] = [
    79.8,
    54.1,
    59.4,
]  # Measured yields for the three recommended parameter configurations
print(df)
```
```none
   Granularity  Pressure[bar]    Solvent  Yield
15      medium            1.0  Solvent D   79.8
10      coarse           10.0  Solvent C   54.1
29        fine            5.0  Solvent B   59.4
```

Now, we can add the newly measured `Target` values to the `Campaign`:

```python
campaign.add_measurements(df)
```

With the newly provided data, BayBE can produce a refined recommendation for the next iteration.
This loop typically continues until a desired `Target` value is achieved in the experiment.

### Inspect the Progress of the Experimental Configuration Optimization

The below plot shows progression of a campaign that optimized direct arylation reaction
by tuning the solvent, base and ligand 
(from [Shields, B.J. et al.](https://doi.org/10.1038/s41586-021-03213-y)).
Each line shows the best target value that was cumulatively achieved after a given number of experimental iterations.


Different lines show outcomes of `Campaigns` with different settings.

![Substance Encoding Example](./examples/Backtesting/full_lookup_light.svg)

In particular, the five `Campaigns` differ in how molecules are encoded within 
each chemical `Parameter`. Instead of simply one-hot encoding each SMILES string,
`SubstanceParameter` can be used to directly compute chemical fingerprints from 
the input SMILES.
We can see that optimization is more efficient when 
using chemical encodings (e.g., *MORDRED*) rather than encoding categories with *one-hot* encoding. The latter is, in fact, no better than *randomly* suggesting parameter configurations at each experimental iteration.

<a id="installation"></a>
(installation)=
## 💻 Installation
### From Package Index
The easiest way to install BayBE is via PyPI:

```bash
pip install baybe
```

A certain released version of the package can be installed by specifying the
corresponding version tag in the form `baybe==x.y.z`.

### From GitHub
If you need finer control and would like to install a specific commit that has not been
released under a certain version tag, you can do so by installing BayBE directly from
GitHub via git and specifying the corresponding
[git ref](https://pip.pypa.io/en/stable/topics/vcs-support/#git).

For instance, to install the latest commit of the main branch, run:

```bash
pip install git+https://github.com/emdgroup/baybe.git@main
```


### From Local Clone

Alternatively, you can install the package from your own local copy.
First, clone the repository, navigate to the repository root folder, check out the
desired commit and run:

```bash
pip install .
```

A developer would typically also install the package in editable mode ('-e'),
which ensures that changes to the code do not require a reinstallation.

```bash
pip install -e .
```

If you need to add additional dependencies, make sure to use the correct syntax
including `''`:

```bash
pip install -e '.[dev]'
```

### Optional Dependencies
There are several dependency groups that can be selected during pip installation, like
```bash
pip install 'baybe[test,lint]' # will install baybe with additional dependency groups `test` and `lint`
```
To get the most out of `baybe`, we recommend to install at least
```bash
pip install 'baybe[chem,simulation]'
```

The available groups are:
- `extras`: Installs all dependencies required for optional features.
- `benchmarking`: Required for running the benchmarking module.
- `chem`: Cheminformatics utilities (e.g. for the `SubstanceParameter`).
- `docs`: Required for creating the documentation.
- `examples`: Required for running the examples/streamlit.
- `lint`: Required for linting and formatting.
- `mypy`: Required for static type checking.
- `onnx`: Required for using custom surrogate models in [ONNX format](https://onnx.ai).
- `polars`: Required for optimized search space construction via [Polars](https://docs.pola.rs/).
- `insights`: Required for built-in model and campaign analysis (e.g. using [SHAP](https://shap.readthedocs.io/)).
- `simulation`: Enabling the [simulation](https://emdgroup.github.io/baybe/stable/_autosummary/baybe.simulation.html) module.
- `test`: Required for running the tests.
- `dev`: All of the above plus dev tools. For code contributors.

## 📡 Telemetry
Telemetry was fully and permanently removed in version 0.14.0.

<a id="citation"></a>
(citation)=
## 📖 Citation
If you find BayBE useful, please consider citing [our paper](https://doi.org/10.1039/D5DD00050E):

```bibtex
@article{baybe_2025,
  author = "Fitzner, Martin and {\v S}o{\v s}i{\'c}, Adrian and 
            Hopp, Alexander V. and M{\"u}ller, Marcel and Rihana, Rim and 
            Hrovatin, Karin and Liebig, Fabian and Winkel, Mathias and 
            Halter, Wolfgang and Brandenburg, Jan Gerit",
  title  = "{BayBE}: a {B}ayesian {B}ack {E}nd for experimental planning 
            in the low-to-no-data regime",
  journal = "Digital Discovery",
  year = "2025",
  volume = "4",
  issue = "8",
  pages = "1991-2000",
  publisher = "RSC",
  doi = "10.1039/D5DD00050E",
  url = "http://dx.doi.org/10.1039/D5DD00050E",
}
```

## 🛠️ Known Issues
A list of known issues can be found [here](https://emdgroup.github.io/baybe/stable/known_issues.html).

## 👨🏻‍🔧 Maintainers

- Martin Fitzner (Merck KGaA, Darmstadt, Germany), [Contact](mailto:martin.fitzner@merckgroup.com), [Github](https://github.com/Scienfitz)
- Adrian Šošić (Merck Life Science KGaA, Darmstadt, Germany), [Contact](mailto:adrian.sosic@merckgroup.com), [Github](https://github.com/AdrianSosic)
- Alexander Hopp (Merck KGaA, Darmstadt, Germany) [Contact](mailto:alexander.hopp@merckgroup.com), [Github](https://github.com/AVHopp)

## 🙏 Contributors

Thanks to our contributors!

[![Contributors](https://contrib.rocks/image?repo=emdgroup/baybe)](https://github.com/emdgroup/baybe/graphs/contributors)

## 📄 License

Copyright 2022-2026 Merck KGaA, Darmstadt, Germany
and/or its affiliates. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
