perdalam-protean
Research code for server-side prototype aggregation in PROTEAN using class-specific sample support, for rare attack detection under non-IID federated intrusion detection.
The study modifies only how the server combines local class prototypes:
Cbar_j(beta) = ( sum_{i in S_j} N_ij^beta C_ij ) / ( sum_{i in S_j} N_ij^beta )
with S_j = { i | N_ij > 0 and C_ij exists } and candidate
beta in {0.0, 0.25, 0.5, 0.75, 1.0}. Architecture, model aggregation, loss terms, and
inference follow the PROTEAN baseline (Chennoufi et al., 2025).
Immutable source
planningawal/PROTEAN_Revisi_Lurus.mdis the authoritative research specification and is read-only. Do not edit, add, rename, move, or delete anything underplanningawal/.
External raw datasets (read-only, never copied into the repo)
~/datasets/X-IIoTID/X-IIoTID-dataset.csv~/datasets/5G-NIDD/5G-NIDD.csv
Paths are configured in configs/datasets/datasets.yaml (with environment overrides) and are
never hardcoded in source. Generated artifacts go under artifacts/.
Layout
docs/research/ spec interpretation, dataset inspection, implementation plan, protocol
docs/baseline/ PROTEAN baseline investigation
docs/handoff/ session handoff (start here for a new session)
configs/ datasets, experiments, model
src/protean_research/ aggregation (implemented), data/federated/models/evaluation (planned)
tests/ unit tests
artifacts/ results/ generated outputs (not source)
Status
This is a planning/bootstrap state. No full training has been run and no experimental sweep has been launched. The original PROTEAN baseline has no public official code, so it must be reproduced from the paper.
Read docs/handoff/SESSION_HANDOFF.md first, then
planningawal/PROTEAN_Revisi_Lurus.md.
Quickstart
# inside the repo, with a virtualenv that has pyyaml + pytest
python -m pytest -q
The aggregation module is dependency-free and testable without pandas/torch:
from protean_research.aggregation import aggregate_prototypes
aggregate_prototypes([[0.0, 2.0], [2.0, 0.0]], "support_weighted", beta=0.5, supports=[1, 3])