OSCR

Optimal Size of Electrocorticography Grids for Classification of Hand Movements.

Code ↔ Paper

9 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 9 matches
  1. [1] § Materials and Methods › Classification ↔ subopt/hillclimbing.py, lines 467–560 · score 0.86 · min max scaler, cross validation, scikit-learn, SVC, Machine, SVM
  2. [2] § Materials and Methods › Classification ↔ subopt/exhaustive.py, lines 132–211 · score 0.86 · min max scaler, cross validation, scikit-learn, SVC, Machine, SVM
  3. [3] § Materials and Methods › Preprocessing ↔ examples/synth_data.py, lines 131–197 · score 0.80 · power feature, high frequency band, epochs, amplitude, noise, Preprocessing
  4. [4] § Materials and Methods › Performance-area Trade-off ↔ subopt/base.py, lines 315–377 · score 0.71 · inter electrode distance, electrode diameter, surface area, IED, height, width
  5. [5] § Materials and Methods › Exhaustive Subgrid Search ↔ subopt/exhaustive.py, lines 132–211 · score 0.69 · cross validation splits, exhaustive search, SVM, model, fold, trained
  6. [6] § Materials and Methods › Exhaustive Subgrid Search ↔ subopt/hillclimbing.py, lines 467–560 · score 0.63 · cross validation splits, SVM, model, fold, trained, stochastic
  7. [7] § Materials and Methods › Exhaustive Subgrid Search ↔ subopt/exhaustive.py, lines 23–124 · score 0.60 · possible subgrid, exhaustive search, iteratively, space, rows, configuration
  8. [8] § Results › Performance-area Analysis ↔ subopt/base.py, lines 315–377 · score 0.59 · Inter Electrode Distance, Electrode Diameter, surface area, IED, class, score
  9. [9] § Materials and Methods › Participants ↔ examples/synth_data.py, lines 14–49 · score 0.50 · sensorimotor cortex, ECoG

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 · 314 lines · 11 KB · MIT · 3 matches

  1. # -------------------------------------------------------------
  2. # Subgrid Optimization
  3. # Copyright (c) 2026
  4. # Dirk Keller, Nick Ramsey's Lab, University Medical Center Utrecht, University Utrecht
  5. # Licensed under the MIT License [see LICENSE for detail]
  6. # -------------------------------------------------------------
  7. from copy import copy
  8. from typing import Tuple, Union, Any, Optional, Type, List
  9. import numpy as np
  10. import pandas as pd
  11. from sklearn.base import MetaEstimatorMixin, TransformerMixin
  12. from sklearn.model_selection import BaseCrossValidator
  13. from sklearn.pipeline import Pipeline
  14. from sklearn.utils.validation import check_is_fitted as sklearn_is_fitted
  15. from tqdm import tqdm
  16. from .base import BaseOptimizer
  17. from .utils import compute_subgrid_dimensions
  18. class ExhaustiveSearch(MetaEstimatorMixin, TransformerMixin):
  19. """
  20. Performs an exhaustive search over all possible subgrids in a given channel grid,
  21. evaluating each using a specified objective function.
  22. Parameters:
  23. -----------
  24. :param channel_grid: numpy.ndarray
  25. The grid of channel IDs.
  26. :param func: callable
  27. The objective function, which takes a mask and a list of included channels and returns a metric score.
  28. :param verbose: bool, default = False
  29. If set to True, outputs progress messages during the optimization process.
  30. Returns:
  31. --------
  32. :return: None
  33. """
  34. def __init__(self, channel_grid, func, verbose=False) -> None:
  35. self.channel_grid = channel_grid
  36. self.objective = func
  37. self.verbose = verbose
  38. def run(self) -> Tuple[int, np.ndarray]:
  39. """
  40. Executes the exhaustive search to find the best subgrid spatially constrained
  41. channel combination.
  42. Iteratively searches through the whole subgrid space.
  43. Records and returns the evaluation history.
  44. Returns:
  45. --------
  46. :return: tuple
  47. A tuple containing the best score achieved, the corresponding mask
  48. for the best subgrid, and a DataFrame detailing the evaluation results
  49. for each configuration.
  50. """
  51. best_score = 0.0
  52. best_mask = None
  53. # Main loop over the number of starting positions
  54. height, width = self.channel_grid.shape
  55. subgrids = self.generate_subgrids(height, width)
  56. mask_template = np.zeros_like(self.channel_grid, dtype=bool)
  57. pbar = range(len(subgrids))
  58. if self.verbose:
  59. pbar = tqdm(
  60. pbar, desc="Exhaustive Search", postfix={"score": f"{best_score:.6f}"}
  61. )
  62. for idx in pbar:
  63. start_row, start_col, end_row, end_col = subgrids[idx]
  64. mask = copy(mask_template)
  65. mask[start_row:end_row, start_col:end_col] = True
  66. # Calculate the score for the current subgrid
  67. score = self.objective(mask)
  68. # Check if this is the best score so far
  69. if score > best_score:
  70. best_score = score
  71. best_mask = mask
  72. if self.verbose:
  73. pbar.set_postfix({"score": f"{best_score:.6f}"})
  74. return best_score, best_mask
  75. @staticmethod
  76. def generate_subgrids(
  77. grid_height: int, grid_width: int
  78. ) -> List[Tuple[int, int, int, int]]:
  79. """
  80. Generates all possible subgrids within a given grid height and width.
  81. Each subgrid is defined by its starting and ending coordinates.
  82. Parameters:
  83. -----------
  84. :param grid_height: int
  85. The height of the grid.
  86. :param grid_width: int
  87. The width of the grid.
  88. Returns:
  89. --------
  90. :return: List[Tuple[int, int, int, int]]
  91. A list of tuples, where each tuple contains the coordinates of a subgrid in the format
  92. (start_row, start_col, end_row, end_col).
  93. """
  94. subgrids = []
  95. for start_row in range(grid_height + 1):
  96. for start_col in range(grid_width + 1):
  97. for end_row in range(start_row, grid_height + 1):
  98. for end_col in range(start_col, grid_width + 1):
  99. if start_row < end_row and start_col < end_col:
  100. subgrids.append((start_row, start_col, end_row, end_col))
  101. return subgrids
  102. ########################################################################################
  103. ###################### Scikit-Learn: SpatialStochasticHillClimbing #####################
  104. ########################################################################################
  105. class SpatialExhaustiveSearch(BaseOptimizer):
  106. """
  107. Implements a spatially constrained exhaustive search for finding
  108. global best channel combinations within a grid based on a given metric.
  109. Parameters:
  110. -----------
  111. :param grid: numpy.ndarray
  112. The grid structure specifying how channels are arranged.
  113. :param estimator: Union[Any, Pipeline]
  114. The machine learning estimator or pipeline to evaluate
  115. channel combinations.
  116. :param metric: str, default = 'f1_weighted'
  117. The metric to optimize, compatible with scikit-learn metrics.
  118. :param cv: Union[BaseCrossValidator, int], default = 10
  119. Cross-validation splitting strategy, can be a fold number
  120. or a scikit-learn cross-validator.
  121. :param n_jobs: int, default = 1
  122. Number of parallel jobs to run during cross-validation.
  123. '-1' uses all available cores.
  124. :param seed: Optional[int], default = None
  125. Seed for randomness, ensuring reproducibility.
  126. :param verbose: Union[bool, int], default = False
  127. Enables verbose output during the optimization process.
  128. Methods:
  129. --------
  130. - fit:
  131. Fit the model to the data, search through the spatial
  132. constrained channel combinations.
  133. - transform:
  134. Apply the mask obtained from the search to transform the data.
  135. - run:
  136. Execute the spatial exhaustive search.
  137. - evaluate_candidates:
  138. Evaluates the selected features using cross-validation or train-test split.
  139. - objective_function:
  140. Evaluate each candidate configuration and return their scores.
  141. - elimination_plot:
  142. Generate and save a plot visualizing the performance across different subgrid sizes.
  143. - importance_plot:
  144. Generate and save a heatmap visualizing the importance of each channel.
  145. Notes:
  146. ------
  147. This implementation is semi-compatible with the scikit-learn
  148. framework, which builds around two-dimensional feature matrices.
  149. To use this transformation within a scikit-learn Pipeline, the
  150. four dimensional data must eb flattened after the first dimension
  151. [samples, features]. For example, scikit-learn's FunctionTransformer can
  152. achieve this.
  153. Examples:
  154. ---------
  155. The following example shows how to retrieve a feature mask for
  156. a synthetic data set.
  157. # >>> import numpy as np
  158. # >>> from sklearn.svm import SVC
  159. # >>> from sklearn.pipeline import Pipeline
  160. # >>> from sklearn.preprocessing import MinMaxScaler
  161. # >>> from sklearn.datasets import make_classification
  162. # >>> from subopt.exhaustive import SpatialExhaustiveSearch
  163. # >>> X, y = make_classification(n_samples=100, n_features=8 * 4 * 100)
  164. # >>> X = X.reshape((100, 8, 4, 100))
  165. # >>> grid = np.arange(1, 33).reshape(X.shape[1:3])
  166. # >>> estimator = Pipeline([('scaler', MinMaxScaler()), ('svc', SVC())])
  167. # >>> shc = SpatialExhaustiveSearch(grid, estimator, verbose=True)
  168. # >>> shc.fit(X, y)
  169. # >>> print(shc.mask_)
  170. array([[False True False False], [False False False False], [ True True False False], [False False False True],
  171. [False False False False], [False False False False], [False False True False], [False False False False]])
  172. # >>> print(shc.score_)
  173. 26.966666666666672
  174. Returns:
  175. --------
  176. :return: None
  177. """
  178. def __init__(
  179. self,
  180. # General and Decoder
  181. grid: np.array,
  182. estimator: Union[Any, Pipeline],
  183. metric: str = "f1_weighted",
  184. cv: Union[BaseCrossValidator, int] = 10,
  185. # Misc
  186. n_jobs: int = 1,
  187. seed: Optional[int] = None,
  188. verbose: Union[bool, int] = False,
  189. ) -> None:
  190. super().__init__(grid, estimator, metric, cv, n_jobs, seed, verbose)
  191. def fit(
  192. self, X: np.ndarray, y: np.ndarray = None
  193. ) -> Type["SpatialExhaustiveSearch"]:
  194. """
  195. Fit method optimizes the channel combination with
  196. Spatial Exhaustive Search.
  197. Parameters:
  198. -----------
  199. :param X: numpy.ndarray
  200. Array-like with dimensions [samples, channel_height, channel_width, time]
  201. :param y: numpy.ndarray, default = None
  202. Array-like with dimensions [targets].
  203. Return:
  204. -----------
  205. :return: Type['SpatialExhaustiveSearch']
  206. """
  207. self.X_ = X
  208. self.y_ = y
  209. self.iter_ = int(0)
  210. self.result_grid_ = []
  211. self.solution_, self.mask_, self.score_ = self.run()
  212. # Conclude the result grid (Calculate the Size and Height)
  213. self.result_grid_ = pd.concat(self.result_grid_, axis=0, ignore_index=True)
  214. self.result_grid_[["Height", "Width"]] = self.result_grid_["Mask"].apply(
  215. lambda mask: pd.Series(compute_subgrid_dimensions(mask))
  216. )
  217. columns = list(self.result_grid_.columns)
  218. size_index = columns.index("Size")
  219. new_order = (
  220. columns[: size_index + 1]
  221. + ["Height", "Width"]
  222. + columns[size_index + 1 : -2]
  223. )
  224. self.result_grid_ = self.result_grid_[new_order]
  225. return self
  226. def transform(self, X: np.ndarray, y: np.ndarray = None) -> np.ndarray:
  227. """
  228. Transforms the input with the mask obtained from
  229. the solution of Spatial Exhaustive Search.
  230. Parameters:
  231. -----------
  232. :param X: numpy.ndarray
  233. Array-like with dimensions [samples, channel_height, channel_width, time]
  234. :param y: numpy.ndarray, default = None
  235. Array-like with dimensions [targets].
  236. Return:
  237. -----------
  238. :return: numpy.ndarray
  239. Returns a filtered array-like with dimensions
  240. [samples, channel_height, channel_width, time]
  241. """
  242. sklearn_is_fitted(self)
  243. return X[:, self.mask_, :]
  244. def run(self) -> Tuple[np.ndarray, np.ndarray, float]:
  245. """
  246. Executes the Spatial Exhaustive Search.
  247. Parameters:
  248. --------
  249. :return: Tuple[numpy.ndarray, float]
  250. The best channel configuration and its score.
  251. Returns:
  252. --------
  253. :return: Tuple[numpy.ndarray, numpy.ndarray, float, pandas.DataFrame]
  254. A tuple with the solution, mask, the evaluation scores and the optimization history.
  255. """
  256. # Initialize and run the SSHC optimizer
  257. es = ExhaustiveSearch(
  258. func=self.objective_function, channel_grid=self.grid, verbose=self.verbose
  259. )
  260. score, mask = es.run()
  261. solution = mask.reshape(-1).astype(float)
  262. best_state = mask
  263. best_score = score * 100
  264. return solution, best_state, best_score

exhaustive.py at commit d1d856f, under MIT · at the source

Overview

  1. Department of Neurology and Neurosurgery, University Medical Center Utrecht Brain Center, Utrecht University, Utrecht, The Netherlands
  2. Department of Information and Computing Sciences, Utrecht University, Utrecht, The Netherlands
  3. Donders Institute for Brain, Cognition and Behaviour, Radboud University, Nijmegen, The Netherlands
Journal: Neuroinformatics, volume 24, issue 3, article 52
Dates: received 10 April 2026; accepted 28 July 2026; published online 7 August 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1007/s12021-026-09807-z · PMID 42563025 · PMCID PMC13447543 · OpenAlex W7196935738
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: intracranial EEG (iEEG / ECoG / SEEG) (modality), human (organism), epilepsy (population), methods / tools (subfield)
Methods: Spectral & time-frequency, Connectivity, Machine learning, Statistics, Preprocessing
Keywords: Electrocorticography, Hand movement, Grid size, Classification, Brain-computer interfaces
MeSH: Brain-Computer Interfaces*, Electrocorticography*, Hand*, Adult, Electrodes, Implanted, Epilepsy, Female, Humans, Male, Movement, Young Adult (* major topic)
Topic: EEG and Brain-Computer Interfaces (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: HORIZON EUROPE Framework Programme (101070939); Dutch Research Council (NWO) (024.005.022, 17619, 19072)
Citations: not cited yet (Europe PMC); 57 references in the paper

Abstract

Implanted Brain-Computer Interfaces (BCIs) hold significant promise as a replacement for conventional assistive technologies for people with extensive motor impairments. In recent years, significant progress has been made in enhancing BCI performance, bringing clinically viable systems within reach. Some of these developments rely on increasingly large numbers of high spatial-density electrocorticography (ECoG) electrodes, which enable the extraction of spatially detailed information from extensive brain areas, but may also elevate surgical burden, posing a challenge for the clinical adoption of implanted BCIs. To mitigate this risk, we conducted an exhaustive investigation of hand movement classification performance involving 4, 5, and 8 classes in nine individuals with epilepsy, exploring all possible rectangular ECoG subgrids within the 32-, 64-, and 128-channel grids that were implanted in these individuals. Our findings reveal that the surface area of ECoG grids can be substantially reduced by 75–94% compared to the original grids, without a meaningful decline in classification performance, if electrodes are placed over informative areas. Classification performance across datasets was stable for progressively smaller subgrids until a critical threshold of approximately 60mm2 was reached, below which performance declined substantially. We show that smallest subgrids with an area above the threshold achieved equally high classification F1 scores (range 81.64-99.71%) as the full grids with an area > 230mm2 (range 82.85-96.75%). We conclude that ECoG-based BCI can be used to accurately decode up to seven different hand movements from well-located grids with a small number of electrodes, paving the way for smaller and safer BCI implants.

Supplementary Information: The online version contains supplementary material available at 10.1007/s12021-026-09807-z.

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 9 matches between paragraphs and lines of code.

UMCU-RIBS/Subgrid-Optimization

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: d1d856fc2fc4d457bebe8315c3dc93c13c4d5e1a, 4 August 2026
Languages: Python (7)
Size: 15 files, 7 scripts
Software Heritage: not archived
Found in: “Code Availability”
Holds: README, license file, environment (Dockerfile, project.toml), documentation
Not found: CITATION.cff, tests, continuous integration
Tools: NumPy (6 files), pandas (4 files), scikit-learn (4 files), SciPy (2 files), Matplotlib (1 file), seaborn (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
9 files

Code Availability

The code describing the subgrid search algorithm (SpatialExhaustiveSearch.py), which evaluates all possible subgrid combinations within the ECoG grid, is available in GitHub upon publication. https://github.com/UMCU-RIBS/Subgrid-Optimization/.

Reproduced under the paper's license (CC BY), from the paper cited above.

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;
  • 7 scripts, each with its path and the digest of its content;
  • 9 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

The data that support the findings of this study are not publicly available due to privacy restrictions. However, data can be provided upon reasonable request and subject to legal data transfer agreement.

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 3, 28 September 2026

  • Publisher: n/a → Springer Science+Business Media

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 5 keywords, 11 MeSH terms, 2 funders, 56 references.

Cite

This paper

Offenberg, E. C., Keller, D., Mehrkanoon, S., Berezutskaya, J., Vansteensel, M. J., & Branco, M. P. (2026). Optimal Size of Electrocorticography Grids for Classification of Hand Movements. Neuroinformatics, 24(3), 52. https://doi.org/10.1007/s12021-026-09807-z

BibTeX

@article{offenberg2026optimal,
author = {Offenberg, Elena C and Keller, Dirk and Mehrkanoon, Siamak and Berezutskaya, Julia and Vansteensel, Mariska J and Branco, Mariana P},
title = {{Optimal Size of Electrocorticography Grids for Classification of Hand Movements}},
journal = {Neuroinformatics},
year = {2026},
month = aug,
volume = {24},
number = {3},
pages = {52},
publisher = {Springer Science+Business Media},
issn = {1539-2791},
doi = {10.1007/s12021-026-09807-z},
url = {https://doi.org/10.1007/s12021-026-09807-z},
pmid = {42563025},
pmcid = {PMC13447543}
}

RIS

TY - JOUR
AU - Offenberg, Elena C
AU - Keller, Dirk
AU - Mehrkanoon, Siamak
AU - Berezutskaya, Julia
AU - Vansteensel, Mariska J
AU - Branco, Mariana P
TI - Optimal Size of Electrocorticography Grids for Classification of Hand Movements
T2 - Neuroinformatics
J2 - Neuroinformatics
PY - 2026
DA - 2026/08/07
VL - 24
IS - 3
SP - 52
SN - 1539-2791
PB - Springer Science+Business Media
DO - 10.1007/s12021-026-09807-z
UR - https://doi.org/10.1007/s12021-026-09807-z
LA - en
ER -

CSL-JSON

{
"id": "10.1007/s12021-026-09807-z",
"type": "article-journal",
"title": "Optimal Size of Electrocorticography Grids for Classification of Hand Movements",
"container-title": "Neuroinformatics",
"author": [
{
"family": "Offenberg",
"given": "Elena C"
},
{
"family": "Keller",
"given": "Dirk"
},
{
"family": "Mehrkanoon",
"given": "Siamak"
},
{
"family": "Berezutskaya",
"given": "Julia"
},
{
"family": "Vansteensel",
"given": "Mariska J"
},
{
"family": "Branco",
"given": "Mariana P"
}
],
"container-title-short": "Neuroinformatics",
"volume": "24",
"issue": "3",
"page": "52",
"DOI": "10.1007/s12021-026-09807-z",
"PMID": "42563025",
"PMCID": "PMC13447543",
"ISSN": "1539-2791",
"publisher": "Springer Science+Business Media",
"URL": "https://doi.org/10.1007/s12021-026-09807-z",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
7
]
]
}
}

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/s41591-026-04414-6 [code]
Long-term independent use of an intracortical brain-computer interface for speech and cursor control.
Journal: Nature medicine
In common: pandas, SciPy, Matplotlib, 1 other tool, 5 references, author Elena C Offenberg
[2] doi:10.1016/j.neuroimage.2026.121837
Optimal location for gesture decoding in the sensorimotor cortex and implications for brain-computer interface research.
Journal: NeuroImage
In common: 9 references
[3] doi:10.1038/s41467-026-71284-4 [code]
Encoding of speech modes and loudness in ventral precentral gyrus.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, 5 references
[4] doi:10.1038/s41586-026-10331-y [code]
Active dissociation of intracortical spiking and high gamma activity.
Journal: Nature
In common: scikit-learn, pandas, SciPy, 2 other tools, 5 references
[5] doi:10.1038/s41467-026-75455-1 [code]
Shared latent representations of speech production for cross-patient speech decoding.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, intracranial EEG (iEEG / ECoG / SEEG), 4 references
[6] doi:10.1073/pnas.2516293123
Distinct laminar origins of sensory-evoked high-gamma and low-frequency ECoG signals revealed by optogenetics.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: intracranial EEG (iEEG / ECoG / SEEG), 6 references
[7] doi:10.1038/s41586-026-10653-x [code]
A mosaic of whole-body representations on the human precentral gyrus.
Journal: Nature
In common: scikit-learn, SciPy, Matplotlib, 1 other tool, 4 references
[8] doi:10.1126/sciadv.adw3876 [code]
Intracortical brain-computer interface for navigation in virtual reality in macaque monkeys.
Journal: Science advances
In common: seaborn, scikit-learn, pandas, 3 other tools, 2 references
[9] doi:10.1038/s41467-026-76109-y [code]
Assistive algorithms influence neural representations in motor brain-computer interfaces.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, 2 references
[10] doi:10.1038/s41593-026-02258-4 [code]
Laminar organization of cellular microcircuits modulating human interictal epileptiform discharges.
Journal: Nature neuroscience
In common: seaborn, scikit-learn, pandas, 3 other tools, epilepsy, 1 reference

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.

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.