Unimodal vs. multimodal deep learning for non-invasive MGMT promoter methylation prediction in glioblastoma: A systematic evaluation on the BraTS 2021 dataset.
The 6 matches · 2 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Methodology and methods › Baseline ↔ multimodal_run.py, lines 170–212 · score 0.73 · CrossEntropyLoss, loss function, EarlyStopping, Adam, channel, optimized
- [2] § Methodology and methods › Baseline ↔ unimodal_run.py, lines 173–215 · score 0.73 · CrossEntropyLoss, loss function, EarlyStopping, Adam, channel, optimized
- [3] § Methodology and methods › Multimodal approach ↔ vgg16.py, the whole file · a weak match · score 0.69 · convolutional layers, classification layers, intermediate fusion, concatenated, tensor, modality
- [4] § Methodology and methods › Multimodal approach ↔ vgg16.py, the whole file · a weak match · score 0.67 · classification layers, multiple modalities, Early fusion, convolutional, tensor, model
- [5] § Results › Multimodal results ↔ multimodal_run.py, lines 294–340 · score 0.59 · intermediate fusion, early fusion, late fusion, axial, sagittal, multimodal
- [6] § Methodology and methods › Pre-processing ↔ pre_processing.py, lines 167–247 · score 0.59 · pre processing steps, resized, min, max, patient, scans
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 · 355 lines · 15 KB · CC-BY-4.0 · 2 matches
- import time
- import copy
- import pandas as pd
- from pathlib import Path
- from sklearn.model_selection import StratifiedKFold
- import torch
- from torch.utils.data import DataLoader
- import itertools
- import MRIDataset
- import vgg16
- import torch.multiprocessing as mp
- def earlystopping_callback(monitor, best_perf, current_val_loss, current_val_acc, current_patience):
- """
- Check performance for EarlyStopping
- :param monitor: String indicating which metric to track
- :param best_perf: Float, the best performance overall
- :param current_val_loss: Current loss on validation set
- :param current_val_acc: Current accuracy on validation set
- :param current_patience: Current patience
- :return: A flag to save the current model or not, current best performance and updated patience
- """
- # Flag to save or not (deepcopy) model
- deepcopy_new_model = False
- # If we are at the first epoch
- if best_perf is None:
- # Monitor on val_loss
- if monitor == "val_loss":
- best_perf = current_val_loss
- # Monitor on val_acc
- elif monitor == "val_acc":
- best_perf = current_val_acc
- deepcopy_new_model = True
- current_patience = 0
- else:
- if monitor == "val_loss":
- # Check if new best perf
- if current_val_loss < best_perf:
- best_perf = current_val_loss
- deepcopy_new_model = True
- current_patience = 0
- else:
- # Increment patience
- current_patience += 1
- elif monitor == "val_acc":
- if current_val_acc > best_perf:
- best_perf = current_val_acc
- deepcopy_new_model = True
- current_patience = 0
- else:
- current_patience += 1
- return deepcopy_new_model, best_perf, current_patience
- def saving_groundtruth_predictions(val_loader, test_loader, final_model, device_run, path_to_save, namefile):
- """
- After reloading the parameters of the best epoch, evaluating model on validation set and test set and saving
- ground truth and predictions
- :param val_loader: Validation Dataloader
- :param test_loader: Test Dataloader
- :param final_model: Model with the correct weights
- :param device_run: Device to run model
- :param path_to_save: Path to save the .csv file
- :param namefile: String, part of the name for the file
- """
- # Put model on evaluation mode
- final_model.eval()
- all_val_ids = []
- all_val_y_true = []
- all_val_preds = []
- with torch.no_grad():
- for val_inputs, val_labels in val_loader:
- val_inputs = [i.to(device_run) for i in val_inputs]
- val_ids, val_y_true = val_labels
- # Get predictions
- val_predictions = final_model.forward(val_inputs)
- _, val_preds = torch.max(val_predictions, 1)
- all_val_ids.extend(val_ids)
- all_val_y_true.extend(val_y_true)
- all_val_preds.extend(val_preds.cpu())
- # Saving ids, ground_truth, and predictions for validation set
- df = pd.DataFrame({
- "ids": all_val_ids,
- "ground_truth": all_val_y_true,
- "predictions": all_val_preds
- })
- val_namefile = namefile + "_cvVal.csv"
- save_path = path_to_save / val_namefile
- df.to_csv(save_path, index=False)
- all_test_ids = []
- all_test_y_true = []
- all_test_preds = []
- with torch.no_grad():
- for inputs, labels in test_loader:
- inputs = [i.to(device_run) for i in inputs]
- test_ids, test_y_true = labels
- # Get predictions
- test_predictions = final_model.forward(inputs)
- _, test_preds = torch.max(test_predictions, 1)
- all_test_ids.extend(test_ids)
- all_test_y_true.extend(test_y_true)
- all_test_preds.extend(test_preds.cpu())
- # Saving ids, ground_truth, and predictions for validation set
- df = pd.DataFrame({
- "ids": all_test_ids,
- "ground_truth": all_test_y_true,
- "predictions": all_test_preds
- })
- test_namefile = namefile + "_cvTest.csv"
- save_path = path_to_save / test_namefile
- df.to_csv(save_path, index=False)
- return
- def run_multimodal_cv(parameters, data_path, n_folds, device_run, scheduler_on=False):
- """
- Run a cross-validation with a multimodal approach
- :param parameters: Dict of hyperparameters for model and training
- :param data_path: Path to load Dataset
- :param n_folds: Int, number of folds for the cross-validation
- :param device_run: String, device to run the model
- :param scheduler_on: Boolean, True to activate CosineAnnealingWarmRestarts scheduler
- :return: The first dict contain only essential results (last epoch) and the second contain every results
- """
- # Load file with labels
- df_train = pd.read_csv("train_labels.csv").copy()
- # Test set
- df_test = pd.concat(
- [df_train.loc[df_train["MGMT_value"] == 0].sample(frac=0.2, random_state=52),
- df_train.loc[df_train["MGMT_value"] == 1].sample(frac=0.2, random_state=52)]
- )
- # Remove indexes of test set to make train set
- df_train.drop(list(df_test.index.values), inplace=True)
- # Create DataLoader
- test_loader = DataLoader(MRIDataset.MRIDataset(root_path=data_path,
- labels=df_test,
- modality=parameters["modality"]),
- batch_size=parameters["batch_size"],
- num_workers=parameters["num_workers"],
- pin_memory=True)
- skf = StratifiedKFold(n_splits=n_folds)
- # One cv_run with transfer learning and one without
- for transfer_learning_status in ["transfer_learning_on", "transfer_learning_off"]:
- fold_no = 0
- print("Start cross-validation...")
- start_time = time.time()
- for train_idx, val_idx in skf.split(X=df_train.iloc[:, 0], y=df_train.iloc[:, 1]):
- # Create train and validation DataLoader based on folds
- train_loader = DataLoader(MRIDataset.MRIDataset(root_path=data_path,
- labels=df_train.iloc[train_idx],
- modality=parameters["modality"]),
- batch_size=parameters["batch_size"], num_workers=parameters["num_workers"],
- shuffle=True, pin_memory=True)
- validation_loader = DataLoader(MRIDataset.MRIDataset(root_path=data_path,
- labels=df_train.iloc[val_idx],
- modality=parameters["modality"]),
- batch_size=parameters["batch_size"], num_workers=parameters["num_workers"],
- shuffle=False, pin_memory=True)
- # Initialize model
- if transfer_learning_status == "transfer_learning_on":
- model = vgg16.MyVGG16(number_channel=parameters["nb_slices"], type_fusion=parameters["type_fusion"],
- number_modality=len(parameters["modality"]), transfer_learning=True)
- else:
- model = vgg16.MyVGG16(number_channel=parameters["nb_slices"], type_fusion=parameters["type_fusion"],
- number_modality=len(parameters["modality"]), transfer_learning=False)
- model.to(device_run)
- # Loss function and optimizer
- criterion = torch.nn.CrossEntropyLoss()
- optimizer = torch.optim.Adam(model.parameters(), lr=parameters["lr"])
- if scheduler_on:
- scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer=optimizer, T_0=20)
- iters = len(train_loader)
- # Variables for EarlyStopping
- best_model = None
- final_epoch = 0
- best_perf = None
- current_patience = 0
- # Train model
- print(f"Training for fold {fold_no}...")
- for e in range(parameters["epochs_max"]):
- train_acc = 0.0
- train_loss = 0.0
- val_acc = 0.0
- val_loss = 0.0
- model.train()
- # Training set
- for inputs, labels in train_loader:
- inputs = [i.to(device_run) for i in inputs]
- _, y_true = labels
- y_true = y_true.to(device_run)
- outputs = model.forward(inputs)
- loss = criterion(outputs, y_true)
- # Backpropagation
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
- # If Scheduler is on
- if scheduler_on:
- scheduler.step((e + 1) / iters)
- # Computing loss and accuracy - Train
- _, preds = torch.max(outputs, 1)
- train_acc += torch.sum(preds == y_true.data) # Accuracy
- train_loss += loss.item() # Loss
- # Validation set
- model.eval()
- with torch.no_grad():
- for val_inputs, val_labels in validation_loader:
- val_inputs = [i.to(device_run) for i in val_inputs]
- _, val_y_true = val_labels
- val_y_true = val_y_true.to(device_run)
- val_outputs = model.forward(val_inputs)
- val_loss = criterion(val_outputs, val_y_true)
- # Computing loss and accuracy - Validation
- _, val_preds = torch.max(val_outputs, 1)
- val_acc += torch.sum(val_preds == val_y_true.data)
- val_loss += val_loss.item()
- # Compute metrics
- train_acc = (train_acc.float() / len(train_loader.dataset)).cpu().item()
- val_acc = (val_acc.float() / len(validation_loader.dataset)).cpu().item()
- # EarlyStopping
- flag_save_model, best_perf, current_patience = earlystopping_callback(monitor=parameters["monitor_es"],
- best_perf=best_perf,
- current_val_loss=val_loss,
- current_val_acc=val_acc,
- current_patience=current_patience)
- if flag_save_model:
- best_model = copy.deepcopy(model.state_dict())
- final_epoch = e + 1
- if parameters["patience_es"] == current_patience:
- print(f"\nPatience limit is reached ({current_patience}), so training of model is stopped")
- break
- # Training is over and reload models parameters at best epoch
- if not final_epoch == 0:
- model.load_state_dict(best_model)
- # Save ground truth and predictions for validation and test sets
- modality_name = str(parameters["modality"]).replace("[", "").replace("]", "").replace("'", "").replace(", ", "_")
- path_to_save = Path(f'raw_results/{parameters["model"]}/multimodal_approach/{parameters["type_fusion"]}/{parameters["plane"]}/{modality_name}/{parameters["nb_slices"]}/')
- path_to_save.mkdir(parents=True, exist_ok=True)
- if transfer_learning_status == "transfer_learning_on":
- namefile = "with_transfer_learning_fold" + str(fold_no)
- else:
- namefile = "no_transfer_learning_fold" + str(fold_no)
- saving_groundtruth_predictions(val_loader=validation_loader, test_loader=test_loader, final_model=model,
- device_run=device_run, path_to_save=path_to_save, namefile=namefile)
- fold_no += 1
- training_time = time.time() - start_time
- print(f"Execution time: {training_time // 60} min {training_time % 60} s")
- return
- def multiprocessing_process(gpu_id):
- root_data_path = Path("Dataset")
- namefolder_axis = ["Processed_Right_to_Left", "Processed_Posterior_to_Anterior", "Processed_Inferior_to_Superior"]
- planes_name = ["Sagittal", "Coronal", "Axial"]
- axis_to_use = [i for i in range(len(namefolder_axis))]
- list_nb_slices = [1, 3, 8, 16, 24, 32]
- list_modalities = ["FLAIR", "T1w", "T1wCE", "T2w"]
- all_multimodalities = []
- for r in range(2, len(list_modalities) + 1):
- all_multimodalities.extend(itertools.combinations(list_modalities, r))
- nb_gpus = 4
- b = len(all_multimodalities) // nb_gpus
- r = len(all_multimodalities) % nb_gpus
- # Models to train are spread through all available gpus
- sub_lists = []
- start = 0
- for i in range(nb_gpus):
- end = start + b + (1 if i < r else 0)
- sub_lists.append(all_multimodalities[start:end])
- start = end
- current_modaltiies = sub_lists[gpu_id]
- all_combinations = list(itertools.product(current_modaltiies, axis_to_use, list_nb_slices))
- for modalities, index_axis, nb_slices in all_combinations:
- plane = planes_name[index_axis]
- for type_fusion in ["early_fusion", "intermediate_fusion", "late_fusion"]:
- hyper_parameters = {"model": "vgg16",
- "modality": list(modalities),
- "batch_size": 16,
- "num_workers": 2,
- "axis": index_axis,
- "plane": plane,
- "nb_slices": nb_slices,
- "type_fusion": type_fusion,
- "lr": 0.00001,
- "monitor_es": "val_acc",
- "epochs_max": 200,
- "patience_es": 30}
- current_data_path = root_data_path / (namefolder_axis[index_axis] + "_" + str(nb_slices))
- run_multimodal_cv(parameters=hyper_parameters, data_path=current_data_path, n_folds=5, device_run=gpu_id,
- scheduler_on=False)
- return
- if __name__ == "__main__":
- # Multiple models are trained in parallel
- mp.set_start_method("spawn")
- num_gpus = torch.cuda.device_count()
- processes = []
- for gpu_id in range(num_gpus):
- p = mp.Process(target=multiprocessing_process, args=(gpu_id,))
- p.start()
- processes.append(p)
- for p in processes:
- p.join()
multimodal_run.py at commit f0ca21c, under CC-BY-4.0 · at the source
Overview
- BIGR, Inserm, U1134, University Paris City, Paris, France
- Faculty of Sciences and Technology, DSIMB, BIGR, Inserm, U1134, University of Reunion, Saint-Denis, France
- Department of Computer Science, University of Management and Technology, Lahore, Pakistan
- Faculty of Sciences and Technology, ENERGYLab, University of Reunion, Saint-Denis, France
- PEACCEL, AI for Biologics, Paris, France
Abstract
Glioblastoma multiforme (GBM) is the most aggressive primary brain tumor in adults, with a median survival of 14.6 months under standard radiotherapy and temozolomide (TMZ) chemotherapy. The methylation status of the O⁶-methylguanine-DNA methyltransferase (MGMT) promoter is a critical biomarker predicting TMZ response; however, its determination currently requires invasive tissue sampling. Non-invasive prediction of MGMT promoter methylation from multiparametric MRI (mpMRI) through deep learning represents a compelling alternative, yet its clinical feasibility remains unresolved. Using the BraTS 2021 dataset (582 patients, four MRI sequences: FLAIR, T1w, T1wCE, T2w), we conducted a systematic comparative study of unimodal and multimodal deep learning approaches based on VGG-16, exploring 1,380 experimental configurations (unimodal: 192; multimodal: 1,188) across three imaging planes, eight slice counts, and three multimodal fusion strategies (early, intermediate, and late fusion). In the unimodal setting, the best model trained on T2w coronal images (32 slices, no transfer learning) achieved an accuracy of 0.6458 and an AUC of 0.6422 on the validation set, but dropped to 0.5586 and 0.5533 on the independent test set, revealing substantial overfitting attributable to limited dataset size. Strikingly, multimodal fusion consistently failed to outperform the best unimodal model, with all three fusion strategies plateauing at ~0.64 accuracy and ~0.64 AUC on validation data. Transfer learning improved generalization across train/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 6 matches between paragraphs and lines of code.
kaggle.com/competitions/rsna-miccai-brain-tumor-radiogenomic-classification
Availability: 1 check, the latest on 27 September 2026: the link is dead (HTTP 404)
- 27 September 2026: the link is dead (HTTP 404)
freddy-oulia/MGMT_Promoter_Methylation_Prediction
f0ca21c1bdaf5d1a4c44898f4f5359321de7f787, 6 April 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
6 files
- MRIDataset.py, Python, 37 lines
- multimodal_run.py, Python, 355 lines, 2 matches
- pre_processing.py, Python, 265 lines, 1 match
- unimodal_run.py, Python, 348 lines, 1 match
- vgg16.py, Python, 111 lines, 2 matches
- README.md, Text, 121 lines
The paper's code and data availability statement is in the Data section.
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:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 5 scripts, each with its path and the digest of its content;
- 6 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 primary imaging dataset used in this study is the RSNA MICCAI Brain Tumor Radiogenomic Classification competition dataset, hosted by the Radiological Society of North America on Kaggle (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, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 11 MeSH terms, 31 references.
Cite
This paper
Oulia, F., Charton, P., Kabir, M., Gardebien, F., Damour, C., & Cadet, F. (2026). Unimodal vs. multimodal deep learning for non-invasive MGMT promoter methylation prediction in glioblastoma: A systematic evaluation on the BraTS 2021 dataset. PloS one, 21(6), e0351405. https://
BibTeX
@article{oulia2026unimod
author = {Oulia, Freddy and Charton, Philippe and Kabir, Muhammad and Gardebien, Fabrice and Damour, Cédric and Cadet, Frederic},
title = {{Unimodal vs. multimodal deep learning for non-invasive MGMT promoter methylation prediction in glioblastoma: A systematic evaluation on the BraTS 2021 dataset}},
journal = {PloS one},
year = {2026},
month = jun,
volume = {21},
number = {6},
pages = {e0351405},
publisher = {PLOS},
issn = {1932-6203},
doi = {10.1371/
url = {https://
pmid = {42284289},
pmcid = {PMC13262868}
}
RIS
TY - JOUR
AU - Oulia, Freddy
AU - Charton, Philippe
AU - Kabir, Muhammad
AU - Gardebien, Fabrice
AU - Damour, Cédric
AU - Cadet, Frederic
TI - Unimodal vs. multimodal deep learning for non-invasive MGMT promoter methylation prediction in glioblastoma: A systematic evaluation on the BraTS 2021 dataset
T2 - PloS one
J2 - PLoS One
PY - 2026
DA - 2026/
VL - 21
IS - 6
SP - e0351405
SN - 1932-6203
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Unimodal vs. multimodal deep learning for non-invasive MGMT promoter methylation prediction in glioblastoma: A systematic evaluation on the BraTS 2021 dataset",
"container-title": "PloS one",
"author": [
{
"family": "Oulia",
"given": "Freddy"
},
{
"family": "Charton",
"given": "Philippe"
},
{
"family": "Kabir",
"given": "Muhammad"
},
{
"family": "Gardebien",
"given": "Fabrice"
},
{
"family": "Damour",
"given": "Cédric"
},
{
"family": "Cadet",
"given": "Frederic"
}
],
"container-title-short":
"volume": "21",
"issue": "6",
"page": "e0351405",
"DOI": "10.1371/
"PMID": "42284289",
"PMCID": "PMC13262868",
"ISSN": "1932-6203",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
12
]
]
}
}
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-48496-1 [code]
- A unified FLAIR hyperintensity segmentation model for various CNS tumor types and acquisition time points.Journal: Scientific reportsIn common: SimpleITK, scikit-learn, pandas, 1 other tool, methods / tools, structural MRI / diffusion, other condition, 4 references
- [2] doi:10.21037/qims-2026-0792 [code]
- An nnU-Net-based framework with adaptive feature representation for 3D brain tumor segmentation.Journal: Quantitative imaging in medicine and surgeryIn common: SimpleITK, OpenCV, PyTorch, 3 other tools, methods / tools, structural MRI / diffusion, other condition, 2 references
- [3] doi:10.1038/s41597-026-07274-4 [code]
- The University of Texas Southwestern Glioma Dataset - MRI, Molecular Markers and Segmentations.Journal: Scientific dataIn common: SimpleITK, NumPy, methods / tools, structural MRI / diffusion, other condition, 4 references
- [4] doi:10.3389/frai.2026.1771088 [code]
- Few-shot deployment of pretrained MRI transformers in brain imaging tasks.Journal: Frontiers in artificial intelligenceIn common: SimpleITK, OpenCV, PyTorch, 3 other tools, methods / tools, structural MRI / diffusion
- [5] doi:10.1002/alz.71649 [code]
- Postmortem brain MRI reveals differential associations of subcortical and limbic volumes with cortical thinning and neurodegenerative pathologies.Journal: Alzheimer's & dementia : the journal of the Alzheimer's AssociationIn common: SimpleITK, OpenCV, PyTorch, 3 other tools, structural MRI / diffusion, other condition
- [6] doi:10.1038/s41597-026-07138-x [code]
- Medical Spine Sagittal MRI Dataset for Segmentation and Foraminal Stenosis detection.Journal: Scientific dataIn common: OpenCV, PyTorch, scikit-learn, 2 other tools, methods / tools, structural MRI / diffusion, 1 reference
- [7] doi:10.1016/j.patter.2026.101538 [code]
- A multi-modal foundation model for brain disease diagnosis and medical imaging.Journal: Patterns (New York, N.Y.)In common: OpenCV, PyTorch, scikit-learn, 2 other tools, 2 references
- [8] doi:10.1016/j.crmeth.2026.101473 [code]
- AmygdalaGo-BOLT for boundary-aware segmentation of the human amygdala.Journal: Cell reports methodsIn common: SimpleITK, OpenCV, PyTorch, 1 other tool, methods / tools, structural MRI / diffusion, 1 reference
- [9] doi:10.1186/s13244-026-02296-3 [code]
- A pre-trained foundation model framework for multiplanar MRI classification of extramural vascular invasion and mesorectal fascia invasion in rectal cancer.Journal: Insights into imagingIn common: SimpleITK, OpenCV, PyTorch, 3 other tools, structural MRI / diffusion, other condition
- [10] doi:10.3389/fnins.2026.1870124 [code]
- An end-to-end pipeline for automated fetal brain segmentation and biometry from 3D SSFP MRI.Journal: Frontiers in neuroscienceIn common: SimpleITK, OpenCV, PyTorch, 3 other tools, structural MRI / diffusion
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: 2 repositories of the authors' code, each at its verified commit and with its license, 5 scripts, and 6 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:3048266fca948d49…
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.
