QiskitAtomiq Hackathon · Qiskit Fall Fest 2026 at IEM

Six customers, one campaign. Every quantum number checked.

A three-stage Qiskit pipeline for a bank's term-deposit campaign: predict who will subscribe, pick six with a QAOA circuit that can only return valid picks, and estimate the chance that three of them say yes.

No login, no installNumbers read from the committed result filesReproduces with one command
stage2_selection.json
Best feasible sampled bitstring · qubit 0 on the right
Feasible · 0.0% gap to brute force
QubitCustomerp(subscribe)DepositCostCapacityNet value
P(at least 3 of 6 subscribe)
The answer

What we submit, and where each number lives.

Customers to contact (Stage 2)
P(≥3 of 6 subscribe), quantum estimate
Probability QAOA returns the optimum
Pipeline

Three stages. One set of probabilities.

Stage 1's probabilities flow unchanged into Stages 2 and 3. A 25-point checker fails the build if any ID or number drifts between files.

Stage 1 · predict

A quantum kernel, tuned so it isn't flat.

Six-qubit ZZ feature-map states feed a fidelity kernel and a projected kernel. At the default scaling, kernel values between customers bunch together, so we tune the bandwidth inside nested cross-validation (Shaydulin & Wild, arXiv:2111.05451).

10 × 5 nested CV, train onlyPlatt in-foldRule committed before fitting
Variance of off-diagonal kernel values peaks near bandwidth 0.06 and is about 60 times smaller at bandwidth 1
Kernel spread collapses at the default bandwidth of 1.
Stage 2 · select

A circuit that can't break the six-customer rule.

QAOA starts in a Dicke state, an equal superposition of all 210 ways to choose six of ten, built gate by gate (Bärtschi & Eidenbenz, arXiv:1904.07358). An XY ring mixer preserves the count. A presolve proves budget and capacity can't bind for these candidates, so the circuit needs 10 qubits and no penalty terms.

Gap to brute force: 0%Stress test with binding limits: mixed
Probability of the brute-force optimum rises with QAOA depth for the Dicke plus XY ansatz and stays near zero for the penalty formulation
Constraint-native QAOA vs the usual penalty QUBO, ideal statevector.
Stage 3 · simulate

Six qubits, checked exactly.

Each selected customer is one qubit, rotated so that it reads 1 with that customer's probability. A shot succeeds when at least three read 1. We compare the result with the exact Poisson-binomial value, Monte Carlo, an IBM Kingston noise model and two readout mitigations. This stage is classically trivial; the circuit is a verifiable sampler of the stated model, nothing more.

200,000 shotsFakeKingston noiseTensored + M3 mitigation
Stage 3 estimates from every method sit close to the exact value, inside a much wider Stage 1 bootstrap band
The orange band is Stage 1 uncertainty.
Try it here

Pick six yourself. Then check the circuit.

Both tools run in your browser on the submitted data. The page doesn't call anything; the Qiskit runs are in the repository.

Stage 2: choose customers

Select exactly six of the top ten. Feasibility and the gap to the brute-force optimum update as you go.

Most likely QAOA outcomes (p = )

Ideal statevector distribution of the optimised circuit (top 6 outcomes). Click one to load it.

Selection checker
0 / 6selected
0 / 25contact cost
0 / 22capacity units
0.00expected net value
Pick six customers
Stage 3: sample the same distribution

Each slider is one qubit's probability of reading 1, starting at our Stage 1 values. Move them and the exact answer updates. Draw shots runs a classical sampler of the distribution the RY circuit produces, in your browser.

Successes per shot (browser sampler)
exact P(≥3)
–sampled P(≥3)
–± 1 s.e.
–shots
sampledexactblue labels count as success (≥3)

Your browser samples the same product-state distribution the RY circuit produces. The Qiskit result (Aer, 200,000 shots, seed 7) is .

Evidence

What holds up, and what doesn't.

Negative results are reported as plainly as positive ones. Each claim links to the file it comes from.

Stage 1 cross-validation (300 customers, positives)
ModelROC-AUCPR-AUCBrierLog loss

Bar chart: Stage 1 model uncertainty is far larger than shot noise, noise bias and the residual after mitigation
Stress test: limits tightened until they bind
ScenarioFeasibleP(feasible) XY / penaltyP(optimum) XYUniform guess

p = 2. Slack qubits and real ZZ couplings. Keeping six picks raises the feasible share in every case, but P(optimum) only beats a uniform guess over feasible subsets in scenario A; in B and C it falls below it. COBYLA minimises the penalised energy, not P(optimum). Source: results/stage2_stress.json.

Noise and transpilation (IBM Kingston model)

No real-QPU job was run for this submission. scripts/run_hardware.py is ready for one ibm_kingston job.

Model error dominates

The pick is fragile

Plain LR comparison

Reproduce

One command, about five minutes.

Python 3.12. The organisers' dataset is in the repository, and every seed is listed in src/atomiq/common.py. CI reruns all three stages on each push and checks that the answer comes out the same.

# clone and run everything
git clone https://github.com/YASASWIP012/atomiq-quantum-campaign
cd atomiq-quantum-campaign
make setup     # .venv + pinned requirements
make all       # stage1 → stage2 → stage3 → tests → checks

# optional
make stress    # Stage 2 with binding limits
make hardware  # needs IBM_QUANTUM_TOKEN in .env

Questions a judge might ask.

Does the quantum classifier beat logistic regression?

No. With 35 positive examples the quantum kernels rank customers only a little better than chance, and the blend procedure is not distinguishable from logistic regression in cross-validation. The shipped blend puts a small weight on the quantum kernel, and plain logistic regression picks the same six customers. The README reports all of this.

Isn't Stage 2 trivial once the constraints are redundant?

Yes, sorting solves it. QAOA is what the task asks for, and we use it to show how a constraint-preserving ansatz behaves, ideal and noisy, against brute force. The stress test repeats the comparison with limits that bind, where slack qubits and ZZ terms come into play.

Was any test information used?

No. All preprocessing, tuning and calibration are fitted inside training folds, and the 100 test customers are predicted once by the final model. We never used the public UCI file the data was sampled from.

Did anything change after the first results?

Four things, all chosen on training data only: a smaller set of categorical features, regularised Platt scaling, a fix that makes PCA signs identical on macOS and Linux, and a flag for customers whose previous campaign succeeded. The last two changed our six customers; the README lists each earlier answer and why we changed it.

Why not real hardware?

We had no IBM Quantum key during the sprint. All noisy results come from the FakeKingston noise model, and the hardware script is ready for one job.

Is there a quantum advantage here?

No, and we don't claim one. Every problem in this pipeline is small enough to solve exactly on a laptop, which is how each quantum result is checked.