Quickstart

This page runs three minimal workflows end-to-end plus a circuit equivalence check. Install the package first (installation), then copy the cells below.

Every example in this guide uses Simulator(show_progress=False) so progress bars do not clutter the built documentation.

1. Analog simulation

Tensor-network time evolution on an MPS. Attach a NoiseModel for open-system TJM trajectories; without noise, the simulator performs a single unitary trajectory regardless of num_traj:

 1from mqt.yaqs import AnalogSimParams, Hamiltonian, Observable, Simulator, State
 2
 3L = 3
 4state = State(L, initial="zeros")
 5hamiltonian = Hamiltonian.ising(L, J=1.0, g=0.5)
 6
 7params = AnalogSimParams(
 8    observables=[Observable("z", sites=0)],
 9    elapsed_time=0.5,
10    dt=0.1,
11    preset="fast",
12    num_traj=8,
13)
14
15sim = Simulator(show_progress=False)
16result = sim.run(state, hamiltonian, params)
17print(f"⟨Z₀⟩(t) = {result.expectation_values[0]}")
⟨Z₀⟩(t) = [1.         0.99502079 0.98033073 0.95665832 0.92517106 0.88740864]

2. Digital circuit simulation

Noisy or noise-free evolution through a Qiskit circuit on an MPS:

 1from qiskit.circuit import QuantumCircuit
 2
 3from mqt.yaqs import Observable, StrongSimParams
 4
 5qc = QuantumCircuit(3)
 6qc.h(0)
 7qc.cx(0, 1)
 8qc.cx(1, 2)
 9
10circuit_state = State(3, initial="zeros")
11circuit_params = StrongSimParams(
12    observables=[Observable("z", sites=i) for i in range(3)],
13    preset="fast",
14    num_traj=8,
15)
16
17circuit_result = sim.run(circuit_state, qc, circuit_params)
18print("Final ⟨Zᵢ⟩:", [float(v[0]) for v in circuit_result.expectation_values])
Final ⟨Zᵢ⟩: [0.0, 0.0, 0.0]
/tmp/ipykernel_2700/1385568565.py:18: ComplexWarning: Casting complex values to real discards the imaginary part
  print("Final ⟨Zᵢ⟩:", [float(v[0]) for v in circuit_result.expectation_values])

3. Equivalence checking

Verify that two circuits implement the same unitary (up to global phase) with EquivalenceChecker:

 1from mqt.yaqs import EquivalenceChecker
 2from qiskit.circuit import QuantumCircuit
 3
 4def bell_prep() -> QuantumCircuit:
 5    qc = QuantumCircuit(2)
 6    qc.h(0)
 7    qc.cx(0, 1)
 8    return qc
 9
10# Original vs. transpiled-style rewrite (same unitary on two qubits)
11original = bell_prep()
12rewritten = QuantumCircuit(2)
13rewritten.h(0)
14rewritten.cx(0, 1)
15
16checker = EquivalenceChecker(representation="mpo", threshold=1e-6)
17equiv = checker.check(original, rewritten)
18print(f"Equivalent: {equiv['equivalent']}  (fidelity {equiv['fidelity']:.6f})")
Equivalent: True  (fidelity 1.000000)

For larger circuits, compiler passes, and OpenQASM inputs, see Equivalence Checking.

4. Where to go next

Goal

Start here

Open-system dynamics, noise, time grids

Noisy Analog Simulation

Bell-curve (Gaussian) noise strengths

Realistic Noise Models

Circuit observables, mid-circuit sampling, OpenQASM

Noisy Circuit Simulation

Accuracy presets and truncation knobs

Configuring Simulation Parameters

Check two circuits for equivalence

Equivalence Checking