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 |
|
Bell-curve (Gaussian) noise strengths |
|
Circuit observables, mid-circuit sampling, OpenQASM |
|
Accuracy presets and truncation knobs |
|
Check two circuits for equivalence |