GNN4Colliders / validation /batching.py
ho22joshua's picture
rewriting codebase (#7)
916755e
Raw History Blame
3.54 kB
#!/usr/bin/env python3
"""Dump deterministic batch membership and aggregate sizes for one implementation."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import torch
from validation.artifacts import load_artifact
from validation.forward import _graph
class _LegacyDataset(torch.utils.data.Dataset):
def __init__(self, artifact):
self.artifact = artifact
def __len__(self):
return self.artifact.event_count
def __getitem__(self, index):
graph = _graph(self.artifact, index)
tracking = torch.tensor(
[
self.artifact.folds[index],
self.artifact.weights[index],
index,
],
dtype=torch.float32,
)
return (
graph,
torch.tensor(self.artifact.labels[index]),
tracking,
torch.empty(0),
)
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument(
"--implementation", choices=("legacy", "rewrite"), required=True
)
parser.add_argument("--artifact", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--batch-size", type=int, default=8)
args = parser.parse_args()
artifact = load_artifact(args.artifact)
if args.implementation == "legacy":
from dgl.dataloading import GraphDataLoader
loader = GraphDataLoader(
_LegacyDataset(artifact),
batch_size=args.batch_size,
shuffle=False,
drop_last=False,
num_workers=0,
)
else:
from gnn4colliders.data import (
EventMetadata,
GraphDataLoader,
GraphDataset,
GraphSample,
)
samples = []
for index in range(artifact.event_count):
samples.append(
GraphSample(
_graph(artifact, index),
torch.tensor(artifact.labels[index]),
None,
EventMetadata(
int(artifact.folds[index]),
float(artifact.weights[index]),
str(artifact.sample_id[index]),
{"index": index},
),
)
)
loader = GraphDataLoader(GraphDataset(samples), args.batch_size, shuffle=False)
batches = []
for batch in loader:
if args.implementation == "legacy":
graph, labels, tracking, _ = batch
indices = tracking[:, 2].to(torch.long).tolist()
ids = [str(artifact.sample_id[index]) for index in indices]
weights = tracking[:, 1].tolist()
else:
graph = batch.graph
labels = batch.labels
ids = list(batch.metadata.sample_id)
weights = batch.metadata.weight.tolist()
batches.append(
{
"sample_id": ids,
"num_graphs": len(ids),
"nodes": int(graph.num_nodes()),
"edges": int(graph.num_edges()),
"labels": labels.reshape(-1).tolist(),
"weights": weights,
}
)
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(
json.dumps({"batch_size": args.batch_size, "batches": batches}, indent=2) + "\n"
)
return 0
if __name__ == "__main__":
raise SystemExit(main())