Skip to the content.

Photonic integration

qpubench models linear-optics photonic chips and Fusion-Based QC (FBQC) in src/qpubench/schemas/mirrors/mqsdk_photoq.py (the LOQC/FBQC section). This is permanent-based simulation using Fock states — distinct from the Gaussian-state / hafnian-based GBS section of the same module.

Computing model: ComputingModel.GATE_BASED (MZI chips, boson sampling — LOQC circuits) and ComputingModel.FUSION_BASED (FBQC with resource states + fusion gates). Qubit modality: QubitModality.PHOTONIC in both cases.

The mqsdk_photoq module also covers Gaussian Boson Sampling, the pseudo-PNRD click-counting simulation methods, and the ORCA PT Series / DTU QCloud / Xanadu Aurora backends — see gbs.md.


Photonic circuit simulation

from qpubench.schemas.mirrors.mqsdk_photoq import (
    BeamsplitterSpec, MZISpec, PhaseShifterSpec,
    FockState, PhotonicCircuitSpec, PhotonicSimulationResult,
    PICPlatform, PhotonicChipArchitecture,
)
from qpubench.schemas.backend import BackendSpec

# Build a 4-mode linear-optics circuit
bs = BeamsplitterSpec(mode_a=0, mode_b=1, theta=0.7854, phi=0.0)   # 50:50
mzi = MZISpec(mode_a=2, mode_b=3, phi_inner=1.5708, phi_outer=0.0)
ps  = PhaseShifterSpec(mode=1, phi=3.14159)

circuit = PhotonicCircuitSpec(
    num_modes=4,
    beamsplitters=[bs],
    mzis=[mzi],
    phase_shifters=[ps],
    input_state=FockState(mode_occupations=[1, 0, 1, 0]),
)

# Simulation result
result = PhotonicSimulationResult(
    num_modes=4,
    output_state_amplitudes=[],    # filled by simulator
    sampling_time_s=0.012,
)

# Backend
backend = BackendSpec.photochipsim(num_modes=4)

Single-photon sources

from qpubench.schemas.mirrors.mqsdk_photoq import SinglePhotonSourceSpec, PhotonSourceType

source = SinglePhotonSourceSpec(
    platform=PhotonSourceType.QUANTUM_DOT,
    indistinguishability=0.98,
    brightness=0.85,
    g2=0.002,
    wavelength_nm=925.0,
    repetition_rate_mhz=76.0,
)

Hong-Ou-Mandel interference

from qpubench.schemas.mirrors.mqsdk_photoq import (
    HOMSpec, HOMResult, BeamsplitterSpec, SinglePhotonSourceSpec,
)

hom_spec = HOMSpec(
    source_a=source,
    source_b=source,
    beamsplitter=BeamsplitterSpec(mode_a=0, mode_b=1, theta=0.7854, phi=0.0),
    delay_ps=0.0,
)

hom_result = HOMResult(
    coincidence_rate=0.012,
    visibility=0.984,
    dip_depth=0.968,
    integration_time_s=60.0,
)

Store in QuantumResult.hom_result.


Photon indistinguishability purification

from qpubench.schemas.mirrors.mqsdk_photoq import (
    IndistinguishabilityPurificationSpec,
    IndistinguishabilityPurificationResult,
)

spec = IndistinguishabilityPurificationSpec(
    input_sources=[source, source],
    purification_rounds=2,
    target_indistinguishability=0.999,
)

result = IndistinguishabilityPurificationResult(
    achieved_indistinguishability=0.997,
    loss_db=3.2,
    success_probability=0.125,
)

Store in QuantumResult.indist_purification.


Photonic VQE

Variational optimization over a photonic linear-optics ansatz:

from qpubench.schemas.mirrors.mqsdk_photoq import PhotonicVQEConfig, PhotonicVQEStep, PhotonicVQEResult

config = PhotonicVQEConfig(
    num_modes=6,
    num_photons=3,
    max_iterations=200,
    optimizer="COBYLA",
    target_unitary_real=[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0],  # flattened 3×3
    target_unitary_imag=[0.0] * 9,
)

step = PhotonicVQEStep(iteration=0, energy=-1.23, parameters=[0.1, 0.5, -0.3])

vqe_result = PhotonicVQEResult(
    config=config,
    steps=[step],
    final_energy=-2.87,
    converged=True,
    final_parameters=[0.785, 1.571, -0.523, 0.314],
    num_iterations=47,
)

Store in QuantumResult.photonic_vqe.


Sobol sensitivity analysis

from qpubench.schemas.mirrors.mqsdk_photoq import PhotonicSensitivityAnalysis, SobolParameterResult

analysis = PhotonicSensitivityAnalysis(
    num_modes=6,
    num_samples=1024,
    parameters=["theta_0", "phi_0", "theta_1", "phi_1"],
    sobol_results=[
        SobolParameterResult(parameter_name="theta_0", S1=0.42, ST=0.61),
        SobolParameterResult(parameter_name="phi_0",   S1=0.08, ST=0.15),
    ],
    total_variance=0.023,
)

Store in QuantumResult.photonic_sensitivity.


FBQC (Fusion-Based QC)

from qpubench.schemas.mirrors.mqsdk_photoq import (
    ResourceStateSpec, ResourceStateType,
    FusionGateSpec, FusionType, FBQCRunConfig,
)

resource_state = ResourceStateSpec(
    state_type=ResourceStateType.LINEAR_4_PHOTON,
    num_photons=4,
)

fusion = FusionGateSpec(
    mode_a=1, mode_b=2,
    fusion_type=FusionType.TYPE_II,
    success_probability=0.5,
)

fbqc_config = FBQCRunConfig(
    resource_state=resource_state,
    logical_qubits=4,
    num_rounds=10,
    fusion_network=[fusion],
)

Photonic analog Hamiltonian simulation

Simulates tight-binding propagation on a photonic waveguide array:

from qpubench.schemas.mirrors.mqsdk_photoq import (
    PhotonicAnalogHamiltonian, PhotonicAnalogSimConfig, PhotonicAnalogSimResult,
    FockState,
)

H = PhotonicAnalogHamiltonian(
    num_modes=4,
    coupling_matrix=[-1.0, 0.0, 0.0, -1.0, 0.0, -1.0, 0.0, 0.0,   # flattened 4×4
                      0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0],
    on_site_energies=[0.0, 0.0, 0.0, 0.0],
)

sim_config = PhotonicAnalogSimConfig(
    hamiltonian=H,
    evolution_time=1.5708,
    num_modes=4,
    initial_fock_state=FockState(mode_occupations=[1, 0, 0, 0]),
)

sim_result = PhotonicAnalogSimResult(
    config=sim_config,
    site_populations=[0.25, 0.25, 0.25, 0.25],
    energy_expectation=-1.0,
    evolution_time=1.5708,
)

Store in QuantumResult.photonic_analog_sim.


Backends

from qpubench.schemas.backend import BackendSpec

BackendSpec.photochipsim(num_modes=6)              # permanent-based, thewalrus
BackendSpec.strawberry_fields("fock", 6, cutoff_dim=5)
BackendSpec.perceval("SLOS", num_modes=6)          # Quandela SLOS / MPS / Naive
BackendSpec.photonic_chip_hardware("chip_001", "silicon_nitride", num_modes=8)