<?xml version="1.0" encoding="UTF-8" ?><OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"><responseDate>2026-10-12T06:10:24Z</responseDate><request identifier="10.35097/1331" metadataPrefix="oai_dc" verb="GetRecord">https://www.radar-service.eu/oai/OAIHandler</request><GetRecord><record><header><identifier>10.35097/1331</identifier><datestamp>2026-10-09T10:54:01Z</datestamp><setSpec>radar4kit</setSpec></header><metadata><oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/"
           xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ https://www.openarchives.org/OAI/2.0/oai_dc.xsd">
   <dc:identifier>https://dx.doi.org/10.35097/1331</dc:identifier>
   <dc:creator>Bach, Jakob</dc:creator>
   <dc:creator>Iser, Ashlin</dc:creator>
   <dc:title>Experimental Data for the Paper "A Comprehensive Study of k-Portfolios of Recent SAT Solvers"</dc:title>
   <dc:publisher>Karlsruhe Institute of Technology</dc:publisher>
   <dc:date>2023</dc:date>
   <dc:subject>Computer Science</dc:subject>
   <dc:type>dataset</dc:type>
   <dc:subject>Dataset</dc:subject>
   <dc:rights>info:eu-repo/semantics/openAccess</dc:rights>
   <dc:rights>https://creativecommons.org/licenses/by/4.0/legalcode</dc:rights>
   <dc:description>These are the experimental data for the paper&#xD;
&#xD;
&gt; Bach, Jakob, Markus Iser, and Klemens Böhm. "A Comprehensive Study of k-Portfolios of Recent SAT Solvers"&#xD;
&#xD;
published at the conference [*SAT 2022*](http://satisfiability.org/SAT22/).&#xD;
You can find the paper [here](https://www.doi.org/10.4230/LIPIcs.SAT.2022.2) and the code [here](https://github.com/Jakob-Bach/Small-Portfolios).&#xD;
See the `README` for details.</dc:description>
   <dc:description># Experimental Data for the Paper "A Comprehensive Study of k-Portfolios of Recent SAT Solvers"&#xD;
&#xD;
These are the experimental data for the paper&#xD;
&#xD;
&gt; Bach, Jakob, Markus Iser, and Klemens Böhm. "A Comprehensive Study of k-Portfolios of Recent SAT Solvers"&#xD;
&#xD;
accepted at the conference [*SAT 2022*](http://satisfiability.org/SAT22/).&#xD;
Check our [GitHub repository](https://github.com/Jakob-Bach/Small-Portfolios) for the code and instructions to reproduce the experiments.&#xD;
The data were obtained on a server with an `AMD EPYC 7551` [CPU](https://www.amd.com/en/products/cpu/amd-epyc-7551) (32 physical cores, base clock of 2.0 GHz) and 128 GB RAM.&#xD;
The Python version was `3.8.10`.&#xD;
With this configuration, the experimental pipeline (`run_experiments.py`) took about 25 h.&#xD;
&#xD;
The commit hash for the last run of the experimental pipeline (`run_experiments.py`) is [`d402353e7f`](https://github.com/Jakob-Bach/Small-Portfolios/tree/d402353e7f5804d3b693c3057f203a2c719c4098).&#xD;
The commit hash for the last run of the evaluation pipeline (`run_evaluation.py`) is [`5ba0468088`](https://github.com/Jakob-Bach/Small-Portfolios/tree/5ba0468088fc0ce0ce3d2f04229946c1df83fa9d).&#xD;
Both commits are also tagged.&#xD;
&#xD;
In the following, we describe:&#xD;
&#xD;
- how to use the experimental data&#xD;
- the structure/content of each data file&#xD;
&#xD;
## Using the Data&#xD;
&#xD;
Most of the experimental pipeline's input and output files are plain CSVs.&#xD;
You can easily read in any of the CSVs with `pandas` if you are using Python:&#xD;
&#xD;
```python&#xD;
import pandas as pd&#xD;
&#xD;
results = pd.read_csv('&lt;path&gt;/search_results.csv')&#xD;
```&#xD;
&#xD;
All CSVs were written with `&lt;DataFrame&gt;.to_csv(&lt;path&gt;, index=False)`, i.e., they follow `pandas`' defaults for CSVs,&#xD;
so it is unnecessary to pass further parameters when reading them in with `pandas`.&#xD;
The CSVs mostly contain plain numbers and strings;&#xD;
the latter are only quoted if necessary, e.g., if they contain commas.&#xD;
However, the column `solvers` in `search_results.csv` contains lists of solver names.&#xD;
You can convert this column from string to proper Python lists as follows:&#xD;
&#xD;
```python&#xD;
import ast&#xD;
&#xD;
search_results['solvers'] = search_results['solvers'].apply(ast.literal_eval)&#xD;
```&#xD;
&#xD;
## `*.db` files and corresponding `*.csv` files&#xD;
&#xD;
Raw instance-feature databases and solver-runtime databases from [GBD](https://gbd.iti.kit.edu),&#xD;
as well as CSV exports of them.&#xD;
Outputs of the script `prepare_dataset.py`.&#xD;
&#xD;
- `meta`:&#xD;
  Meta-data of SAT instances, e.g., in which competition(s) the instances were used.&#xD;
  We only use this information to filter instances for the experimental datasets but not as features for predictions.&#xD;
- `satzilla`:&#xD;
  Instance features obtained with the feature extractor of [*SATzilla 2012*](https://www.cs.ubc.ca/labs/algorithms/Projects/SATzilla/Report_SAT_features.pdf).&#xD;
  Numeric matrix, apart from the `hash` column that identifies instances.&#xD;
  Each row represents a SAT instance; each column represents a feature (column names are feature names).&#xD;
  The value `timeout` represents missing values (feature extractor exceeded time or memory limits).&#xD;
- `sc2020`:&#xD;
  Solver runtimes from the [*SAT Competition 2020*](https://satcompetition.github.io/2020/).&#xD;
  Numeric matrix, apart from the `hash` column that identifies instances.&#xD;
  Each row represents a SAT instance (not all of them are actually from this SAT competition, so we filter instances later);&#xD;
  each column represents a solver (column names are solver names).&#xD;
  The values `failed`, `unknown`, and `timeout` represent missing values (solver did not solve instance within cut-off time).&#xD;
- `sc2021`:&#xD;
  Solver runtimes from the [*SAT Competition 2021*](https://satcompetition.github.io/2021/).&#xD;
  Numeric matrix, apart from the `hash` column that identifies instances.&#xD;
  Each row represents a SAT instance (not all of them are actually from this SAT competition, so we filter instances later);&#xD;
  each column represents a solver (column names are solver names).&#xD;
  The value `timeout` represents missing values (solver did not solve instance within cut-off time).&#xD;
&#xD;
## `sc(2020|2021)_features.csv`&#xD;
&#xD;
Pre-processed instance-feature data for the *Main Track* of the SAT Competitions 2020 and 2021.&#xD;
Output of the script `prepare_dataset.py`; input to the script `run_experiments.py`.&#xD;
Numeric matrix, apart from the `hash` column that identifies instances&#xD;
(we do not have any categorical features; they would need to be encoded beforehand).&#xD;
Each row represents a SAT instance; each column represents a feature (column names are feature names).&#xD;
Has the same number of rows as the corresponding runtime file.&#xD;
The empty string represents missing values caused by the feature extractor exceeding time or memory limits;&#xD;
these missing values are handled (imputed) in the prediction pipeline.&#xD;
&#xD;
## `sc(2020|2021)_runtimes.csv`&#xD;
&#xD;
Pre-processed solver-runtime data from the *Main Track* of the SAT Competitions 2020 and 2021.&#xD;
Output of the script `prepare_dataset.py`; input to the script `run_experiments.py`.&#xD;
Numeric matrix, apart from the `hash` column that identifies instances.&#xD;
Each row represents a SAT instance; each column represents a solver (column names are solver names).&#xD;
Has the same number of rows as the corresponding feature file.&#xD;
Missing values were replaced with the double cut-off time according to PAR-2 scoring (= 10000).&#xD;
&#xD;
## `search_results.csv`&#xD;
&#xD;
Results of portfolio search, e.g., portfolios, train/test objective values, and search times.&#xD;
Output of the script `run_experiments.py`; input to the script `run_evaluation.py`.&#xD;
&#xD;
- `solvers` (string, but actually a list of strings):&#xD;
  List of the names of the solvers forming the portfolio.&#xD;
  The solver names are column names in `sc(2020|2021)_runtimes.csv`.&#xD;
- `train_objective` (float):&#xD;
  Objective value of a solution (= portfolio) to the `K-Portfolio-Problem`,&#xD;
  using the SAT instances from the training data.&#xD;
  The objective is defined as the PAR-2 score of the portfolio's virtual best solver (VBS).&#xD;
- `test_objective` (float):&#xD;
  Objective value of the `K-Portfolio-Problem` for the SAT instances from the test data,&#xD;
  i.e., take the solvers of the portfolio determined on the training data,&#xD;
  and compute their VBS on the test instances (without running portfolio search again).&#xD;
- `(train|test)_portfolio_vws` (float):&#xD;
  PAR-2 score of the virtual worst solver (VWS) formed from the portfolio,&#xD;
  i.e., select the worst (in terms of PAR-2 score) solver from the portfolio for each instance.&#xD;
  Might be used for comparison purposes; we do not use it in our evaluation.&#xD;
  Bounds the objective value for portfolios with instance-specific solver selection.&#xD;
- `(train|test)_portfolio_sbs` (float):&#xD;
  PAR-2 score of the single best solver (SBS) from the portfolio,&#xD;
  i.e., the best individual solver contained in the portfolio.&#xD;
  Might be used for comparison purposes; we use it in Figures 4 and 5 as a baseline.&#xD;
- `(train|test)_portfolio_sws` (float):&#xD;
  PAR-2 score of the single worst solver (SWS) from the portfolio,&#xD;
  i.e., the worst individual solver contained in the portfolio.&#xD;
  Might be used for comparison purposes; we do not use it in our evaluation.&#xD;
- `(train|test)_global_sws` (float):&#xD;
  PAR-2 score of the single worst solver (SWS) from all solvers (independent from current portfolio),&#xD;
  i.e., the globally worst individual solver.&#xD;
  Might be used for comparison purposes; we use it in Figures 1 and 2 for the submodularity-based upper bound.&#xD;
- `search_time` (float):&#xD;
  Runtime (in seconds) of the portfolio search (on the particular dataset and cross-validation fold,&#xD;
  with the particular portfolio-search approach).&#xD;
- `search_id` (int):&#xD;
  Identifier denoting combinations of dataset, cross-validation fold, and portfolio-search approach.&#xD;
  The experimental pipeline parallelizes these tasks.&#xD;
  Each `search_id` might be associated with multiple portfolios;&#xD;
  combining `search_id` and `solution_id` allows joining `search_results` and `prediction_results`.&#xD;
- `solution_id` (int):&#xD;
  Identifier to distinguish between multiple portfolios found with&#xD;
  a particular portfolio-search approach on a particular dataset and cross-validation fold.&#xD;
  Apart from `mip_search` (the *optimal solution*), all search approaches yield multiple portfolios.&#xD;
- `fold_id` (int in `{0, 1, 2, 3, 4}`):&#xD;
  Index of the cross-validation fold.&#xD;
- `problem` (string, 2 different values):&#xD;
  Dataset name (in our experiments: `SC2020` or `SC2021`).&#xD;
- `algorithm` (string, 4 different values):&#xD;
  Search approach used to determine portfolios&#xD;
  (in our experiments: `beam_search`, `kbest_search`, `mip_search`, or `random_search`).&#xD;
- `k` (int in `[1, 48]`):&#xD;
  Desired number of solvers in the portfolio, an input parameter to portfolio search.&#xD;
  The actual number of solvers in column `solvers` might differ,&#xD;
  as *beam search* and *k-best* are only run with the maximal `k` for each dataset,&#xD;
  but also yield all smaller portfolios (intermediate results).&#xD;
- `w` (int in `[1, 100]`, but stored as float):&#xD;
  Beam width if *beam search* was used, or number of random samples if *random search* was used.&#xD;
  Missing value (represented as an empty string) for the other two search approaches.&#xD;
  Input parameter to portfolio search.&#xD;
&#xD;
## `prediction_results.csv`&#xD;
&#xD;
Results of predictions with portfolios, e.g., train/test prediction performance, train/test objective values, and feature importance.&#xD;
Output of the script `run_experiments.py`; input to the script `run_evaluation.py`.&#xD;
&#xD;
- `model` (string, 2 different values):&#xD;
  Name of the prediction model (in our experiments: `Random Forest` and `XGBoost`).&#xD;
  Each prediction model is trained for each portfolio from the search&#xD;
  (thus, `prediction_results` has twice the number of rows as `search_results`).&#xD;
- `pred_time` (float):&#xD;
  Runtime (in seconds) for training the prediction model (for one portfolio) on the training data,&#xD;
  and making predictions on training data as well as test data.&#xD;
- `(train|test)_pred_mcc` (float in `[-1, 1]`):&#xD;
  Prediction performance in terms of Matthews Correlation Coefficient for predicting&#xD;
  the best solver from the portfolio for each instance.&#xD;
- `(train|test)_pred_objective` (float):&#xD;
  PAR-2 score of the (instance-specific) solver recommendations made by the prediction model.&#xD;
- `imp.&lt;feature_name&gt;` (float in `[0, 1]`):&#xD;
  Feature importances extracted from the prediction model after training.&#xD;
  Importances are normalized and should sum up to one for each row. &#xD;
  Missing values (represented as empty strings) occur if no prediction model was trained&#xD;
  since the prediction target only had one class, e.g.,&#xD;
  portfolio had size one or always the same solver (out of multiple solvers) was best.&#xD;
- `search_id` (int), `solution_id` (int):&#xD;
  Same as in `search_results.csv`, can be used for joining the results.&#xD;
&#xD;
## `Evaluation_console_output.txt`&#xD;
&#xD;
Output of the script `run_evaluation.py`, manually copied from the console to a file.</dc:description>
   <dc:subject>propositional satisfiability</dc:subject>
   <dc:subject>solver portfolios</dc:subject>
   <dc:subject>runtime prediction</dc:subject>
   <dc:subject>machine learning</dc:subject>
   <dc:subject>integer programming</dc:subject>
   <dc:identifier>10.5445/IR/1000146629</dc:identifier>
   <dc:identifier>KITopen-DOI</dc:identifier>
   <dc:relation>https://publikationen.bibliothek.kit.edu/1000146629</dc:relation>
   <dc:format>application/x-tar</dc:format>
</oai_dc:dc></metadata></record></GetRecord></OAI-PMH>