Simulation
qsimlab.sim
¶
Simulation: simulate, plan, requests and results.
A request says what you want from a circuit; simulate picks (or is
told) the engine and returns a result object holding numpy arrays.
>>> import numpy as np
>>> from qsimlab import Circuit, simulate, statevector, amplitudes, samples, expectation
>>> ghz = Circuit(3).h(0).cx(0, 1).cx(1, 2)
>>> np.round(simulate(ghz, amplitudes(["000", "111", 5])).amplitudes, 4)
array([0.7071+0.j, 0.7071+0.j, 0. +0.j])
>>> simulate(ghz, expectation(["Z0 Z1", "X0 X1 X2", "Z0"])).values.round(6)
array([1., 1., 0.])
>>> r = simulate(ghz, samples(8), seed=7)
>>> r.bits.shape, bool((r.bits == r.bits[:, :1]).all())
((8, 3), True)
StatevectorRequest
dataclass
¶
AmplitudesRequest
dataclass
¶
SamplesRequest
dataclass
¶
ExpectationRequest
dataclass
¶
Budget
dataclass
¶
NoiseModel
dataclass
¶
Circuit-level noise applied on top of the circuit's own noise channels (samples only).
p1: single-qubit depolarizing after every 1-qubit gate;p2: two-qubit depolarizing after every 2-qubit gate;readout: probability each measurement result is reported flipped;reset: probability each reset leaves|1>.
Explanation
dataclass
¶
Explanation(
engine: Optional[str],
ranked: List[Tuple[str, float]],
plan_seconds: float,
cached: bool,
features: Dict[str, Any],
notes: List[str],
)
What the planner decided and why (simulate(..., explain=True) or plan).
ranked lists (engine, predicted_seconds) best first; predictions come
from cost models fitted on an M1 Pro (one thread), so read them as relative.
Result
dataclass
¶
Result(
engine: str,
components: List[Tuple[int, int, str]],
seed: int,
precision: str,
wall_time: float,
explanation: Optional[Explanation] = None,
)
Fields shared by every result.
engine: the engine that ran ("pipeline"if components used different ones);components:[(num_qubits, num_gates, engine)]per simulated part;seed: the seed actually used (pass it back for bit-identical samples);precision:"f64"or"f32", what was actually used;wall_time: seconds spent in the engine;explanation: anExplanationifexplain=True.
StatevectorResult
dataclass
¶
StatevectorResult(
engine: str,
components: List[Tuple[int, int, str]],
seed: int,
precision: str,
wall_time: float,
explanation: Optional[Explanation] = None,
state: ndarray = None,
)
AmplitudesResult
dataclass
¶
AmplitudesResult(
engine: str,
components: List[Tuple[int, int, str]],
seed: int,
precision: str,
wall_time: float,
explanation: Optional[Explanation] = None,
amplitudes: ndarray = None,
bitstrings: Tuple[BitstringLike, ...] = (),
)
SamplesResult
dataclass
¶
SamplesResult(
engine: str,
components: List[Tuple[int, int, str]],
seed: int,
precision: str,
wall_time: float,
explanation: Optional[Explanation] = None,
bits: ndarray = None,
measured_qubits: Tuple[int, ...] = (),
)
ExpectationResult
dataclass
¶
ExpectationResult(
engine: str,
components: List[Tuple[int, int, str]],
seed: int,
precision: str,
wall_time: float,
explanation: Optional[Explanation] = None,
values: ndarray = None,
paulis: Tuple[str, ...] = (),
)
statevector
¶
statevector() -> StatevectorRequest
Request the full state vector (complex ndarray of length 2**n).
amplitudes
¶
amplitudes(
bitstrings: Union[
BitstringLike, Iterable[BitstringLike]
],
) -> AmplitudesRequest
Request <x|ψ> for basis states x: ints (bit q = qubit q) or '0'/'1' strings
whose rightmost character is qubit 0. Works far beyond state-vector sizes when the
planner finds a cheaper engine (sparse, MPS, HSF path sums).
samples
¶
samples(shots: int) -> SamplesRequest
Request shots measurement records. Noise channels, resets, mid-circuit
measurements and conditionals are simulated exactly, shot by shot or batched.
expectation
¶
expectation(
paulis: Union[str, Iterable[str]],
) -> ExpectationRequest
Request expectation values of Pauli strings (see API.md §5 for the syntax).
simulate
¶
simulate(
circuit: Circuit,
request: Request,
*,
engine: Engine = "auto",
precision: Precision = "f64",
seed: Optional[int] = None,
budget: Union[Budget, int, str, None] = None,
threads: Optional[int] = None,
noise: Optional[NoiseModel] = None,
repeat: Optional[bool] = None,
explain: bool = False,
) -> Result
Simulates circuit for request and returns the matching result object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
Engine
|
|
'auto'
|
precision
|
Precision
|
|
'f64'
|
seed
|
Optional[int]
|
RNG seed for sampling; |
None
|
budget
|
Union[Budget, int, str, None]
|
Memory cap: |
None
|
threads
|
Optional[int]
|
Worker threads for this call (default: |
None
|
noise
|
Optional[NoiseModel]
|
A |
None
|
repeat
|
Optional[bool]
|
Run the repeat-detection pass (default: on iff the circuit was built with
|
None
|
explain
|
bool
|
Attach the planner's |
False
|
Examples:
plan
¶
plan(
circuit: Circuit,
request: Request,
*,
budget: Union[Budget, int, str, None] = None,
) -> Explanation