Skip to main content

qiskit-data-reuploading

CI PyPI Coverage Python Code License: MIT Docs License: CC BY 4.0 Qiskit

The first pip-installable, sklearn-compatible Python library for data re-uploading quantum classifiers, built on Qiskit 2.x V2 primitives.

Implements the architecture from Pérez-Salinas et al. (2020) as a production-quality, benchmarkable, and hardware-ready open-source package.

Compatible with Qiskit — not affiliated with, endorsed by, or maintained by IBM.


Authors

This library is developed and maintained by:

Name Affiliation Contact
Carlos A. Durán Paredes Corporation for Aerospace Initiatives, Research and Innovation (CASIRI), Popayán, Colombia caduranpd@gmail.com
Javier E. León Calderón Department of Electronics Engineering, Universidad Nacional de Colombia, Manizales, Colombia javleonca@unal.edu.co
Nicolás Sánchez Perea Department of Electronics Engineering, Universidad del Cauca, Popayán, Colombia nicolassp@unicauca.edu.co
German Darío Díaz Department of Physics, Universidad del Cauca, Popayán, Colombia germandiaz@unicauca.edu.co
Camilo Segura Corporation for Aerospace Initiatives, Research and Innovation (CASIRI), Popayán, Colombia camilosegura6@gmail.com

Table of Contents


What is Data Re-uploading?

Classical machine learning encodes data once before processing it. Data re-uploading breaks this assumption: input features are injected at every layer of the quantum circuit, interleaved with trainable rotation gates.

Layer 1:  [ Encode(x) → Train(θ) ]
Layer 2:  [ Encode(x) → Train(θ) ] ← same x, new θ
Layer N:  [ Encode(x) → Train(θ) ]
               ↓
          Measure → classify

A single qubit with enough layers can approximate any continuous function — a quantum analog of the universal approximation theorem. This makes it a uniquely compact variational model for NISQ hardware.


Existing Ecosystem Analysis

This library addresses a gap that remained open in the Qiskit ecosystem as of mid-2025:

What exists Framework Status
PR #668 "Implement Data-reuploading classifier" qiskit-machine-learning DRAFT, abandoned ~2024, never merged
Data-reuploading tutorial PennyLane Maintained demo — not a library
Academic Qiskit notebook (arXiv:2211.13191) Qiskit 1.x Didactic, no pip install, legacy APIs

What did not exist before this library:

  • A pip-installable DataReuploadingClassifier with sklearn-compatible API
  • Native data re-uploading support in qiskit-machine-learning
  • A dedicated feature map in Qiskit's circuit.library
  • Reproducible benchmarks (DR vs. MLP/SVM) on Qiskit 2.x V2 primitives

Deprecated approaches this library explicitly avoids:

  • execute() and Aer.get_backend() — removed in Qiskit 2.x
  • V1 primitives (StatevectorSimulator, algorithm_globals)
  • BlueprintCircuit — deprecated upstream in favor of constructor methods

This library uses exclusively V2 primitives: StatevectorEstimator, StatevectorSampler for local simulation, and qiskit_ibm_runtime.EstimatorV2 for IBM Quantum hardware.


Installation

Standard:

pip install qiskit-data-reuploading

With IBM Quantum hardware support:

pip install "qiskit-data-reuploading[hardware]"

From source (latest development):

git clone https://github.com/Carlosandp/qiskit-data-reuploading.git
cd qiskit-data-reuploading
pip install -e ".[dev]"

Requirements: Python ≥ 3.10 · Qiskit ≥ 2.0 · qiskit-machine-learning ≥ 0.9.0 · qiskit-aer ≥ 0.15


Quick Start

Classification

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from qdr.models import DataReuploadingClassifier

X, y = load_iris(return_X_y=True)
X = MinMaxScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = DataReuploadingClassifier(
    n_qubits=2,
    n_layers=5,
    encoding="rx_ry_rz",    # "rx" | "ry" | "rz" | "rx_ry_rz"
    entanglement="full",     # "none" | "linear" | "circular" | "full"
    optimizer="COBYLA",      # "COBYLA" | "SPSA" | "ADAM"
    backend=None,            # None → StatevectorEstimator (local, exact)
    shots=None,              # None → exact; int → noisy simulation
    max_iter=150,
)

model.fit(X_train, y_train)

preds  = model.predict(X_test)
proba  = model.predict_proba(X_test)
score  = model.score(X_test, y_test)

print(f"Accuracy: {score:.4f}")

model.save("iris_model.pkl")
loaded = DataReuploadingClassifier.load("iris_model.pkl")

Circuit inspection

from qdr.circuits import DataReuploadingCircuit

circuit = DataReuploadingCircuit(n_qubits=2, n_layers=3, n_features=4)
circuit.build_circuit()
circuit.draw("mpl")           # matplotlib figure
circuit.draw("text")          # ASCII
print(circuit.get_parameters())

Benchmarking against classical baselines

from qdr.benchmarks import BenchmarkRunner
from sklearn.datasets import make_moons

X, y = make_moons(n_samples=200, noise=0.1)

runner = BenchmarkRunner(cv_folds=5)
runner.run(X, y, include_svm=True, include_mlp=True, include_lr=True)

df = runner.summary()
# Returns pandas DataFrame: model, accuracy, f1, precision, recall, mcc, train_time_s
print(df.to_string(index=False))

Visualization

from qdr.visualization import (
    plot_decision_boundary,
    plot_loss_curve,
    plot_bloch_trajectory,
    plot_parameter_landscape,
)

plot_loss_curve(model.loss_history_)
plot_decision_boundary(model, X_test, y_test)
plot_bloch_trajectory(circuit, X_train[0])

IBM Quantum hardware

from qdr.hardware import run_on_ibm_backend

result = run_on_ibm_backend(
    model=model,
    X=X_test,
    backend_name="ibm_brisbane",   # or "fake_manila" for noise simulation
    shots=1024,
)

API Overview

Class / Function Module Description
DataReuploadingClassifier qdr.models sklearn-compatible multi-class classifier
DataReuploadingRegressor qdr.models sklearn-compatible regressor
DataReuploadingCircuit qdr.circuits parameterized re-uploading circuit
ReuploadingFeatureMap qdr.circuits fixed-weight feature map (no training)
ParameterShiftGradient qdr.training exact quantum gradients via parameter shift
SPSA qdr.training gradient-free stochastic optimizer
COBYLA qdr.training derivative-free local optimizer
ADAM qdr.training adaptive moment estimation optimizer
BenchmarkRunner qdr.benchmarks benchmarks vs. MLP, SVM, logistic regression
plot_decision_boundary qdr.visualization 2D decision boundary plot
plot_loss_curve qdr.visualization training loss over iterations
plot_bloch_trajectory qdr.visualization qubit state on Bloch sphere per layer
plot_parameter_landscape qdr.visualization 2D cost landscape scan
run_on_ibm_backend qdr.hardware execution on IBM Quantum real hardware

Full API documentation: docs/api/


Architecture

qdr/
├── circuits/
│   ├── data_reuploading.py     # DataReuploadingCircuit
│   └── feature_maps.py         # ReuploadingFeatureMap
├── models/
│   ├── classifier.py           # DataReuploadingClassifier
│   └── regressor.py            # DataReuploadingRegressor
├── training/
│   ├── gradients.py            # ParameterShiftGradient
│   └── optimizers.py           # SPSA, COBYLA, ADAM wrappers
├── benchmarks/
│   └── runner.py               # BenchmarkRunner
├── visualization/
│   └── plots.py                # all plotting utilities
├── hardware/
│   └── ibm_backend.py          # IBM Quantum integration (V2 Runtime)
└── utils/
    └── encoding.py             # RX/RY/RZ encoding helpers

All modules are independent. No circular imports. Each subpackage can be used in isolation without loading the full library.


Supported Versions

Python Qiskit qiskit-machine-learning qiskit-aer
3.10 ≥ 2.0 ≥ 0.9.0 ≥ 0.15
3.11 ≥ 2.0 ≥ 0.9.0 ≥ 0.15
3.12 ≥ 2.0 ≥ 0.9.0 ≥ 0.15
3.13 ≥ 2.0 ≥ 0.9.0 ≥ 0.15

Hardware Integration

The library supports three execution modes:

Mode Backend Noise Use case
Exact simulation StatevectorEstimator None Development, small circuits
Noisy simulation AerSimulator + noise model Configurable Pre-hardware testing
Real hardware qiskit_ibm_runtime.EstimatorV2 Device noise Production experiments

All modes share the same API — switching is a single backend= argument.


Benchmarking

BenchmarkRunner evaluates models using stratified k-fold cross-validation and reports: accuracy, F1-score (macro), precision, recall, MCC, and training time.

Supported datasets out of the box: Iris, Moons, Circles, Wine, reduced MNIST.

Baselines: sklearn MLP, SVM (RBF kernel), and Logistic Regression.


Scientific Background

This library implements the data re-uploading technique introduced in:

Pérez-Salinas, A., Cervera-Lierta, A., Gil-Fuster, E., & Latorre, J.I. (2020). Data re-uploading for a universal quantum classifier. Quantum, 4, 226. https://doi.org/10.22331/q-2020-02-06-226

Key result from the paper: A single-qubit circuit with re-uploading layers can approximate any continuous function on a compact domain, making it a universal classifier with minimal qubit overhead. Entanglement across multiple qubits extends this expressibility with improved sample efficiency.

Implementation notes:

  • Encoding and trainable parameters are kept strictly separate in the circuit
  • Parameter shift rules compute exact gradients without finite-difference approximation
  • Barren plateau risk is discussed in docs/barren_plateaus.md
  • Scalability is limited by current NISQ hardware; see docs/nisq_limitations.md

Licensing

This project uses a dual license:

Component License
Source code (qdr/, tests/, examples/) MIT License
Documentation, notebooks, tutorials (docs/, notebooks/) CC BY 4.0

What this means in practice:

  • You can use, modify, and redistribute the code freely under MIT terms.
  • If you reuse or adapt the documentation or notebooks, you must credit the author.
  • Academic publications using this library should include the citation below.

Citation

If you use this library in research or academic work, please cite both the original paper and this software. If your work involves UAV anomaly detection or the QML benchmark evaluation, also cite the associated study below.

Original method:

@article{perez2020data,
  title     = {Data re-uploading for a universal quantum classifier},
  author    = {P{\'{e}}rez-Salinas, Adri{\'{a}}n and Cervera-Lierta, Alba
               and Gil-Fuster, Elies and Latorre, Jos{\'{e}} Ignacio},
  journal   = {Quantum},
  volume    = {4},
  pages     = {226},
  year      = {2020},
  doi       = {10.22331/q-2020-02-06-226},
  url       = {https://doi.org/10.22331/q-2020-02-06-226}
}

This software:

@software{duranleon2026qdr,
  title     = {qiskit-data-reuploading: A pip-installable sklearn-compatible library
               for data re-uploading quantum classifiers on Qiskit 2.x},
  author    = {Carlos Andr{\'e}s Dur{\'a}n Paredes and
               Javier Esteban Le{\'o}n Calder{\'o}n and
               Nicol{\'a}s S{\'a}nchez Perea and
               German Dar{\'i}o D{\'i}az and
               Camilo Segura},
  year      = {2026},
  url       = {https://github.com/Carlosandp/qiskit-data-reuploading},
  license   = {MIT (code) / CC BY 4.0 (docs)},
  note      = {Compatible with Qiskit 2.x. Not affiliated with IBM.}
}

Associated study — UAV anomaly detection benchmark:

@article{duran2026qml,
  title     = {Quantum Machine Learning for Cyber-Physical Anomaly Detection in
               Unmanned Aerial Vehicles: A Leakage-Free Evaluation with
               Proxy-Audited Feature Sets},
  author    = {Dur{\'a}n Paredes, Carlos A. and
               Le{\'o}n Calder{\'o}n, Javier E. and
               S{\'a}nchez Perea, Nicol{\'a}s and
               D{\'i}az, German Dar{\'i}o and
               Segura Quintero, Camilo},
  year      = {2026},
  eprint    = {2605.19233},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CR},
  doi       = {10.48550/arXiv.2605.19233},
  url       = {https://arxiv.org/abs/2605.19233},
  note      = {10 pages, 7 figures, 1 table; open Qiskit 2.x implementation
               available at https://github.com/Carlosandp/qiskit-data-reuploading}
}

Preprint: Durán Paredes et al. (2026). Quantum Machine Learning for Cyber-Physical Anomaly Detection in Unmanned Aerial Vehicles: A Leakage-Free Evaluation with Proxy-Audited Feature Sets. arXiv:2605.19233 [cs.CR]. https://arxiv.org/abs/2605.19233


Contributing

Contributions are welcome. See CONTRIBUTING.md for guidelines.

Priority areas:

  • Additional encoding schemes (ZZ, Pauli, custom)
  • Noise-aware training methods
  • Hardware experiment results and calibration data
  • Additional benchmark datasets
  • Contributions toward a potential upstream PR to qiskit-machine-learning

Before opening a PR, run the test suite:

pytest tests/ --cov=qdr --cov-report=term-missing

Disclaimer

This project is compatible with Qiskit but is not affiliated with, endorsed by, or maintained by IBM. Qiskit is a registered trademark of IBM. The use of Qiskit in this project's name and documentation is solely to indicate technical compatibility.

Metadata

Release files for qiskit-data-reuploading 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qiskit-data-reuploading 0.1.0
File Size Uploaded Provenance Actions
qiskit_data_reuploading-0.1.0.tar.gz 67.1 kB Without provenance Details for qiskit_data_reuploading-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for qiskit-data-reuploading 0.1.0
File Interpreter ABI Platform Actions
qiskit_data_reuploading-0.1.0-py3-none-any.whl Python 3 none any Details for qiskit_data_reuploading-0.1.0-py3-none-any.whl

Total release size: 124.2 kB

Release files / qiskit_data_reuploading-0.1.0.tar.gz

Download URL qiskit_data_reuploading-0.1.0.tar.gz
Size 67.1 kB
Tags Source
SHA-256 checksum
How to use checksums
55bdbb898b0e247c86583c9fc9e644c91cfe27c50a011d5bed5d26ccbbcb2b8d
BLAKE2b-256 checksum
How to use checksums
62b4b0af1a54b0de0a6cbcbf8275802f3873c36f7890de035d3e8b0f56e875fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / qiskit_data_reuploading-0.1.0-py3-none-any.whl

Download URL qiskit_data_reuploading-0.1.0-py3-none-any.whl
Size 57.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2c9855a25f807b1d93896574a5a55c24cbb7527c4073dc8ee6c84fbdaa02ac45
BLAKE2b-256 checksum
How to use checksums
d8952c4885eb6b0ff7dcde79451d3d5e88301e5b8135e0e8af14433aab5ee98f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Security for qiskit-data-reuploading 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page