Leednet: a lightweight network for event detection in EEG signals.
The 7 matches
- [1] § Results and discussion › Feature extraction using signal decomposition techniques ↔ ablation_study/preprocess_data.py, lines 59–87 · score 0.74 · Frequency Domain Features, peak frequency, bandwidth, kurtosis, sum, centroid
- [2] § Methodology › Training protocol ↔ ablation_study/src/train_eval.py, lines 200–250 · score 0.69 · AdamW, ReduceLROnPlateau, weight decay, scheduler, optimizer, epochs
- [3] § Results and discussion › Feature extraction using signal decomposition techniques ↔ ablation_study/notebooks/exp25_vmd_handcrafted_features.ipynb, lines 1–50 · score 0.68 · spectral centroid, peak frequency, VMD, Frequency Domain, skewness, bandwidth
- [4] § Methodology › Training protocol ↔ experiments/LEEDNet_Parameters.ipynb, lines 32–73 · score 0.68 · AdamW, ReduceLROnPlateau, weight decay, scheduler, optimizer, loss
- [5] § Methodology › Dataset and segment annotation ↔ Dataset_Creation/config.py, lines 75–105 · score 0.64 · delta slow wave, Sharp Waves, duration, validation, Spike, abnormal
- [6] § Methodology › Dataset and segment annotation ↔ Dataset_Creation/abnormality_extraction.ipynb, lines 70–113 · score 0.62 · delta slow wave, Sharp Waves, polyspikes, abnormal, activity
- [7] § Methodology › Model architecture › Single-branch LEEDNet ↔ ablation_study/src/models/LEEDNetModel.py, lines 116–202 · score 0.50 · fusion gate, head, single branch, module, classification, EEG
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 208 lines · 8.3 KB · no license · 1 match
- import os
- import sys
- import numpy as np
- import pandas as pd
- import torch
- import pywt
- from scipy.signal import lfilter, bessel
- from tqdm import tqdm
- from vmdpy import VMD
- from scipy.stats import kurtosis, skew, entropy
- # --- Pre-processing Functions ---
- def bessel_bandpass(data, lowcut=0.01, highcut=15, fs=200, order=4):
- b, a = bessel(order, [lowcut, highcut], btype='band', fs=fs)
- return lfilter(b, a, data)
- # MSPCA (copied from notebooks for consistency)
- def _hankel_avg(matrix, orig_len):
- K, L = matrix.shape
- result = np.zeros(orig_len); counts = np.zeros(orig_len)
- for i in range(K):
- result[i:i+L] += matrix[i]
- counts[i:i+L] += 1
- return result / counts
- def mspca_denoise(signal, wavelet='db4', level=5, device=None):
- if device is None:
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- sig = np.array(signal, dtype=np.float64).flatten()
- n = len(sig)
- coeffs = pywt.wavedec(sig, wavelet, level=level)
- rec = np.zeros(n)
- for i, c in enumerate(coeffs):
- L = len(c)
- K = n - L + 1
- if K <= 0:
- temp_coeffs = [np.zeros_like(cc) for cc in coeffs]
- temp_coeffs[i] = c
- rec += pywt.waverec(temp_coeffs, wavelet)[:n]
- continue
- H = np.zeros((K, L))
- for j in range(K): H[j] = sig[j:j+L]
- H_t = torch.tensor(H, dtype=torch.float32).to(device)
- U, S, V = torch.svd(H_t)
- S_np = S.cpu().numpy(); s_sq = S_np**2; var = np.cumsum(s_sq) / np.sum(s_sq)
- rank = np.searchsorted(var, 0.95) + 1
- S_th = torch.zeros_like(S); S_th[:rank] = S[:rank]
- H_rec = torch.mm(U, torch.mm(torch.diag(S_th), V.t())).cpu().numpy()
- rec += _hankel_avg(H_rec, n)
- return rec / len(coeffs)
- def vmd_decompose(signal, n_modes=5):
- # n_modes Intrinsic Mode Functions (IMFs)
- # alpha=2000, tau=0, K=n_modes, DC=0, init=1, tol=1e-7
- u, u_hat, omega = VMD(signal, 2000, 0, n_modes, 0, 1, 1e-7)
- return u # [n_modes, T]
- def extract_vmd_features(imfs, fs=200):
- all_feats = []
- for imf in imfs:
- # Energy features
- energy = np.sum(imf**2)
- # Statistical features
- m = np.mean(imf)
- v = np.var(imf)
- s = np.std(imf)
- k = kurtosis(imf)
- sk = skew(imf)
- # Entropy features
- p = np.abs(imf) + 1e-12
- p /= np.sum(p)
- h = entropy(p)
- # Frequency-domain features
- fft = np.fft.rfft(imf)
- mags = np.abs(fft)
- freqs = np.fft.rfftfreq(len(imf), d=1/fs)
- sum_mags = np.sum(mags) + 1e-12
- centroid = np.sum(freqs * mags) / sum_mags
- bandwidth = np.sqrt(np.sum(((freqs - centroid)**2) * mags) / sum_mags)
- peak_freq = freqs[np.argmax(mags)]
- all_feats.extend([energy, m, v, s, k, sk, h, centroid, bandwidth, peak_freq])
- return np.array(all_feats, dtype=np.float32)
- # --- Main Script ---
- def preprocess_experiment(exp_id, csv_files, base_save_dir, device):
- print(f"\n>>> Processing Experiment {exp_id}...")
- num_skipped = 0
- num_processed = 0
- for csv_path in csv_files:
- df = pd.read_csv(csv_path)
- new_data = []
- save_dir = os.path.join(base_save_dir, f"exp{exp_id}", os.path.basename(csv_path).replace('.csv', ''))
- os.makedirs(save_dir, exist_ok=True)
- desc = f"Exp{exp_id} - {os.path.basename(csv_path)}"
- for idx, row in tqdm(df.iterrows(), total=len(df), desc=desc):
- file_path = row['file_name']
- # Save Path Check
- save_name = os.path.basename(file_path).replace('.npz', '.npy')
- save_path = os.path.join(save_dir, save_name)
- if os.path.exists(save_path):
- num_skipped += 1
- new_row = row.copy()
- new_row['file_name'] = save_path
- new_data.append(new_row)
- continue
- try:
- raw_data = np.load(file_path)['data'][0] # Channel 0
- except Exception as e:
- print(f"Error loading {file_path}: {e}")
- continue
- # Apply Pre-processing
- if exp_id == 1: # Symlet DWT
- filtered = bessel_bandpass(raw_data)
- coeffs = pywt.wavedec(filtered, 'sym5', level=4)
- feat = np.concatenate(coeffs).astype(np.float32)
- elif exp_id == 2: # Daubechies DWT
- filtered = bessel_bandpass(raw_data)
- coeffs = pywt.wavedec(filtered, 'db4', level=4)
- feat = np.concatenate(coeffs).astype(np.float32)
- elif exp_id == 3: # MSPCA
- feat = mspca_denoise(raw_data, device=device).astype(np.float32)
- elif exp_id == 4: # VMD
- filtered = bessel_bandpass(raw_data)
- feat = vmd_decompose(filtered, n_modes=5).astype(np.float32)
- elif exp_id == 5: # Baseline (t-SNE)
- feat = bessel_bandpass(raw_data).astype(np.float32)
- elif exp_id == 6: # Mexican Hat CWT (mexh)
- filtered = bessel_bandpass(raw_data)
- coeffs, _ = pywt.cwt(filtered, np.arange(1, 31), 'mexh', sampling_period=1/200)
- feat = coeffs.astype(np.float32)
- elif exp_id == 7: # Real Morlet CWT (morl)
- filtered = bessel_bandpass(raw_data)
- coeffs, _ = pywt.cwt(filtered, np.arange(1, 31), 'morl', sampling_period=1/200)
- feat = coeffs.astype(np.float32)
- elif exp_id == 8: # Gaussian Derivative CWT (gaus5)
- filtered = bessel_bandpass(raw_data)
- coeffs, _ = pywt.cwt(filtered, np.arange(1, 31), 'gaus5', sampling_period=1/200)
- feat = coeffs.astype(np.float32)
- elif exp_id == 9: # STFT / FFT Branch
- from scipy.signal import stft
- filtered = bessel_bandpass(raw_data)
- # raw_data is 1D, so filtered is 1D
- spec = np.abs(stft(filtered, fs=200, nperseg=64, noverlap=32)[2])**2
- feat = spec.astype(np.float32)
- elif exp_id == 24: # Sequential VMD -> CWT
- filtered = bessel_bandpass(raw_data)
- imfs = vmd_decompose(filtered, n_modes=5)
- cwt_results = []
- for i in range(imfs.shape[0]):
- coeffs, _ = pywt.cwt(imfs[i], np.arange(1, 31), 'cmor1.5-1.0', sampling_period=1/200)
- cwt_results.append(np.abs(coeffs))
- feat = np.mean(np.stack(cwt_results, axis=0), axis=0).astype(np.float32)
- elif exp_id == 25: # VMD Hand-crafted Features
- filtered = bessel_bandpass(raw_data)
- imfs = vmd_decompose(filtered, n_modes=5)
- feat = extract_vmd_features(imfs).astype(np.float32) # [50]
- # Save
- np.save(save_path, feat)
- num_processed += 1
- # Record
- new_row = row.copy()
- new_row['file_name'] = save_path
- new_data.append(new_row)
- # Save new CSV
- new_df = pd.DataFrame(new_data)
- # Special case mapping to match old suffix conventions
- suffix_str = f'_exp{exp_id}'
- if exp_id == 9:
- suffix_str = '_fft'
- new_csv_path = csv_path.replace('.csv', f'{suffix_str}.csv')
- new_df.to_csv(new_csv_path, index=False)
- print(f"Saved new catalog to {new_csv_path}")
- print(f"Experiment {exp_id} finished: Processed {num_processed}, Skipped {num_skipped}")
- if __name__ == "__main__":
- csv_files = [
- '/media/hira/SSD 4TB/code/LEEDNet_EEG_Event_Detection/ablation_study/dataset/train.csv',
- '/media/hira/SSD 4TB/code/LEEDNet_EEG_Event_Detection/ablation_study/dataset/eval.csv',
- '/media/hira/SSD 4TB/code/LEEDNet_EEG_Event_Detection/ablation_study/dataset/test.csv'
- ]
- base_save_dir = '/media/hira/SSD 4TB/code/LEEDNet_EEG_Event_Detection/ablation_study/dataset/preprocessed'
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- print(f"Using device: {device}")
- # Run pre-processing for all experiments (1 through 9)
- preprocess_experiment(25, csv_files, base_save_dir, device)
- # for i in range(1, 10):
- # preprocess_experiment(i, csv_files, base_save_dir, device)
- print("\\nAll pre-processing complete!")
preprocess_data.py at commit 84143e0, no license · at the source
Overview
- College of Computer Science and Engineering, University of Jeddah, Jeddah, Saudi Arabia
- School of Electrical Engineering and Computer Science, National University of Sciences and Technology, Islamabad, Pakistan
- Deep Learning Laboratory, National Center of Artificial Intelligence, Islamabad, Pakistan
- Department of Applied Artificial Intelligence and Robotics, Aston University Birmingham, Birmingham, B4 7ET United Kingdom
- Pak-Emirates Military Hospital, Rawalpindi, Pakistan
- AI Lounge Private Limited, Islamabad, Pakistan
- Guangdong CAS Cogniser Information Technology Co., Ltd., Guangzhou, China
Abstract
Detection of diagnostically relevant events within an EEG recording requires making classification decisions about small event windows of a few seconds duration each. For long-duration EEG recordings, this can translate into thousands of decisions leading to a high computational load, which must be reduced for field deployments of EEG triage and decision support systems, especially in resource-constrained healthcare systems. In this work, we explore three avenues for enhancing computational efficiency: (1) purpose-built architectures; (2) length of the decision window/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 7 matches between paragraphs and lines of code.
dll-ncai/LEEDNet_EEG_Event_Detection
84143e0dd284e3b391f88f5c35a6ded123d48c26, 3 April 2026Availability: 1 check, the latest on 28 September 2026: the link answers
- 28 September 2026: the link answers
46 files
- Dataset_Creation/
abnormality_extraction.i , Jupyter, 1,006 lines, 1 matchpynb - Dataset_Creation/
config.py , Python, 105 lines, 1 match - EEGDataLoader.py, Python, 77 lines
- ablation_study/
notebooks/ , Jupyter, 57 linesexp10_cmor_FFT_Wavelet.i pynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp11_cmor_Raw_FFT_Wavel et.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp12_mexh_Raw_Wavelet.i pynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp13_mexh_FFT_Wavelet.i pynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp14_mexh_Raw_FFT_Wavel et.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp15_morl_Raw_Wavelet.i pynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp16_morl_FFT_Wavelet.i pynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp17_morl_Raw_FFT_Wavel et.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp18_gaus5_Raw_Wavelet. ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp19_gaus5_FFT_Wavelet. ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp1_symlet_5_dwt.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp20_gaus5_Raw_FFT_Wave let.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp21_baseline_raw.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp22_baseline_fft.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp23_baseline_cmor.ipyn b - ablation_study/
notebooks/ , Jupyter, 61 linesexp24_vmd_cwt.ipynb - ablation_study/
notebooks/ , Jupyter, 64 lines, 1 matchexp25_vmd_handcrafted_fe atures.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp2_daubechies_4_dwt.ip ynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp3_mspca_denoising.ipy nb - ablation_study/
notebooks/ , Jupyter, 57 linesexp4_variational_mode_de composition.ipynb - ablation_study/
notebooks/ , Jupyter, 188 linesexp5_distinctive_tsne.ip ynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp6_mexican_hat_mexh_cw t.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp7_real_morlet_morl_cw t.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp8_gaussian_deriv_gaus 5_cwt.ipynb - ablation_study/
notebooks/ , Jupyter, 57 linesexp9_cmor_Raw_Wavelet.ip ynb - ablation_study/
preprocess_data.py , Python, 208 lines, 1 match - ablation_study/
src/ , Python, 7 lines__init__.py - ablation_study/
src/ , Python, 30 linesconfig.py - ablation_study/
src/ , Python, 176 linesdataset.py - ablation_study/
src/ , Python, 202 lines, 1 matchmodels/ LEEDNetModel.py - ablation_study/
src/ , Python, 119 linesmodels/ LEEDNet_mini.py - ablation_study/
src/ , Python, 272 lines, 1 matchtrain_eval.py - config.py, Python, 6 lines
- experiments/
LEEDNet_FFT.ipynb , Jupyter, 102 lines - experiments/
LEEDNet_FFT_Wavelet.ipyn , Jupyter, 110 linesb - experiments/
LEEDNet_FFT_Wavelet_visu , Jupyter, 374 linesalization.ipynb - experiments/
LEEDNet_FFT_visualizatio , Jupyter, 163 linesn.ipynb - experiments/
LEEDNet_Parameters.ipynb , Jupyter, 95 lines, 1 match - experiments/
LEEDNet_Raw.ipynb , Jupyter, 108 lines - experiments/
LEEDNet_Raw_FFT.ipynb , Jupyter, 113 lines - experiments/
LEEDNet_Raw_FFT_Wavelet. , Jupyter, 107 linesipynb - experiments/
LEEDNet_Raw_FFT_Wavelet_ , Jupyter, 335 linesvisualization.ipynb - repository limit reached (2,000 files or 30 MB): the rest is at the source (11 files)
- README.md, Text, 29 lines
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 45 scripts, each with its path and the digest of its content;
- 7 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data availability
This study used the publicly available NMT-Events Dataset. The dataset can be accessed at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 28 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 5 keywords, 2 funders, 23 references.
Cite
This paper
Alqarni, M. A., Masood, H., Khan, H. A., Kamboh, A. M., Shafait, S., Jaffarey, T., & Shafait, F. (2026). Leednet: a lightweight network for event detection in EEG signals. Journal on advances in signal processing, 2026(1), 64. https://
BibTeX
@article{alqarni2026leed
author = {Alqarni, Mohammad Ali and Masood, Hira and Khan, Hassan Aqeel and Kamboh, Awais Mehmood and Shafait, Saima and Jaffarey, Tooba and Shafait, Faisal},
title = {{Leednet: a lightweight network for event detection in EEG signals}},
journal = {Journal on advances in signal processing},
year = {2026},
month = may,
volume = {2026},
number = {1},
pages = {64},
issn = {3091-4507},
doi = {10.1186/
url = {https://
pmid = {42598465},
pmcid = {PMC13471070}
}
RIS
TY - JOUR
AU - Alqarni, Mohammad Ali
AU - Masood, Hira
AU - Khan, Hassan Aqeel
AU - Kamboh, Awais Mehmood
AU - Shafait, Saima
AU - Jaffarey, Tooba
AU - Shafait, Faisal
TI - Leednet: a lightweight network for event detection in EEG signals
T2 - Journal on advances in signal processing
J2 - J Adv Signal Process
PY - 2026
DA - 2026/
VL - 2026
IS - 1
SP - 64
SN - 3091-4507
DO - 10.1186/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1186/
"type": "article-journal",
"title": "Leednet: a lightweight network for event detection in EEG signals",
"container-title": "Journal on advances in signal processing",
"author": [
{
"family": "Alqarni",
"given": "Mohammad Ali"
},
{
"family": "Masood",
"given": "Hira"
},
{
"family": "Khan",
"given": "Hassan Aqeel"
},
{
"family": "Kamboh",
"given": "Awais Mehmood"
},
{
"family": "Shafait",
"given": "Saima"
},
{
"family": "Jaffarey",
"given": "Tooba"
},
{
"family": "Shafait",
"given": "Faisal"
}
],
"container-title-short":
"volume": "2026",
"issue": "1",
"page": "64",
"DOI": "10.1186/
"PMID": "42598465",
"PMCID": "PMC13471070",
"ISSN": "3091-4507",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
26
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41598-026-68186-2 [code]
- NeuroStream: spectral-spatio-temporal
deep learning for visual stimulus classification from EEG. Journal: Scientific reportsIn common: PyWavelets, PyTorch, seaborn, 5 other tools, EEG, 2 references - [2] doi:10.1371/journal.pone.0347671 [code]
- RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features.Journal: PloS oneIn common: MNE-Python, PyTorch, seaborn, 5 other tools, EEG, 2 references
- [3] doi:10.3390/bios16080437 [code]
- Deep Learning for Ear-EEG-Based Brain-Computer Interface: A Systematic Comparison and Design Insights.Journal: BiosensorsIn common: MNE-Python, PyTorch, scikit-learn, 3 other tools, EEG, 3 references
- [4] doi:10.3390/brainsci16070680 [code]
- ION-Sim: A Novel Open-Source Simulation Framework for Intraoperative Neurophysiological Monitoring.Journal: Brain sciencesIn common: PyWavelets, MNE-Python, PyTorch, 5 other tools, EEG
- [5] doi:10.1002/hbm.70628 [code]
- EEG Biomarkers for Affective Disorders Diagnosis: An Evaluation and Validation Study.Journal: Human brain mappingIn common: PyWavelets, MNE-Python, PyTorch, 5 other tools, EEG
- [6] doi:10.1371/journal.pone.0354510 [code]
- Personalized adaptive virtual reality experience driven by electroencephalography-b
ased pain recognition. Journal: PloS oneIn common: PyWavelets, MNE-Python, seaborn, 4 other tools, EEG, 1 reference - [7] doi:10.1038/s41746-026-02778-0 [code]
- Trust-gated synthetic EEG augmentation reduces performance drops when generalizing to new patients.Journal: NPJ digital medicineIn common: MNE-Python, PyTorch, scikit-learn, 4 other tools, EEG, 2 references
- [8] doi:10.1002/hbm.70528 [code]
- Explainable AI Insights Into EEG Classification and Its Alignment to Neural Correlates.Journal: Human brain mappingIn common: MNE-Python, PyTorch, seaborn, 5 other tools, EEG, 1 reference
- [9] doi:10.1117/1.nph.13.2.025001 [code]
- Surface-based image reconstruction optimization for high-density functional near-infrared spectroscopy.Journal: NeurophotonicsIn common: PyWavelets, MNE-Python, seaborn, 5 other tools
- [10] doi:10.1126/sciadv.aee9425 [code]
- Probabilistic inference of homonymous and heteronymous recurrent inhibition in human muscles from large-scale motor neuron recordings.Journal: Science advancesIn common: PyWavelets, PyTorch, seaborn, 5 other tools
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 45 scripts, and 7 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:e79a1b5704c2e661…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
