Simulators
BraketSimulators.jl provides two types of simulators: StateVectorSimulator for pure state simulation (without noise) and DensityMatrixSimulator for noisy simulation. Each type is parameterized by an element type (which should be a Julia Complex type, such as ComplexF64) and an array type (so that we can specialize for GPU arrays, for example).
Each simulator can be initialized with a qubit_count and shots value. You may query the properties of a simulator to learn what gate types, result types, and other operations it supports.
BraketSimulator.StateVectorSimulator — TypeStateVectorSimulator{T, S<:AbstractVector{T}} <: AbstractSimulatorSimulator representing a pure state evolution of a statevector of type S, with element type T. State vector simulators should be used to simulate circuits without noise.
BraketSimulator.DensityMatrixSimulator — TypeDensityMatrixSimulator{T, S<:AbstractMatrix{T}} <: AbstractSimulatorSimulator representing evolution of a density matrix of type S, with element type T. Density matrix simulators should be used to simulate circuits with noise.
BraketSimulator.evolve! — Functionevolve!(svs::StateVectorSimulator{T, S<:AbstractVector{T}}, operations::Vector{Instruction}) -> StateVectorSimulator{T, S}Apply each operation of operations in-place to the state vector contained in svs.
Effectively, perform the operation:
$\left| \psi \right\rangle \to \hat{A} \left| \psi \right\rangle$
for each operation $\hat{A}$ in operations.
evolve!(dms::DensityMatrixSimulator{T, S<:AbstractMatrix{T}}, operations::Vector{Instruction}) -> DensityMatrixSimulator{T, S}Apply each operation of operations in-place to the density matrix contained in dms.
Effectively, perform the operation:
$\hat{\rho} \to \hat{A}^\dag \hat{\rho} \hat{A}$
for each operation $\hat{A}$ in operations.
BraketSimulator.simulate — Functionsimulate(simulator::AbstractSimulator, circuit_ir::Union{OpenQasmProgram, Program}, shots::Int; kwargs...) -> GateModelTaskResultSimulate the evolution of a state vector or density matrix using the passed-in simulator. The instructions to apply (gates and noise channels) and measurements to make are encoded in circuit_ir. Supported IR formats are OpenQASMProgram (OpenQASM3) and Program (JAQCD). Returns a GateModelTaskResult containing the individual shot measurements (if shots > 0), final calculated results, circuit IR, and metadata about the task.
simulate(simulator::AbstractSimulator, circuit_irs::Vector{<:Union{Program, OpenQasmProgram}}, shots::Int; max_parallel::Int=min(32, Threads.nthreads()), inputs=Dict{String,Float64}(), kwargs...) -> Vector{GateModelTaskResult}Simulate the evolution of a batch of state vectors or density matrices using the passed in simulator. The instructions to apply (gates and noise channels) and measurements to make are encoded in circuit_irs. Supported IR formats are OpenQASMProgram (OpenQASM3) and Program (JAQCD).
The simulation of the batch is done in parallel using threads. The keyword argument max_parallel specifies the number of evolutions to simulate in parallel – the default value is whichever of 32 and Threads.nthreads() is smaller. This is to avoid overwhelming the thread scheduler with too many small tasks waiting to run, as each evolution is itself threaded. This value may change in the future.
The inputs keyword argument can be a Dict{String} or a Vector{Dict{String}}. In the first case, the same input values are applied to all circuit_irs. In the second, the length of the inputs must be the same as the length of circuit_irs, and the n-th inputs is applied to the n-th circuit_irs.
Returns a Vector{GateModelTaskResult}, each element of which contains the individual shot measurements (if shots > 0), final calculated results, corresponding circuit IR, and metadata about the task.
BraketSimulator.expectation — Functionexpectation(svs::StateVectorSimulator, observable::Observables.Observable, targets::Int...) -> Float64Compute the exact (shots=0) expectation value of observable applied to targets given the evolved state vector in svs. In other words, compute
$\langle \psi | \hat{O} | \psi \rangle$.
expectation(dms::DensityMatrixSimulator, observable::Observables.Observable, targets::Int...) -> Float64Compute the exact (shots=0) expectation value of observable applied to targets given the evolved density matrix in dms. In other words, compute
$\mathrm{Tr}\left(\hat{O}\hat{\rho}\right)$.
BraketSimulator.probabilities — Functionprobabilities(svs::StateVectorSimulator) -> Vector{Float64}Compute the observation probabilities of all amplitudes in the state vector in svs.
BraketSimulator.properties — Functionproperties(svs::StateVectorSimulator) -> GateModelSimulatorDeviceCapabilitiesQuery the properties and capabilities of a StateVectorSimulator, including which gates and result types are supported and the minimum and maximum shot and qubit counts.
properties(svs::DensityMatrixSimulator) -> GateModelSimulatorDeviceCapabilitiesQuery the properties and capabilities of a DensityMatrixSimulator, including which gates and result types are supported and the minimum and maximum shot and qubit counts.