Hi Ryan,

Here’s my handle: https://github.com/vvvdwbvvv

And here is brief introduction about my proposal:

Following issue #1008 ([QDP] Add ZZFeatureMap Encoding) and GSOC-312 
discussion, I would like to contribute a GPU-accelerated ZZFeatureMap encoder 
to qdp-core / qdp-kernels.

This implementation aims to:
- Complete the QML encoding suite in QDP (amplitude, angle, basis, IQP → + 
ZZFeatureMap)
- Provide high-performance batch encoding via CUDA kernels (direct 
amplitude-phase manipulation for RZZ, avoiding CNOT decomposition)
- Align with Qiskit ZZFeatureMap defaults for easy migration (alpha=2.0, 
data_map=(π-x)(π-x), entanglement options: linear/circular/full)
- Remain flexible for research: pluggable data_map_func, configurable alpha, 
and safe defaults to avoid performance cliffs on larger n

Key Features in the Patch:
- Rust struct: `ZZEncoder` (or `PauliZZEncoder`) implementing `QuantumEncoder` 
trait
  - Params: n_qubits, reps (default 2), entanglement (Linear/Circular/Full), 
alpha (default 2.0)
  - Optional: data_map (QiskitDefault | Product | Custom fn)
- CUDA kernels:
  - Reuse existing `apply_hadamard_batch` & `apply_rz_batch` from IQP
  - New `apply_rzz_batch`: bit-pattern based phase (bi ^ bj ? +theta/2 : 
-theta/2), per-amplitude thread
- Python binding via PyO3: `qdp.encoders.ZZEncoder` with `.encode(features: 
np.ndarray) → np.ndarray[complex]`
- Validation: statevector L2 norm ≈1.0, dimension checks, zero-input handling
- Tests:
  - Unit: pair generation for each entanglement topology
  - Integration: vs Qiskit `ZZFeatureMap` (compare |amplitudes|, atol=1e-5, 
allow global phase diff)
  - Edge: reps=0 (pure Hadamard), n=1 full (empty pairs), dimension mismatch 
error

Performance Considerations:
- Full entanglement auto-warn / opt-in for n>12 to prevent kernel explosion
- Batch mode for multiple samples → ideal for kernel matrix computation
- Little-endian basis consistent with Qiskit/Aer

Patch Structure (proposed):
- `qdp-core/src/gpu/encodings/zz_encoder.rs`
- `qdp-kernels/src/zzfeaturemap.cu` (new kernels)
- `testing/qdp/test_zzencoder.py` (Qiskit comparison + smoke tests)

This builds directly on the existing IQPEncoder pattern, minimizing code 
duplication while adding the missing second-order Pauli-Z interaction.

I'd like to open a Draft PR soon for early feedback. Happy to adjust naming 
(e.g. ZZEncoder vs QuadraticZEncoder), default entanglement (suggest Linear for 
safety).

Looking forward to your thoughts / review!

Thanks,

Eddie Tsai

Reply via email to