# LAPO Dataset: LLM-Assisted Parameter Optimization of Low-Power Wireless Protocols

This record contains the experimental data underlying the paper:

> M. H. M. Hydher, M. Schuß, O. Saukh, K. Römer, C. A. Boano:
> "LLM-Assisted Parameter Optimization for Low-Power Wireless Protocols",
> Proceedings of the 23rd International Conference on Embedded Wireless Systems and Networks (EWSN 2026), Dresden, Germany, September 2026.
> DOI: 10.3217/f19q-hk91

DOI of this dataset: 10.3217/pk9q4-9a455
Companion software record (LAPO pipeline, MIT licensed): 10.3217/xx8ab-xjm17
Development repository: https://github.com/LENS-TUGraz/LAPO (also reachable as http://iti.tugraz.at/LAPO)
The testbed traces used by the emulator come from the APEX dataset: 10.3217/3dhx0-2k125

Funding: This research was funded in whole, or in part, by the Austrian Science Fund (FWF) [10.55776/DFH5].

License: Creative Commons Attribution 4.0 International (CC BY 4.0).

## Contents

| File | Description |
|---|---|
| `run_results.zip` | One JSON file per optimization run: the parameter sets tested, the measured outcomes, and the final answer. 1,010 runs. |
| `reasoning_traces.zip` | One JSON file per run with the optimizer's proposals and rationales. Same 1,010 runs, same folder layout. |
| `ground_truth.zip` | The recorded D-Cube testbed traces the emulator replays (Crystal: 16 settings x 6 trials, RPL: 36 settings x 6 trials), their anonymized versions, and the per-setting medians. |
| `prompts_and_example_summaries.zip` | The prompt specifications as the runs used them, and three example protocol summaries produced by the repository analyzer for Crystal. |

## Experiments covered

Folder layout inside `run_results/` and `reasoning_traces/`:
`<Protocol>/<Variant>/<goal_constraint>/`, with Protocol in {Crystal, RPL}, Variant in
{LAPO_minimal, LAPO_median, LAPO_median_anon} and the goal-constraint folder named after the
application requirement, for example `e_1_r_0.96` for "minimize energy subject to PRR >= 96%".

| Application requirement | Protocol | Goal | Constraint | Folder |
|---|---|---|---|---|
| AR1 | Crystal | minimize energy | PRR >= 65% | `e_1_r_0.65` |
| AR2 | Crystal | minimize energy | PRR >= 96% | `e_1_r_0.96` |
| AR3 | RPL | minimize energy | PRR >= 65.5% | `e_1_r_0.655` |
| AR4 | RPL | minimize energy | PRR >= 93% | `e_1_r_0.93` |

Variants: `LAPO_minimal` uses the minimal prompt specification, `LAPO_median` the
median-informed specification with protocol context, `LAPO_median_anon` the median-informed
specification without protocol context (LAPO-A: the protocol and its parameters are anonymized).

| Variant | Requirements | Models | Runs per model and requirement |
|---|---|---|---|
| LAPO_minimal | AR1, AR2 | GPT-5, Claude Sonnet 4.5, Gemini 2.5 Pro | 8 |
| LAPO_median | AR1, AR2, AR3, AR4 | GPT-5, Claude Sonnet 4.5, Gemini 2.5 Pro | 8 |
| LAPO_median | AR1, AR2, AR3, AR4 | Gemma 3 12B, Gemma 3 27B, Llama 3.1 8B, Llama 3.1 70B, Llama 3.1 70B AWQ | 40 |
| LAPO_median_anon | AR2, AR4 | GPT-5, Claude Sonnet 4.5, Gemini 2.5 Pro | 8 |

Live runs on the D-Cube testbed (Crystal, AR1, Gemini 2.5 Pro, median-informed specification)
are under `Crystal/LAPO_median/e_1_r_0.65/live_run/<layout>/<interference>/`:

| Folder | Scenario | Runs |
|---|---|---|
| `live_run/1/0` | D-Cube layout 1, no added interference | 6 |
| `live_run/4/0` | D-Cube layout 4, no added interference | 6 |
| `live_run/1/HH02` | D-Cube layout 1, Wi-Fi interference generated with JamLab-NG | 6 |

File names carry the model and the start time of the run, for example
`results_gpt-5_median_T_20251120_110726.json`. The open-weight models appear with the
name of their vLLM checkpoint, for example `-work-models-google-gemma-3-27b-it`.

## Results files

Each `results_*.json` holds one run:

```
{
  "configuration": {
    "model": {"provider": "open-ai", "full_name": "gpt-5"},
    "optimization": {"goal": "energy", "constraints": {"reliability": ">= 0.96"},
                     "param_ranges": {"tx_power": [19, 23, 27, 31], "n_tx_max": [1, 2, 3, 4]}}
  },
  "runs": [
    {"iteration": 0,
     "params_clear": {"tx_power": 31, "n_tx_max": 2},        parameter set the optimizer asked for
     "params_executed_anon": {"n_tx_max": 2, "tx_power": 31},  the set that was executed
     "results": {"reliability": 0.950806, "latency": 600.147, "energy": 176.155},
     "ts": "2025-11-20T09:36:34+00:00"},
    ...
  ],
  "by_param_set": { "<executed parameter set>": [ {reliability, latency, energy}, ... ] },
  "early_exit_attempts": [ {"iteration": 3, "suggested_best_parameter_set": {...}} ],
  "optimization_goals": "...",
  "returned_best_parameter_set": {"tx_power": 31, "n_tx_max": 2},
  "max_iterations_reached": false,
  "final_iteration_count": 33
}
```

`early_exit_attempts` appears when the optimizer proposed a final answer before the minimum
number of trials. Runs that ended before a final answer have `runs` and `by_param_set` and
none of the four closing fields from `optimization_goals` on.

`runs` is the sequence of executed trials. In the emulated experiments each trial outcome is
one of the six recorded testbed trials of that parameter set, drawn at random and used at most
once per run; in the live experiments it is the measured outcome of a D-Cube job. Parameter
values are the raw firmware values (see the ground truth section for the mapping to the paper's
notation). Reliability is the packet reception ratio as a fraction, energy is in J, and latency
is the value reported by the testbed.

In the anonymized runs (`LAPO_median_anon`) the optimizer saw the parameters as `param_1`,
`param_2`, ... with index values; the files carry both views: `params_clear` with the anonymized
names and indices the optimizer used, and `params_executed_real` with the real names and values.
Their `by_param_set` keys use the anonymized names. The live-run files also carry the D-Cube job
configuration under `configuration.dcube_config`. In some entries of
the minimal-prompt runs the `results` object also has `id`, the number of the recorded testbed
trial, `goal`, the negative of the reliability value, and the executed parameter values under
the names `a` and `b`.

## Reasoning traces

Each `chat_log_*.json` in `reasoning_traces/` is a JSON array with one entry per optimizer
answer in that run:

```
[
  {"iteration": 1,
   "proposed_params": {"tx_power": 19, "n_tx_max": 1},
   "rationale": "..."},
  ...
]
```

`iteration` counts the optimizer's answers from 1; `proposed_params` is the parameter set parsed
from the answer, or null when the answer carried no valid set; `rationale` is the model's own
explanation. A trace can have more entries than its results file has trials, because it also
keeps the answers that led to no testbed trial: an answer with no valid set, a set already at
its trial limit, or an early final answer. The trace `chat_log_<run>.json`
and the results file `results_<run>.json` of a run share the same `<run>` part of the name.

## Ground truth

`Crystal_results.json` and `RPL_results.json` are the recorded testbed traces (D-Cube, Graz
University of Technology). Each entry is one trial:

```
{"id": 37155, "params": {"n_tx_max": 1, "n_empty_ta": 1, "tx_power": 19},
 "metrics": {"reliability": 0.674024, "latency": 602.13, "energy": 191.132}}
```

They are the same files as in the APEX dataset record (10.3217/3dhx0-2k125), which documents
them in full. The mapping from raw values to the paper's notation:

| Protocol | Recorded field | Values | Paper notation |
|---|---|---|---|
| Crystal | `tx_power` | 19, 23, 27, 31 | -5, -3, -1, 0 dBm (CC2420 PA_LEVEL) |
| Crystal | `n_tx_max` | 1, 2, 3, 4 | number of transmissions 1 to 4 |
| RPL | `_RPL_DIO_INTERVAL_MIN` | 4, 8, 12, 16 | DIO interval 2^4, 2^8, 2^12, 2^16 ms |
| RPL | `_MAX_LINK_METRIC` | 2048, 4096, 8192 | max link metric 16, 32, 64 (value / 128) |
| RPL | `_RANK_THRESHOLD` | 192, 384, 768 | rank threshold 1.5, 3, 6 (value / 128) |

`Anonymized_*_results.json` are the same traces with parameter names replaced by `param_n` and
values by indices, as used for LAPO-A. `*_Recorded_summary.json` hold the median energy and
reliability of each setting over its six trials.

## Prompts and example summaries

`prompts/` holds the optimizer system prompts of the three variants
(`optimizer_prompt_minimal.txt`, `optimizer_prompt_median_informed.txt`,
`optimizer_prompt_median_informed_anonymized.txt`), the repository analyzer prompt, and the
templates used to hand the protocol summary, the optimization goal and each trial result to
the optimizer, as used in the runs. The same prompts are embedded in the scripts of the software
record.

`example_protocol_summaries/` holds three protocol summaries produced by the repository
analyzer for Crystal, one per proprietary model, as examples of what the optimizer receives
as protocol context.
