GSoC 2026 — QDP Pipeline Cleanup
Scope: qdp-core, qdp-python, qdp-kernels
Pipeline today: read data (synthetic / file / streaming Parquet) → CPU prefetch → GPU encode_batch → yield QuantumTensor to Python (QuantumDataLoader)
Prerequisite: #1310 (single-sample f32 on QuantumEncoder trait) — confirm merged before starting
Track A — Parquet / reader f32
Make file/Parquet sources honor dtype=f32 end-to-end (no forced f64 widening)
| ID |
Issue |
What to do |
| A1 |
[Refactor] Add FloatElem trait and DataReader #1339 |
Generalize DataReader::read_batch from Vec<f64> to Vec<T> in reader.rs |
| A2 |
[Feature] ParquetReader: f32/f64 columns + Arrow cast #1340 |
Accept f32 Parquet columns; Arrow cast when dtypes differ |
| A3 |
[Feature] Pipeline file load respects PipelineConfig.dtype #1341 |
Wire A2 into pipeline_runner so dtype=f32 reaches f32 kernels |
| A4 |
[Testing] Parquet f32 tests and benchmark #1342 |
Fidelity tests + optional throughput benchmark |
Track B — GPU memory estimate
Early OOM detection: fail at loader build, not after 90 min of running
| ID |
Issue |
What to do |
| B1 |
[Feature] Add estimate_memory() for pipeline GPU footprint #1429 |
Pure function estimating CPU + GPU memory from config params |
| B2 |
[Feature] Fail fast when estimated memory exceeds VRAM #1430 |
Call B1 at loader construction; return actionable error |
Track C — Preprocessor Python API
Expose Preprocessor helpers that already exist in Rust to Python users
| ID |
Issue |
What to do |
| C1 |
[Feature] PyO3 bindings for Preprocessor #1431 |
Bind validate_input, calculate_l2_norm, validate_batch, calculate_batch_l2_norms via PyO3 |
| C2 |
[Docs] Document Preprocessor in qumat_qdp public API #1432 |
Export from __init__.py, add docstrings and usage example |
Track D — Kernel dedup
Collapse ~270 duplicate f32/f64 stubs in qdp-kernels
| ID |
Issue |
What to do |
| D1 |
[Refactor] KernelElem trait to deduplicate f32/f64 stubs #1433 |
Add KernelElem trait + define_stub! macro to replace copy-paste stubs |
Track E — pipeline_runner structure
Unify three PipelineIterator constructors and three producers in pipeline_runner.rs
| ID |
Issue |
What to do |
| E1 |
[Refactor] Unify PipelineIterator constructors with Source enum #1434 |
3 new_* methods → 1 PipelineIterator::new(source, config) |
| E2 |
[Refactor] Unify batch producers via AdapterBackedProducer #1435 |
3 producers with 80% identical code → AdapterBackedProducer |
| E3 |
[Refactor] StreamingProducer: use VecDeque for O(1) buffer advance #1436 |
Replace Vec::drain O(n) with VecDeque |
Others
Done when
GSoC 2026 — QDP Pipeline Cleanup
Scope:
qdp-core,qdp-python,qdp-kernelsPipeline today: read data (synthetic / file / streaming Parquet) → CPU prefetch → GPU
encode_batch→ yieldQuantumTensorto Python (QuantumDataLoader)Prerequisite: #1310 (single-sample f32 on
QuantumEncodertrait) — confirm merged before startingTrack A — Parquet / reader f32
DataReader::read_batchfromVec<f64>toVec<T>inreader.rscastwhen dtypes differpipeline_runnersodtype=f32reaches f32 kernelsTrack B — GPU memory estimate
Track C — Preprocessor Python API
validate_input,calculate_l2_norm,validate_batch,calculate_batch_l2_normsvia PyO3__init__.py, add docstrings and usage exampleTrack D — Kernel dedup
KernelElemtrait +define_stub!macro to replace copy-paste stubsTrack E — pipeline_runner structure
new_*methods → 1PipelineIterator::new(source, config)AdapterBackedProducerVec::drainO(n) withVecDequeOthers
Done when
QuantumDataLoader(...).dtype("f32").source_file("x.parquet")uses f32 kernels end-to-endPreprocessorexposed and documented in Python