idslab 0.3.1__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {idslab-0.3.1 → idslab-0.3.2}/CHANGELOG.md +9 -0
- {idslab-0.3.1 → idslab-0.3.2}/CITATION.cff +1 -1
- idslab-0.3.2/PKG-INFO +142 -0
- idslab-0.3.2/README.md +88 -0
- idslab-0.3.2/docs/how-it-works.md +103 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/make_figures.py +4 -1
- {idslab-0.3.1 → idslab-0.3.2}/pyproject.toml +1 -1
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/__init__.py +1 -1
- idslab-0.3.2/src/idslab.egg-info/PKG-INFO +142 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab.egg-info/SOURCES.txt +1 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_examples.py +2 -2
- idslab-0.3.1/PKG-INFO +0 -259
- idslab-0.3.1/README.md +0 -205
- idslab-0.3.1/src/idslab.egg-info/PKG-INFO +0 -259
- {idslab-0.3.1 → idslab-0.3.2}/CONTRIBUTING.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/DESIGN.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/INSTALL.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/LICENSE +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/MANIFEST.in +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/architecture.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/cli.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/compare-and-sweeps.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/config-reference.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/dashboard.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/getting-started.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/dashboard-builder.png +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/dashboard-editor.png +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/dashboard-run.png +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/design-r1-four-layer.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/design-r1-router-gate.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/design-r2-anomaly-first.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/flow-map.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/frontier-gap.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/idslab-overview.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/report-page.png +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/selection.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/splits.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/img/stage-steps.svg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/limitations.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/models.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/outputs.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/docs/protocol.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/examples/README.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/examples/custom_adapter.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/examples/external_score_job.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/setup.cfg +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/adapters.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/cli.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/compare.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/config.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/controls.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/README.md +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/__init__.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/catalog.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/jobs.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/server.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/app.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/builder.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/charts.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/compare.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/core.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/draft.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/experiments.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/index.html +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/jobs.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/library.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/results.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/setup.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/styles.css +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/static/views.js +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/dashboard/workspace.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/data.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/examples/__init__.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/examples/r1_four_layer.yaml +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/examples/r1_router_gate.yaml +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/examples/r2_anomaly_first.yaml +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/external.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/features.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/fitting.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/graph.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/html_report.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/metrics.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/plugins.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/prep.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/report.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/results_version.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/runner.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/selection.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/sweep.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/synthetic.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab/torch_models.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab.egg-info/dependency_links.txt +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab.egg-info/entry_points.txt +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab.egg-info/requires.txt +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/src/idslab.egg-info/top_level.txt +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_adapters.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_cli.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_compare_sweep.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_config.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_controls.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_customization.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_dashboard.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_dashboard_browser.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_data.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_external.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_fitting.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_graph.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_metrics.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_modes.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_prep.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_release_script.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_report.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_results_version.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_runner.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_selection.py +0 -0
- {idslab-0.3.1 → idslab-0.3.2}/tests/test_torch_models.py +0 -0
|
@@ -6,6 +6,15 @@ releases keep finished runs.
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.3.2 (2026-10-17)
|
|
10
|
+
|
|
11
|
+
Documentation only; the code and the evaluation are unchanged, and finished runs are reused.
|
|
12
|
+
|
|
13
|
+
- A shorter README: overview, quickstart for every system, guides, versions and citation.
|
|
14
|
+
- `docs/how-it-works.md` explains a run with its figures: the design, the splits, the accuracy after
|
|
15
|
+
each stage, the frontier gap and the flow map.
|
|
16
|
+
- The project site describes the current builder, results page and fingerprints, and links the DOI.
|
|
17
|
+
|
|
9
18
|
## 0.3.1 (2026-10-17)
|
|
10
19
|
|
|
11
20
|
- Finished run units survive releases that do not change the evaluation. Fingerprints carry a results
|
|
@@ -8,7 +8,7 @@ authors:
|
|
|
8
8
|
alias: hashtagRR
|
|
9
9
|
orcid: "https://orcid.org/0009-0002-0385-3757"
|
|
10
10
|
doi: 10.5281/zenodo.23435536 # every version; Zenodo gives each release its own DOI as well
|
|
11
|
-
version: 0.3.
|
|
11
|
+
version: 0.3.2
|
|
12
12
|
date-released: "2026-10-17"
|
|
13
13
|
license: AGPL-3.0-or-later
|
|
14
14
|
repository-code: "https://github.com/hashtagRR/IDSLab"
|
idslab-0.3.2/PKG-INFO
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: idslab
|
|
3
|
+
Version: 0.3.2
|
|
4
|
+
Summary: Evaluation framework for staged intrusion detection systems
|
|
5
|
+
Author: hashtagRR
|
|
6
|
+
License-Expression: AGPL-3.0-or-later
|
|
7
|
+
Project-URL: Homepage, https://hashtagRR.github.io/IDSLab
|
|
8
|
+
Project-URL: Source, https://github.com/hashtagRR/IDSLab
|
|
9
|
+
Project-URL: Documentation, https://github.com/hashtagRR/IDSLab/tree/main/docs
|
|
10
|
+
Project-URL: Changelog, https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md
|
|
11
|
+
Project-URL: Issues, https://github.com/hashtagRR/IDSLab/issues
|
|
12
|
+
Keywords: intrusion detection,cascade,evaluation,machine learning,network security
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Security
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: numpy>=1.26
|
|
28
|
+
Requires-Dist: pandas>=2.1
|
|
29
|
+
Requires-Dist: pyarrow>=14
|
|
30
|
+
Requires-Dist: pyyaml>=6
|
|
31
|
+
Requires-Dist: scikit-learn>=1.6
|
|
32
|
+
Provides-Extra: xgboost
|
|
33
|
+
Requires-Dist: xgboost>=2.0; extra == "xgboost"
|
|
34
|
+
Provides-Extra: lightgbm
|
|
35
|
+
Requires-Dist: lightgbm>=4.0; extra == "lightgbm"
|
|
36
|
+
Provides-Extra: imbalance
|
|
37
|
+
Requires-Dist: imbalanced-learn>=0.12; extra == "imbalance"
|
|
38
|
+
Provides-Extra: pyod
|
|
39
|
+
Requires-Dist: pyod>=2.0; extra == "pyod"
|
|
40
|
+
Provides-Extra: torch
|
|
41
|
+
Requires-Dist: torch>=2.2; extra == "torch"
|
|
42
|
+
Provides-Extra: browser-tests
|
|
43
|
+
Requires-Dist: playwright>=1.44; extra == "browser-tests"
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
46
|
+
Requires-Dist: pytest-cov>=5; extra == "dev"
|
|
47
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
48
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
49
|
+
Requires-Dist: pyright>=1.1.380; extra == "dev"
|
|
50
|
+
Requires-Dist: vulture>=2.11; extra == "dev"
|
|
51
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
52
|
+
Requires-Dist: twine>=5; extra == "dev"
|
|
53
|
+
Dynamic: license-file
|
|
54
|
+
|
|
55
|
+
# IDSLab
|
|
56
|
+
|
|
57
|
+
**[hashtagRR.github.io/IDSLab](https://hashtagRR.github.io/IDSLab)**
|
|
58
|
+
|
|
59
|
+
[](https://pypi.org/project/idslab/)
|
|
60
|
+
[](https://doi.org/10.5281/zenodo.23435536)
|
|
61
|
+
|
|
62
|
+
<p align="center">
|
|
63
|
+
<img src="https://raw.githubusercontent.com/hashtagRR/IDSLab/main/docs/img/idslab-overview.svg" width="100%"
|
|
64
|
+
alt="IDSLab overview. Question: does every stage of your IDS cascade earn its place? 1 Your design: a binary classifier, a router and an anomaly gate, each with its model and decision, written in one YAML file. 2 One fixed protocol: splits per seed with TEST locked, each stage fitted on its own rows, models and thresholds chosen on VAL with off as an option, TEST read once next to controls. 3 The answer on synthetic data: the cascade and the first stage alone reach almost the same TEST accuracy; the entry classifier carries the result and the router and gate add nothing here.">
|
|
65
|
+
</p>
|
|
66
|
+
|
|
67
|
+
A framework for building and evaluating staged (cascade) network intrusion detection systems. You
|
|
68
|
+
describe a design in one YAML file, or draw it in the dashboard: the stages, the model in each, and
|
|
69
|
+
where each stage sends the flows it judges. IDSLab fits it, makes every choice on validation data,
|
|
70
|
+
and then shows on untouched test data whether the design beats its own first stage alone, and what
|
|
71
|
+
each stage adds.
|
|
72
|
+
|
|
73
|
+
## Quickstart
|
|
74
|
+
|
|
75
|
+
IDSLab needs Python 3.10 or newer and installs from [PyPI](https://pypi.org/project/idslab/).
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python3 -m venv .venv && .venv/bin/pip install idslab
|
|
79
|
+
.venv/bin/idslab example demo # synthetic data and three reference designs
|
|
80
|
+
.venv/bin/idslab run demo/r1_router_gate.yaml --out demo/runs # fit, choose on VAL, report on TEST
|
|
81
|
+
.venv/bin/idslab dashboard --workspace demo --open # optional web UI
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
On Windows, in PowerShell (the programs are in `.venv\Scripts`):
|
|
85
|
+
|
|
86
|
+
```powershell
|
|
87
|
+
py -3.12 -m venv .venv; .\.venv\Scripts\pip install idslab
|
|
88
|
+
.\.venv\Scripts\idslab example demo
|
|
89
|
+
.\.venv\Scripts\idslab run demo\r1_router_gate.yaml --out demo\runs
|
|
90
|
+
.\.venv\Scripts\idslab dashboard --workspace demo --open # keep the window open; Ctrl+C stops it
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The report is `demo/runs/r1-router-gate/report.html`. Step-by-step guides for Windows, macOS and
|
|
94
|
+
GNU/Linux, optional model libraries and troubleshooting are in
|
|
95
|
+
[INSTALL.md](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md).
|
|
96
|
+
|
|
97
|
+
## Documentation
|
|
98
|
+
|
|
99
|
+
| Guide | What it covers |
|
|
100
|
+
|---|---|
|
|
101
|
+
| [How it works](https://github.com/hashtagRR/IDSLab/blob/main/docs/how-it-works.md) | one run in figures: the design, the splits, the accuracy after each stage, the frontier gap and the flow map |
|
|
102
|
+
| [Getting started](https://github.com/hashtagRR/IDSLab/blob/main/docs/getting-started.md) | a first run on the synthetic data, reading the report, moving to your own data |
|
|
103
|
+
| [Example designs](https://github.com/hashtagRR/IDSLab/blob/main/examples/README.md) | the three reference cascades with diagrams, a custom model adapter, an outside score job |
|
|
104
|
+
| [Config reference](https://github.com/hashtagRR/IDSLab/blob/main/docs/config-reference.md) | every key of a config file, with defaults |
|
|
105
|
+
| [Protocol and controls](https://github.com/hashtagRR/IDSLab/blob/main/docs/protocol.md) | splits, greedy selection on VAL, the controls and what each reported number means |
|
|
106
|
+
| [Models in stages](https://github.com/hashtagRR/IDSLab/blob/main/docs/models.md) | score contracts, pipelines and search, PyTorch, your own adapter, scores from models trained elsewhere |
|
|
107
|
+
| [Outputs](https://github.com/hashtagRR/IDSLab/blob/main/docs/outputs.md) | the report pages and every file a run writes |
|
|
108
|
+
| [Comparing designs and sweeps](https://github.com/hashtagRR/IDSLab/blob/main/docs/compare-and-sweeps.md) | two designs on the same flows, paired per seed; one base config with many variants |
|
|
109
|
+
| [Command line](https://github.com/hashtagRR/IDSLab/blob/main/docs/cli.md) | `validate`, `run`, `report`, `export-splits`, `example`, `compare`, `sweep`, `dashboard` |
|
|
110
|
+
| [Dashboard](https://github.com/hashtagRR/IDSLab/blob/main/docs/dashboard.md) | the local web UI: pages, jobs, security ([source reference](https://github.com/hashtagRR/IDSLab/blob/main/src/idslab/dashboard/README.md)) |
|
|
111
|
+
| [Architecture](https://github.com/hashtagRR/IDSLab/blob/main/docs/architecture.md) | what happens during a run, the modules, and where to extend |
|
|
112
|
+
| [Known limitations](https://github.com/hashtagRR/IDSLab/blob/main/docs/limitations.md) | what the numbers do and do not show |
|
|
113
|
+
| [Design notes](https://github.com/hashtagRR/IDSLab/blob/main/DESIGN.md) | the reasoning behind each protocol rule |
|
|
114
|
+
| [Install guide](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md) | platform setup, extras, tests and checks |
|
|
115
|
+
| [Changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) | what changed in each version |
|
|
116
|
+
| [Project site](https://hashtagRR.github.io/IDSLab) | the project's overview page |
|
|
117
|
+
|
|
118
|
+
## Versions
|
|
119
|
+
|
|
120
|
+
Every release and its changes are in the
|
|
121
|
+
[changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) and on the
|
|
122
|
+
[Releases page](https://github.com/hashtagRR/IDSLab/releases). Releases from 0.3.0 on are archived
|
|
123
|
+
on Zenodo under the concept DOI above. From 0.3.1 on, a release that does not change the evaluation
|
|
124
|
+
keeps finished runs; upgrades to 0.2.0 and 0.3.0 ran them again.
|
|
125
|
+
|
|
126
|
+
- **`v0.3.0`**: the dashboard redesigned around experiments, with a guided setup, a results page
|
|
127
|
+
that reads the cascade against its first stage, and job progress.
|
|
128
|
+
- **`v0.2.0`**: visual pipeline builder, cost objectives and stage cost, plugins, `idslab compare`
|
|
129
|
+
and `idslab sweep`.
|
|
130
|
+
- **`v0.1.0`**: first public release.
|
|
131
|
+
|
|
132
|
+
## Citing
|
|
133
|
+
|
|
134
|
+
Cite the version you used. The concept DOI
|
|
135
|
+
[10.5281/zenodo.23435536](https://doi.org/10.5281/zenodo.23435536)
|
|
136
|
+
always resolves to the latest version, and lists each version's own DOI and citation.
|
|
137
|
+
[CITATION.cff](https://github.com/hashtagRR/IDSLab/blob/main/CITATION.cff) holds the same details,
|
|
138
|
+
and GitHub shows them under "Cite this repository".
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
AGPL-3.0-or-later. See [LICENSE](https://github.com/hashtagRR/IDSLab/blob/main/LICENSE).
|
idslab-0.3.2/README.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# IDSLab
|
|
2
|
+
|
|
3
|
+
**[hashtagRR.github.io/IDSLab](https://hashtagRR.github.io/IDSLab)**
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/idslab/)
|
|
6
|
+
[](https://doi.org/10.5281/zenodo.23435536)
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<img src="https://raw.githubusercontent.com/hashtagRR/IDSLab/main/docs/img/idslab-overview.svg" width="100%"
|
|
10
|
+
alt="IDSLab overview. Question: does every stage of your IDS cascade earn its place? 1 Your design: a binary classifier, a router and an anomaly gate, each with its model and decision, written in one YAML file. 2 One fixed protocol: splits per seed with TEST locked, each stage fitted on its own rows, models and thresholds chosen on VAL with off as an option, TEST read once next to controls. 3 The answer on synthetic data: the cascade and the first stage alone reach almost the same TEST accuracy; the entry classifier carries the result and the router and gate add nothing here.">
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
A framework for building and evaluating staged (cascade) network intrusion detection systems. You
|
|
14
|
+
describe a design in one YAML file, or draw it in the dashboard: the stages, the model in each, and
|
|
15
|
+
where each stage sends the flows it judges. IDSLab fits it, makes every choice on validation data,
|
|
16
|
+
and then shows on untouched test data whether the design beats its own first stage alone, and what
|
|
17
|
+
each stage adds.
|
|
18
|
+
|
|
19
|
+
## Quickstart
|
|
20
|
+
|
|
21
|
+
IDSLab needs Python 3.10 or newer and installs from [PyPI](https://pypi.org/project/idslab/).
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 -m venv .venv && .venv/bin/pip install idslab
|
|
25
|
+
.venv/bin/idslab example demo # synthetic data and three reference designs
|
|
26
|
+
.venv/bin/idslab run demo/r1_router_gate.yaml --out demo/runs # fit, choose on VAL, report on TEST
|
|
27
|
+
.venv/bin/idslab dashboard --workspace demo --open # optional web UI
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
On Windows, in PowerShell (the programs are in `.venv\Scripts`):
|
|
31
|
+
|
|
32
|
+
```powershell
|
|
33
|
+
py -3.12 -m venv .venv; .\.venv\Scripts\pip install idslab
|
|
34
|
+
.\.venv\Scripts\idslab example demo
|
|
35
|
+
.\.venv\Scripts\idslab run demo\r1_router_gate.yaml --out demo\runs
|
|
36
|
+
.\.venv\Scripts\idslab dashboard --workspace demo --open # keep the window open; Ctrl+C stops it
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The report is `demo/runs/r1-router-gate/report.html`. Step-by-step guides for Windows, macOS and
|
|
40
|
+
GNU/Linux, optional model libraries and troubleshooting are in
|
|
41
|
+
[INSTALL.md](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md).
|
|
42
|
+
|
|
43
|
+
## Documentation
|
|
44
|
+
|
|
45
|
+
| Guide | What it covers |
|
|
46
|
+
|---|---|
|
|
47
|
+
| [How it works](https://github.com/hashtagRR/IDSLab/blob/main/docs/how-it-works.md) | one run in figures: the design, the splits, the accuracy after each stage, the frontier gap and the flow map |
|
|
48
|
+
| [Getting started](https://github.com/hashtagRR/IDSLab/blob/main/docs/getting-started.md) | a first run on the synthetic data, reading the report, moving to your own data |
|
|
49
|
+
| [Example designs](https://github.com/hashtagRR/IDSLab/blob/main/examples/README.md) | the three reference cascades with diagrams, a custom model adapter, an outside score job |
|
|
50
|
+
| [Config reference](https://github.com/hashtagRR/IDSLab/blob/main/docs/config-reference.md) | every key of a config file, with defaults |
|
|
51
|
+
| [Protocol and controls](https://github.com/hashtagRR/IDSLab/blob/main/docs/protocol.md) | splits, greedy selection on VAL, the controls and what each reported number means |
|
|
52
|
+
| [Models in stages](https://github.com/hashtagRR/IDSLab/blob/main/docs/models.md) | score contracts, pipelines and search, PyTorch, your own adapter, scores from models trained elsewhere |
|
|
53
|
+
| [Outputs](https://github.com/hashtagRR/IDSLab/blob/main/docs/outputs.md) | the report pages and every file a run writes |
|
|
54
|
+
| [Comparing designs and sweeps](https://github.com/hashtagRR/IDSLab/blob/main/docs/compare-and-sweeps.md) | two designs on the same flows, paired per seed; one base config with many variants |
|
|
55
|
+
| [Command line](https://github.com/hashtagRR/IDSLab/blob/main/docs/cli.md) | `validate`, `run`, `report`, `export-splits`, `example`, `compare`, `sweep`, `dashboard` |
|
|
56
|
+
| [Dashboard](https://github.com/hashtagRR/IDSLab/blob/main/docs/dashboard.md) | the local web UI: pages, jobs, security ([source reference](https://github.com/hashtagRR/IDSLab/blob/main/src/idslab/dashboard/README.md)) |
|
|
57
|
+
| [Architecture](https://github.com/hashtagRR/IDSLab/blob/main/docs/architecture.md) | what happens during a run, the modules, and where to extend |
|
|
58
|
+
| [Known limitations](https://github.com/hashtagRR/IDSLab/blob/main/docs/limitations.md) | what the numbers do and do not show |
|
|
59
|
+
| [Design notes](https://github.com/hashtagRR/IDSLab/blob/main/DESIGN.md) | the reasoning behind each protocol rule |
|
|
60
|
+
| [Install guide](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md) | platform setup, extras, tests and checks |
|
|
61
|
+
| [Changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) | what changed in each version |
|
|
62
|
+
| [Project site](https://hashtagRR.github.io/IDSLab) | the project's overview page |
|
|
63
|
+
|
|
64
|
+
## Versions
|
|
65
|
+
|
|
66
|
+
Every release and its changes are in the
|
|
67
|
+
[changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) and on the
|
|
68
|
+
[Releases page](https://github.com/hashtagRR/IDSLab/releases). Releases from 0.3.0 on are archived
|
|
69
|
+
on Zenodo under the concept DOI above. From 0.3.1 on, a release that does not change the evaluation
|
|
70
|
+
keeps finished runs; upgrades to 0.2.0 and 0.3.0 ran them again.
|
|
71
|
+
|
|
72
|
+
- **`v0.3.0`**: the dashboard redesigned around experiments, with a guided setup, a results page
|
|
73
|
+
that reads the cascade against its first stage, and job progress.
|
|
74
|
+
- **`v0.2.0`**: visual pipeline builder, cost objectives and stage cost, plugins, `idslab compare`
|
|
75
|
+
and `idslab sweep`.
|
|
76
|
+
- **`v0.1.0`**: first public release.
|
|
77
|
+
|
|
78
|
+
## Citing
|
|
79
|
+
|
|
80
|
+
Cite the version you used. The concept DOI
|
|
81
|
+
[10.5281/zenodo.23435536](https://doi.org/10.5281/zenodo.23435536)
|
|
82
|
+
always resolves to the latest version, and lists each version's own DOI and citation.
|
|
83
|
+
[CITATION.cff](https://github.com/hashtagRR/IDSLab/blob/main/CITATION.cff) holds the same details,
|
|
84
|
+
and GitHub shows them under "Cite this repository".
|
|
85
|
+
|
|
86
|
+
## License
|
|
87
|
+
|
|
88
|
+
AGPL-3.0-or-later. See [LICENSE](https://github.com/hashtagRR/IDSLab/blob/main/LICENSE).
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# How IDSLab works, in figures
|
|
2
|
+
|
|
3
|
+
This page walks through one run of a reference design and the figures that explain it. The figures
|
|
4
|
+
come from one seed of the design on the synthetic example data (`idslab example`); the dashboard
|
|
5
|
+
screenshot at the end shows all three seeds.
|
|
6
|
+
|
|
7
|
+
## Why a cascade needs a fixed protocol
|
|
8
|
+
|
|
9
|
+
A staged IDS splits detection into steps. A first classifier sees every flow; later stages (a second
|
|
10
|
+
classifier, an anomaly detector, a type classifier) re-check the flows it sends them, to catch attacks
|
|
11
|
+
it missed or clear its false alarms. Many published designs report a gain over a single model, and the
|
|
12
|
+
gain is easy to overstate:
|
|
13
|
+
|
|
14
|
+
- thresholds or stages are chosen while looking at the test set;
|
|
15
|
+
- the cascade is compared with a different single model, not with its own first stage tuned as
|
|
16
|
+
carefully;
|
|
17
|
+
- the same gain could come from moving the first stage's threshold, no extra stage needed;
|
|
18
|
+
- nobody checks what each stage contributes, so a stage that does nothing stays in the design.
|
|
19
|
+
|
|
20
|
+
IDSLab rules these out for any design you can describe, with the same protocol every time, so two
|
|
21
|
+
designs (or two papers) compare on equal terms.
|
|
22
|
+
|
|
23
|
+
## What a run does
|
|
24
|
+
|
|
25
|
+
**1. You describe the design.** Stages, models, decisions and routes:
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
name: r1-router-gate
|
|
29
|
+
dataset: {train: data/train.parquet, test: data/test.parquet, label: label, type: attack_cat}
|
|
30
|
+
entry: binary
|
|
31
|
+
stages:
|
|
32
|
+
binary: # sees every flow
|
|
33
|
+
kind: classifier
|
|
34
|
+
pipeline: [{class: idslab.prep.Encode, params: {categorical: [proto, service]}}]
|
|
35
|
+
candidates: [{class: sklearn.ensemble.RandomForestClassifier}]
|
|
36
|
+
decision: {threshold: 0.5, off: benign}
|
|
37
|
+
routes: {attack: router, benign: BENIGN}
|
|
38
|
+
router: # keeps confident attacks, sends the rest to the gate
|
|
39
|
+
kind: classifier
|
|
40
|
+
pipeline: [{class: idslab.prep.Encode, params: {categorical: [proto, service]}}]
|
|
41
|
+
candidates: [{class: sklearn.ensemble.RandomForestClassifier}]
|
|
42
|
+
decision: {grid: [0.5, 0.6, 0.7, 0.8, 0.9], off: attack}
|
|
43
|
+
routes: {attack: ATTACK, benign: gate}
|
|
44
|
+
gate: # anomaly detector trained on benign flows only
|
|
45
|
+
kind: detector
|
|
46
|
+
fit_on: benign
|
|
47
|
+
pipeline: [{class: idslab.prep.Encode, params: {categorical: [proto, service]}}]
|
|
48
|
+
candidates: [{class: sklearn.ensemble.IsolationForest}]
|
|
49
|
+
decision: {budget: [0.01, 0.02, 0.05], off: normal}
|
|
50
|
+
routes: {anomalous: ATTACK, normal: BENIGN}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
Any acyclic graph works: stages can re-check, clear alarms, name attack types, or feed their scores
|
|
56
|
+
to later stages. Any model can sit in a stage: scikit-learn, XGBoost, LightGBM, PyOD, PyTorch, your
|
|
57
|
+
own class, or scores from a model trained elsewhere. The [example designs](../examples/README.md)
|
|
58
|
+
show all three reference cascades.
|
|
59
|
+
|
|
60
|
+
**2. It splits the data per seed and locks TEST away.**
|
|
61
|
+
|
|
62
|
+

|
|
63
|
+
|
|
64
|
+
**3. It makes every choice on VAL**, one stage at a time: which candidate model, which threshold, and
|
|
65
|
+
whether the stage stays on at all. Switching a stage off is always an option, and ties go to off.
|
|
66
|
+
|
|
67
|
+
**4. It reads TEST once**, for the frozen cascade and for controls built from the same fitted first
|
|
68
|
+
stage, over several seeds. The [protocol page](protocol.md) gives every rule.
|
|
69
|
+
|
|
70
|
+
## What you learn
|
|
71
|
+
|
|
72
|
+
Every report answers three questions.
|
|
73
|
+
|
|
74
|
+
**Does the cascade beat its first stage alone?** Here VAL said the extra stages help; TEST says they
|
|
75
|
+
cost 0.005. The report gives the difference with paired bootstrap intervals and the spread over seeds.
|
|
76
|
+
|
|
77
|
+

|
|
78
|
+
|
|
79
|
+
**Could a threshold do the same?** The frontier gap compares the cascade's detection rate with the
|
|
80
|
+
best the first stage reaches at the same false alarm rate. The report gives it twice: the step value
|
|
81
|
+
compares with single thresholds, and the interpolated value with the upper hull of the ROC curve,
|
|
82
|
+
which also covers mixing two thresholds. A positive interpolated gap means the stages reach a point
|
|
83
|
+
that no threshold, and no mix of two, can reach; here the cascade sits just below the first stage's curve.
|
|
84
|
+
|
|
85
|
+

|
|
86
|
+
|
|
87
|
+
**What does each stage do?** Every flow's path is recorded. Here the router passes 73 attacks to the
|
|
88
|
+
gate, and the gate catches none of them; switching the gate off costs nothing, and the report's stage
|
|
89
|
+
table says so.
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
The same run also gives the configuration chosen in every seed, the full selection trace, recall on
|
|
94
|
+
attack families held out of training, and per-type results when the design names attack types. The
|
|
95
|
+
[outputs page](outputs.md) lists every file.
|
|
96
|
+
|
|
97
|
+
## The same run in the dashboard
|
|
98
|
+
|
|
99
|
+
`idslab dashboard` shows each experiment with its next step, a guided setup, the job's progress, and
|
|
100
|
+
a results page that reads the cascade against its first stage with the per-unit bootstrap. The
|
|
101
|
+
[dashboard guide](dashboard.md) covers every page.
|
|
102
|
+
|
|
103
|
+

|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
# Copyright (C) 2026 hashtagRR
|
|
3
|
-
"""Generate the
|
|
3
|
+
"""Generate the figures (SVG) of docs/how-it-works.md, the README overview and the project site.
|
|
4
|
+
|
|
5
|
+
The numbers in the prose of docs/how-it-works.md and docs/index.html come from the same run; update
|
|
6
|
+
both when the figures change.
|
|
4
7
|
|
|
5
8
|
Usage:
|
|
6
9
|
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: idslab
|
|
3
|
+
Version: 0.3.2
|
|
4
|
+
Summary: Evaluation framework for staged intrusion detection systems
|
|
5
|
+
Author: hashtagRR
|
|
6
|
+
License-Expression: AGPL-3.0-or-later
|
|
7
|
+
Project-URL: Homepage, https://hashtagRR.github.io/IDSLab
|
|
8
|
+
Project-URL: Source, https://github.com/hashtagRR/IDSLab
|
|
9
|
+
Project-URL: Documentation, https://github.com/hashtagRR/IDSLab/tree/main/docs
|
|
10
|
+
Project-URL: Changelog, https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md
|
|
11
|
+
Project-URL: Issues, https://github.com/hashtagRR/IDSLab/issues
|
|
12
|
+
Keywords: intrusion detection,cascade,evaluation,machine learning,network security
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Security
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: numpy>=1.26
|
|
28
|
+
Requires-Dist: pandas>=2.1
|
|
29
|
+
Requires-Dist: pyarrow>=14
|
|
30
|
+
Requires-Dist: pyyaml>=6
|
|
31
|
+
Requires-Dist: scikit-learn>=1.6
|
|
32
|
+
Provides-Extra: xgboost
|
|
33
|
+
Requires-Dist: xgboost>=2.0; extra == "xgboost"
|
|
34
|
+
Provides-Extra: lightgbm
|
|
35
|
+
Requires-Dist: lightgbm>=4.0; extra == "lightgbm"
|
|
36
|
+
Provides-Extra: imbalance
|
|
37
|
+
Requires-Dist: imbalanced-learn>=0.12; extra == "imbalance"
|
|
38
|
+
Provides-Extra: pyod
|
|
39
|
+
Requires-Dist: pyod>=2.0; extra == "pyod"
|
|
40
|
+
Provides-Extra: torch
|
|
41
|
+
Requires-Dist: torch>=2.2; extra == "torch"
|
|
42
|
+
Provides-Extra: browser-tests
|
|
43
|
+
Requires-Dist: playwright>=1.44; extra == "browser-tests"
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
46
|
+
Requires-Dist: pytest-cov>=5; extra == "dev"
|
|
47
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
48
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
49
|
+
Requires-Dist: pyright>=1.1.380; extra == "dev"
|
|
50
|
+
Requires-Dist: vulture>=2.11; extra == "dev"
|
|
51
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
52
|
+
Requires-Dist: twine>=5; extra == "dev"
|
|
53
|
+
Dynamic: license-file
|
|
54
|
+
|
|
55
|
+
# IDSLab
|
|
56
|
+
|
|
57
|
+
**[hashtagRR.github.io/IDSLab](https://hashtagRR.github.io/IDSLab)**
|
|
58
|
+
|
|
59
|
+
[](https://pypi.org/project/idslab/)
|
|
60
|
+
[](https://doi.org/10.5281/zenodo.23435536)
|
|
61
|
+
|
|
62
|
+
<p align="center">
|
|
63
|
+
<img src="https://raw.githubusercontent.com/hashtagRR/IDSLab/main/docs/img/idslab-overview.svg" width="100%"
|
|
64
|
+
alt="IDSLab overview. Question: does every stage of your IDS cascade earn its place? 1 Your design: a binary classifier, a router and an anomaly gate, each with its model and decision, written in one YAML file. 2 One fixed protocol: splits per seed with TEST locked, each stage fitted on its own rows, models and thresholds chosen on VAL with off as an option, TEST read once next to controls. 3 The answer on synthetic data: the cascade and the first stage alone reach almost the same TEST accuracy; the entry classifier carries the result and the router and gate add nothing here.">
|
|
65
|
+
</p>
|
|
66
|
+
|
|
67
|
+
A framework for building and evaluating staged (cascade) network intrusion detection systems. You
|
|
68
|
+
describe a design in one YAML file, or draw it in the dashboard: the stages, the model in each, and
|
|
69
|
+
where each stage sends the flows it judges. IDSLab fits it, makes every choice on validation data,
|
|
70
|
+
and then shows on untouched test data whether the design beats its own first stage alone, and what
|
|
71
|
+
each stage adds.
|
|
72
|
+
|
|
73
|
+
## Quickstart
|
|
74
|
+
|
|
75
|
+
IDSLab needs Python 3.10 or newer and installs from [PyPI](https://pypi.org/project/idslab/).
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python3 -m venv .venv && .venv/bin/pip install idslab
|
|
79
|
+
.venv/bin/idslab example demo # synthetic data and three reference designs
|
|
80
|
+
.venv/bin/idslab run demo/r1_router_gate.yaml --out demo/runs # fit, choose on VAL, report on TEST
|
|
81
|
+
.venv/bin/idslab dashboard --workspace demo --open # optional web UI
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
On Windows, in PowerShell (the programs are in `.venv\Scripts`):
|
|
85
|
+
|
|
86
|
+
```powershell
|
|
87
|
+
py -3.12 -m venv .venv; .\.venv\Scripts\pip install idslab
|
|
88
|
+
.\.venv\Scripts\idslab example demo
|
|
89
|
+
.\.venv\Scripts\idslab run demo\r1_router_gate.yaml --out demo\runs
|
|
90
|
+
.\.venv\Scripts\idslab dashboard --workspace demo --open # keep the window open; Ctrl+C stops it
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The report is `demo/runs/r1-router-gate/report.html`. Step-by-step guides for Windows, macOS and
|
|
94
|
+
GNU/Linux, optional model libraries and troubleshooting are in
|
|
95
|
+
[INSTALL.md](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md).
|
|
96
|
+
|
|
97
|
+
## Documentation
|
|
98
|
+
|
|
99
|
+
| Guide | What it covers |
|
|
100
|
+
|---|---|
|
|
101
|
+
| [How it works](https://github.com/hashtagRR/IDSLab/blob/main/docs/how-it-works.md) | one run in figures: the design, the splits, the accuracy after each stage, the frontier gap and the flow map |
|
|
102
|
+
| [Getting started](https://github.com/hashtagRR/IDSLab/blob/main/docs/getting-started.md) | a first run on the synthetic data, reading the report, moving to your own data |
|
|
103
|
+
| [Example designs](https://github.com/hashtagRR/IDSLab/blob/main/examples/README.md) | the three reference cascades with diagrams, a custom model adapter, an outside score job |
|
|
104
|
+
| [Config reference](https://github.com/hashtagRR/IDSLab/blob/main/docs/config-reference.md) | every key of a config file, with defaults |
|
|
105
|
+
| [Protocol and controls](https://github.com/hashtagRR/IDSLab/blob/main/docs/protocol.md) | splits, greedy selection on VAL, the controls and what each reported number means |
|
|
106
|
+
| [Models in stages](https://github.com/hashtagRR/IDSLab/blob/main/docs/models.md) | score contracts, pipelines and search, PyTorch, your own adapter, scores from models trained elsewhere |
|
|
107
|
+
| [Outputs](https://github.com/hashtagRR/IDSLab/blob/main/docs/outputs.md) | the report pages and every file a run writes |
|
|
108
|
+
| [Comparing designs and sweeps](https://github.com/hashtagRR/IDSLab/blob/main/docs/compare-and-sweeps.md) | two designs on the same flows, paired per seed; one base config with many variants |
|
|
109
|
+
| [Command line](https://github.com/hashtagRR/IDSLab/blob/main/docs/cli.md) | `validate`, `run`, `report`, `export-splits`, `example`, `compare`, `sweep`, `dashboard` |
|
|
110
|
+
| [Dashboard](https://github.com/hashtagRR/IDSLab/blob/main/docs/dashboard.md) | the local web UI: pages, jobs, security ([source reference](https://github.com/hashtagRR/IDSLab/blob/main/src/idslab/dashboard/README.md)) |
|
|
111
|
+
| [Architecture](https://github.com/hashtagRR/IDSLab/blob/main/docs/architecture.md) | what happens during a run, the modules, and where to extend |
|
|
112
|
+
| [Known limitations](https://github.com/hashtagRR/IDSLab/blob/main/docs/limitations.md) | what the numbers do and do not show |
|
|
113
|
+
| [Design notes](https://github.com/hashtagRR/IDSLab/blob/main/DESIGN.md) | the reasoning behind each protocol rule |
|
|
114
|
+
| [Install guide](https://github.com/hashtagRR/IDSLab/blob/main/INSTALL.md) | platform setup, extras, tests and checks |
|
|
115
|
+
| [Changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) | what changed in each version |
|
|
116
|
+
| [Project site](https://hashtagRR.github.io/IDSLab) | the project's overview page |
|
|
117
|
+
|
|
118
|
+
## Versions
|
|
119
|
+
|
|
120
|
+
Every release and its changes are in the
|
|
121
|
+
[changelog](https://github.com/hashtagRR/IDSLab/blob/main/CHANGELOG.md) and on the
|
|
122
|
+
[Releases page](https://github.com/hashtagRR/IDSLab/releases). Releases from 0.3.0 on are archived
|
|
123
|
+
on Zenodo under the concept DOI above. From 0.3.1 on, a release that does not change the evaluation
|
|
124
|
+
keeps finished runs; upgrades to 0.2.0 and 0.3.0 ran them again.
|
|
125
|
+
|
|
126
|
+
- **`v0.3.0`**: the dashboard redesigned around experiments, with a guided setup, a results page
|
|
127
|
+
that reads the cascade against its first stage, and job progress.
|
|
128
|
+
- **`v0.2.0`**: visual pipeline builder, cost objectives and stage cost, plugins, `idslab compare`
|
|
129
|
+
and `idslab sweep`.
|
|
130
|
+
- **`v0.1.0`**: first public release.
|
|
131
|
+
|
|
132
|
+
## Citing
|
|
133
|
+
|
|
134
|
+
Cite the version you used. The concept DOI
|
|
135
|
+
[10.5281/zenodo.23435536](https://doi.org/10.5281/zenodo.23435536)
|
|
136
|
+
always resolves to the latest version, and lists each version's own DOI and citation.
|
|
137
|
+
[CITATION.cff](https://github.com/hashtagRR/IDSLab/blob/main/CITATION.cff) holds the same details,
|
|
138
|
+
and GitHub shows them under "Cite this repository".
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
AGPL-3.0-or-later. See [LICENSE](https://github.com/hashtagRR/IDSLab/blob/main/LICENSE).
|
|
@@ -52,8 +52,8 @@ def test_external_score_job_round_trip(data_dir, r4, tmp_path):
|
|
|
52
52
|
assert info["external_producer"]["code_version"] == "mlp-1"
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
def
|
|
56
|
-
text = (EXAMPLES.parent / "
|
|
55
|
+
def test_how_it_works_config_is_valid():
|
|
56
|
+
text = (EXAMPLES.parent / "docs" / "how-it-works.md").read_text(encoding="utf-8")
|
|
57
57
|
block = text.split("```yaml\n", 1)[1].split("```", 1)[0]
|
|
58
58
|
cfg = from_dict(parse_yaml(block))
|
|
59
59
|
assert cfg.order() == ["binary", "router", "gate"]
|